pset 3
plurality
Implement a program that runs a plurality election, per the below.
$ ./plurality Alice Bob CharlieNumber of voters: 4Vote: AliceVote: BobVote: CharlieVote: AliceAlice#include <cs50.h>#include <stdio.h>#include <string.h>
// Max number of candidates#define MAX 9
// Candidates have name and vote counttypedef struct{ string name; int votes;}candidate;
// Array of candidatescandidate candidates[MAX];
// Number of candidatesint candidate_count;
// Function prototypesbool 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 votebool vote(string name){ // TODO for (int i = 0; i < candidate_count; i++) { if (strcmp(candidates[i].name, name) == 0) { candidates[i].votes++; return true; } } return false;}
// Print the winner (or winners) of the electionvoid print_winner(void){ // TODO int max = 0; for (int i = 0; i < candidate_count; i++) { if (max < candidates[i].votes) { max = candidates[i].votes; } } for (int i = 0; i < candidate_count; i++) { if (max == candidates[i].votes) { printf("%s\n", candidates[i].name); } } return;}tideman
Implement a program that runs a Tideman election, per the below.
./tideman Alice Bob CharlieNumber of voters: 5Rank 1: AliceRank 2: CharlieRank 3: Bob
Rank 1: AliceRank 2: CharlieRank 3: Bob
Rank 1: BobRank 2: CharlieRank 3: Alice
Rank 1: BobRank 2: CharlieRank 3: Alice
Rank 1: CharlieRank 2: AliceRank 3: Bob
Charlie#include <cs50.h>#include <stdio.h>#include <string.h>
// Max number of candidates#define MAX 9
// preferences[i][j] is number of voters who prefer i over jint preferences[MAX][MAX];
// locked[i][j] means i is locked in over jbool locked[MAX][MAX];
// Each pair has a winner, losertypedef struct{ int winner; int loser;}pair;
// Array of candidatesstring candidates[MAX];pair pairs[MAX * (MAX - 1) / 2];
int pair_count;int candidate_count;
// Function prototypesbool vote(int rank, string name, int ranks[]);void record_preferences(int ranks[]);void add_pairs(void);void sort_pairs(void);void lock_pairs(void);void print_winner(void);
int main(int argc, string argv[]){ // Check for invalid usage if (argc < 2) { printf("Usage: tideman [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] = argv[i + 1]; }
// Clear graph of locked in pairs for (int i = 0; i < candidate_count; i++) { for (int j = 0; j < candidate_count; j++) { locked[i][j] = false; } }
pair_count = 0; int voter_count = get_int("Number of voters: ");
// Query for votes for (int i = 0; i < voter_count; i++) { // ranks[i] is voter's ith preference int ranks[candidate_count];
// Query for each rank for (int j = 0; j < candidate_count; j++) { string name = get_string("Rank %i: ", j + 1);
if (!vote(j, name, ranks)) { printf("Invalid vote.\n"); return 3; } }
record_preferences(ranks);
printf("\n"); }
add_pairs(); sort_pairs(); lock_pairs(); print_winner(); return 0;}
// Update ranks given a new votebool vote(int rank, string name, int ranks[]){ // TODO for (int i = 0; i < candidate_count; i++) { if (strcmp(name, candidates[i]) == 0) { ranks[rank] = i; return true; } } return false;}
// Update preferences given one voter's ranksvoid record_preferences(int ranks[]){ // TODO for (int i = 0; i < candidate_count - 1; i++) { for (int j = i + 1; j < candidate_count; j++) { preferences[ranks[i]][ranks[j]]++; } } return;}
// Record pairs of candidates where one is preferred over the othervoid add_pairs(void){ // TODO int n = 0; for (int i = 0; i < candidate_count - 1; i++) { for (int j = i + 1; j < candidate_count; j++) { if (preferences[i][j] > preferences[j][i]) { pairs[n].winner = i; pairs[n].loser = j; n++; } else if (preferences[j][i] > preferences[i][j]) { pairs[n].winner = j; pairs[n].loser = i; n++; } } } pair_count = n;
return;}
// Sort pairs in decreasing order by strength of victoryvoid sort_pairs(void){ // TODO int k; int max; pair temp; for (int i = 0; i < pair_count; i++) { max = -1; for (int j = i; j < pair_count; j++) { if (max < preferences[pairs[j].winner][pairs[j].loser]) { max = preferences[pairs[j].winner][pairs[j].loser]; k = j; } } temp = pairs[k]; pairs[k] = pairs[i]; pairs[i] = temp; } return;}
// Lock pairs into the candidate graph in order, without creating cyclesvoid lock_pairs(void){ // TODO bool cycle; locked[pairs[0].winner][pairs[0].loser] = true; for (int i = 1; i < pair_count; i++) { cycle = false; if (pairs[i].winner == pairs[i - 1].loser) { for (int j = 0; j < i; j++) { if (pairs[j].winner == pairs[i].loser) { cycle = true; } } } else if (pairs[i].loser == pairs[i - 1].winner) { for (int j = 0; j < i; j++) { if (pairs[j].loser == pairs[i].winner) { cycle = true; } } } if (cycle == false) { locked[pairs[i].winner][pairs[i].loser] = true; } } return;}
// Print the winner of the electionvoid print_winner(void){ // TODO bool winner[candidate_count]; for (int i = 0; i < candidate_count; i++) { winner[i] = true; }
for (int i = 0; i < candidate_count; i++) { for (int j = 0; j < candidate_count; j++) { if (locked[i][j] == true) { winner[j] = false; } } }
for (int i = 0; i < candidate_count; i++) { if (winner[i] == true) { printf("%s\n", candidates[i]); } } return;}