最高点と最低点
探すときも1つずつ見るしかない
配列の中から最大値を探す関数は C には用意されていません。合計と同じように、自分で先頭から1つずつ見ていきます。
考え方は、暫定の王者を1人立てて、勝った相手が出るたびに入れ替える、というものです。
int max = scores[0];
for (int i = 1; i < SUBJECTS; i++) {
if (scores[i] > max) {
max = scores[i];
}
}ループを最後まで回し終わったとき、max には必ず全体の最大値が入っています。どの要素も、一度は max と比べられているからです。
初期値を0にしてはいけない
ここで初学者がよくやるのが int max = 0; です。点数なら 0 以上なので一見動きますが、これは題材にたまたま助けられているだけです。
int temps[3] = {-5, -12, -3};
int max = 0; // 最大値が -3 なのに 0 のまま残る気温のようにマイナスがあるデータだと、どの要素も 0 に勝てず、存在しない 0 が答えになってしまいます。最小値を探すときに int min = 0; と書いた場合はもっと悲惨で、正の数しかないデータでは常に 0 が答えになります。
ですから初期値は 0 ではなく、配列の先頭の要素にします。実際に存在する値から始めれば、データの中身がどうであれ、答えは必ず配列の中のどれかになります。ループを i = 1 から始めているのは、先頭は初期値としてすでに使ったからです。i = 0 から回しても答えは変わりませんが、1回ぶん無駄になります。
最小値は不等号を反対にするだけ
int min = scores[0];
for (int i = 1; i < SUBJECTS; i++) {
if (scores[i] < min) {
min = scores[i];
}
}違いは > が < になるところだけです。同じループの中で最大と最小を同時に求めることもできます。配列を2回なめるより1回で済むので、要素数が多いときは差が出ます。
何番目かも一緒に覚えておく
「最高点は92点」だけでなく「3科目目が最高」まで出したいなら、値だけでなく添字も覚えます。
int best = 0; // 添字を覚える
for (int i = 1; i < SUBJECTS; i++) {
if (scores[i] > scores[best]) {
best = i;
}
}
printf("%d科目目が最高です\n", best + 1);値そのものは scores[best] でいつでも取り出せるので、添字だけ持っておけば両方に答えられます。
では、最高点と最低点を探してみましょう。
要件
- 5つの整数を配列に読み込む
- 最高点は92点です の形で最高点を出す
- 最低点は58点です の形で最低点を出す
- max と min の初期値は scores[0] にする
入出力例
main("80 65 92 74 58") → "最高点は92点です
最低点は58点です"
main("100 90 80 70 60") → "最高点は100点です
最低点は60点です"ヒント
編集 LuaGate編集部