MMGamesロゴ  MMGames
Twitterシェアボタン  Facebookシェアボタン   
 English 

しんで覚えるC言語
しんで覚えるC言語

回数不明ループ

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

実行結果
ある小学生が、親に頼みました。「今月は1円、来月は2円、再来月は4円と、先月の倍額のおこずかいをちょうだい」さて、親が払う金額が100万円を超えるのは何ヶ月目でしょうか?

この計算自体は、数学的に求めることも可能なのですが、
今回は、ループを使って計算してみることにします。
for文を使って求めることもできますが、この様な場合には、
for文よりも、while(ホワイル)文が適しています。
while文は、一般に、次のような書き方で使用します。

while文
while (条件式) {
    繰り返す文;
}

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

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

while文
#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型に直してみてください。

long(ロング)型
int型よりもサイズの大きいlong(ロング)型を使えば扱えますが、
例題のプログラム程度では、long型を必要とすることはあまりないので、
long型についての説明は後回しといたします。

このプログラムのポイントは、条件の部分にあります。

条件として money<1000000 を指定しています。
while文は、この条件が真の間、つまり、金が100万円より小さい間は、
繰り返し文の money*=2 の文を実行し続けます。
そして、金が100万円を超えた時に繰り返しを終わります。
そして、最後のprintf文で、100万円を超えたことを表示します。

この様に、for文でもwhile文でも、
条件に指定した変数を変化させながら繰り返す点では共通しています。
そうしないと、条件が同じままなので、無限ループになってしまいます。
for文との互換性
前項で説明した通り、while文は、for文の条件式だけと同じです。
逆に言えば、for文はwhile文を拡張した文だと言えるでしょう。

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

while文
初期化;
while (条件式) {
    繰り返す文;
    更新;
}

この様にすれば、while文でも、定数回のループを実現できます。
逆に、for文をwhile文のように使う場合、
初期化と更新の文を省略するだけです。

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


本サイトについて

苦しんで覚えるC言語(苦C)は
C言語入門サイトの決定版です。
C言語の基本機能を体系立てて解説しており、
市販書籍と同等以上の完成度です。

第0部:プログラム概要編
  1. プログラムとは何か?
2章:プログラムの書き方
  1. 書き方のルール
  2. 書き方の慣習
  3. 練習問題2
3章:画面への表示
  1. 文字列の表示
  2. 改行文字
  3. 練習問題3
6章:キーボードからの入力
  1. 入力用の関数
  2. 入力の恐怖
  3. 練習問題6
9章:回数が決まっている繰り返し
  1. 繰り返しを行う文
  2. ループ動作の仕組み
  3. 練習問題9
10章:回数がわからない繰り返し
  1. 回数不明ループ
  2. 入力チェック
  3. 練習問題10
13章:複数の変数を一括して扱う
  1. 複数の変数をまとめて扱う
  2. 配列の使い方
  3. 練習問題13
20章:複数のソースファイル
  1. 最小限の分割
  2. 分割の定石
  3. 練習問題20

コメント
COMMENT

💬 コメント投稿欄を開く