第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)であるか否かを調べるアルゴリズムを
作成し、改良していく過程を説明している。
空欄を埋めて完成せよ。
(図等を含めた説明の文章をレポートとして書くこと)
一覧へ