何か文字を繰り返したいときってありますよね?もしくは、1、2、3、4・・・のように規則的に表示していきたい場合もありますよね?まずは、今までの知識でやってみましょう。
では、"x = 1"、"x = 2"、"x = 3"・・・"x = 10"まで表示してみましょう。
#include<stdio.h> int main(void); int main(void){ printf("x = 1\n"); printf("x = 2\n"); printf("x = 3\n"); printf("x = 4\n"); printf("x = 5\n"); printf("x = 6\n"); printf("x = 7\n"); printf("x = 8\n"); printf("x = 9\n"); printf("x = 10\n"); return(0); }
x = 1 x = 2 x = 3 x = 4 x = 5 x = 6 x = 7 x = 8 x = 9 x = 10
このようにプログラムで書くのは、非常にめんどくさいです。これを解決したのがfor文、while文です。
まず、for文の説明から行います。forの形式は、for(初期化 ; 条件 ; 処理(再初期化)です。
まず、初期化です。forの構文があると、必ず一番最初に1回通る場所であり、1つのfor文につき、必ず1回しか通りません。
for文の真ん中にあるのが条件です。ここへの書き方はifの条件に近いです。ここに書かれる条件が満たされている間のみ繰り返されます。
そして、最後にあるのが処理(再初期化)です。これはfor文内を一番最後まで通った後に1度通ります。
まず、初期化を行います。次に条件を確認し、条件を満たしていたらfor文の中に入り、条件を満たしていない場合はfor文の処理は終了します。 条件を満たしていた場合、for文の中の処理を行います、そして、for文の最後まで行くと、処理(再初期化)のところに行き、何らかの処理(書かない場合は 何もおきません)をした後にもう一度、条件を確認して満たしていたらfor文内へ(これ以降は満たさないときまで繰り返されます)。 満たしていなかったらfor文の処理は終了する、という流れです。
では、擬似的なプログラムで見てみましょう。
#include<stdio.h> int main(void); int main(void){ for(初期化; 条件; 処理(再初期化){ 中での処理 } return(0); }
次に、実際に上で示した繰り返しプログラムをfor文で書いた例を見てみましょう。 (ここで出てくるi++とはインクリメントと言って、変数iの値を1増やす処理のことです。詳しくは後述します。)
#include<stdio.h> int main(void); int main(void){ int i; for(i = 1; i <= 10; i++){ printf("x = %d\n", i); } return(0); }
x = 1 x = 2 x = 3 x = 4 x = 5 x = 6 x = 7 x = 8 x = 9 x = 10
for文の中の処理が1行のものを単文、for文の中の処理が2行以上のものを複文といいます。単文の場合、for文の書き方を少し省略することができます。 以下は例です。(実行結果は上のものと一緒です。)
#include<stdio.h> int main(void); int main(void){ int i; for(i = 1; i <= 10; i++) printf("x = %d\n", i); return(0); }
また、単文の場合はこれでもいけます。
#include<stdio.h> int main(void); int main(void){ int i; for(i = 1; i <= 10; i++)printf("x = %d\n", i); return(0); }
ちなみに、この書き方はwhile文、if文でも可能です。
二重forとは名前のまま、二重のforです。もちろんながら、三重for、四重forもあります。(四重forなんて、まず使うことはないと思いますが・・・) では、まず九九を出力するプログラムの例を見てみましょう。
#include<stdio.h> int main(void); int main(void){ int i, j; for(i = 1; i < 10; i++){ for(j = 1; j < 10; j++){ printf(" %2d ", i * j); } printf("\n"); } return(0); }
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
for文とは関係ないですが、%2dのように数字を入れると、1桁の数字でも2桁と同じスペースを用意してくれます。ちなみに、%d、%3dで実行すると・・・
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
では次にwhile文の説明を行います。while文もfor文と同様に繰り返しに使う制御構文です。while文の形式はwhile(条件)です。
while文の流れは、まず条件を確認します。条件を満たしていれば、while文の中に入り、満たしていなければ、while文の中に入らず、while文の処理は終了します。 そして、while文の中に入った場合、while文の一番最後までいくと、再び条件を確認します。そして、条件を満たしていれば再びwhile文の中に入り、 満たしていなければ、そこでwhile文の処理は終了します。
ではfor文同様、擬似的なプログラムを見てみましょう。
#include<stdio.h> int main(void); int main(void){ while(条件){ 処理 } return(0); }
#include<stdio.h> int main(void); int main(void){ int i = 1; while(i <= 10){ printf("x = %d\n", i); i++; } return(0); }
x = 1 x = 2 x = 3 x = 4 x = 5 x = 6 x = 7 x = 8 x = 9 x = 10
標準入力関数getchar()を使うとこのようなこともできます。
#include<stdio.h> int main(void); int main(void){ char c; while((c = getchar()) != '\n'){ printf("c = %c\n", c); } return(0); }
RCCと入力した場合、 RCC c = R c = C c = C
do-while文とwhile文との違いは、一番最初に条件を確認せず、一度だけ必ずdo-while文中の処理を行います。流れ的には まず、一度中の処理を行います。そして、最後まで行くと条件を確認します。そして、条件を満たしていた場合は処理を繰り返します。 満たしていない場合はdo-while文の処理を終了します。
do-while文の例のプログラムを示してみます。
#include<stdio.h> int main(void); int main(void){ int x = 1; do{ printf("x = %d\n", x); x++; }while(x <= 10); return(0); }
x = 1 x = 2 x = 3 x = 4 x = 5 x = 6 x = 7 x = 8 x = 9 x = 10
for文でも、while文でも、同様の処理が可能です。どちらのほうが楽か、どっちを使った方がいいかはなんとも言えません。これはもう慣れだと思います。 しかし、どちらかを使えないと後々後悔するので、両方使えるようにはしておきましょう。
インクリメントとは整数型(int型)の変数の値を1増やす処理のことを言います。デクリメントはその反対で変数の値を1減らす処理のことです。 例としては、変数iの場合、i++; --i;等のことです。++が1増やす処理で。--が1減らす処理です。
実はi++; と、++i; は代入を行う場合、意味合いが大きく違います。以下ではそれの説明を行います。
++(--)が変数の前についているものの演算を前置演算と言います。また、++(--)が変数の後ろについているものの演算を後置演算と言います。 前置演算は先に変数の値を増やし、後置演算は後で変数の値を増やします。i++や、++i単体でははっきり言って変化はないのですが、代入を行った場合は変化があります。
では、実際に見てみましょう。
#include<stdio.h> int main(void); int main(void){ int i = 0, j = 0; i = ++j; printf("i = %d\nj = %d\n", i, j); return(0); }
i = 1 j = 1
#include<stdio.h> int main(void); int main(void){ int i = 0, j = 0; i = j++; printf("i = %d\nj = %d\n", i, j); return(0); }
i = 0 j = 1
このように、代入を行ったときは大きく違います。そのため、代入を行うときは気をつけましょう。
無限ループという言葉は聞いたことがある人もいるかもしれませんが、名前のとおり、無限にループする処理のことです。これは条件がない、 またはどれだけ回っても条件を満たさないときに起こりえます。以下ではfor文とwhile文での無限ループの例を示します。実行結果は無限に表示されるので、省略します。
#include<stdio.h> int main(void); int main(void){ int i; for(i = 0;; i++){ printf("%d", i); } return(0); }
#include<stdio.h> int main(void); int main(void){ int i = 0; while(1){ printf("%d", i); i++; } return(0); }
#include<stdio.h> int main(void); int main(void){ int i; for(i = 0; i >= 0; i++){ printf("%d", i); } return(0); }
break文はswitch文のときにも出てきましたが、繰り返し処理の中でif文の中に書くことでも使われています。break文に入ると、繰り返し処理、 つまりfor文やwhile文から抜けます。以下にサンプルソースを示します。
#include<stdio.h> int main(void); int main(void){ int x; for(x = 1;; x++){ printf("x = %d\n", x); if(x == 10){ break; } } return(0); }
x = 1 x = 2 x = 3 x = 4 x = 5 x = 6 x = 7 x = 8 x = 9 x = 10
continue文は、繰り返し処理をスキップして、その繰り返し処理の最初に戻るという処理を行うプログラムです。 下は例のプログラムです。
#include<stdio.h> int main(void); int main(void){ int x = 1; for(;; x++){ printf("x = %d\n", x); if(x == 10){ break; } if(x % 3 == 0){ printf("!"); continue; } } return(0); }
x = 1 x = 2 x = 3 !x = 4 x = 5 x = 6 !x = 7 x = 8 x = 9 !x = 10
0〜100までの偶数を表示するプログラムをfor、またはwhileを用いて作成してください。
好きな数字を入力して、1からその好きな数までのFizz Buzzプログラムを作成してください。Fizz Buzzプログラムとは、 数字が3で割り切れるならFizzを、5で割り切れるなら、Buzzを、3でも、5でも割り切れるなら、Fizz Buzzと表示するプログラムです。
例:1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11・・・次回は関数について説明します。