さて、前回のプログラムのチェック部分を抜き出すと下のようになります。
printf("2〜9までの整数を入力してください:"); scanf("%d", &dan); while (dan < 2 || dan > 9) { printf("2〜9までの整数を入力してください:"); scanf("%d", &dan); } |
よく見ると、printfとscanfで同じ記述が2回ありますね。
この部分を少々改良して、重複したプログラムを書かなくても良いようにしてみます。
そのためには、新しい「繰り返し」の命令が必要になります。
・do〜while文の文法
do { 繰り返す処理; } while (繰り返し条件);
do〜whileの間に書いてあるプログラムを繰り返し実行します。
※whileの後の「;(セミコロン)」も忘れずに書いてください。
普通のwhileと異なる部分は、繰り返し条件が「下」にあるという部分です。
繰り返し条件が「下」にあることで、どのように動作が変わるか見てみましょう。
下のプログラムは、以前に書いたプログラムで「0〜9まで表示する」プログラムです。
<sample program 030-01>
#include <stdio.h> int main(void) { int counter; counter = 0; while (counter < 10) { printf("%d\n", counter); counter = counter + 1; } return 0; } |
これを、do〜whileで書き直してみます。
<sample program 038-01>
#include <stdio.h> int main(void) { int counter; counter = 0; do { printf("%d\n", counter); counter = counter + 1; } while (counter < 10); return 0; } |
<実行結果>
0 1 2 3 4 5 6 7 8 9 続行するには何かキーを押してください・・・
whileがあった箇所にdoを書き、「}」の後にwhileを移動しました。
実行結果は特に変わっていませんね。
では、下の九九のプログラムを書き換えて見ましょう。
<sample program 036-04>
#include <stdio.h> int main(void) { int counter; int dan; counter = 2; printf("2〜9までの整数を入力してください:"); scanf("%d", &dan); while (counter <= 9) { printf("%d * %d = %2d\n", dan, counter, dan * counter); counter++; } return 0; } |
<sample program 038-02>
#include <stdio.h> int main(void) { int counter; int dan; counter = 2; printf("2〜9までの整数を入力してください:"); scanf("%d", &dan); do { printf("%d * %d = %2d\n", dan, counter, dan * counter); counter++; } while (counter <= 9); printf("\n"); return 0; } |
<実行結果>
2〜9までの整数を入力してください:2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18 続行するには何かキーを押してください・・・
これも同じです。
最後に、正数を入力し、正しいデータが入力されるまでチェックを行うプログラムを書き換えてみます。
<sample program 037-03>
#include <stdio.h> int main(void) { int input; printf("正の数を入力してください:"); scanf("%d", &input); while (input <= 0) { printf("正の数を入力してください:"); scanf("%d", &input); } printf("入力された値は正の数です。\n"); return 0; } |
<sample program 038-03>
#include <stdio.h> int main(void) { int input; printf("正の数を入力してください:"); scanf("%d", &input); do { printf("正の数を入力してください:"); scanf("%d", &input); } while (input <= 0); printf("入力された値は正の数です。\n"); return 0; } |
<実行結果>
正の数を入力してください:0 正の数を入力してください:5 入力された値は正の数です。 続行するには何かキーを押してください・・・
変わっていないように見えますが、次のように入力すると・・・
<実行結果>
正の数を入力してください:5 正の数を入力してください:5 入力された値は正の数です。 続行するには何かキーを押してください・・・
最初から正しいデータを入力しているにもかかわらず、2度目の入力もしなければならなくなっています。
これは、最初の
printf("正の数を入力してください:"); scanf("%d", &input); |
の部分で1度目の入力を行い、
do { printf("正の数を入力してください:"); scanf("%d", &input); } while (input <= 0); |
繰り返しの開始点である、doの部分でチェックを「せず」に2度目の入力が行われているからです。
書き換える前の、while文では、
while (input <= 0) { printf("正の数を入力してください:"); scanf("%d", &input); } |
繰り返しの開始点でチェックが行われています。
do〜whileは、繰り返しの開始点ではチェックを行わず、終了点でチェックを行うため、このような動作になります。
では、これをどのように変更すると「重複したプログラムを書かなくても良いように」なるのでしょうか。
書いてみますね。
<sample program 038-04>
#include <stdio.h> int main(void) { int input; do { printf("正の数を入力してください:"); scanf("%d", &input); } while (input <= 0); printf("入力された値は正の数です。\n"); return 0; } |
<実行結果1>
正の数を入力してください:0 正の数を入力してください:5 入力された値は正の数です。 続行するには何かキーを押してください・・・
<実行結果2>
正の数を入力してください:5 入力された値は正の数です。 続行するには何かキーを押してください・・・
最初のprintfとscanfを削除しました。
実行結果を見ると正しく動作していますね。
繰り返しに入る前にチェックを行うか、繰り返しの後でチェックを行うかで、whileを使うか、do〜whileを使うか決めるわけです。
繰り返しの前にチェックを行うことを「前判定」、繰り返しの後でチェックを行うことを「後判定」と言います。
「前判定」と「後判定」の違いをもう少し見ていきます。
<sample program 038-05>
#include <stdio.h> int main(void) { int counter; counter = 0; while (counter > 0) { printf("counter = %d\n", counter); } return 0; } |
<実行結果>
続行するには何かキーを押してください・・・
<sample program 038-06>
#include <stdio.h> int main(void) { int counter; counter = 0; do { printf("counter = %d\n", counter); } while (counter > 0); return 0; } |
<実行結果>
counter = 0 続行するには何かキーを押してください・・・
この2つのプログラムの繰り返し条件は「counterが0より大きい間繰り返す」というものです。
counterの初期値は、どちらも「0」ですから、1度も繰り返されません。
が、実行結果は異なっています。
上のプログラムは何も表示されていませんが、下のプログラムは「counter = 0」という表示があります。
「前判定」の場合、「繰り返しの中身が1度も実行されない」場合がありますが、「後判定」の場合は「繰り返しの中身は必ず1度は実行される」のです。
whileとdo〜while、どちらを使うかはその時の状況に応じて、選択する必要があります。