繰り返し文
プログラムでは先ほどのような分岐処理以外にも特定の処理を繰り返すということがあります。
例えばある単語が出てくるまで、ファイルを1行ずつ読み込んでいくという処理を繰り返すといった具合です。
そういった処理を行うときに使用するのが繰り返し文となります。繰り返し文のことをループ文ともいいます。
繰り返し文には、「for」「while」「do while」というものがあります。
for文
forの基本書式
for文の書式は以下のようになります。for文は繰り返しの回数が決まっている場合によく使用されます。
for( 初期値; 継続条件; 増分){ 文; }
初期値のところには初期化の処理が行えます。
継続条件はここの式が真の間、処理が繰り返されることになります。
継続条件に当てはまらなくなったときに処理が終了します。
増分のところにはこのループを継続させる際のカウンタとなる変数などを1回処理が終わるごとに
どれだけ増やす(減らす)のかを指定します。
先ほどの構文で出てきた初期値、継続条件、増分の3個の式は省略が
可能です。初期値だけ省略するといったことができます。またすべて省略することも可能です。
ただしこの場合、繰り返し処理が無限に続く形となりますので、何かをトリガーとして終了する処理を
実装しておく必要があります。
継続条件を指定しない場合にループを終了させるには、さきほどswitch文で出てきた「break」を使用します。
break文の役割にはswitch文の終了やループ文の終了といったものがあります。
for(;;){ 文; if(条件式){ break; } }
無限にループさせたい場合は上記のようにfor文の3つの式を省略します。
ある条件になったとき無限ループを終了させる場合には、break文を入れます。
コードで確認
では実際にfor文を使用してみます。
例として1から10の合計値を出してみます。
#include <stdio.h> int main(void){ int i; int sum = 0; for(i = 1; i <= 10; i++){ sum += i; } printf("合計値は%dn",sum); return(0); }
~~~~実行結果~~~~
合計値は55
~~~~~~~~~~~~
順に見ていきます。
for文の初期値のところで変数iに1を代入して初期化しています。1から加算するためです。
次の継続条件で変数iの値が10以下の間となっています。増分のところで変数iをインクリメントしています。
つまり処理が一回終わるごとに変数iは1ずつ加算されていくことになります。最初の処理の時はiは1となります。
変数sumには0+1の結果が格納されます。
次の処理の時はiが2になります。これを繰り返して10を超えたときにfor文が終了します。
繰り返される処理は合計値を表すための変数sumに変数iの値を足していってます。
次に無限ループを見てみましょう。
#include <stdio.h> int main(void){ int i; int sum = 0; for(i = 1; ; i++){ sum += i; if( sum > 100){ break; } } printf("合計値は%dn",sum); return(0); }
~~~~実行結果~~~~
合計値は105
~~~~~~~~~~~~
for文のところを見てもらうと継続条件を省略しています。
継続条件がないということで無限ループとなります。このままではいつまでもプログラムが終了しないので
終了させるための条件を入れる必要があります。
そのために分岐文を使用して、足し算を行ったあと100を超えていたら終了するようにしています。
105となった時点でif文の条件式が真と判定されて、break文が実行されループが終了します。
このように繰り返し文の中に分岐文をいれたり、その逆に分岐文の中に繰り返し文を入れることをネスト(入れ子)と
いいます。
先ほどのループの部分は以下のように書き換えても同様の処理となります。
for(i = 1; sum <= 100 ; i++){ sum += i; }
for文のネスト
if文やfor文はネスト(入れ子)することができます。この後出てくるwhile文でも可能です。
ネストというのはループ文の中にさらにループ文を入れることを言います。forの中にforを再度記述するといった
処理のことです。。
コードで確認
では利用してみましょう。画面に「*」を四角形に表示させてみます。
#include <stdio.h> int main(void){ int num = 5; int i,j; for( i = 0; i < num; i++){ for( j = 0; j < num; j++){ printf("*"); } printf("n"); } return(0); }
~~~~実行結果~~~~
*****
*****
*****
*****
*****
~~~~~~~~~~~~
コードを見てみます。
まずアスタリスクを横に指定回数文表示させることを
考えます。
この場合、1個表示させるという処理を5回繰り返せばよいわけですね。それが内側のforのところになります。
これで終わってしまうと「*****」にしかならないため、この横に5回表示させたのを5回縦に繰り返す形となります。
5回横に表示させると1度改行を挟み、また5回横に表示させると改行という流れになります。
縦への繰り返しが外側のforの部分となります。
このような使い方をするのがネストとなります。
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載