前章で解説したfor文は、決まった回数だけ繰り返す文でしたが、
それとは逆に、何回繰り返せば良いのか知りたい場合もあるでしょう。
それの面白い例としては、ねずみ算の計算があります。
ある小学生が、親に頼みました。この計算自体は、数学的に求めることも可能なのですが、
「今月は1円、来月は2円、再来月は4円と、
先月の倍額のおこずかいをちょうだい」
さて、親が払う金額が100万円を超えるのは何ヶ月目でしょうか?
これを見ていただくとわかりますが、要するに、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; }
まず、何故double型で計算しているのかと言いますと、
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万円を超える。
このプログラムのポイントは、条件の部分にあります。
int型よりもサイズの大きいlong(ロング)型を使えば扱えますが、
例題のプログラム程度では、long型を必要とすることはあまりないので、
long型についての説明は後回しとさせていただきます。
この様に、for文でもwhile文でも、
条件に指定した変数を変化させながら繰り返す点では共通しています。
そうしないと、条件が同じままなので、無限ループになってしまいます。
前項で説明した通り、while文は、for文の条件式だけと同じです。
逆に言えば、for文はwhile文を拡張した文だと言えるでしょう。
実は、この2つは、同じような使い方をすることが可能です。
while文をfor文のように使う場合、次のようにします。
この様にすれば、while文でも、定数回のループを実現出来ます。初期化; while (条件式) { 繰り返す文; 更新; }
ただし、慣習として、for文は定数回のループに使用し、
while文は、そうではないループに使用することがほとんどです。
良く似ている2つの文ですが、うまく使い分けて下さい。