第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 で割ったあまりを求める演算を表す。
疑似コード