繰り返しの回数が予め分かっているとき,
for文がつかわれる.
「初期値は○○,条件式が正しければ,ループを繰り返し,条件を再設定する.これは,
条件式検査
ループ
条件の再設定を繰り返す.条件式が誤りに
なれば,そのループから抜け出す」という構文に使われる.これは,次のように,書く.
|
書式
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増加させている.これをイ
ンクリメントと言う.
構文の内容は,次の通りである.
- 初期値として,「a=1」と設定する.
- もし,aが1000以下ならば,
-4pt
- 「sum+aを計算し,その結果をsumに代入」を実行する.
- 「a=値 sum=値」と表示する.
- 「aの値を+1増加」を実行する.
- 一つ前の,アイテム「もし,aが1000以下ならば」に戻る.
- [練習1]
- 次の動作をするプログラムを作成せよ.最後のの値はどの
ような値になるか?
-4pt
- 実数の初期値をそれぞれ,1.0と2.0とする.
- 実数を
とする.
- もし,が2より小さければ,の値をに代入す
る.反対に2よりも大きければ,の値をに代入
する.
- 操作2〜3を100回繰り返す.
- [練習2]
- 以下の級数展開式を用いてネピア数(
)を計算せ
よ.少し難しいので,余裕のある者のみ実施せよ.
繰り返し回数が予め分かっていない場合は,
do while文か
while文を用いる.それぞれ
の違いは,以下の通りである.
- while文は,ループ入り口で継続条件の判断を行う.
- do-while文は,ループ出口で継続条件の判断を行う.
これも,
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 |
|
を計算する.構文の内容は,次の通りである.
- もし,aが1000以下ならば,
-4pt
- 「sum+aを計算し,その結果をsumに代入」を実行する.
- 「a=値 sum=値」と表示する.
- 「aの値を+1増加」を実行する.
- 一つ前の,アイテム「もし,aが1000以下ならば」に戻る.
これは後判定繰り返しで,予め繰り返し回数が分からないときに使われることが多い.
「ループ内を実行し,継続条件式が正しければ,さらにループを繰り返す.条件式が誤り
になれば,そのループから抜け出す」という構文に使われる.次のように,書く.
|
書式
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 |
|
を計算する.構文の内容は,次の通りである.
- 以下を実行する.
-4pt
- 「sum+aを計算し,その結果をsumに代入」を実行する.
- 「a=値 sum=値」と表示する.
- 「aの値を+1増加」を実行する.
- もし,aが1000以下ならば,一つ前の,アイテム「以下を実行する」に戻る.
do while文とwhil文の動作はよく似ているが,「最初から継続条件式が誤り」
の場合に違いが生じる.違いは,
do while |
最初から条件式が誤りでも,ループブロックを1回は実行する. |
while |
最初から条件式が誤りの場合,ループブロックは実行されない. |
である.
場合によっては,ループブロックの文を実行させたくない場合がある.このとき,
continue文を使う.通常は
if文を伴って,次のように書く.
|
書式
while(継続条件式){
文1;
if(制御式) continue;
文2;
文3;
}
|
これは,「継続条件が正しい限り,文1と文2,文3を実行する.ただし,制御式が正しけ
れば文2と文3はスキップする.」となる.当然,制御式が誤り(偽)であれば,これら文は実行されず,ブロックの外側に出る.図
13にこの構文
のフローチャートを示す.ここでは,
while文に,
continueを用いているが,
forや
do while文にも使える.いずれの構文でも,
contine文に出会うと,
それ以降のループブロックが実行されない.
以下のようなプログラムが,この構文の使用例である.
while(sum<=10000){
sum=sum+n;
n++;
if(sum <= 9000)contine;
printf("sum=%d\n",n);
}
この構文の実行直前まで,
sum=0かつ
n=1ならば,
sum |
|
を計算する.ただし,この繰り返し文を抜けたときには,
sumの値は10000を越えている.
構文の内容は,次の通りである.
- もし,sumが10000以下ならば,
-4pt
- 「sum+nを計算し,その結果をsumに代入」を実行する.
- 「nの値を+1増加」を実行する.
- もし,sumが9000以下ならば,ループブロックの最後にスキップする.
- 「sum=値」と表示する.
- 一つ前の,アイテム「もし,sumが10000以下ならば」に戻る.
図 13:
contineを使って,ループブロックをスキップする構文
|
場合によっては,継続条件式が正しくても,構文から抜け出たい場合がある.このとき,
break文を使う.通常は
if文を伴って,次のように書く.
|
書式
while(継続条件式){
文1;
if(制御式) break;
文2;
文3;
}
|
これは,「継続条件が正しい限り,文1と文2,文3を実行する.ただし,制御式が正しけ
れば,この構文から抜ける」となる.当然,制御式が誤り(偽)であれば,これら文は実行
されず,ブロックの外側に出る.図
14にこの構文のフローチャートを示す.
ここでも,
while文に,
break文を用いているが,
forや
do while文
にも使える.いずれの構文でも,
break文に出会うと,構文から抜け出る..
以下のようなプログラムが,この構文の使用例である.
while(1){
sum=sum+n;
n++;
if(sum >= 10000)break;
printf("sum=%d\n",n);
}
この構文の実行直前まで,
sum=0かつ
n=1ならば,
sum |
|
を計算する.ただし,
breakにより,
sumの値が10000以上になると,この構文から完
全に抜け出す..
構文の内容は,次の通りである.
- 継続条件式はいつも1(真)なので,以下を実行する.
-4pt
- 「sum+nを計算し,その結果をsumに代入」を実行する.
- 「nの値を+1増加」を実行する.
- もし,sumが10000以上ならば,構文から抜ける.
- 「sum=値」と表示する.
- 一つ前の,アイテム「継続条件式はいつも1(真)なので,」に戻る.
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成18年5月8日