前回、breakを使ってで繰り返しを抜ける方法を勉強しました。
テストの得点合計を計算するプログラムを改良しましたが、これにさらに手を加えていきましょう。
とりあえず、前回のプログラムを書いておきます。
<sample program 041-03>
#include <stdio.h> int main(void) { int sum; int input; sum = 0; while (1) { do { printf("点数を入力してください:"); scanf("%d", &input); } while (input < 0 || input > 100 && input != 999); if (input == 999) { break; } sum += input; } printf("得点合計は%d点です。\n", sum); return 0; } |
<実行結果>
点数を入力してください:100 点数を入力してください:0 点数を入力してください:50 点数を入力してください:999 得点合計は150点です。 続行するには何かキーを押してください・・・
このプログラムでは、入力回数が決まっていません。
「999」が入力されたら終了となります。
しかし、1クラスのテストの得点を入力して「平均点」を求めたい場合、「データ(入力)件数」が必要になります。
「平均点」=「合計点」÷「データ件数」
ですよね。
では、次のような実行結果になるようにプログラムに手を加えてみてください。
<実行結果>
点数を入力してください:100 点数を入力してください:0 点数を入力してください:50 点数を入力してください:999 得点合計は150点です。 入力件数は3件です。 続行するには何かキーを押してください・・・
解答例です。
<sample program 042-01>
#include <stdio.h> int main(void) { int counter; int input; int sum; counter = 0; sum = 0; while (1) { printf("点数を入力してください:"); scanf("%d", &input); if (input == 999) { break; } sum += input; counter++; } printf("得点合計は%d点です。\n", sum); printf("入力件数は%d件です。\n", counter); return 0; } |
<実行結果>
点数を入力してください:100 点数を入力してください:0 点数を入力してください:50 点数を入力してください:999 得点合計は150点です。 入力件数は3件です。 続行するには何かキーを押してください・・・
データ(入力)件数を求めるには、カウンタを使えば良いですね。
これまでのカウンタの使い方は、主に繰り返し回数を決めることに使ってきました。
しかし、今回は繰り返し回数は分かりませんので、単純に繰り返しの回数(入力回数)を数えることに使いました。
カウンタを使って「データ件数」が分かるようになりましたので、「平均」も求めることが出来ます。
では、「平均点」を求めるプログラムを考えてみてください。
実行結果は書いておきます。
<実行結果>
点数を入力してください:100 点数を入力してください:50 点数を入力してください:20 点数を入力してください:999 得点合計は170点です。 入力件数は3件です。 平均得点は56点です。 続行するには何かキーを押してください・・・
解答例です。
<sample program 042-02>
#include <stdio.h> int main(void) { int counter; int input; int sum; counter = 0; sum = 0; while (1) { printf("点数を入力してください:"); scanf("%d", &input); if (input == 999) { break; } sum += input; counter++; } printf("得点合計は%d点です。\n", sum); printf("入力件数は%d件です。\n", counter); printf("平均得点は%d点です。\n", sum / counter); return 0; } |
<実行結果>
点数を入力してください:100 点数を入力してください:50 点数を入力してください:20 点数を入力してください:999 得点合計は170点です。 入力件数は3件です。 平均得点は56点です。 続行するには何かキーを押してください・・・
「平均点」=「合計点」÷「データ件数」
ですから、変数sumを変数counterで割れば計算出来ます。
ただし、
「合計点:170」÷「データ件数:3」=56.6666666・・・
のはずですが、int型(整数型)で計算しているため小数部分が切り捨てられています。
では、小数が扱えるdouble型で書き換えてみましょう。
#include <stdio.h> int main(void) { double counter; double input; double sum; counter = 0; sum = 0; while (1) { printf("点数を入力してください:"); scanf("%lf", &input); if (input == 999) { break; } sum += input; counter++; } printf("得点合計は%f点です。\n", sum); printf("入力件数は%f件です。\n", counter); printf("平均得点は%f点です。\n", sum / counter); return 0; } |
<実行結果>
点数を入力してください:100 点数を入力してください:50 点数を入力してください:20 点数を入力してください:999 得点合計は170.000000点です。 入力件数は3.000000件です。 平均得点は56.666667点です。 続行するには何かキーを押してください・・・
すべての変数をdouble型に変更しました。
double型は「%f」で表示するんでしたよね。(覚えていますか?)
「%f」で表示すると小数点以下6桁まで表示されています。
「%d」で10進整数を表示するときに「%2d」と書けば10進数2桁で表示出来る、というのを前にやりました。
同じように「%f」でも桁数の制御が可能です。
整数の時と違ってこのように設定します。
例えば「%6.2f」
これは、「小数点も含めた全桁数が6桁で、その内2桁が小数点以下の桁数」という意味です。
試しに動かしてみましょう。
<sample program 041-04>
#include <stdio.h> int main(void) { double counter; double input; double sum; counter = 0; sum = 0; while (1) { printf("点数を入力してください:"); scanf("%lf", &input); if (input == 999) { break; } sum += input; counter++; } printf("得点合計は%6.2f点です。\n", sum); printf("入力件数は%6.2f件です。\n", counter); printf("平均得点は%6.2f点です。\n", sum / counter); return 0; } |
<実行結果>
点数を入力してください:100 点数を入力してください:50 点数を入力してください:20 点数を入力してください:999 得点合計は170.00点です。 入力件数は 3.00件です。 平均得点は 56.67点です。 続行するには何かキーを押してください・・・
「小数点も含めた全桁数が6桁で、その内2桁が小数点以下の桁数」になっていますね。
ここで1つ疑問が出てきませんか?
「平均得点」を見てください。
前のプログラムでは、
56.666667
と表示されていましたが、今回は
56.67
と表示されています。
本来の計算結果は、
56.6666666666666......
のはずですが、表示出来る小数点以下の最後の桁で「四捨五入」されているように見えます。
以前のコラムで変数の表現範囲を超えて数値を代入した場合、おかしな数値が表示されると書きました。
実は、小数でも同じようなことが言えるのです。
コンピュータはどんなに大きな数やどんなに小さな数も表現出来るものではありません。
※表現しようと思うと様々な工夫が必要です。
対応する方法は色々あると思いますが、あくまでも初心者向けのHPですから、基本的なことを書きますので、細かいことも知りたい方は、コラム「小数の表現2」をご覧ください。