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

下へ一覧へ
○テキスト
3章(3.6)
○基本事項
goto は、強制的に処理の流れを変える。
機械語(アセンブリ言語)に近い
・一般に goto を使うとプログラムが見にくくなる。

・goto 全く使えないと不便
       エラー処理など
・goto の限定的使用
    (Cの場合)
     break;      ループの外に飛ぶ
                 何重ものループの場合一番内側のループだけ。
                 それ以上は必要なら goto を使う。
                 switch の抜け出しと同じなので、switch の条件では
                 使えない。このときも必要なら goto を使う。

     continue;   ループの継続
                 何重ものループの場合一番内側のループだけ。
                 それ以上は goto を使う

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

反復処理の途中抜け出し

方法2(goto 使用) { result=0; i=1; while( i<=n ){ if( table[i] == data ){ result=i; goto found; } i=i+1; } found:; }
下へ上へ 方法2(break 使用) { result=0; i=1; while( i<=n ){ if( table[i] == data ){ result=i; break; } i=i+1; } }
下へ上へ 方法3( 「スイッチ」 使用 ) { i=1; while( まだデータがある かつ 一致データが見つかっていない ){ if( table[i] == data ){ result=i; } i=i+1; } }
下へ上へ 方法3( 「スイッチ」 使用 ) { result=0; found=0; i=1; while( i<=n && found==0 ){ if( table[i] == data ){ result=i; found=1; } i=i+1; } } 反復終了の2つの場合 該当データが発見できた時 該当データが発見できない時
下へ上へ 終了条件の統一:「番兵」テクニック 方法4(「番兵」 使用) { table[n+1]=data; i=1; while( table[i] != data ){ i=i+1; } if( i<=n ){ result=i; }else{ result=0; } }
下へ上へ 「方法4」 をプログラムにする。 (第4回の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]=1234; /* 「あらかじめ」格納する */ table[2]=4567; /* 「あらかじめ」格納する */ table[3]=8901; /* 「あらかじめ」格納する */ n=3; /* データ数は3 */ data=8901; /* 探すデータ */ /* データの表示(なくてもよい) */ printf("以下のデータから %d を探します。\n", data ); for( i=1 ; i<=n ; i=i+1 ){ printf("%2d:%5d\n",i,table[i]); } /* 下へ上へここからアルゴリズムの本体 */ table[n+1]=data; i=1; while( table[i] != data ){ i=i+1; } if( i<=n ){ result=i; }else{ result=0; } /* ここまでアルゴリズムの本体 */ /* 結果の表示(ないとうまくいったかどうかわからない。) */ /* もっと簡単でもよい。例えば printf("%d\n",result); */ if( result==0 ){ printf("見つかりませんでした。\n"); }else{ printf("%d 番目に見つかりました。\n", result ); } exit(0); /* 無条件に入れる */ } /* } のあとの改行がないとだめ */
下へ上へ 実行結果の例 以下のデータから 8901 を探します。 1: 1234 2: 4567 3: 8901 3 番目に見つかりました。
一覧へ上へ ○レポート課題・演習(解答) 1. prime0.ps 与えられた自然数が素数(prime number)であるか否かを調べるアルゴリズムを 作成し、改良していく過程を説明している。 空欄を埋めて完成せよ。 (図等を含めた説明の文章をレポートとして書くこと)
一覧へ