練習 [5] 配列(2/5)

練習 2(提出プログラム名:p0502a.c)

以下の例のように配列に格納されている整数の入れ替えを繰り返し実行できるプログラムを p0502a.c として作りなさい.このプログラムでは次の処理を行っている:

(1) SIZE 個(この場合,マクロ SIZE5 と定義)の整数を読み込んで配列に格納する.
(2)「何番目と何番目を交換しますか:」とメッセージを表示した後に 2 つの整数 mn を読み込み,
m 番目の数と n 番目の数を配列内で入れ替える.そして,配列の内容を表示する.
ただし,このプログラムではこの (2) の処理を繰り返し,m == n の時に繰り返しを止めるものとする.
なお,ここでは 1 ≦ m, n ≦ SIZE であると仮定してプログラムを作ってよい.

【注意】この問題ではマクロ SIZE の定義以外の場所では 5 や 4 といった配列長に関係する数字を書いてはいけません

【ヒント】
この問題の場合,何回繰り返すことになるかは事前に分からないため while 文を使うのがよいですが,その際には無限ループと break 文を活用して次のように作るという手があります(一般クラス向け第 5 回講義資料 p37).
※こうすれば mn の値の比較は②の位置で 1 回だけ書けば良いため手間が省けます.
 while (1)
 {
   ①「何番目と何番目を交換しますか」と表示し,整数 mn を読み込む.
   ② m == n ならば break を実行して繰り返しから脱出する.
   ③交換を実行する.
   ④交換した後の配列の内容を表示する.
 }
 ⑤「終了します」と表示する.

  • 【プログラムの実行例】(その1)赤字は実行時にキーボードから入力する内容
    ※「5 個の整数を入力してください:⏎」という表示を行うのに printf("5 個の整数を入力してください:\n"); と書くのは誤りなので注意せよ."%d"SIZE を使うこと.
    ※交換後の数列表示で数字が隣とくっついてしまっていないか注意せよ.
    (数列の表示では "%d " での出力を繰り返して,繰り返しが終わったら改行を出力するということで構いません)
5 個の整数を入力してください:
5 -2 4 13 8
何番目と何番目を交換しますか:
2 5
2 番目と 5 番目を交換した結果:
5 8 4 13 -2 
何番目と何番目を交換しますか:
1 4
1 番目と 4 番目を交換した結果:
13 8 4 5 -2 
何番目と何番目を交換しますか:
1 1
終了します
  • 【プログラムの実行例】(その2)赤字は実行時にキーボードから入力する内容
    ※きちんと「終了します⏎」と表示されているか確認せよ.
5 個の整数を入力してください:
1 2 3 4 5
何番目と何番目を交換しますか:
1 1
終了します

【過去にあったミス(減点となり,やり直しを命じられる)】
2 種類の実行例を確認せずに提出してしまっている.
 (例1)m == n の場合も交換を実行してしまっている(その場合は何もせずに終了するのが正解).
 (例2)「◯番目と△番目を交換した結果:」という表示で◯と△に具体的な数字が入っていない.
 (例3)最後に「終了します」と表示させていない.
■ scanf で mn を読み込むよりも前に m != nm == n を while や if の条件に書いてしまっている.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


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