練習 [12] ポインタ②(1/5)

練習 1(提出プログラム名:p1201.c)

まず,このプログラム(p1201.c)をダウンロードしなさい.
p1201.c では,長さ SIZE の int 配列を用意し(SIZE はマクロとして定義),
最初は初期値を与えない状態でいきなりその内容を表示させている.
その際,配列の内容表示は関数 print_array既に完成している)を使用している.

その後,関数 fill_array を使って,その配列の内容を「初項 x,公差 d の等差数列」で埋め
再び print_array を使って表示させている.
この関数 fill_array を完成させなさい
ただし,等差数列の公式を使ってはいけません
つまり,a[i] = x + i*d; と書いてはいけません

なお,関数 fill_array の戻り値と引数は次の通りとする:
 ●戻り値:なし(それゆえ void と宣言)
 ●引数 a:書き換え対象の配列
     (ポインタになっているが,講義で説明したように配列と同じ意味になる)
 ●引数 x:等差数列の初項
 ●引数 d:等差数列の公差

【注意】
この問題では関数 mainprint_array の内容を書き換えてはいけません
また,等差数列で埋めるにあたって,
さらに,マクロ SIZE を使わずに 5(やそれに関する数字)を直接書いてはいけません.

【ヒントと注意すべき点】
過去には以下の間違いに該当する人が多数いましたのでくれぐれも注意してください:
等差数列なので,第 i 項を a[i] で表すとした場合,a[i] の値は a[i-1] + d で求まることになります.
この際,次の 2 種類のfor 文はいずれも間違いです
 間違い① for ( i = 0; i < SIZE; i++ ) ...
 間違い② for ( i = 1; i <= SIZE; i++ ) ...

①の場合, i = 0 の時に a[-1] + d を計算しようとしてしまが,a[-1] という変数は存在しません.
②の場合,i = SIZE の時に a[SIZE] に代入しようとしまますが,a[SIZE] という変数は存在しません.

  • 【プログラムの実行例】(その1)赤字は実行時にキーボードから入力する内容
配列の内容(初期状態)を表示します:
a = { 4201088, 4200976, 0, 3469312, 4194432 }

上の配列を等差数列で埋めていきます.
初項と公差を指定してください:5 8

配列の内容(代入後)を表示します:
a = { 5, 13, 21, 29, 37 }

※配列の初期状態の数値は人によって異なる可能性が高いです.このように,変数を用意しただけの状態では,その初期値が何になっているかは不明なので,特に合計を求める場合などに 0 で初期化することが重要になってきます.

  • 【プログラムの実行例】(その2)赤字は実行時にキーボードから入力する内容
配列の内容(初期状態)を表示します:
a = { 4201088, 4200976, 0, 3846144, 4194432 }

上の配列を等差数列で埋めていきます.
初項と公差を指定してください:0 1

配列の内容(代入後)を表示します:
a = { 0, 1, 2, 3, 4 }

【過去にあったミス(減点となり,やり直しを命じられる)】
上に示した2種類の実行例と違っている.
  等差数列で埋める前の内容は人によって異なってよいが,埋めた後は同じでなければならない.
等差数列の公式を使ってはいけないという注意書きを見落としていて
  a[i] = x + (i-1)*d と書いている.
■ 文字列の話とごっちゃになっていて '\0' を配列の終わりと見なして処理しようとしている.
 (ナル文字が終端記号になるのは「文字列」を扱っている場合だけであり,整数の配列とは無関係です
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


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