復習課題:ループ・配列を扱う

課題 1:六つの数を入力し、そのなかで最大のものを出力する

入力数値は 0 - 100 までとします。

実行例(赤文字は入力を意味する):
$ ./a.out 
8
93
42
7
92
79
max = 93
$

実習:キー入力をやめ、ファイルからのリダイレクションを入力とする

作業手順:

  1. 6行の数字列からなるファイルを作成し、保存する(ファイル名は任意だが例ではtestdata.txtとした)。
  2. cat コマンドによってファイルの中身が正しいことを確認する。最後の行に改行が確かについているか?
  3. リダイレクション、あるいはパイプによって入力を切り替えて実行する。
    $ ./a.out < testdata.txt あるいは
    $ cat testdata.txt | ./a.out のような形

これで繰り返してテストする場合に作業が簡単になる。


課題 2:入力を再表示しつつ、最大のものに目印を付けて表示する機能を加える

先の課題では結果しか見えず、本当に正しく最大のものが選べているかよくわかりません。 そこで入力したものを出して、最大のものに MAX と目印を付けて表示するようにします。

実行例(赤文字は入力を意味する):
$ ./a.out < testdata.txt
max = 93
  8
 93 = MAX
 42
  7
 92
 79
$

このプログラムはいったん入力をすべて配列に格納する必要がある。 なお出力結果の数値が右揃えになるように printf の変換文字を調整すること。

ところで最大の値となるものが複数データに含まれていた場合でも、プログラムが正しく動作するように作って下さい。 (実際にそのようなデータを作成して動作を確認すること)


課題 3:最大のものが複数あることを前提に、幾つあったか数える機能を加える

先の課題では最大の値となるものが幾つあったのかわかりません。 そこで入力したものを出して、最大のものに MAX と目印を付けて、かつ、それが幾つ存在したかを表示するようにします。

実行例(赤文字は入力を意味する):
$ ./a.out < testdataDup.txt
max = 93 (count = 2)
  8
 93 (MAX)
 42
  7
 93 (MAX)
 79
$

上の例で用いた testdataDup.txt は、testdata.txt から複製して最大値(93)を二カ所に含むように修正したもの。 (別に名前はなんでもよいが)


課題 4:最小の数についても同様に処理する

最大だけでなく、最小の数についても同じく数を数え、目印を付けて表示するようにします。

実行例(赤文字は入力を意味する):
$ ./a.out < testdataDup.txt
max = 93 (count = 2)
min = 7 (count = 1)
  8
 93 (MAX)
 42
  7 (MIN)
 93 (MAX)
 79
$

なお、最小と最大が同一の値になる場合がある。つまり全ての入力値が同じ値だった場合に、正しく MIN と MAX の目印が両方につくように作ってください。 これも必ず実際にそのようにして動作を確認すること。

全て同じ値であった場合の実行例(赤文字は入力を意味する):
$ ./a.out < testdataAll10.txt
max = 10 (count = 6)
min = 10 (count = 6)
 10 (MAX) (MIN)
 10 (MAX) (MIN)
 10 (MAX) (MIN)
 10 (MAX) (MIN)
 10 (MAX) (MIN)
 10 (MAX) (MIN)
$

課題 5:最小と最大のものを除いたデータだけを別の配列に移す

先の課題のプログラムの最後に付け足す形で良いので、MIN, MAX のいずれにも該当しないデータだけを含む別の配列を作ります。 つまり、そのプログラムの最後の部分では、新しく作った配列 middle[ ] に、変数 middleCount の個数だけ、MIN, MAX 以外のデータが入っている、という状況にしてください。
下の実行例では、middle[0] = 8, middle[1] = 42, middle[2] = 92, middle[3] = 79 となり、変数 middleCount = 4 となるはずです。

実行例(赤文字は入力を意味する):
$ ./a.out < testdataDup.txt
max = 93 (count = 1)
min = 7 (count = 1)
  8
 93 (MAX)
 42
  7 (MIN)
 92
 79
middle count = 4
  8
 42
 92
 79
$

この処理は「それ以降の処理に、前処理された配列を引き渡す」ことを想定したものです。