while文

10.繰り返し while文 for文


同じようなことを繰り返させるのに,同じようなことをひたすら書き続けるのは大変ですね.
例えば1から10までの数字を表示させることを考えます.
馬鹿正直に1行づつ書くと、下のプログラムのようになります.
#include <stdio.h>

int main(void)
{
	printf("1\n\r");
	printf("2\n\r");
	printf("3\n\r");
	printf("4\n\r");
	printf("5\n\r");
	printf("6\n\r");
	printf("7\n\r");
	printf("8\n\r");
	printf("9\n\r");
	printf("10\n\r");
	
	return 0;
}

今回は10までの数字でしたが、10000までの数字を1つずつ表示するとなったらどうすればよいでしょうか。
こうした単純な繰り返しこそコンピュータの得意技です.繰り返しの制御構文にwhile文,for文などがあります.

while文について
繰り返し行う構文の一つです.

書式
while文で記述
(繰り返し開始時に行う処理)
while(条件式)
{
	繰り返したい処理
	・
	・
	・
	1周するごとに実行する文
}

while文は条件式が真のとき、{ }内の処理を繰り返します。
1から10000までの数字を表示させるプログラムをwhile文で記述します.
#include <stdio.h>

int main(void)
{
	int x = 1;
	while(x < 10001)
	{
		printf("%d\n\r", x);
		x++;
	}

	return 0;
}

動きを1行ずつ追っていきます.
まず,ループ用変数としてiが用意します.
次の行でwhile()に当たります.ループ条件は1<10001なので真です.{}内に進みます.
printf()で1を表示します.
i++でループ回数を1増やし,iは2になります.
}にあたったらwhile()に戻ります.
2<10001なので{}内に進みます.
3,4,...9999回も同様です.
10000回目 printf()で10000を表示します.
i++でiは10001になります.
100001 < 100001は偽です.{}を飛ばします.
return 0にあたり,プログラムを終了します.

これをいちいち1~10000までprintfを書くよりはるかに楽に記述できています.
また,繰り返し回数が変数にできるところも大きな利点です.

for文について
while文同様繰り返しを記述できる構文です.
while文への書き換えも可能ですが,どちらで記述した方が簡潔かは場合によりけりです.適切な使い分けをしましょう.

書式
	for(繰り返し開始時に行う式(初期化式); 条件式; 1周するごとに実行する式(更新式))
	{
		繰り返したい処理
		・
		・
		・
	}

1から10000まで出力するプログラムを書いてみます.

#include <stdio.h>
int main(void)
{
	int i;
	for(i = 0; i < 10000; i++)
	{
		printf("%d", i+1);
	}
	return 0;
}

最初for文に入ったとき,for文の最初の文が実行され,iに0が代入されます.
次に真ん中の継続条件判定が行われ,これが真であるとき{}の中が実行され続けます.
最初iは0であり,0<10000は真なので実行されます.
そして{}内に入りi+1,即ち1を出力します.
}に当たったらfor文の最後i++が実行され,iが1増えて1になります.
その次にfor文の継続条件判定を行います.1<10000は真なので実行されます.
2,3,4,...9999回目も同様です.
10000回出力後, i++の結果iが10000になると継続条件判定10000<10000が偽になるのでfor文から抜けます.
その下のreturn 0でプログラムが終了します.

簡潔にまとめるとこんな感じです.

int i; (繰り返しカウント用変数.)
for(i = 0; i < (繰り返したい回数); i++)
{
	繰り返したい処理
	・
	・
	・
}

このようにして全く等価なfor文とwhile文を書き換えられます.

for文で記述
for(初期化式; 条件式; 更新式)
{
	繰り返したい処理
	・
	・
	・
}

while文で記述
(初期化式)
while(条件式)
{
	繰り返したい処理
	・
	・
	・
	更新式
}


例題1 : 1つの正数nを入力し, 1+2+3+…nを計算し出力する(for文で)
#include <stdio.h>
int main(void)
{
	int i, n, answer = 0;
	printf("正整数を入力してください:"); scanf("%d", &n);
	for(i = 0; i < n; i++)
	{
		anwser += i+1;
	}
	printf("1から%dまでの総和は%dです", n, answer);
	return 0;
}

例題2 : 例題1をwhile文で
#include <stdio.h>
int main(void)
{
	int i = 0, n, answer = 0;
	printf("正整数を入力してください:"); scanf("%d", &n);
	while(i < n)
	{
		answer += i+1;
		i++;
	}
	printf("1から%dまでの総和は%dです", n, answer);
	return 0;
}
演習1 : 九九の表を出力する.
演習2 : 1つの正数nを入力し,素数かどうか判定する.