for 文と同様、ある処理を繰り返し実行するためのものだが、for 文と違うのは while 文で指定
するのは、継続条件のみであるということ。
for 文で書かれた左のプログラムを、while 文で書き換えると右のようになる。
同じ色でマーキングされたところが、対応する処理内容。見て分るとおり、書き方は異なるが、
プログラム実行に必要な要素は、両方とも同じである。
つまり、基本的に for 文で書かれたプログラムは while 文で書き換えることができるし、当然そ
の逆も言える。
/* 読込んだ正の整数値までカウントアップ (for 文) */ #include <stdio.h> main() { int i, no; printf(“正の整数を入力して下さい:”); scanf(“%d”, &no);for (i = 0; i <= no; i++) { printf(“%d ”, i); } printf(“¥n”); } /* 読込んだ正の整数値までカウントアップ (while 文) */ #include <stdio.h> main() { int i=0; int no; printf(“正の整数を入力して下さい:”); scanf(“%d”, &no); while (i <= no) { printf(“%d ”, i); i++; } printf(“¥n”); } 次の文を、while 文で書き換えよ。 #include <stdio.h> main() { int no , total, i; total = 0; no = 10;
for (i = 1; i <= no; i++) { total += i;
}
printf(“1 から%d までの和は%d です。¥n”, i, no, total); }
/* 読込んだ正の整数値は奇数か偶数か */ #include <stdio.h> main() { int no; do { printf(“正の整数を入力して下さい:”); scanf(“%d”, &no); if (no <= 0) { printf(“正の整数です!!¥n”); } } while (no <= 0); if (no % 2) { printf(“%d は奇数です。¥n”, no); } else { printf(“%d は偶数です。¥n”, no); } }
4-5 do~while 文
今までは範囲外の数値が入力されたときは、
エラー表示をして終了していた。しかし実際は、
適切な数値が入力されるまで、入力を促すこと
が多い。そんなとき使えるのが do~while 文で
ある。
右のプログラムはその例。do{ }で処理を囲み、
最後の while で継続条件を判定し。もし( )内の
条件を満たしていれば、再び{ }内の処理を繰り
返し、そうでなければ次の行に移る。
while 文と違うのは、継続判定が最後にあるこ
と。つまり、do 文の場合は必ず 1 回は{ }内の処
理を行うが、while 文の場合は一度も実行されな
いこともある。
次のプログラムをwhile 文を使って作成せよ。 1.整数を指定された数だけ入力し、その合計、平均、 最高、最低を出力する。 2.2 の n 乗を表示する。ただし、n は 0≦n≦30 の 整数とし、それ以外はエラー表示して終了する。 問題 4-6 1.の実行結果 整数は何個ですか:5 No.1 : 10 No.2 : 56 No.3 : 82 No.4 : 72 No.5 : 27 合計:247 平均:49.40 最大:82(No.3) 最小:10(No.1) 2.の実行結果(その 1) 2 の n 乗を表示します。 n はいくつですか:4 2^0 : 1 2^1 : 2 2^2 : 4 2^3 : 8 2^4 : 16 2.の実行結果(その 2) 2 の n 乗を表示します。 n はいくつですか:32 その値は受け付けません!!がスッキリしていると思う。
/* 読込んだ正の整数値は奇数か偶数か */ #include <stdio.h> main() { int no; no = 0; for ( ; no <= 0; ) { printf(“正の整数を入力して下さい:”); scanf(“%d”, &no); if (no <= 0) { printf(“正の整数です!!¥n”); } } if (no % 2) { printf(“%d は奇数です。¥n”, no); } else { printf(“%d は偶数です。¥n”, no); } } /* 読込んだ正の整数値は奇数か偶数か */ #include <stdio.h> main() { int no; no = 0; while (no <= 0) { printf(“正の整数を入力して下さい:”); scanf(“%d”, &no); if (no <= 0) { printf(“正の整数です!!¥n”); } } if (no % 2) { printf(“%d は奇数です。¥n”, no); } else { printf(“%d は偶数です。¥n”, no); } } 問題4-7 の 1.を次のように修正しなさい。 ・入力する整数の数を制限しない。 ・入力される整数は、0~100 とする。 ・-1 が入力されたら入力を中止し、合計等の表示を行う。もちろん、-1 は合計等に含めない。 問題 4-7 次のプログラムは、あらかじめ決められた数を当てるというものである。 空欄を埋めて完成せよ。 #include <stdio.h> main() { int no = 89; /* 当てさせる数 */ int x; /* 入力する数 */ ① { printf(“数を当てて下さい:”); scanf(“%d”, ② ); if ( ③ ) { printf(“もっと大きいです。¥n”); } else { printf(“もっと小さいです。¥n”); } ④ ( ⑤ ); printf(“正解です。¥n”); } 問題 4-8次のプログラムを実行したらどうなるか。選択肢から選びなさい。 なお、main 文の中のみ書いてある。 1) int a=5; while (a) { printf(“%d␣”, a); a--; } 2) int a=5; while (a>0) { printf(“%d␣”, a--); } 3) int a=5; do { printf(“%d␣”, --a); } while (a>0); 4)
int a=5, i=0; do { int b = a-i; printf(“%d␣”, b); i++; } while (b>0); 5) int a=1, b=5; while (a<b--) printf(“%d␣”, a); a++; 問題 4-9 ≪選択肢≫ ①012 ②00000 ③01234 ④43210 ⑤543210 ⑥54321 ⑦1111 ⑧11111 ⑨無限ループになる ⑩コンパイルエラー
問題解答
4-5
#include <stdio.h> main() { int no , total , i; total = 0; no = 10; i = 1; while (i <= no) { total += i; i++; }printf(“1 から%d までの和は%d です。¥n”, i, no, total); }
4-6
1.
分りづらいのは、
「
max_num = min_num = 1」という代入の仕方ではないだろうか。これを訳せ
ば、
「最初に min_num に 1 を代入し、次に max_num に min_num を代入する」となる。こういう書き
方をして、複数の変数に同じ数値を代入する方法がある。
また、i=1 のときの、point の値を max と min に代入するのは、何も代入されていないと後の値
との比較ができないから。代入する値の範囲があらかじめ決まっていれば、それらを max と min
に代入できるが、今回は範囲を決めていないため。
その他の箇所については、じっくり見てもらえれば理解できると思う。
#include <stdio.h> main() {int no , max, min, point; /* no:整数の個数 max:最大値 min:最小値 point:入力する整数 */
int max_num, min_num /* max_num:最大値の番号 min_num:最小値の番号 */
double total=0, ave; /* total:合計 ave:平均 */
int i; /* i:ループ用 */
printf(“整数は何個ですか:”); scanf(“%d”, &no); i = 1;
max_num = min_num = 1; /* 最小・最大の番号をとりあえず 1 とする */
while (i <= no) {
printf(“No.%d:”, i); scanf(“%d”, &point);
if (i == 1) { /* max, min には初期値が必要なので */
min = point; /* No.1 の値を初期値とした */
max = point; }
total += point; /* 合計値に入力した値を加算 */
if (point < min) { /* point が min より小さかったら */
min_num = i; min = point; }
if (point > max) { /* point が max より大きかったら */
max_num = i; max = point; }
i++; /* i をひとつ増やす */
}
ave = total / no; /* 平均の計算 */
/* 結果の表示 */
printf(”合計:%.0f¥n”, total); printf(“平均:%.2f¥n”, ave);
printf(“最大:%d(No.%d)¥n”, max, max_num); printf(“最小:%d(No.%d)¥n”, min, min_num); }
4-7
#include <stdio.h> main() { int n, i, sum=1; printf(“2 の n 乗を表示します。¥n”); printf(“n はいくつですか:”); scanf(“%d”, &n); if (n<0 || n > 30) printf(“その値は受け付けません!!¥n”); else { i = 0; while (i <= n) { printf(“2^%d:%d¥n”, i, sum); sum *= 2; i++; } } }4-7
今回は入力値の範囲が決まっているので、それを元に max、min を初期化している。
水色の部分が、入力の終了条件(入力値が-1 の時)に関わるところ。i が余計にインクリメント
(増加)されているので、break する前に戻している。
#include <stdio.h> main() {int max, min, point; /* max:最大値 min:最小値 point:入力する整数 */
int max_num, min_num; /* max_num:最大値の番号 min_num:最小値の番号 */
double total=0, ave; /* total:合計 ave:平均 */
int i; /* i:ループ用 */ i = 1; max = 0; min = 100; while ( i ) { /* 値の入力 */ do {
printf(“No.%d:”, i); scanf(“%d”, &point); if ((point < 0 || point > 100) && point != -1) printf(“0 から 100 までです!!¥n”);
} while ((point < 0 || point > 100) && point != -1); if (point == -1) {
--i; break; }
total += point; /* 合計値に入力した値を加算 */
if (point < min) { /* point が min より小さかったら */
min_num = i; min = point; }
if (point > max) { /* point が max より大きかったら */
max_num = i; max = point; } i++; } ave = total / i; /* 平均の計算 */ /* 結果の表示 */ printf(”合計:%.0f¥n”, total); printf(“平均:%.2f¥n”, ave);
printf(“最大:%d(No.%d)¥n”, max, max_num); printf(“最小:%d(No.%d)¥n”, min, min_num); }