第三回(for文、while文)


繰り返し処理

何か文字を繰り返したいときってありますよね?もしくは、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(初期化 ; 条件 ; 処理(再初期化)です。

初期化

まず、初期化です。forの構文があると、必ず一番最初に1回通る場所であり、1つのfor文につき、必ず1回しか通りません。

条件

for文の真ん中にあるのが条件です。ここへの書き方はifの条件に近いです。ここに書かれる条件が満たされている間のみ繰り返されます。

処理(再初期化)

そして、最後にあるのが処理(再初期化)です。これはfor文内を一番最後まで通った後に1度通ります。

for文の流れ

まず、初期化を行います。次に条件を確認し、条件を満たしていたら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、四重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で実行すると・・・

%dの実行結果
 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
%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

while文

では次にwhile文の説明を行います。while文もfor文と同様に繰り返しに使う制御構文です。while文の形式はwhile(条件)です。

while文の流れ

while文の流れは、まず条件を確認します。条件を満たしていれば、while文の中に入り、満たしていなければ、while文の中に入らず、while文の処理は終了します。 そして、while文の中に入った場合、while文の一番最後までいくと、再び条件を確認します。そして、条件を満たしていれば再びwhile文の中に入り、 満たしていなければ、そこでwhile文の処理は終了します。

ではfor文同様、擬似的なプログラムを見てみましょう。

サンプルソース
#include<stdio.h>

int main(void);

int main(void){
	
	while(条件){
		処理
	}
	
	return(0);
}
では、再び、"x = 1"、"x = 2"、"x = 3"・・・"x = 10"まで表示するプログラムで例を示します。
サンプルソース
#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文

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文の使い分け

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文での無限ループの例を示します。実行結果は無限に表示されるので、省略します。

for文の無限ループのサンプルソース
#include<stdio.h>

int main(void);

int main(void){
	
	int i;
	
	for(i = 0;; i++){
		printf("%d", i);
	}
	
	return(0);
}
while文の無限ループのサンプルソース
#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文

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文

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・・・

次回予告

次回は関数について説明します。

戻る