/*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*/ }
while(条件式) 実行文;
まず、最初に while 文にさしかかった時、最初の条件判断が行なわれます。このとき、x は不定であって0 ではないので、条件式は真となり、while 文は1回目のループを行ないます (*1) 。続いてループ中の scanf で x に「5」が取り込まれたとしましょう。ループが終わると2回目の条件判断が行なわれます。しかし、x は 0 ではない(x は 5)なので、まだ条件は真です。よってそのまま2回目のループが行なわれます。そうして、例えば5回目のループ中に scanf で x に「0」をとり込んだとしましょう。すると、ループが終わって6回目の条件判断をしますが、今度は、x は 0 であるから条件は偽になります。これにより while 文は6回目のループを行なわずに処理を終了します。
while 文に対し、「do while」文というのがあります。上の例の while 文のところを次のように直してみてください。
do{
scanf("%d", &x);
wa += x;
}while(x != 0);
まず最初に do while 文にさしかかると、何はともあれ1回目のループが行なわれます。そこで scanf により x に「5」がとり込まれたとしましょう。ループが終わると1回目の条件判断が行なわれますがx は 0 ではない(真)なので2回目のループが行なわれます。同様の手順で5回目のループまで行き、そこで x に「0」がとり込まれたとしましょう。ループが終わると5回目の条件判断が行なわれますが、今度はx は 0 である(偽)なので6回目のループに入らずに処理を終了します。
今回の場合、ループの前に変数を初期化していないので、不定値による評価を避けるために do 文を使ったほうが確実です。このように、「while」と「do while」は状況に応じて使い分けてください。
さて、これら2つの文でも for 文のところで書いた無限ループが使えます。条件式の部分に非ゼロ値を書けば無限ループとなります。
数当てゲームを作ってください。当てる数ははじめからプログラムに組み込んでしまってかまいません。ユーザが数字を入力して、当たるまで繰り返させます。ただし、ハズレの場合は「大きい」とか「小さい」とか「100 以内」などのようにメッセージを出すようにしましょう。
#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;
}