112 lines
2.3 KiB
C
112 lines
2.3 KiB
C
|
#include <cs50.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
// Max number of candidates
|
||
|
#define MAX 9
|
||
|
|
||
|
// Candidates have name and vote count
|
||
|
typedef struct
|
||
|
{
|
||
|
string name;
|
||
|
int votes;
|
||
|
}
|
||
|
candidate;
|
||
|
|
||
|
// Array of candidates
|
||
|
candidate candidates[MAX];
|
||
|
|
||
|
// Number of candidates
|
||
|
int candidate_count;
|
||
|
|
||
|
// Function prototypes
|
||
|
bool vote(string name);
|
||
|
void print_winner(void);
|
||
|
|
||
|
int main(int argc, string argv[])
|
||
|
{
|
||
|
// Check for invalid usage
|
||
|
if (argc < 2)
|
||
|
{
|
||
|
printf("Usage: plurality [candidate ...]\n");
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
// Populate array of candidates
|
||
|
candidate_count = argc - 1;
|
||
|
if (candidate_count > MAX)
|
||
|
{
|
||
|
printf("Maximum number of candidates is %i\n", MAX);
|
||
|
return 2;
|
||
|
}
|
||
|
for (int i = 0; i < candidate_count; i++)
|
||
|
{
|
||
|
candidates[i].name = argv[i + 1];
|
||
|
candidates[i].votes = 0;
|
||
|
}
|
||
|
|
||
|
int voter_count = get_int("Number of voters: ");
|
||
|
|
||
|
// Loop over all voters
|
||
|
for (int i = 0; i < voter_count; i++)
|
||
|
{
|
||
|
string name = get_string("Vote: ");
|
||
|
|
||
|
// Check for invalid vote
|
||
|
if (!vote(name))
|
||
|
{
|
||
|
printf("Invalid vote.\n");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Display winner of election
|
||
|
print_winner();
|
||
|
}
|
||
|
|
||
|
// Update vote totals given a new vote
|
||
|
bool vote(string name)
|
||
|
{
|
||
|
for (int i = 0; i < candidate_count; i++)
|
||
|
{
|
||
|
if (strcmp(candidates[i].name, name) == 0)
|
||
|
{
|
||
|
candidates[i].votes += 1;
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// Print the winner (or winners) of the election
|
||
|
void print_winner(void)
|
||
|
{
|
||
|
//array to store candidates with highest votes
|
||
|
int winner_index[candidate_count];
|
||
|
winner_index[0] = 0;
|
||
|
int j = 0;
|
||
|
//check votes of all candidates
|
||
|
for (int i = 1; i < candidate_count; i++)
|
||
|
{
|
||
|
//store highest seen vote candidate index
|
||
|
if (candidates[i].votes > candidates[winner_index[j]].votes)
|
||
|
{
|
||
|
j = 0;
|
||
|
winner_index[j] = i;
|
||
|
}
|
||
|
//when more candidates have the smae amount of votes, save all of them
|
||
|
else if (candidates[i].votes == candidates[winner_index[j]].votes)
|
||
|
{
|
||
|
j++;
|
||
|
winner_index[j] = i;
|
||
|
}
|
||
|
}
|
||
|
//prints all winners, 1 per line
|
||
|
for (int i = 0; i <= j; i++)
|
||
|
{
|
||
|
printf("%s\n", candidates[winner_index[i]].name);
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|