switch文で関数を呼び出して選挙の投票・開票を行うC言語プログラムの作り方
問題
C言語を使って、選挙に参加している各候補者への投票を受け付け、票数を集計して表示するには、どのようにプログラムを書けばよいのでしょうか。
解決策
ここでは、選挙に立候補した3人の候補者がいる場合を例に考えてみましょう。このプログラムには、次の2つの主要な機能が必要です。
投票(Cast Vote) − 候補者の番号を選んで入力することで、その候補者に1票を投じます。
得票数の集計(Vote Count) − 各候補者が獲得した総得票数を集計し、結果を一覧表示します。これにより誰が当選したかを確認できます。
サンプルコード
これらの操作はすべて、switch 文を使ってユーザーの選択に応じた関数を呼び出すことで実現しています。メニュー処理は do-while ループで繰り返し行い、「0」を入力するとプログラムが終了します。
#include <stdio.h>
#define CANDIDATE_COUNT
#define CANDIDATE1 "ABC"
#define CANDIDATE2 "XYZ"
#define CANDIDATE3 "PQR"
int votescount1 = 0, votescount2 = 0, votescount3 = 0;
/* 投票を行う関数 */
void castvote(){
int choice;
printf("\n\n ### Please choose your Candidate ####\n\n");
printf("\n 1. %s", CANDIDATE1);
printf("\n 2. %s", CANDIDATE2);
printf("\n 3. %s", CANDIDATE3);
printf("\n 4. %s", "None of These");
printf("\n Input your choice (1 - 4) : ");
scanf("%d", &choice);
switch(choice){
case 1: votescount1++; break;
case 2: votescount2++; break;
case 3: votescount3++; break;
default: printf("\n Error: Wrong Choice !! Please retry");
/* 画面を保持 */
getchar();
}
printf("\n thanks for vote !!");
}
/* 得票数を集計・表示する関数 */
void votesCount(){
printf("\n\n ##### Voting Statics ####");
printf("\n %s - %d ", CANDIDATE1, votescount1);
printf("\n %s - %d ", CANDIDATE2, votescount2);
printf("\n %s - %d ", CANDIDATE3, votescount3);
}
int main(){
int i;
int choice;
do{
printf("\n\n ###### Welcome to Election/Voting 2019 #####");
printf("\n\n 1. Cast the Vote");
printf("\n 2. Find Vote Count");
printf("\n 0. Exit");
printf("\n Please enter your choice : ");
scanf("%d", &choice);
switch(choice){
case 1: castvote(); break;
case 2: votesCount(); break;
default: printf("\n Error: Invalid Choice");
}
}while(choice != 0);
/* 画面を保持 */
getchar();
return 0;
}
プログラムのポイント
候補者名は
#defineマクロで定義しているため、名前を変更したい場合は定義部分だけを修正すれば済みます。各候補者の得票数はグローバル変数(
votescount1〜3)で管理されており、case文の中でインクリメント(++)されています。範囲外の番号が入力された場合、
default句でエラーメッセージを表示し、再入力を促します。main関数内のdo-whileループにより、ユーザーが「0」を選ぶまでメニュー画面が繰り返し表示されます。
実行結果
###### Welcome to Election/Voting 2019 ##### 1. Cast the Vote 2. Find Vote Count 0. Exit Please enter your choice : 1 ### Please choose your Candidate #### 1. ABC 2. XYZ 3. PQR 4. None of These Input your choice (1 - 4) : 1 thanks for vote !! ###### Welcome to Election/Voting 2019 ##### 1. Cast the Vote 2. Find Vote Count 0. Exit Please enter your choice : 1 ### Please choose your Candidate #### 1. ABC 2. XYZ 3. PQR 4. None of These Input your choice (1 - 4) : 1 thanks for vote !! ###### Welcome to Election/Voting 2019 ##### 1. Cast the Vote 2. Find Vote Count 0. Exit Please enter your choice : 2 ##### Voting Statics #### ABC - 2 XYZ - 0 PQR - 0 ###### Welcome to Election/Voting 2019 ##### 1. Cast the Vote 2. Find Vote Count 0. Exit Please enter your choice :
このように、switch文と関数を組み合わせることで、投票から開票までの一連の流れを簡潔かつ構造的に実装できます。応用として、候補者数を配列で管理したり、最多得票者を自動的に判定して「当選者」を表示する機能を追加したりすると、より実用的な投票システムになります。
-
C言語でforループを使ってハート型パターンの中央に名前を出力するプログラム
C言語のforループを活用すれば、星印(*)だけでハート型の図形を描き、その中央に好きな名前を表示することができます。この記事では、その仕組みと実装方法を順を追ってわかりやすく解説します。 課題 forループを使用して、星印(*)で描いたハート型のパターンの中に、名前を中央に表示するプログラムを作成します。 解決方法 まずユーザーに、中央に表示したい名前と、星印を表示する行数を入力してもらいます。プログラムはこれらの入力値をもとに、星印でハートの輪郭を描きながら、その中心部分に指定された名前を組み込んで出力します。 アルゴリズム forループを使ってハートパターン内に名前を表示する際は、以下
-
【C言語】ビット演算子を使って2倍・半分を計算する方法
ビット演算子は、オペランドのビット単位(2進数の各桁)に対して直接操作を行う演算子です。シフト演算を活用すると、掛け算や割り算を高速に処理できるため、組み込み開発やパフォーマンスが求められる場面でよく使われます。C言語の主なビット演算子一覧演算子説明&ビットごとのAND(論理積)|ビットごとのOR(論理和)^ビットごとのXOR(排他的論理和)<<左シフト>>右シフト~1の補数(ビット反転)AND演算の真理値表ビットごとのANDaba & b000010100111OR演算の真理値表ビットごとのORaba | b000011101111XOR演算の真理値表