Last active
June 26, 2024 19:39
-
-
Save AnimeshRy/489d3c19db9d179c7c562bad24c4b3ee to your computer and use it in GitHub Desktop.
CS50 Runoff Pset3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cs50.h> | |
#include <stdio.h> | |
#include <string.h> | |
#include <stdbool.h> | |
#include <math.h> | |
// Max voters and candidates | |
#define MAX_VOTERS 100 | |
#define MAX_CANDIDATES 9 | |
// preferences[i][j] is jth preference for voter i(2d array) | |
int preferences[MAX_VOTERS][MAX_CANDIDATES]; | |
// Candidates have name, vote count, eliminated status | |
typedef struct | |
{ | |
string name; | |
int votes; | |
bool eliminated; | |
} | |
candidate; | |
// Array of candidates | |
candidate candidates[MAX_CANDIDATES]; | |
// Numbers of voters and candidates | |
int voter_count; | |
int candidate_count; | |
// Function prototypes | |
bool vote(int voter, int rank, string name); | |
void tabulate(void); | |
bool print_winner(void); | |
int find_min(void); | |
bool is_tie(int min); | |
void eliminate(int min); | |
int main(int argc, string argv[]) | |
{ | |
// Check for invalid usage | |
if (argc < 2) | |
{ | |
printf("Usage: runoff [candidate ...]\n"); | |
return 1; | |
} | |
// Populate array of candidates | |
candidate_count = argc - 1; | |
if (candidate_count > MAX_CANDIDATES) | |
{ | |
printf("Maximum number of candidates is %i\n", MAX_CANDIDATES); | |
return 2; | |
} | |
for (int i = 0; i < candidate_count; i++) | |
{ | |
candidates[i].name = argv[i + 1]; | |
candidates[i].votes = 0; | |
candidates[i].eliminated = false; | |
} | |
voter_count = get_int("Number of voters: "); | |
if (voter_count > MAX_VOTERS) | |
{ | |
printf("Maximum number of voters is %i\n", MAX_VOTERS); | |
return 3; | |
} | |
// Keep querying for votes | |
for (int i = 0; i < voter_count; i++) | |
{ | |
// Query for each rank | |
for (int j = 0; j < candidate_count; j++) | |
{ | |
string name = get_string("Rank %i: ", j + 1); | |
// Record vote, unless it's invalid | |
if (!vote(i, j, name)) | |
{ | |
printf("Invalid vote.\n"); | |
return 4; | |
} | |
} | |
printf("\n"); | |
} | |
// Keep holding runoffs until winner exists | |
while (true) | |
{ | |
// Calculate votes given remaining candidates | |
tabulate(); | |
// Check if election has been won | |
bool won = print_winner(); | |
if (won) | |
{ | |
break; | |
} | |
// Eliminate last-place candidates | |
int min = find_min(); | |
bool tie = is_tie(min); | |
// If tie, everyone wins | |
if (tie) | |
{ | |
for (int i = 0; i < candidate_count; i++) | |
{ | |
if (!candidates[i].eliminated) | |
{ | |
printf("%s\n", candidates[i].name); | |
} | |
} | |
break; | |
} | |
// Eliminate anyone with minimum number of votes | |
eliminate(min); | |
// Reset vote counts back to zero | |
for (int i = 0; i < candidate_count; i++) | |
{ | |
candidates[i].votes = 0; | |
} | |
} | |
return 0; | |
} | |
// Record preference if vote is valid | |
//passed i,j and name of the candidate the user entered, look at line 77 | |
bool vote(int voter, int rank, string name) | |
{ | |
bool exist = false; | |
for (int i = 0; i < candidate_count; i++) | |
{ | |
//check if name is present in the candidates entered by the user by camparing two strings | |
//strcmp is checking for the name and camparing it to the candidates array location 'i' which starts according to the for loop above | |
if (strcmp(name, candidates[i].name) == 0) | |
{ | |
//if you found the person is present then add that number as a rank of the candidate in the preferences array | |
//suppose this is a 2d array and the preference array is adding the preference number on a specific poistion so | |
// here ex - preferences[0][0] = i (the rank preferences from the candidate count) | |
// [i][][][] | |
// [][][][] | |
// [][][][] | |
// [][][][] | |
preferences[voter][rank] = i; | |
exist = true; | |
break; | |
//This is a bool conditions which will become true, again look at line 77 | |
} | |
} | |
return exist; | |
} | |
// Tabulate votes for non-eliminated candidates | |
void tabulate(void) | |
{ | |
// TODO | |
for (int i = 0; i < voter_count; i++) | |
{ | |
for (int j = 0; j < candidate_count; j++) | |
{ | |
if (candidates[preferences[i][j]].eliminated == false) | |
{ | |
candidates[preferences[i][j]].votes += 1; | |
break; | |
} | |
} | |
} | |
return; | |
} | |
// Print the winner of the election, if there is one | |
bool print_winner(void) | |
{ | |
// TODO | |
for (int i = 0; i < candidate_count; i++) | |
{ | |
string most = candidates[i].name; | |
if (candidates[i].votes > voter_count / 2) | |
{ | |
printf("%s\n", most); | |
return true; | |
} | |
} | |
return false; | |
} | |
// Return the minimum number of votes any remaining candidate has | |
int find_min(void) | |
{ | |
int minvotes = voter_count; | |
for (int i = 0; i < candidate_count; i++) | |
{ | |
if (candidates[i].eliminated == false && candidates[i].votes < minvotes) | |
{ | |
minvotes = candidates[i].votes; | |
} | |
} | |
return minvotes; | |
} | |
// Return true if the election is tied between all candidates, false otherwise | |
bool is_tie(int minvotes) | |
{ | |
for (int i = 0; i < candidate_count; i++) | |
{ | |
if (candidates[i].eliminated == false && candidates[i].votes != minvotes) | |
{ | |
return false; | |
} | |
} | |
return true; | |
} | |
// Eliminate the candidate (or candidiates) in last place | |
void eliminate(int minvotes) | |
{ | |
for (int i = 0; i < candidate_count; i++) | |
if (candidates[i].votes == minvotes) | |
{ | |
candidates[i].eliminated = true; | |
} | |
return; | |
} |
wx5162839
commented
Dec 1, 2022
via email
这是一封自动回复邮件。已经收到您的来信,我会尽快回复。
please help me because as I run this code it is not compiling properly instead after entering one rank is giving the output of invalid .
这是一封自动回复邮件。已经收到您的来信,我会尽快回复。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment