以前、「入力した2つの数値の内、大きいほうの数値を表示する」というプログラムを作りました。
また、「3つの整数を入力し、一番大きな数を表示する」というプログラムも作りました。
これらのプログラムを作ったときには、「繰り返し」という概念はまだ提示していなかったため、「4つ以上の数値の最大値を求める」というようなプログラムを問題として出すことはしませんでした。
これまでに繰り返しの考え方を色々と説明してきましたので、繰り返しを利用して次のようなプログラムを考えてみましょう。
10個の数値を入力し、その中で一番大きかった値を表示する。
<sample program 046-01>
#include <stdio.h> int main(void) { int input; int counter; counter = 0; while (counter < 10) { printf("数値を入力してください:"); scanf("%d", &input); counter++; } return 0; } |
<実行結果>
数値を入力してください:1 数値を入力してください:5 数値を入力してください:3 数値を入力してください:6 数値を入力してください:7 数値を入力してください:2 数値を入力してください:9 数値を入力してください:3 数値を入力してください:5 数値を入力してください:4 続行するには何かキーを押してください・・・
変数「input」に10回数値が代入出来るようになっています。
これにプログラムを追加し、最終的に最大の値を表示出来るようにしたいのですが、手がかりが不足していますので、ここまで作っておきます。
<sample program 046-02>
#include <stdio.h> int main(void) { int input; int counter; int max; counter = 0; max = 0; while (counter < 10) { printf("数値を入力してください:"); scanf("%d", &input); counter++; } printf("最大値は%dです。\n", max); return 0; } |
<実行結果>
数値を入力してください:1 数値を入力してください:5 数値を入力してください:3 数値を入力してください:6 数値を入力してください:7 数値を入力してください:2 数値を入力してください:9 数値を入力してください:3 数値を入力してください:5 数値を入力してください:4 最大値は0です。 続行するには何かキーを押してください・・・
変数「max」を追加しました。
初期値は「0」を入れていますが、最終的には下のように10個の数値の中で最大の値を「max」に入れて表示したいのです。
<実行結果>
数値を入力してください:5 数値を入力してください:3 数値を入力してください:8 数値を入力してください:7 数値を入力してください:0 数値を入力してください:2 数値を入力してください:6 数値を入力してください:4 数値を入力してください:9 数値を入力してください:1 最大値は9です。 続行するには何かキーを押してください・・・
では、考えてみてください。
解答例を書く前にもう少しヒントを・・・
例えば、上の実行結果のように入力したとします。
数値を入力してください:5 数値を入力してください:3 数値を入力してください:8 数値を入力してください:7 数値を入力してください:0 数値を入力してください:2 数値を入力してください:6 数値を入力してください:4 数値を入力してください:9 数値を入力してください:1
人間がこれを「ぱっ」と見た場合、すぐに「9」が最大値だと気づきます。
1桁程度の数値の大小関係は、いちいち細かく見なくても「何となく」分かるのです。
しかし、コンピュータは「ぱっ」と見ることなど出来ませんし、「何となく」では分かりません。
人間がしっかりと手順を教えてやらなければならないのです。
今回のプログラムでは、前に入力した値は、次の値を入力した時点で上書きされ、消えてしまいます。
そこで、1回1回入力する度に「これは最大値なのか?」を調べなければなりません。
しかし、特別なことを考える必要はありません、人間が同じような問題を出された時にどう対処するかを細かく考えてみれば良いのです。
数字の書いた紙(カードでも何でも良いです)を1つずつ順番に見せられ、どれが一番大きい値だったかを答えるというゲームがあったとします。
あなたはどうやって最大値を答えるでしょうか?
最初の1枚を見せられた時、その数値を記憶するでしょう。
次の紙を見せられた時、覚えている数値と比べて、小さければ無視するでしょうし、大きければ新たにその数値を覚えておくと思います。
これを最後まで繰り返し、最後に覚えている数値を答えることになるでしょう。
ゲームの途中では「その時々の最大値」さえ覚えておけば良いのです。
このプログラムで「その時々の最大値」を覚えておく場所が「max」という変数なのです。
これを踏まえてプログラムを考えてみてください。
解答例です。
<sample program 046-03>
#include <stdio.h> int main(void) { int input; int counter; int max; counter = 0; max = 0; while (counter < 10) { printf("数値を入力してください:"); scanf("%d", &input); if (input > max) { max = input; } counter++; } printf("最大値は%dです。\n", max); return 0; } |
<実行結果>
数値を入力してください:5 数値を入力してください:3 数値を入力してください:8 数値を入力してください:7 数値を入力してください:0 数値を入力してください:2 数値を入力してください:6 数値を入力してください:4 数値を入力してください:9 数値を入力してください:1 最大値は9です。 続行するには何かキーを押してください・・・
入力した値「input」と「その時々の最大値」を覚えている変数「max」を毎回比較します。
「max」よりも「input」の方が大きければ「max」を更新します。
これを繰り返していけば、最終的に「一番大きな値」が「max」に入ることになります。
さて、このプログラムでは「その時々の最大値」を覚えている変数「max」の初期値は「0」としています。
では、次のように入力するとどうなるでしょうか。
<実行結果>
数値を入力してください:-5 数値を入力してください:-3 数値を入力してください:-8 数値を入力してください:-7 数値を入力してください:-10 数値を入力してください:-2 数値を入力してください:-6 数値を入力してください:-4 数値を入力してください:-9R> 数値を入力してください:-1 最大値は0です。 続行するには何かキーを押してください・・・
全てマイナスの値を入力してみました。
この中での最大値は、「−1」のはずですが、「0」と表示されています。
「max」には最初から「0」が入っているために、マイナスの値を代入しても「0」より大きな数ではないので、このような結果になるのです。
では、「max」の初期値として何を入れておくのが相応しいのでしょうか??
色々あると思います、「その型で扱える最小の値」という考え方もあるでしょうし、「最初に入力した値」を「その時の最大値として扱う」ことも考えられます。
「その型で扱える最小の値」という考え方では、「int型で扱える最小の値」ということになります。
符号付int型(32bit)の最小値は、「-2147483648」です。(2の31乗を計算してみてください)
この数値を入れておけば、大抵の値の最大値は正しく表示されると思います。
もう1つの方法は実際にプログラムを作って実行してみましょう。
<sample program 046-04>
#include <stdio.h> int main(void) { int input; int counter; int max; counter = 0; printf("数値を入力してください:"); scanf("%d", &max); while (counter < 9) { printf("数値を入力してください:"); scanf("%d", &input); if (input > max) { max = input; } counter++; } printf("最大値は%dです。\n", max); return 0; } |
<実行結果>
数値を入力してください:-5 数値を入力してください:-3 数値を入力してください:-8 数値を入力してください:-7 数値を入力してください:-10 数値を入力してください:-2 数値を入力してください:-6 数値を入力してください:-4 数値を入力してください:-9 数値を入力してください:-1 最大値は-1です。 続行するには何かキーを押してください・・・
最初の入力は「input」ではなく、「max」に直接入れています。
2回目以降は「input」に入力しているため、繰り返しは9回となります。
この方法であれば、「int型の最小値」は何だったっけ?と考えなくても最大値が求まります。
最小値を求めるプログラムも同様の方法で出来ますので、チャレンジしてみてください。