2 繰り返し処理

ここでは,先に示した3通りのの繰り返し処理の構文を学習する.3通りの構文で同じ内容 のプログラムを示し,その違いを学習する.ここで,例に示しているプログラムは,全て 同一で,以下のようになっている.

2.1 while

2.1.1 プログラム例

リスト1while文を使った例を示す.その動作は,以下のとおり.
  1. 「1からいくつまで加算しますか?」と質問を行い,ユーザーはそれに答える.入 力した値は,imaxに格納される.
  2. 変数sumiに0と1を代入している.これを初期化と言う.
  3. whileを使ったループ処理のブロックでは,i <= imaxが正しい限り, 以下の文を繰り返し実行する.ただし,一度実行すると,i <= imaxが正し いか否か,再度判断を行う.
    • sumiの値を加えている.sum += isum = sum+i と同じ.教科書 [1]のp.87を見よ.
    • iの値を1増加させている.i++i=i+1と同じ.これをイ ンクリメントと言う.教科書 [1]の p.135-137を見よ.

   1 #include <stdio.h>
   2 
   3 int main(void){
   4   int i, imax;
   5   int sum;
   6 
   7   printf("1からいくつまで加算しますか?\t");
   8   scanf("%d", &imax);
   9 
  10   sum = 0;
  11   i = 1;
  12  
  13   while(i<=imax){
  14     sum += i;
  15     i++;
  16   }
  17 
  18 
  19   printf("sum = %d\n", sum);
  20 
  21   return 0;
  22 }

2.1.2 while文の書き方

これは,前判定繰り返しである.ループのブロックを実行する前に判断を行う--のでそ のように呼ばれる.次に述べるfor文も前判定繰り返し文であるが,予め繰り返し回 数が分からないときには,while文が使われることが多い.「条件式が正しければ, ループ繰り返す.条件式が誤りになれば,そのループから抜け出す」という構文である. 次のように,書く.
書式
	while(継続条件式){
	   文1;
	   文2;
	   文3;
	}
図 3: whileを使ったループ処理
\includegraphics[keepaspectratio, scale=1.0]{figure/while.eps}

2.2 for

2.2.1 プログラム例

リスト2for文を使った例を示す.その動作は,以下のとおり.
  1. 「1からいくつまで加算しますか?」と質問を行い,ユーザーはそれに答える.入 力した値は,imaxに格納される.
  2. 変数sumに0を代入し,初期化を行っている.
  3. forを使ったループ処理のブロックでは,次のように動作する.
    • 初期値として,iに1を代入している.
    • 継続条件式i <= imaxが正しければ,中括弧で囲まれた繰り返しのブロックを実 行する.誤りであれば,forのループから抜け出る.
    • 再設定式であるi++により,iの値を1増加させる.
    • 継続条件式に戻り,繰り返す.

   1 #include <stdio.h>
   2 
   3 int main(void){
   4   int i, imax;
   5   int sum;
   6 
   7   printf("1からいくつまで加算しますか?\t");
   8   scanf("%d", &imax);
   9 
  10   sum = 0;
  11  
  12   for(i=1; i<=imax; i++){
  13     sum += i;
  14   }
  15 
  16 
  17   printf("sum = %d\n", sum);
  18 
  19   return 0;
  20 }

2.2.2 for文の書き方

whileとは異なり,繰り返しの回数が予め分かっているとき,for文がつかわれ る.これも,前判定繰り返し文となっている.実際の動作は図4のフローチャー トを見て理解してほしい.動作の順序は,初期値設定 $ \rightarrow$継続条件式 $ \rightarrow$ループブロックの処理 $ \rightarrow$再設定式 $ \rightarrow$継続条件式 $ \rightarrow$ループブロックの処理となる.初期条件式は,最初の1回のみで,継続条件 式が正しい限り,ループを繰り返す.
書式
	for(初期値設定式; 継続条件式; 再設定式){
	   文1;
	   文2;
	   文3;
	}
これは,「継続条件が正しい限り,文1と文2,文3を実行する」となる.もし,制御式が誤り (偽)であれば,これら文は実行されず,ブロックの外側に出る.図4にこの 構文のフローチャートを示す.
図 4: forを使ったループ処理
\includegraphics[keepaspectratio, scale=1.0]{figure/for.eps}

2.3 do-while

2.3.1 プログラム例

リスト3do-while文を使った例を示す.その動作は, 以下のとおり.
  1. 「1からいくつまで加算しますか?」と質問を行い,ユーザーはそれに答える.入 力した値は,imaxに格納される.
  2. 変数sumiに0と1を代入し,初期化を行っている.
  3. do-whileを使ったループ処理のブロックでは,次のように動作する.
    • sumiの値を加える.
    • iの値をインクリメント--1加算--する.
    • 継続条件式が正しければ,ループを繰り返す.誤りであれば, do-whileのループから抜け出す.

   1 #include <stdio.h>
   2 
   3 int main(void){
   4   int i, imax;
   5   int sum;
   6 
   7   printf("1からいくつまで加算しますか?\t");
   8   scanf("%d", &imax);
   9 
  10   sum = 0;
  11   i = 1;
  12 
  13   do{
  14     sum += i;
  15     i++;
  16   }while(i<=imax);
  17 
  18 
  19   printf("sum = %d\n", sum);
  20 
  21   return 0;
  22 }

2.3.2 do-while文の書き方

これは後判定繰り返しで,予め繰り返し回数が分からないときに使われることが多い. 「ループ内を実行し,継続条件式が正しければ,さらにループを繰り返す.条件式が誤り になれば,そのループから抜け出す」という構文に使われる.どのような場合でも,必ず ループが1度は実行されるところが,前判定繰り返しと異なる.do-while文 は,次のように,書く.
書式
	do{
	   文1;
	   文2;
	   文3;
	}while(継続条件式);
これは,「文1と文2,文3を実行し,継続条件が正しければ,これを繰り返す」となる. もし,制御式が誤り(偽)であれば,ブロックの外側に出る.図5にこの 構文のフローチャートを示す.
図 5: do whileの後判定繰り返し文
\includegraphics[keepaspectratio, scale=1.0]{figure/do_while.eps}

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


no counter