プログラムの構造を把握しやすくするために, その「仕事手順」(シナリオ) (参考:プログラミングの流れの3) を図示することは,一般的に広く行われている. 特に大きくて複雑なプログラムの場合,図を用いずにプログラムの構造を把握することは困難である. そのような目的の図として,古くから 流れ図 (フローチャート) が広く使われている.
流れ図とは,処理の内容を書いた箱(図形要素)を, 実行順に線(または矢印)でつないで表したものである. 一般的には,上から下・左から右へ進行するように書くが, 必要に応じて任意の方向に矢印を伸ばしても良い. ただし,分岐(後述)の図形要素を除き, すべての図形要素は,入口の線も出口の線も1本ずつで,合計2本の線しか接続してはいけない. 実行順序を分岐させるときは,必ず分岐の図形要素を用い,合流する場合は線を合流させる. (箱への入口線を複数にして,箱で合流させてはいけない. → 参考)

処理の内容を書いた箱(図形要素)は,その処理内容に応じて,いくつかの決まった書き方がある. (右図参照)
個人的に使う分には,ややこしければ上3つ (開始と終了・通常の処理・分岐) で済ませても構わない. なお,反復(繰り返し)は分岐を用いて記述する.
図が広がりすぎて途中で切りたいときには 結合子 を用いる. 結合子は対で用いられ,線のつながりを表す. 対応する結合子は中に同じ番号を書いて表す.
プログラムの実行順序の構造は,すべて3つの基本的な処理の構造 (順次処理・分岐処理・反復処理) の組み合わせで表現ができる.(構造化定理; Dijkstra)
プログラムの複雑な機能も単純な機能の組み合わせでできていると考え, 実現しようとしている(複雑な)機能(部品,モジュール)を, より単純な機能(部品,モジュール)に分解していくことで, プログラムを段階的にだんだん詳細に設計していく設計手法を 段階的詳細化 と呼ぶ.
この考え方に先ほどの構造化の基本原理を組み合わせ, 3つの基本的な構造を当てはめながら分解していくのが 構造化プログラミング である. 流れ図で考えると,はじめはプログラム全体を一つの (四角の) 箱と考え, その箱を段階的に,順次・分岐・反復のいずれか構造で置き換えていくことで, 流れ図を作り上げていくことに相当する. (参考: 「段階的詳細化のパターン」(次項). また,次のタスクの流れ図例も見よ)
十分に細分化され,分解された各々の処理が十分に単純になれば, その単純な処理を コーディング (プログラムのコードを記述すること) し, 分解の逆をたどってプログラム全体を組み上げていくことができる.
このような手法を取ることにより,プログラムの構造が整理されて把握しやすくなり, また,読みやすいプログラムを作成することができる.
詳細化前 ⇒ 詳細化後 ⇒ JavaScriptコードパターン
| 課題番号: | 5-1 |
| 課題名: | 流れ図の作成 |
| 提出方法: | 印刷して提出 |
| 締切: | 次回の演習の開始時刻まで |
流れ図の解説を参照して, 何らかの「手順」を流れ図を使って表してみる.
何の手順であるかを必ず明記し,その手順を表す流れ図を作成する (課題1-1「手順の記述」で記述した手順を対象としてもよい.). 流れ図の図形要素(箱)の 4~8 は,2(四角)で代用してよい. また,必要に応じて結合子(9, 10)を用いてもよい.
なお,段階的詳細化の過程は必ずしも記述しなくてもよい. ページ数は特に限定しない.
「課題レポート提出に関する諸注意 (プリントアウトして提出する場合)」 に従って,レポートとして提出する.次回の演習の開始時に回収するので用意しておくこと.
レポートの作成の手段は任意とするが,A4サイズを縦に用い,必ず表紙を付けて左肩を綴じること. (Word,Visio,Powerpoint,Paint,手書き など,任意の作成手段でよい)
1〜10 の自然数の足し算の問題を出題して, 入力された解答をチェックするプログラムを作成する.問題は10問出題するものとする. ただし,
Math.random())
を用いてランダムに生成する.prompt(…) を用いて,下図のように出題し,
答えを入力させる.
alert(…) を使って表示する.ファイル名は js05-1.html とする.
i,
問題となる2つの整数のための変数 n, m,
正解を保持するための変数 sol,
入力した答えを保持するための変数 ans
を用意しよう.Math.random() が生成する乱数は0以上1未満の小数なので,
これを整数に変えるためには,切り捨ての関数
Math.floor(…) を併用すると良い.Math.floor(Math.random() * k) とすればよい
(なぜ,これでよいか考えてみよう).また,出題は 1〜10 の自然数なので,
Math.floor(Math.random() * 10) のままでは 0〜9 となって適切ではない.
どうすればよいか考えてみよ.雛形を以下に示す.
<!DOCTYPE html>
<title>JavaScript Sample 5-1</title>
<body>
<script type="text/javascript">
<!--
// 変数 i:カウント,n,m:問題,sol:正解,ans:解答
var i, n, m, sol, ans;
// 計算練習10回
// ここは自分で考えること
// -->
</script>
</body>
例を以下に示す.リンクをクリックすれば実行できる.(別ウィンドウで実行される)
| 課題番号: | 5-2,5-3,5-4(,5-5,5-6) |
| 課題名: | 計算練習プログラムの拡張 a ~ c (d,e はオプション) |
| ファイル名: | task05-2.html,task05-3.html,task05-4.html (,task05-5.html,task05-6.html) |
| 締切: | 次々回の演習日の直前の日曜日,18:00まで |
先の 計算練習プログラム (1) に対して, 以下の各々の変更や拡張を実現するにはどのようにすればよいか考え, 実際に,計算練習プログラムを書き直す.
alert(…) の代わりに
document.writeln(…) を用いて,
最終的に以下のような画面を得るようにする.(task05-2.html)
第1問 3+4=? 解答 7 正解です 第2問 2+10=? 解答 20 違います 正解は 12 です …
余力があれば,以下のチャレンジ課題(オプション)を遂行してもよい.
プログラムの作成時には,元の 計算練習プログラム (1) からの変更箇所について, プログラム中にその変更内容を説明するコメントを書き入れることを強く推奨する.
Moodle の各々の課題ページから各々のプログラムのファイルを提出すること. ファイル名はすべて半角文字とする.
こちらのページ (http://usir.kobe-c.ac.jp/users/miura/Sc283/part05hint.swf) を参照.