5 基本制御構造(繰り返し)

5.1 for文(p.142)

繰り返しの回数が予め分かっているとき,for文がつかわれる. 「初期値は○○,条件式が正しければ,ループを繰り返し,条件を再設定する.これは, 条件式検査 $ \rightarrow$ループ $ \rightarrow$条件の再設定を繰り返す.条件式が誤りに なれば,そのループから抜け出す」という構文に使われる.これは,次のように,書く.
書式
	for(初期値設定式; 継続条件式; 再設定式){
	   文1;
	   文2;
	   文3;
	}
これは,「継続条件が正しい限り,文1と文2,文3を実行する」となる.もし,制御式が誤り (偽)であれば,これら文は実行されず,ブロックの外側に出る.図10にこの 構文のフローチャートを示す.

以下のようなプログラムが,この構文の使用例である.

	for(a=1; a<=1000; a++){
	   sum=sum+a;
	   printf("a=%d sum=%d\n",a,sum);
	}
この構文の実行直前まで,sum=0ならば,1〜1000までの和を計算することができる. 見慣れないa++は,a=a+1と同じで,aの値を1増加させている.これをイ ンクリメントと言う.

構文の内容は,次の通りである.

図 10: forの前判定繰り返し文
\includegraphics[keepaspectratio, scale=1.0]{figure/for.eps}
[練習1]
次の動作をするプログラムを作成せよ.最後の$ c$の値はどの ような値になるか? -4pt
  1. 実数$ a,\,b$の初期値をそれぞれ,1.0と2.0とする.
  2. 実数$ c$ $ c=(a+b)/2.0$とする.
  3. もし,$ c^2$が2より小さければ,$ c$の値を$ a$に代入す る.反対に2よりも大きければ,$ c$の値を$ b$に代入 する.
  4. 操作2〜3を100回繰り返す.
[練習2]
以下の級数展開式を用いてネピア数( $ \mathrm{e}$)を計算せ よ.少し難しいので,余裕のある者のみ実施せよ.

$\displaystyle \mathrm{e}$ $\displaystyle =1+1+\frac{1}{2}+\frac{1}{3\times2\times1}+\frac{1}{4\times3\times2\times1}+\cdots$    
  $\displaystyle =\sum_{n=0}^{\infty}\frac{1}{n!}$ (1)

5.2 不定回数繰り返し

繰り返し回数が予め分かっていない場合は,do while文かwhile文を用いる.それぞれ の違いは,以下の通りである.

5.2.1 while文(p.141)

これも,for文同様,前判定繰り返しであるが,予め繰り返し回数が分からないとき には,while文が使われることが多い.「条件式が正しければ,ループ繰り返す.条件式が誤 りになれば,そのループから抜け出す」という構文に使われる.次のように,書く.
書式
	while(継続条件式){
	   文1;
	   文2;
	   文3;
	}
これは,「継続条件が正しい限り,文1と文2,文3を実行する」となる.もし,制御式が誤り (偽)であれば,これら文は実行されず,ブロックの外側に出る.図11にこの 構文のフローチャートを示す.

以下のようなプログラムが,この構文の使用例である.

	while(a<=1000){
	   sum=sum+a;
	   printf("a=%d sum=%d\n",a,sum);
	   a++;
	}
この構文の実行直前まで,sum=0かつa=1ならば,

sum$\displaystyle =1+2+3+\cdots+1000$    

を計算する.構文の内容は,次の通りである.
図 11: whileの前判定繰り返し文
\includegraphics[keepaspectratio, scale=1.0]{figure/while.eps}

5.2.2 do while文(p.145)

これは後判定繰り返しで,予め繰り返し回数が分からないときに使われることが多い. 「ループ内を実行し,継続条件式が正しければ,さらにループを繰り返す.条件式が誤り になれば,そのループから抜け出す」という構文に使われる.次のように,書く.
書式
	do{
	   文1;
	   文2;
	   文3;
	}while(継続条件式);
これは,「文1と文2,文3を実行し,継続条件が正しければ,これを繰り返す」となる. もし,制御式が誤り(偽)であれば,ブロックの外側に出る.図12にこの 構文のフローチャートを示す.

以下のようなプログラムが,この構文の使用例である.

	do{
	   sum=sum+a;
	   printf("a=%d sum=%d\n",a,sum);
	   a++;
	}while(a<=1000);
この構文の実行直前まで,sum=0かつa=1ならば,

sum$\displaystyle =1+2+3+\cdots+1000$    

を計算する.構文の内容は,次の通りである.

do while文とwhil文の動作はよく似ているが,「最初から継続条件式が誤り」 の場合に違いが生じる.違いは,

do while 最初から条件式が誤りでも,ループブロックを1回は実行する.
while 最初から条件式が誤りの場合,ループブロックは実行されない.
である.
図 12: do whileの後判定繰り替え詩文
\includegraphics[keepaspectratio, scale=1.0]{figure/do_while.eps}

5.3 ループのスキップと脱出

5.3.1 スキップ(continue)(p.150)

場合によっては,ループブロックの文を実行させたくない場合がある.このとき, continue文を使う.通常はif文を伴って,次のように書く.
書式
	while(継続条件式){
	   文1;
	  if(制御式) continue;
	   文2;
	   文3;
	}
これは,「継続条件が正しい限り,文1と文2,文3を実行する.ただし,制御式が正しけ れば文2と文3はスキップする.」となる.当然,制御式が誤り(偽)であれば,これら文は実行されず,ブロックの外側に出る.図13にこの構文 のフローチャートを示す.ここでは,while文に,continueを用いているが, fordo while文にも使える.いずれの構文でも,contine文に出会うと, それ以降のループブロックが実行されない.

以下のようなプログラムが,この構文の使用例である.

	while(sum<=10000){
	   sum=sum+n;
	   n++;
	   if(sum <= 9000)contine;
	   printf("sum=%d\n",n);
	}
この構文の実行直前まで,sum=0かつn=1ならば,

sum$\displaystyle =1+2+3+\cdots+n$    

を計算する.ただし,この繰り返し文を抜けたときには,sumの値は10000を越えている.

構文の内容は,次の通りである.

図 13: contineを使って,ループブロックをスキップする構文
\includegraphics[keepaspectratio, scale=1.0]{figure/continue.eps}

5.3.2 脱出(break)(p.149)

場合によっては,継続条件式が正しくても,構文から抜け出たい場合がある.このとき, break文を使う.通常はif文を伴って,次のように書く.
書式
	while(継続条件式){
	   文1;
	  if(制御式) break;
	   文2;
	   文3;
	}
これは,「継続条件が正しい限り,文1と文2,文3を実行する.ただし,制御式が正しけ れば,この構文から抜ける」となる.当然,制御式が誤り(偽)であれば,これら文は実行 されず,ブロックの外側に出る.図14にこの構文のフローチャートを示す. ここでも,while文に,break文を用いているが,fordo while文 にも使える.いずれの構文でも,break文に出会うと,構文から抜け出る..

以下のようなプログラムが,この構文の使用例である.

	while(1){
	   sum=sum+n;
	   n++;
	   if(sum >=  10000)break;
	   printf("sum=%d\n",n);
	}
この構文の実行直前まで,sum=0かつn=1ならば,

sum$\displaystyle =1+2+3+\cdots+n$    

を計算する.ただし,breakにより,sumの値が10000以上になると,この構文から完 全に抜け出す..

構文の内容は,次の通りである.

図 14: break文を用いた構文からの脱出
\includegraphics[keepaspectratio, scale=1.0]{figure/break.eps}

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成18年5月8日


no counter