つくる 点数入力と平均
この章で手に入れたもの
第1章では決まった文字を出すだけでした。この章で、値を変数に持ち、外から受け取り、計算し、桁を決めて出せるようになりました。今回はそれを1本のプログラムにまとめて、成績管理アプリを一歩進めます。
作るのは「3科目の点数を入力すると、一覧と合計と平均を出す」プログラムです。
組み立ての順番
やることは4つで、上から順に並べるだけです。
- 見出しを出す
- 3つの点数を scanf で読む
- 合計と平均を計算する
- 桁を揃えて表示する
#include <stdio.h>
int main(void) {
int kokugo, suugaku, eigo;
printf("=== 成績管理 ===\n");
scanf("%d %d %d", &kokugo, &suugaku, &eigo);
/* ここで合計と平均を出す */
/* ここで表示する */
return 0;
}詰まりやすいところ
合計は int、平均は double です。合計は点数を足しただけなので整数のままで問題ありません。平均は前回のとおり、割る前にキャストしてください。(double)total / 3 です。ここを忘れると平均が 78.0 や 73.0 のように、小数点以下が必ず 0 になります。それが出たら切り捨てが起きている合図です。
幅は 6 で揃えます。 点数と合計は %6d、平均は %6.1f です。こうすると数の右端が縦に並び、「点」の位置も揃います。合計は3桁になるので、幅を指定しないと行ごとに「点」の位置がずれます。
scanf の & を忘れないでください。 3つとも必要です。値がおかしいときは、まずここを見てください。理由は第7章で扱います。
出力の形
入力が 78 と 92 と 64 のとき、次のようになります。
=== 成績管理 ===
国語 78点
数学 92点
英語 64点
合計 234点
平均 78.0点見出しは入力を読む前に出しても後に出しても、出力される順番は変わりません。読み終わってから表示を始めるほうが、次章以降で処理が増えたときに読みやすくなります。
揃わないときの見方
期待どおりに動かないときは、ずれている行だけを見てください。原因はだいたい次の3つに分かれます。
- 数の左の空白の数が違う。幅の指定が 6 になっていない
- 平均の小数点以下が 0 になる。割る前のキャストが抜けている
- 平均が
73.666667と長い。%fのままで桁を指定していない
どれもコンパイルは通ってしまう種類の間違いです。C はこうした「動くけれど違う」を自分で見つける必要がある言語なので、出力を1行ずつ見比べる進め方に、この章のうちに慣れておくと後が楽になります。
次の章へ
いまのプログラムは、点数が何点でも同じ形で表示します。次の第3章では if 文を学び、前回書いた「60点以上かつ出席10回以上」のような条件で表示を出し分けられるようにします。この回で作った合計と平均の計算は、そこでもそのまま使います。
要件
- 1行目に「= 成績管理 =」を出す
- 国語、数学、英語の順に3つの点数を scanf で読む
- 各科目と合計は %6d で出す
- 平均はキャストを使って計算し %6.1f で出す
- 「国語 78点」「合計 234点」「平均 78.0点」の形で並べる
入出力例
main("78 92 64") → "=== 成績管理 ===
国語 78点
数学 92点
英語 64点
合計 234点
平均 78.0点"
main("80", "75", "66") → "=== 成績管理 ===
国語 80点
数学 75点
英語 66点
合計 221点
平均 73.7点"