第4回 擬似コードと段階的詳細化

下へ一覧へ
○テキスト
3章(3.1,3.2,3.3)

擬似コードとはなにか? PAD では書き切れない細かい点を表現するために、プログラム 言語の制御構造の記述法を借用し、”条件”や”処理”の 部分を自然言語で表した ”擬似”プログラム 自然言語の部分を計算機のわかる形に直すとプログラムになる。 簡単な例では、プログラムとほとんど変わらない。 本演習では C 言語の制御構造に従った疑似コードを学習する。 (テキストでは Pascal の制御構造を用いている。) (テキストで使用している PASCAL との対応(ps file) とその対応例(主に擬似コード))
プログラムをつくる上での重要概念:段階的詳細化 計算機のデータ処理は (1)データの入力(2)処理(3)処理結果の出力 からなる。さらにそれぞれは制御構造を用いて小さな問題に 分割できる。このように、与えられた問題を部分的な小問題 に分割し、最終的に計算機で実行可能なプログラムを作成 する手法をいう。
下へ上へ ○ C 言語の制御構造に基づく疑似コード pad2ps を使って PAD を書く文法に似ている。 ただ、各処理のあとに ';'を つける約束がある。 最も典型的な文は代入で、例えば n = m + 10 ; の形をしている。 この ; (セミコロン)を書き忘れたり、 : (コロン)と間違え ないように注意する。
下へ上へ ○逐次構造 C言語では文を並べたものである。 文1 文2 (PAD) 文3 文を並べて、{ } で括ったものを、「ブロック」と呼ぶ。 あるまとまったの逐次構造の文は、{ }で括ってブロックにする。 { 文1 文2 文3 } 一般に「文」はブロックでもよい。すなわち、ブロックはブロックを含んでよい このような構造を入れ子構造(nest構造)と呼ぶ。 { 文1 { 文2 文3 } 文4 } ( 多くの場合 文は「 式 ; 」である。)
下へ上へ ○選択構造 if 形式1 if( 条件 ) 真の時の処理 (PAD) 形式2 if( 条件 ) 真の時の処理 else 偽の時の処理 (PAD) 条件は、「式」 例えば、 if( a > b ) max = a ; else max = b ; それぞれの処理が、複数の時は、それらを { } でくくってブロックにする。 if( a > b ){ max = a ; min=b ; } else { min = a ; max=b ; } 三つに分類するなどの時は、 if( 条件1 ) 処理1 else if( 条件2 ) 処理2 else 処理3 などとする。
下へ上へ ○反復構造 1.while 形式 while( 繰り返し条件 )繰り返し処理 (PAD ) 説明 繰り返し条件は「式」である。 繰り返し処理は 文 である 例えば while( r - d >=0 ) r = r - d ; 繰り返し処理はブロックでもよい。 while( i<=n ) { s = s + x[i] ; i = i + 1; } 大抵の場合 while の前に初期化処理があり、繰り返し処理の 最後には、増分処理がある。これをまとめたのが次の for 文である。 2. for 形式 for( 初期化処理 ; 繰り返し継続条件 ; 増分処理 )繰り返し処理 初期化処理、繰り返し継続条件、増分処理は、どれも式である。 繰り返し処理は文である。ブロックでもよい。 典型的な使い方は、 for( i=初期値 ; i<=最終値 ; i=i+1 )処理 の形である。 これは、while を使って置き換えることができる。 ( もう一つの繰り返し形式 do-whileは ここでは説明しない。 ) (主に 1.は不定回反復 2.定回反復)
○段階的詳細化の例 : ソート(整列) 下へ上へ (テキスト例題 3.3) n 個の数値 a[1],...,a[n]がある。 大きい順に並べ変えよ。 (データがすでに入っているものと してする入力・出力は今は考えない) 方針: 1. a[1],...,a[n]の中から最大値を求め、 それと a[1]を入れ換える。 2. 1の結果得られる a[2],...,a[n] の中 から最大値を求め、それとa[2]を入れ換える。 ... 以下繰り返す。 最大値を求めて入れ換える。 ↓ { 最大値を求める。 入れ換える。 }
下へ上へ 1.1 最大値を求める。 a[i]からa[n]の中から最大値および 「最大値を与える添字」を求める。 ↓ { a[i]を仮の最大値とする ; while( a[i] の次から最後のデータまで ){ if( データが仮の最大値より大きい ){ 仮の最大値をそのデータで置き換える ; } } } ↓ { max=a[i] ; for( j=i+1 ; j<=n ; j=j+1 ){ ^^^ if( a[j]>max ){ max=a[j]; jmax=j; } } }
下へ上へ 1.2 入れ換える。 ↓ { a[jmax]をa[i] とする。; a[i]を max とする。; } ↓ { a[jmax]=a[i]; a[i]=max; }
下へ上へ ○字下げ indentation 反復される処理 選択される処理 まとめられた処理(ブロックの中身) を少し行の先頭から下げて書く これにより見やすくなる。すなわち誤りが起きにくくなる。
下へ上へ ○コメント(注釈) /* コメント */ プログラム(または、アルゴリズム、 擬似コード)の内容に直接関係なく 人間が見やすさのために入れる文字
下へ上へ ○演習4 4.1 課題 2.1, 2.2 で使った pad のファイル (.pad) を別の名前と してコピーし、そのファイルの”処理”、”条件”を具体的な もの(例えば等式や不等式)で置き換え、任意の疑似コードを 作成せよ。セミコロンを忘れない。
一覧へ上へ ○レポート課題4 (解答) 4.1 n 個のデータの平均と標準偏差を求めるアルゴリズム を理解し、適当なファイルに疑似コードを作成せよ。 4.2 上に示したデータを大きい順(降順)にソートするアルゴリズム 全体の PAD と 擬似コードは次のようになる(空欄あり)。 PAD(psfile)擬似コード 疑似コードのファイルを自分の ic2 directory の中に save、 編集して完成させよ。 4.3 次の疑似コードのコメント/* pn */ および /* cn */のある行の 各処理、各条件判断が実行される順番を示せ。 読み込む m は、各自の学籍番号とせよ。結果は学籍番号に依存する。 また、式の中で a % b は a を b で割ったあまりを求める演算を表す。 疑似コード
一覧へ