다양한 투표 시스템이 존재하지만, 아마도 다수결 투표가 가장 단순한 투표 방식일 것이다. 다수결 투표에서는 투표자가 한 명의 후보을 뽑을 수 있고, 투표가 완료되면 가장 많은 표를 얻은 후보자가 당선된다.
다음과 같이 명령행 인자로 투표 입후보자의 이름을 받고, 프롬프트로 투표자 수를 입력받은 후, 다수결 투표를 시뮬레이션하는 프로그램을 만든다.
$ ./plurality Alice Bob Charlie
Number of voters: 4
Vote: Alice
Vote: Bob
Vote: Charlie
Vote: Alice
Alice
$ ./plurality Alice Bob Charlie
Number of voters: 5
Vote: Alice
Vote: Charlie
Vote: Bob
Vote: Bob
Vote: Alice
Alice
Bob
#define MAX 9
는 MAX
가 상수 9
임을 의미하며, 이것은 프로그램 전체에서 사용될 수 있다. 이 프로그램에서는 투표에 참여할 수 있는 최대 인원수를 의미한다.candidate
라는 struct
가 정의되어 있다. 각 candidate
은 두 개의 필드를 가진다. 하나는 후보자의 이름을 저장하는 string
이고, 다른 하나는 후보자의 득표 수를 저장하는 int
이다. 그 다음, 파일에는 candidates
라는 전역 배열 변수가 정의되어 있는데, 각 원소가 하나의 candidate
이 된다.main
함수를 보면, 프로그램은 투표 입후보자의 수를 나타내는 전역변수 candidate_count
을 선언하고, candidates
배열에 명령행 인자를 복사하며, 사용자에게 투표자 수를 입력받는 프롬프트를 출력한다. 그 다음에는 vote
함수를 출력하여 모든 투표자가 투표를 하도록 한다. 마지막으로는 print_winner
를 호출하여 투표의 당선자를 출력한다.vote
와 print_winner
함수를 보충하여 프로그램을 완성한다.vote
함수를 완성한다.vote
는 하나의 인수로 string
타입의 name
을 받는다. 투표 입후보자의 이름을 의미한다.name
이 입후보자의 이름 중 하나와 일치한다면, 해당 후보자의 총 득표수를 업데이트한다. 이 경우 함수는 유효한 투표를 의미하는 true
를 반환한다.name
이 어떤 입후보자와의 이름과도 일치하지 않는다면, 총 투표수는 변하지 않는다. 이 경우 함수는 유효하지 않은 투표를 의미하는 false
를 반환한다.print_winner
함수를 완성한다.vote
와 print_winner
함수 외의 부분은 수정해서는 안된다(헤더 파일 추가는 가능하다).bool vote(string name)
{
for (int i = 0; i < candidate_count; i++)
{
if (strcmp(name, candidates[i].name) == 0)
{
candidates[i].votes++;
return true;
}
}
return false;
}
strcmp()
를 이용.void print_winner(void)
{
int max = 0;
for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].votes > max)
{
max = candidates[i].votes;
}
}
for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].votes == max)
{
printf("%s", candidates[i].name);
printf("\n");
}
}
return;
}