繰り返し文 その2
前回は繰り返し分のforについて述べました。今回はそれ以外の繰り返し文について説明したいと思います。
while文
繰り返し文にはwhile文というものもあります。
while文の書式は以下のようになります。
while( 継続条件 ){ 文; }
While文ではfor文と違い初期値や増分の指定はありません。
継続条件が真の間、内部の処理が行われる形となります。
継続条件が最初から偽の場合は何も中の処理が行われずwhile文は終了します。
while文は先に判定を行ってから処理を行うので前判定といわれます。
while文は繰り返し回数の決まっていないときに使用されることが多くなっています。
継続条件に1を指定することで継続条件が真となり無限ループにすることができます。
その際は先ほどのfor文でも述べたように処理のところにbreak文をいれてwhile文を終了させなければ
なりません。
コードで確認
では実際使用してみましょう。
前回のでforを使用して作成したプログラムを使用することにしましょう。
先ほどの1から順番に足していって100を超えたら終了するという処理をwhile文で書いてみます。
#include <stdio.h> int main(void){ int i = 0; int sum = 0; while(sum <= 100){ sum += i; i++; } printf("合計値は%dn",sum); return(0); }
~~~~実行結果~~~~
合計値は105
~~~~~~~~~~~~
実行結果はfor文のところと同じく105となります。
for文では初期化とカウンタの増減をfor文の()のところで指定していましたが、while文では継続条件だけを
指定します。
そのため、初期化は使用前に行い、カウンタの増減は繰り返し処理の中で行っています。
以下の処理は同じことを行っています。
do while文
while文と同様に継続条件が真の間処理が繰り返されるものとなります。
while文との違いとしてwhile文では継続条件が偽となった場合に一度も処理が行われないのに対して、
do while文は継続条件が偽となる場合でも一度は処理が行われるようになっています。
そうした動きをすることからwhile文が前判定といわれるのに対して、do while文は後判定といわれます。
do while文の書式は以下のようになっています。
do{ 文; }while(継続条件);
書式で気を付けるべきところとしては継続条件の最後に「;」(セミコロン)をつけるところです。
前判定と後判定は以下のようなフローとなります。
コードでの確認
では実際に使用してみましょう。
20歳以上かどうかを問われてYESなら1をNOなら2を入力するというプログラムを考えます。それ以外の数の場合は
再度選択させるようにします。
#include <stdio.h> int main(void){ int num = 0; do{ printf("20歳以上ですか?YES:1 NO:2n"); scanf(“%d”, &num); }while(num != 1 && num != 2); return (0); }
処理を見てみましょう。
print文で20以上かどうなのかを問う文章を表示させています。
その次にscanf文を使用しています。
このscanf文はキーボードからの入力を受け付ける関数となります。キーボードからの入力をprintfと同じように
書式指定することでその形式にあった形で入力されます。「%d」と書式指定しているので入力されたものは
整数値として扱われます。第二引数には入力されたものを格納する変数を指定します。今回は入力されたものを
整数値として受け取る書式指定をしているので、int型の変数を指定します。このときprintf文と違い
変数のアドレスを指定する必要があるので頭に「&」をつけなければなりません。のちに詳しく出てきます。
今回のプログラムの場合、一度は年齢を問い合わせる処理を行わなければならないので
do while文を使用しています。そして1か2以外の数値が入力されるまでは、再度問い合わせる処理を
行っています。
このように1度は文の実行が行われるのがdo while文となります。
■continue文
continue文自体は繰り返しを行うものではありません。しかしforやwhile、do while文などの中で使用される
ものとなります。
continue文の動作は繰り返し処理をスキップするものです。
これを使用することでbreak文では繰り返し処理が完全に終わってしまいますが、continue文より後ろの処理が
スキップされて継続条件の判定に戻るという動作をさせることができるようになります。
構文はスキップさせたいところで「continue;」とやります。
コードで確認
では実際に使用してみましょう。10以下の偶数だけの足し算を行っています。
#include <stdio.h> int main(void){ int i = 0; int sum = 0; while( i < 10){ if( i % 2){ i++; continue; } sum += i; i++; } printf("10以下の偶数の合計値は%dn",sum); return 0; }
~~~~実行結果~~~~
10以下の偶数の合計値は30
~~~~~~~~~~~~
ではコードを見てみましょう。
if文の条件式のところをみると2で割ったあまりが1になるとき真と判定するようになっています。
真と判定された場合、continue文が実行される形となります。このように条件分岐とセットで使用されることが
多い構文です。
このときの処理で気を付けなければならないのは変数iを加算しないと無限ループから抜けられなくなるということです。
変数iを加算する処理はループの処理の最後にあるため、スキップした場合は加算されずに同じiの値で処理が
続いてしまうことになります。
そのためスキップする前にiを加算しています。
■文の注意
if文、for文、while文、do~while文では「{}」を省くことができます。
基本的にifやforなどは後ろの1文が操作の対象になります。以下のコードを見て下さい。
#include <stdio.h> int main(void){ int num = 4; if(num >= 5) while(num < 10) num++; else while(num > 0) num--; printf("%dn",num); return(0); }
~~~~実行結果~~~~
0
~~~~~~~~~~~~
先ほど述べたように制御文の「{}」は省略が可能です。省略されたときは
後ろの1文だけがその操作対象となります。上のwhile文であれば処理する1文が「num++」となり、
下のwhile文であれば「num–」が1文となり、そこまでをひと塊として1つのwhile文となります。
ifにも「{}」がついていないので処理する1文はwhile文1つということになります。elseの範囲も後ろのwhile文1つ
ということになります。そのため最後のprintf関数はif文にもwhile文にも入っていないことになります。
[num++」の後ろにprintf関数を書いてみてください。コンパイルエラーとなります。そのため複数の処理が必要な場合は
複合文を使用しなければなりません。複合文は「{}」の間が1文とみなされます。「{}」を使用して書き直すと以下のように
なります。
if(num >= 5){ while(num < 10){ num++; } }else{ while(num > 0){ num--; } } printf("%dn",num);
分岐処理や繰り返し処理はプログラムの中で非常によく目にすることになると思いますので、よく覚えておいてください。
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載