課題 [12] ポインタ②(6/9)

問 6(提出プログラム名:ex1206.c)

このプログラム(ex1206.c)をダウンロードし,その中の関数 rotate を完成させなさい

このプログラムは,SIZE 個の整数を読み込んで int 配列に格納した後,
関数 rotate を使って配列内の要素を 1 つずつ(左方向へ)ローテーションさせようとしている(実行例を参照).

【注意】
例年,以下の【ヒント】で注意喚起している間違いをそのままやってしまう人が何人かいるので,
自分が該当してしまわないようくれぐれも注意せよ.

この問題では関数 mainprint_array の内容は一切書き換えないこと.
あわせて,配列の長さに関する記述にはマクロ SIZE を使用し,5 といった関連する数字を直接書かないこと.

なお,この問題は整数を扱うものであり文字列とは関係ないので間違えないこと.
文字列(char 配列)ならばナル文字('\0')かどうかで末尾をチェックできるが,
int 配列ではそのようなやり方は使えないので間違えないこと.

【ヒント】
ローテーションを行う方法としては,例えば次のやり方があります:
(ここでは仮に配列 p を対象としているものとします)
①まず,左端の p[0] をいったん別の変数へ代入してコピーを残しておきます.
 (例: tmp = p[0];
② 次に,i の値を 1 以上 SIZE 未満0 以上や SIZE 以下ではないです)の範囲で変化させながら
 p[i] の値を 1 つ左の p[i-1] へ上書きしていきます.
 (例: for 文か while 文で p[i-1] = p[i]; を繰り返す)
 ※例年よくある間違い:もしも i = 0 を許すと p[i-1]p[-1] になってしまい,
  i = SIZE を許すと p[i]p[SIZE] になってしまう(いずれも間違い).
③最後に,右端の p[SIZE-1] へ元の p[0](今は tmp として残してある)を代入してあげます.
 (例:p[SIZE-1] = tmp;

  • 【プログラムの実行結果】(その1)赤字は実行時にキーボードから入力する内容
整数を 5 個入力してください:1 2 3 4 5
ローテーション前:1 2 3 4 5
ローテーション後:2 3 4 5 1
  • 【プログラムの実行結果】(その2)赤字は実行時にキーボードから入力する内容
整数を 5 個入力してください:1 1 2 2 2
ローテーション前:1 1 2 2 2
ローテーション後:1 2 2 2 1

【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
実行の画面出力が上の例と違うきちんと確認していない).
 例えば,左端の数値はローテーションによって右端へ移るはずであるがそうなっていない.
■ 配列の添字として許されない範囲(p[-1]p[SIZE])にアクセスしてしまっている.
main 関数や print_array を書き換えてしまっている.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


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