◎第5回 段階的詳細化

○テキスト
3章(3.3-3.4)
下へ一覧へ
○「段階的詳細化」とは何か
これまでの例の大部分は計算式があって計算する形
(最大値最小値はちょっと違う)
複雑になるとどこから手をつけてよいのかわからなくなる。
→系統的な方法が必要
  段階的詳細化

  まず、処理の大枠を決めてから、
  徐々に細かい所を決めていき、
  最後に、自然にプログラムになる。
(この簡単な例は、第3回に反復処理のアルゴリズムを作成する時に
すでに示してある)

  トップダウン ( top down )「上から下へ」
          ←→ ボトムアップ ( bottom up )「下から上へ」
               必要と考えられる部分を作り、
               組み合わせて行く。

下へ上へ ・テキストでは打撃十傑を求める場合で 段階的詳細化を説明している。 { 1.データの入力 ; 2.処理する ; 3.結果の出力(表示) ; } ※ 多くのプログラムはこの形 1.データを入力する ↓ { 1.1 規定打席数を読む ; 1.2 全選手の打撃成績を読む ; } 1.2 全選手の打撃成績を読む ; ↓ while( 選手がまだ残っている ){ 1.2.1 次の選手の打撃成績を読む ; }
下へ上へ 2. 処理する ↓ { 2.1 打席数が規定打席数に満たない選手を除く ; 2.2 残った選手について、、打率を計算する ; 2.3 打率が大きい順に上位 10 人を求める ;(後に詳述) } 3.結果の出力(表示) ; ↓ 3.1 見出しの表示 ; 3.2 for( i=1 ; i<=10 ; i++ ){ 3.2.1 打撃順位 i の選手の選手名と打撃成績を表示する ; }
下へ上へ この段階的詳細化をを発展させると 構造化プログラミング 下降型プログラミング につながる。
・テキストの電話をかける例 ダイアルを回す。 国番号をを回す 市外局番を回す 市内局番を回す 加入番号を回す 市外局番を回す→ 第1数字を回す 第2数字を回す ...
下へ上へ ○ソート(整列) (テキスト例題 3.3) n 個の数値 a[1],...,a[n]がある。 大きい順に並べ変えよ。 (データがすでに入っているものと してする入力・出力は今は考えない) 方針: 1. a[1],...,a[n]の中から最大値を求め、 それと a[1]を入れ換える。 2. 1の結果得られる a[2],...,a[n] の中 から最大値を求め、それとa[2]を入れ換える。 ... { for( i=1 ; i<=n-1 ; i=i+1 ){ 1. 最大値を求めて入れ換える。 } }
下へ上へ 1. 最大値を求めて入れ換える。 ↓ { 1.1 最大値を求める。 1.2 入れ換える。 } 1.1 最大値を求める。( 第3回演習(d)参照 ) 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]; } } }
下へ上へ 1.2 入れ換える。 1.2.1 a[i]を max とする。 1.2.2 ?? を a[i] とする。 a[j]のどれが max になったのか ? 入れ換えるには何番目の要素が max を与えるのかが わからないといけない!! max を与える要素の番号 jmax を求めるように 1.1 を修正
下へ上へ 1.1' 最大値を求める。 a[i]からa[n]の中から「最大値を与える添字」を求める。 (ついでにその最大値も) ↓ { max=a[i] ; jmax=i ; for( j=i+1 ; j<=n ; j=j+1 ){ if( a[j]>max ){ max=a[j]; jmax=j; } } }
下へ上へ 1.2 入れ換える。 ↓ { 1.2.1 a[jmax]をa[i] とする。; 1.2.2 a[i]を max とする。; } ↓ { a[jmax]=a[i]; a[i]=max; }
下へ上へ ・分割された各段階間でのどんなデータの受渡しが必要かが重要 分割された各処理は、まったく独立でないので、あとの段階に何が必要で それは、どの段階で作られるかを考える。
下へ上へ ○演習 上に示したデータを大きい順(降順)にソートするアルゴリズム全体をまとめ、 PAD と 擬似コードで記述すると次のようになる。それぞれ空欄を埋めよ。 ・降順ソートのアルゴリズムのPADと疑似コードを次に示す。 PAD(psfile)擬似コード これに、宣言と入出力を加えて、C プログラムにすると次のようになる。 空欄を埋めてプログラムを完成し、コンパイル・実行せよ。 ・降順ソートのCプログラム C プログラム
一覧へ上へ ○レポート課題(解答) 1.データを小さい順(昇順)にソートするアルゴリズムを作成する場合の段階的 詳細化の過程を説明せよ。各段階のアルゴリズムは、 PAD または 擬似コー ドで記述して説明せよ。(図等を含む文章をレポートとして書くこと) 2. nibunhou.ps は2分法によって方程式 f(x)=0 を解くためのプログラムを 段階的詳細化により作成する過程を説明したものである。 空欄を埋めて説明を完成させよ。空欄を埋める内容だけでなく、その理由も 書くこと。 また、完成したプログラムをコンパイル・実行し、動作を確認せよ。 実行時には、a には 1 を, b には 3.14を, epsilon には、1e-6 を 入力すること。結果として得られる値は、何か考えよ。 ( 1e-6 は 「1×10の-6乗」を意味する ) (空欄のあるプログラムは ~eenagai/ic2/nibun.c にある。)
一覧へ