最高点と最低点

探すときも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] でいつでも取り出せるので、添字だけ持っておけば両方に答えられます。

では、最高点と最低点を探してみましょう。

要件

  1. 5つの整数を配列に読み込む
  2. 最高点は92点です の形で最高点を出す
  3. 最低点は58点です の形で最低点を出す
  4. max と min の初期値は scores[0] にする

入出力例

main("80 65 92 74 58") → "最高点は92点です 最低点は58点です" main("100 90 80 70 60") → "最高点は100点です 最低点は60点です"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.c
学習モード

メモ

最高点と最低点

⌘S で保存