課題 [13] 構造体(8/8)

この課題は加点対象ですので,上級クラスは必須としますが中級クラスの人はできる人だけでよいです.なお,上級・中級を問わず,正解していれば加点します.

問 8(提出プログラム名:ex1308a.c)

まず,このプログラム(ex1308a.c)をダウンロードしなさい.
そして,ex1308a.cを編集して次の処理を行うプログラムとして仕上げなさい.

【目的の処理】
このプログラムは問 7 で作った ex1307a.h も活用しつつ,
コンピュータとトランプの勝負を 26 回行って,その勝ち負けの数を出力させるものである.

【プログラムの内容】
(1)52 種類のトランプを長さ 52(SIZE として定義)の CARD 配列に用意する.
(2)整数を 1 つ読み込み,その回数だけトランプをシャッフルする.
(3)シャッフル後のトランプを上から 1 枚ずつ(配列の先頭から 1 つずつ),
  あなたとコンピュータが交互に引いて,問 7 で定義したルールで勝負を行う.
(4)最後にあなたの何勝何敗なのかを出力する.

ダウンロードしたプログラムでは手順(1)と(2)は既に完成しているので,
手順の(3)と(4)を完成させなさい.

【補足説明】
プログラムの中では rand() という関数が呼び出されており,これが乱数(ただし 0 以上の整数)
を自動的に生み出すようになっている.これを使うために #include <stdlib.h> が必要.
ただし,この乱数は擬似乱数と呼ばれるもので,毎回同じ法則で乱数を発生させているため,
何回実行しても結果は変わらない.
これを変えるには「乱数の種」と呼ばれる数値を srand 関数で設定する必要があるが,
今回はそこまでは行っていない.

プログラム中で
  i = rand() % SIZE;
といった記述があるが,こうすることで rand() が生み出す乱数が何であったとしても
i の値は 0SIZE-1 になることが保証される.
乱数を使ったプログラムでは定番の書き方となっている.

  • 【プログラムの実行結果】(その1)赤字は実行時にキーボードから入力する内容
カードを何回シャッフルしますか?
> 0
-------------------
 1 回目:
スペード の A
スペード の 2
あなたの勝ち
-------------------
 2 回目:
スペード の 3
スペード の 4
あなたの負け
...

あなたの負け
-------------------
26 回目:
クラブ の Q
クラブ の K
あなたの負け
====================
結果: 2 勝 24 敗

  • 【プログラムの実行結果】(その2)赤字は実行時にキーボードから入力する内容
    以下の結果はひょっとすると環境やコンパイラのバージョンによって変わるかもしれませんので,
    念の為に表示されたカードの勝ち負けは自分でも確認して下さい.
カードを何回シャッフルしますか?
> 1000
-------------------
 1 回目:
スペード の 8
スペード の J
あなたの負け
-------------------
 2 回目:
スペード の K
ダイヤ の Q
あなたの勝ち
-------------------
...

あなたの勝ち
-------------------
26 回目:
スペード の 9
クラブ の K
あなたの負け
====================
結果: 12 勝 14 敗

【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
実行の画面出力の内容が上の例と違うきちんと確認していない).
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


問 4 ~問 8 は 7/13(月)23:59 までに提出を済ませなさい.
(ex1304a.h ~ ex1308a.c を Moodle から提出してください.)
くれぐれも各問題で記載されている注意事項や「過去にあったミス」を見落とさないようにしてください.
なお,提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.