MMGamesロゴ  MMGames
Twitterシェアボタン  Facebookシェアボタン   
しんで覚えるC言語
しんで覚えるC言語

入力チェック

後判定と先判定
C言語には、全部で3つのループ文が用意されています。
while文、for文、そして、do(デュウ)~while文です。

while文とfor文についてはすでに説明しましたが、
実は、do~while文は、while文とほとんど同じです。
do~while文は、一般に、次のような書き方で使用します。

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

条件式の意味も動作も、while文とまったく同様です。
すなわち、条件式が真の間、繰り返す文の実行を繰り返すのです。
なお、書き方の違いとして、do~while文の場合には、
while文の条件式の()の後に;が必要になります。

do~while文とwhile文の唯一の違いは、
条件式が、後判定であるか先判定であるかの違いです。
while文は、繰り返す文の実行を行う前に条件式を判定します。
しかし、do~while文は、繰り返す文の実行後に条件式を判定します。

実は、これだけでは、あまり大きな違いにはなりません。
実際、while文でもdo~while文でも、同じ結果になることもあります。
その為、do~while文はあまり使われていません。

しかし、do~while文には、1つ大きな利点があります。
それは、繰り返し文が、必ず1回は実行されるという点です。

while文の場合、もしも初めから条件式が偽になっていたら、
繰り返し文が1回も実行されないまま終わってしまうことになりますが、
do~while文ならば、最低でも1回だけは実行されます。
入力チェック
do~while文の、必ず1回は実行されるという利点は、
なんと言っても、入力チェックの時に威力を発揮します。

たとえば、円の面積を計算するプログラムを作ってみます。
円の面積は、半径x半径x円周率です。
ここで、半径が負の値と言うのはおかしいですから、それをチェックします。

円周率はいくつ
コンピュータの世界では、円周率を3.14159で計算します。
これは、その次の桁まで表すと、3.141592、となり、
9と2の間で切り捨てても、誤差が大きくならないからです。

次は、ループを使用しない場合のチェックです。

do~while文
#include <stdio.h>

int main(void)
{

    int r;
    double s;

    printf("半径?:");
    scanf("%d", &r);

    if (r < 0) {
        printf("半径は負の値になりません。\n");
    } else {
        s = r * r * 3.14;
        printf("面積は %f です。\n", s);
    }

    return 0;
}

このプログラムを実行し、8を入力した結果は次の通りです。

実行結果
半径?:8 入力した値
面積は 200.960000 です。

このプログラムを実行し、-8を入力した結果は次の通りです。

実行結果
半径?:-8 入力した値
半径は負の値になりません。

これでも一応チェックはできていますが、ちょっと不親切です。
入力値が間違っているならば、再入力させることにしましょう。
次のプログラムは、while文で再入力を実装した例です。

do~while文
#include <stdio.h>

int main(void)
{

    int r;
    double s;

    printf("半径?:");
    scanf("%d", &r);

    while (r < 0) {
        printf("半径?:");
        scanf("%d", &r);
    }

    s = r * r * 3.14;
    printf("面積は %f です。\n", s);

    return 0;
}

このプログラムを実行し、-8、-5、8 を入力した結果は次の通りです。

実行結果
半径?:-8 入力した値
半径?:-5 入力した値
半径?:8 入力した値
面積は 200.960000 です。

見事に再入力が行われています。

しかし、今度の問題は、プログラム側にあります。
プログラムを見ると、scanf関数を2回使っていることがわかります。
同じデータの入力なのに、scanf関数を2回書くのはまさにムダです。
次のプログラムは、do~while文でこのムダをなくした例です。

do~while文
#include <stdio.h>

int main(void)
{

    int r;
    double s;

    do {
        printf("半径?:");
        scanf("%d", &r);
    } while (r < 0);

    s = r * r * 3.14;
    printf("面積は %f です。\n", s);

    return 0;
}

このプログラムを実行し、-8、-5、8 を入力した結果は次の通りです。

実行結果
半径?:-8 入力した値
半径?:-5 入力した値
半径?:8 入力した値
面積は 200.960000 です。

今度は、scanf関数は1回だけ書けば済みます。
必ず1回は実行されるという、do~while文の利点が生かされています。


本サイトについて

苦しんで覚える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

💬 コメント投稿欄を開く