Plurality

以下のような多数決選挙を行うプログラムを実装します。

$ ./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