while 文

while 文


サイト全体の目次

稿


稿

while 文

このセクションのソース

/*01*/ #include <stdio.h>
/*02*/ 
/*03*/ main()
/*04*/ {
/*05*/   int x, wa = 0;
/*06*/ 
/*07*/   printf("入力された数の和を求めます。\n");
/*08*/   printf("整数を1つずつ入力してください。\n");
/*09*/   printf("「0」を入力すると入力を終了します。\n");
/*10*/ 
/*11*/   while(x != 0){
/*12*/     scanf("%d", &x);
/*13*/     wa += x;
/*14*/   }
/*15*/ 
/*16*/   printf("入力された数の和は %d です。\n", wa);
/*17*/ 
/*18*/   return 0;
/*19*/ }

list-2.4.1-11

while文は「条件が真のあいだ繰り返せ。」という、繰り返し処理機構です。書式は

while(条件式) 実行文;

となり、やはり複数の実行文を記述する場合はブロックを使用します。上のサンプルでは条件式が「 ( x != 0 ) 」となっているので「x」が「0」でない場合「真」となり、その間命令を繰り返せ、ということになります。その流れを簡単に書いておきましょう。

まず、最初に while 文にさしかかった時、最初の条件判断が行なわれます。このとき、x は不定であって0 ではないので、条件式はとなり、while 文は1回目のループを行ないます (*1) 。続いてループ中の scanf で x に「5」が取り込まれたとしましょう。ループが終わると2回目の条件判断が行なわれます。しかし、x は 0 ではない(x は 5)なので、まだ条件は真です。よってそのまま2回目のループが行なわれます。そうして、例えば5回目のループ中に scanf で x に「0」をとり込んだとしましょう。すると、ループが終わって6回目の条件判断をしますが、今度は、x は 0 であるから条件は偽になります。これにより while 文は6回目のループを行なわずに処理を終了します。

不定ということは 0 の可能性もあります。そうすると期待した動作が行われないことになります。このようなことを避けるためにも変数は使用する前に初期化しておいたほうがよいでしょう。

while 文に対し、「do while」文というのがあります。上の例の while 文のところを次のように直してみてください。

do{
    scanf("%d", &x);
    wa += x;
}while(x != 0);

while 文が、まず「条件判断をしてからループに入る」のに対し do while 文は「ループを実行してから条件判断する」となっています。つまり、ループは少なくとも1回は必ず実行されるわけです。逆に言うと、この文は「最低でも1回は処理が必要」な場合に使われます。上のような流れを書くと次のようになります。

まず最初に do while 文にさしかかると、何はともあれ1回目のループが行なわれます。そこで scanf により x に「5」がとり込まれたとしましょう。ループが終わると1回目の条件判断が行なわれますがx は 0 ではない(真)なので2回目のループが行なわれます。同様の手順で5回目のループまで行き、そこで x に「0」がとり込まれたとしましょう。ループが終わると5回目の条件判断が行なわれますが、今度はx は 0 である(偽)なので6回目のループに入らずに処理を終了します。

今回の場合、ループの前に変数を初期化していないので、不定値による評価を避けるために do 文を使ったほうが確実です。このように、「while」と「do while」は状況に応じて使い分けてください。

さて、これら2つの文でも for 文のところで書いた無限ループが使えます。条件式の部分に非ゼロ値を書けば無限ループとなります。

練習問題

問題-2.4.1

数当てゲームを作ってください。当てる数ははじめからプログラムに組み込んでしまってかまいません。ユーザが数字を入力して、当たるまで繰り返させます。ただし、ハズレの場合は「大きい」とか「小さい」とか「100 以内」などのようにメッセージを出すようにしましょう。

練習問題回答例

問題-2.4.1

#include <stdio.h>
#include <math.h>	/* abs 関数を使うのに必要 */

main()
{
	/* 次の変数を用意しておく
	i	入力回数をカウントする
	ans	正解を入れておく
	x	入力された値を入れる
	sa	ans と x の差を入れる
	abs_sa	sa の絶対値を入れる */
	int i = 1, ans, x, sa, abs_sa;

	/* 正解を決めておく */
	ans = 512;

	printf("数当てゲームスタート\n");

	while(1){
		printf("%d回目 -> ", i);
		scanf("%d", &x);
		sa = ans - x;
		abs_sa = abs(sa);	/* abs 関数で絶対値を求める */

		/* 正解ならばループから抜ける */
		if(sa == 0){
			printf("正解です!\n");
			break;
		}

		printf("答えは");

		/* 正解との差の絶対値によって、どれだけ離れているかの
		ニュアンスを分ける。プラス側に大きいのかマイナス側に
		大きいのかはあとから付け加えることにする */
		if(abs_sa <= 5){
			printf("あとほんの少し");
		}else if(6 <= abs_sa && abs_sa <= 20){
			printf("もうちょっと");
		}else if(21 <= abs_sa && abs_sa <= 100){
			printf("もっと");
		}else if(101 <= abs_sa && abs_sa <= 500){
			printf("もっともっと");
		}else{
			printf("ぜ~んせん");
		}

		/* 差が正か負かによって大きい小さいの区別を付け加える */
		if(sa < 0){
			printf("小さいよ。\n");
		}else{
			printf("大きいよ。\n");
		}

		i++;	/* 回数のカウントを増やしておく */
	}

	return 0;
}


読み込み中・・・
10秒待っても表示が変わらない場合、次の理由が考えられます。
・Javascript が無効になっています。
・検索エンジンのキャッシュを見ています。
サイトホームへ / 上位ページへ / ページトップへ / PAROFトレンドショッピングへ
Copyright (C) 2010 totobon all right reserved.