苦しんで覚えるC言語

回数不明ループ


第1項:回数を求めるループ

前章で解説したfor文は、決まった回数だけ繰り返す文でしたが、
それとは逆に、何回繰り返せば良いのか知りたい場合もあるでしょう。
それの面白い例としては、ねずみ算の計算があります。

ある小学生が、親に頼みました。
「今月は1円、来月は2円、再来月は4円と、
先月の倍額のおこずかいをちょうだい」
さて、親が払う金額が100万円を超えるのは何ヶ月目でしょうか?
この計算自体は、数学的に求めることも可能なのですが、
今回は、ループを使って計算してみることにします。
for文を使って求めることも出来ますが、この様な場合には、
for文よりも、while(ホワイル)文が適しています。
while文は、一般に、次のような書き方で使用します。

while (条件式) {
繰り返す文;
}
これを見ていただくとわかりますが、要するに、
for文で、条件式しか指定しない場合と同じことなのです。
for文では、初期化と更新が使えるので、定数回ループが簡単に書けるのですが、
ループの回数がわからない場合は、条件式だけのwhile文が便利です。

先ほどの計算をwhile文で行うには、
while文の条件に100万円より少ない間は繰り返しを続けるよう指定し、
繰り返し文の中でお金を倍々にしていけば良いのです。
次のプログラムは、これを計算する例です。

#include <stdio.h>

int main(void)
{
	double money = 1;
	int month = 1;
	
	while (money < 1000000) {
		printf("%02d 月目 : %7.0f 円\n",month,money);
		money *= 2;
		month++;
	}
	printf("%02d 月目 に %7.0f 円となり、100万円を超える。\n",month,money);
	
	return 0;
}
このプログラムの実行結果は、次の通りになります。

01 月目 :    1 円
02 月目 :    2 円
03 月目 :    4 円
04 月目 :    8 円
05 月目 :   16 円
06 月目 :   32 円
07 月目 :   64 円
08 月目 :   128 円
09 月目 :   256 円
10 月目 :   512 円
11 月目 :  1024 円
12 月目 :  2048 円
13 月目 :  4096 円
14 月目 :  8192 円
15 月目 :  16384 円
16 月目 :  32768 円
17 月目 :  65536 円
18 月目 : 131072 円
19 月目 : 262144 円
20 月目 : 524288 円
21 月目 に 1048576 円となり、100万円を超える。
まず、何故double型で計算しているのかと言いますと、
16ビットコンパイラの LSI-C86 ではint型では百万を記憶出来ないためです。
そのほかのコンパイラでは問題ないので、各自でint型に直してみて下さい。

int型よりもサイズの大きいlong(ロング)型を使えば扱えますが、
例題のプログラム程度では、long型を必要とすることはあまりないので、
long型についての説明は後回しとさせていただきます。
このプログラムのポイントは、条件の部分にあります。
条件として money<1000000 を指定しています。
while文は、この条件が真の間、つまり、金が100万円より小さい間は、
繰り返し文の money*=2 の文を実行し続けます。
そして、金が100万円を超えた時に繰り返しを終わります。
そして、最後のprintf文で、100万円を超えたことを表示します。

この様に、for文でもwhile文でも、
条件に指定した変数を変化させながら繰り返す点では共通しています。
そうしないと、条件が同じままなので、無限ループになってしまいます。

目次に戻る

第2項:for文との交換性

前項で説明した通り、while文は、for文の条件式だけと同じです。
逆に言えば、for文はwhile文を拡張した文だと言えるでしょう。

実は、この2つは、同じような使い方をすることが可能です。
while文をfor文のように使う場合、次のようにします。

初期化;
while (条件式) {
	  繰り返す文;
	  更新;
}
この様にすれば、while文でも、定数回のループを実現出来ます。
逆に、for文をwhile文のように使う場合、
初期化と更新の文を省略するだけです。

ただし、慣習として、for文は定数回のループに使用し、
while文は、そうではないループに使用することがほとんどです。
良く似ている2つの文ですが、うまく使い分けて下さい。

目次に戻る