第6回 構造化プログラミングとgoto文の限定的使用法

下へ一覧へ
○テキスト
3章(3.6)
○基本事項
構造化プログラミング

  いくつかのまとまったアルゴリズムから全体のアルゴリズムを
成り立たせるプログラミング。具体的には、理解しやすい制御構造
だけを用いて、段階的詳細化により構造の把握しやすいプログラムを
作ること。(本授業の目標とするところ)

これを”乱す”ものに goto 文 がある。

    プログラムで、goto は、強制的に処理の流れを変える。
    機械語(アセンブリ言語)に近い。

    goto 文はできるだけ使わない。goto の限定的使用


○goto 文の例 下へ上へ テキストには検索の例がある。”表の探索”問題。 table[1] から table[n] に、データがあらかじめ 格納してあるとする。(重複するデータはないものとする) この中から、data に等しいものを探す、 すなわち、配列 table なかで data に等しい要素の 添字を求める。 結果は変数 result に入れるものとする。 一致するものがないときは、result は、0 とする。 { result=0; i=1; while( i<=n ){ if( table[i] == data ){ result=i; } i=i+1; } }
下へ上へ 前のアルゴリズムの無駄な点 "見つかったあとも探し続ける" これを解消したい。

反復処理の途中抜け出し

(goto 使用) { result=0; i=1; while( i<=n ){ if( table[i] == data ){ result=i; goto found; } i=i+1; } found:; } goto 全く使えないと不便。 " 繰り返し脱出用に限り goto 文を許す。" goto 文と似たもの: break, switch
下へ上へ ”表の探索”の問題 goto を使わない方法もある。プログラムの構造が簡単。 終了条件の統一:「番兵」テクニック { table[n+1]=data; i=1; while( table[i] != data ){ i=i+1; } if( i<=n ){ result=i; }else{ result=0; } }
○演習 6.1 上の 上の番兵テクニックのアルゴリズムを理解せよ。 参考: C 言語の式 一覧へ上へ ○レポート課題 (解答) 6.1 上の演習のアルゴリズムを含むプログラムを作って、その作動を 確認する。まず、下のプログラムを適当な C のプログラムの名前 として コピーせよ。(変数の宣言などは、次回またはその次で勉強 する。)次に、”適当な整数”、”適当なアルゴリズム”に具体的な ものを入れて、「3番目に見つかりました」と表示させよ。プログラム および実行結果のスクリプトを提出のこと。 (必要ならC言語の説明, 実際の C プログラムの書き方(限定版)を参考) プログラム #include <stdio.h> /* 無条件に入れる */ #include <math.h> /* 無条件に入れる */ #define N 100 /* 無条件に入れる */ main() /* 無条件に入れる */ { int i, n; /* 整数変数の宣言 */ /* (以下で iとnを使う) */ int data, result; /* (dataとresult も使う) */ int table[N+1]; /* N までの添字が使える配列 */ table[1]=適当な整数; /* 「あらかじめ」格納する */ table[2]=適当な整数; /* 「あらかじめ」格納する */ table[3]=適当な整数; /* 「あらかじめ」格納する */ n=3; /* データ数は3 */ data=適当な整数; /* 探すデータ */ /* データの表示(なくてもよい) */ printf("以下のデータから %d を探します。\n", data ); for( i=1 ; i<=n ; i=i+1 ){ printf("%2d:%5d\n",i,table[i]); } /*ここからアルゴリズムの本体 */ ”適当なアルゴリズム” /* ここまでアルゴリズムの本体 */ /* 結果の表示(ないとうまくいったかどうかわからない。) */ /* もっと簡単でもよい。例えば printf("%d\n",result); */ if( result==0 ){ printf("見つかりませんでした。\n"); }else{ printf("%d 番目に見つかりました。\n", result ); } exit(0); /* 無条件に入れる */ } /* } のあとの改行がないとだめ */ 6.2 prime0.ps 与えられた自然数が素数(prime number)であるか否かを調べる アルゴリズムを作成し、改良していく過程を説明している。 内容を理解し、空欄 A, B, C に入るものを示せ。 6.3 goto 文の限定的使用とプログラムの段階的詳細化はどのように 関係するか論ぜよ。手書きでよい。
一覧へ