課題 [13] ファイル処理(1/9)

問 1(提出プログラム名:ex1301.c)
(これまでの復習:この問題は「ファイル処理」とは関係ありません)

(この問題は前回までに学んできた内容の復習問題であり,今回学んだ「ファイル処理」とは関係ない.解き方は各自の自由である.)

まず,このプログラム(ex1301.c)をダウンロードしなさい.
そして,それを編集し,次の動作をするプログラムとして仕上げなさい.
なお,プログラムにおいてマクロ SIZE を使わずに 10 やそれに関係する数字を直接書いてはいけません.

【目的の動作】
最初に整数 n を読み込み(ただし,n は 1 以上 SIZE 以下と仮定してよい),
続いて n 個の実数(double 型)を読み込み,順番に配列へ格納する
そして「最後に読み込まれた実数」より大きな実数の個数を数えたい.

そのため,この問題では n 個の実数をいったんすべて配列へ格納し
その後で(すべてを配列に格納し終わった後で)
「最後に読み込まれた実数」との比較を行うように作る必要がある.

【注意:例年よくある間違い①】
例年よくある間違いとして,まだ最後まで読み込んでいないのに(まだ x[n-1] を読み込んでいないのに),早々に x[i] > x[n-1] かどうかをチェックしようとしてしまうミスがある.
具体的には次のように scanf の直後に if を書くというのは間違いである
    .....
    scanf("%lf", &x[i]);
    if ( x[i] > x[n-1] ) ← この時点ではまだ x[n-1] は不明
    {
      .....

(※上の時点ではまだ x[0], …, x[i] までしか読み込んでいないため,x[n-1] は不明である)

【注意:例年よくある間違い②】
読み込みで
  for ( i = 1; i <= n; i++ )
  {
    scanf("%lf", &x[i]);
  }
と書いてしまっている.
こうすると x[0] は使わないことになってしまう.
さらに, n == SIZE であった場合に x[n]x[SIZE] となってしまうが,そのような変数は存在しない(使えるのは x[0], x[1], ..., x[SIZE-1] の範囲だけである)

  • 【プログラムの実行結果】(その1)赤字は実行時にキーボードから入力する内容
5
3.14 2.71828 -1 2.2362 1.4142
最後の実数より大きい値の個数 = 3

最初の「5」が n を意味し,その後の 5 個の数字のうち,最後の 1.4142 より大きい値が 3 個あったことを意味している.
  • 【プログラムの実行結果】(その2)赤字は実行時にキーボードから入力する内容
1
3.14
最後の実数より大きい値の個数 = 0

【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
■ 出力結果が上の実行例と違うきちんと確認していない).
■ for 文や while 文での繰り返しの条件を i < SIZEi <= SIZE などと書いている.
 (読み込む実数の個数は n であり,SIZE に固定ではありません)
■ for 文や while 文での繰り返しの条件を間違えていて配列の範囲からはみ出ている.
 (仮に配列名を x としたとき,x[i] と書いた場合の i のとりうる範囲に注意!)
個数を数えるための変数を 0 に初期化するのを忘れている.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


ミスが無いことを確認したら次の問題へ → [ 問2 (ex1302.c) ]