以下のような多数決選挙を行うプログラムを実装します。
$ ./plurality Alice Bob Charlie
Number of voters: 4
Vote: Alice
Vote: Bob
Vote: Charlie
Vote: Alice
Alice
背景
選挙はあらゆる形と規模で行われます。英国では、首相は通常、女王によって、下院で最も多くの議席を獲得した政党のリーダーが任命されます。米国では、市民が州ごとに選挙人をどのように配分し、その後大統領を選出するかについて投票する、複数の段階からなる選挙人制度を採用しています。
しかし、おそらく選挙を実施する最も簡単な方法は、一般的に 「多数決投票」として知られている方法 ( 「単純小選挙区制」 または 「勝者総取り方式」 としても知られています) を用いることです。多数決では、すべての投票者が1人の候補者に投票します。選挙が終わると、得票数が最も多い候補者が当選者になります。
始め方
VS Codeを開きます。
ターミナルウィンドウ内をクリックすることから始めて、それからcd
を実行します。
その後プロンプトは次のようになっていることがわかります。
$
ターミナルウィンドウの内側をクリックし、次のように入力します。
wget https://cdn.cs50.net/2021/fall/psets/3/plurality.zip
その後にEnterを押すと、plurality.zipというZIPがあなたのCodespaceにダウンロードされます。wgetと次のURLの間にあるスペースや、その他の文字を見落とさないように注意してください。
次に
unzip plurality.zip
を実行して、pluralityというフォルダを作成します。
ZIPファイルは不要になったため、
rm plurality.zip
を実行し、プロンプトで “y “に続いてEnterで応答すると、ダウンロードしたZIPファイルが削除されます。
次に
cd plurality
の後にEnterを押して、そのディレクトリに移動する(つまり、開く)。これでプロンプトは以下のようになります。
plurality/ $
すべて成功した場合は、次のように実行します。
ls
plurality.cというファイルが表示されます。code plurality.cを実行すると、このProblem setのコードを入力するファイルが開かれるはずです。そうでない場合は、手順をたどって、どこで間違ったのかを判断してください。
理解を深める
次に、plurality.c
を見て、提供された配布コードを確認します。
行#define MAX 9
は、MAX
がプログラム全体で使用できる定数 (9
に等しい) であることを示すために使用される構文です。ここでは、選挙の候補者の最大数を表します。
次に、ファイルはcandidate (
候補者) と呼ばれる構造体 (struct
)
を定義します。各candidate
には2つのフィールドがあります。候補者の名前を表すname
というstring
と、候補の得票数を表すvotes
というint
です。次に、ファイルはグローバル配列candidates
を定義し、その各要素自体がcandidate
となります。
次に、main
関数自体を見てみましょう。プログラムが選挙の候補者の数を表すグローバル変数candidate_count
を設定し、コマンドライン引数を配列candidates
にコピーし、投票者の数を入力するようにユーザーに要求していることを確認します。このプログラムでは、投票者全員に投票を行わせて (どのように行っていますか?)、投票した各候補者のvote
関数を呼び出しています。最後に、main
はprint_winner
関数を呼び出して、選挙の勝者 (複数可) を出力します。
しかし、ファイルをさらに詳しく見ると、vote
関数とprint_winner
関数が空白になっていることがわかります。この部分を完成させるのはあなたです!
仕様
プログラムが多数決投票をシミュレートするように、plurality.c
の実装を完了します。
vote
関数を実装します。vote
は、投票された候補者の名前を表すname
というstring
文字列を引数として取ります。
name
が選挙の候補者の名前の1つと一致する場合は、その候補者の投票合計を更新して新しい投票を反映させます。この場合、vote
関数はtrue
を返し、投票が成功したことを示します。
name
が選挙の候補者の名前と一致しない場合、投票合計は変更されず、vote
関数は無効な投票を示すfalse
を返します。
- 2人の候補者が同じ名前を持つことはないと仮定できます。
print_winner
関数を実装します。- この関数は、選挙で最も多くの票を獲得した候補者の名前を出力し、改行を出力します。
- 複数の候補者がそれぞれ最大の投票数を持っている場合、選挙が引き分けに終わる可能性があります。その場合は、当選した候補者の名前をそれぞれ別の行に出力する必要があります。
plurality.c
では、vote
およびprint_winner
関数 (また必要に応じて、追加のヘッダファイル) の実装以外は変更しないでください。
使い方
プログラムは、次の例に従って動作する必要があります。
$ ./plurality Alice Bob
Number of voters: 3
Vote: Alice
Vote: Bob
Vote: Alice
Alice
$ ./plurality Alice Bob
Number of voters: 3
Vote: Alice
Vote: Charlie
Invalid vote.
Vote: Alice
Alice
$ ./plurality Alice Bob Charlie
Number of voters: 5
Vote: Alice
Vote: Charlie
Vote: Bob
Vote: Bob
Vote: Alice
Alice
Bob
ウォークスルー
テスト
コードをテストして以下を処理できることを確認してください。
- 任意の数の候補者による選挙 (
MAX
の9
まで) - 候補者の氏名による投票
- 投票に参加していない候補者に対する無効な投票
- 当選者が1人の場合は当選者を印刷
- 当選者が複数ある場合は、その複数の当選者を印刷
check50
を使用して以下を実行し、コードの正確さを評価してください。ただし、コンパイルとテストは必ず自分で行ってください。
check50 cs50/problems/2022/x/plurality
以下を実行し、style50
を使用してコードのスタイルを評価します。
style50 plurality.c
提出方法
ターミナルで、以下を実行して提出してください。
submit50 cs50/problems/2022/x/plurality