第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 文の限定的使用とプログラムの段階的詳細化はどのように
関係するか論ぜよ。手書きでよい。