前回の合計金額を求めるプログラムは万能ではない、と書きました。
<sample program 040-01>
#include <stdio.h> int main(void) { int sum; int input; sum = 0; do { printf("金額を入力してください:"); scanf("%d", &input); sum += input; } while (input > 0); printf("合計金額は%d円です。\n", sum); return 0; } |
<実行結果>
金額を入力してください:1000 金額を入力してください:500 金額を入力してください:200 金額を入力してください:50 金額を入力してください:0 合計金額は1750円です。 続行するには何かキーを押してください・・・
これはちゃんと動作していますが、次のようなプログラムに適用するとどうでしょう。
テストの点を入力し、合計点を求めるプログラム。
何人が受験しているかは分からないこととし、満点は100点とします。
金額計算と同じような問題ですが、テストの点数は「0点から100点まで」あります。
0を入力して終わることができないので、点数としてありえない数値「999」を入力したら終了とします。
考えてみてください。
<実行結果>
点数を入力してください:100 点数を入力してください:0 点数を入力してください:50 点数を入力してください:999 得点合計は150点です。 続行するには何かキーを押してください・・・
とりあえず、前回のプログラムと同じ形で作ってみるとこのようになります。
<sample program 040-02>
#include <stdio.h> int main(void) { int sum; int input; sum = 0; do { printf("点数を入力してください:"); scanf("%d", &input); sum += input; } while (input != 999); printf("得点合計は%d点です。\n", sum); return 0; } |
メッセージの内容を変更し、繰り返し条件を「変数inputの中身が999以外の間繰り返す」としました。
このプログラムの実行結果は、こうなります。
<実行結果>
点数を入力してください:100 点数を入力してください:0 点数を入力してください:50 点数を入力してください:999 得点合計は1149点です。 続行するには何かキーを押してください・・・
得点合計が変ですね。
100点と0点と50点の合計は「150点」になるはずですが「1149点」になっています。
差は「999点」です。
つまり、終了するために設定した「999」という数値が加算されているのです。
合計金額を求めるプログラムでは「0」で終了でしたから「0」を加算しても金額に変化はなかったのですが、得点合計を求めるプログラムでは「0」で終了できませんでしたので「999」を終了用の数値に設定しました。
途端に正しく動作しなくなりました。
ですから「万能ではない」と書いたのです。
正しく動作させるために、応急処置をしてみましょう。
<sample program 040-03>
#include <stdio.h> int main(void) { int sum; int input; sum = 0; do { printf("点数を入力してください:"); scanf("%d", &input); sum += input; } while (input != 999); sum -= 999; printf("得点合計は%d点です。\n", sum); return 0; } |
<実行結果>
点数を入力してください:100 点数を入力してください:0 点数を入力してください:50 点数を入力してください:999 得点合計は150点です。 続行するには何かキーを押してください・・・
「999点」多く加算していますので、合計計算を終えた後で「999点」減算しました。
これで正しく動作するようになります。
が、やはりスマートでは無いような気がします・・・
要は、得点を入力してから合計するまでに終了チェックが出来れば、もう少しスマートに書けると思います。
それぞれの方法を簡単に書いてみると、
1.前判定 チェック ← この時点で得点が入っていなければエラー 得点入力 合計 2.後判定 得点入力 合計 チェック ← 合計後に入力した値のチェックをしている 3.スマート?な方法 得点入力 チェック ← 得点が入力されてからチェック 合計 ← チェックがOKであれば合計
3のようにプログラムが作れれば良さそうです。
では、その方法の1つを書いてみます。
<sample program 040-04>
#include <stdio.h> int main(void) { int sum; int input; sum = 0; printf("点数を入力してください:"); scanf("%d", &input); while (input != 999) { sum += input; printf("点数を入力してください:"); scanf("%d", &input); } printf("得点合計は%d点です。\n", sum); return 0; } |
<実行結果>
点数を入力してください:100 点数を入力してください:0 点数を入力してください:50 点数を入力してください:999 得点合計は150点です。 続行するには何かキーを押してください・・・
以前、九九の段を表示するプログラムで使った方法です。
この方法だと、
1.得点入力 2.チェック 3.合計 4.得点入力 5.2へ戻る
という順番でプログラムが実行されますので、「0」で終わろうが「999」で終わろうが正しく動作します。
しかしプログラムが長くなる(同じ箇所が2回ある)というデメリット?があります。
テストの得点入力ですから、「0点から100点」までの入力チェックを加えてみます。
<sample program 040-05>
#include <stdio.h> int main(void) { int sum; int input; sum = 0; do { printf("点数を入力してください:"); scanf("%d", &input); } while (input < 0 || input > 100 && input != 999); while (input != 999) { sum += input; do { printf("点数を入力してください:"); scanf("%d", &input); } while (input < 0 || input > 100 && input != 999); } printf("得点合計は%d点です。\n", sum); return 0; } |
<実行結果>
点数を入力してください:100 点数を入力してください:0 点数を入力してください:50 点数を入力してください:999 得点合計は150点です。 続行するには何かキーを押してください・・・
0点から100点以外の数値を入力すると、再度入力させるように変更しました。
ただし「999」で終了しなければなりませんので、「999」だけは例外となるよう条件を書いています。
条件は「inputが0より小さいか(または)100より大きい(しかも)999でない間繰り返す」です。
動作はしますが、入力チェックの部分が長くなるとプログラム全体が長くなってしまいます。
次回は、新しい命令を使ってこのプログラムの書き換えをしてみます。