課題 [14] 構造体(3/3)

問 3(提出プログラム名:ex1403.c)

まず,このプログラム(ex1403.c)をダウンロードしなさい.
ex1403.c では,整数を要素として持つ(数学用語の)集合を構造体 SET として表現している.
ただし,集合に格納できる要素数は SIZE を上限とし,これ以上多くの要素が与えられることはないものと仮定してよい.
この構造体には次の 2 つのメンバがある:
  ■ elements (集合の要素を格納している int 配列)
  ■ count  (集合に含まれている要素の個数)

この問題では,整数をいくつか読み込み,それらを 1 つずつ集合へ追加して集合の内容を表示するという操作を繰り返したい(ただし,0 を入力したら終わりとする(その 0 は集合には含めない)).
整数を集合へ追加するための関数 append を以下の仕様で完成させなさい:
【関数 append の仕様】
 ■ 引数 p:対象としている集合(SET 型)へのポインタ
 ■ 引数 x:集合へ追加したい整数
 ■ 処理内容:
  ポインタ p が参照している集合に対して,整数 x を追加する.
  ただし,数学でいうところの「集合」では同じ要素を 2 個含むことはできない
  (重複は無視される)点に注意すること.

  具体的には,次の手順に従ってこれを完成させること.
  (1)for 文または while 文を使って,i0 以上 p->count 未満の範囲で
    変化させながら,p->elements[i]x と等しいかどうかをチェックする.
    もしも等しい場合は break でもって繰り返しを打ち切る.
  
  (2)上の繰り返しが終わった時点で i の値が p->count と等しければ,
    break による打ち切りは行われなかったことになる.つまり,
    この集合には x と同じ値はまだ格納されていないことになる.
    そこで,p->elements[i]x を代入し,要素数が 1 個増えたことになるので
    p->count+1 する.

【注意】
関数 main の内容は一切書き換えないこと.

  • 【プログラムの実行結果】(その1)赤字は実行時にキーボードから入力する内容
    (※実行例では,123 や 88 が 2 回入力されているが,2 回目の追加はいずれも無視されている点に注意.)
集合の内容 = { }
集合に追加する整数を入力してください:123
集合の内容 = { 123 }
集合に追加する整数を入力してください:88
集合の内容 = { 123, 88 }
集合に追加する整数を入力してください:123
集合の内容 = { 123, 88 }
集合に追加する整数を入力してください:502
集合の内容 = { 123, 88, 502 }
集合に追加する整数を入力してください:88
集合の内容 = { 123, 88, 502 }
集合に追加する整数を入力してください:0
  • 【プログラムの実行結果】(その2)赤字は実行時にキーボードから入力する内容
    (※実行例では,123 が 3 回入力されているが,2 回目以降の追加はいずれも無視されている点に注意.)
集合の内容 = { }
集合に追加する整数を入力してください:123
集合の内容 = { 123 }
集合に追加する整数を入力してください:123
集合の内容 = { 123 }
集合に追加する整数を入力してください:123
集合の内容 = { 123 }
集合に追加する整数を入力してください:0

【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
上に示した 2 種類の実行例を試していない
 あるいは,答えが微妙に違っていることに気が付いていない.

■ 入力された値が単に末尾に追加されるだけになっている(重複のチェックがない).
注意書きを見落としていて main 関数の中身を書き換えてしまっている.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


以上の 3 問明日(7/26)の 16時までに提出してください.
(ex1401.c ~ ex1403.c を Moodle から提出してください.)
くれぐれも各問題で記載されている注意事項や「過去にあったミス」を見落とさないようにしてください.なお,コンパイルエラーや無限ループが含まれる場合は総合評価を 0 点とします.
提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.