Can someone tell me why my code doesn't work.
here's its description https://cs50.harvard.edu/x/2020/psets/3/runoff/.
the error is most probably outside of the main function.
edit - the issue has been resolved, below code is working solution to the pset
#include <cs50.h>
#include <stdio.h>
#include<string.h>
// Max voters and candidates
#define MAX_VOTERS 100
#define MAX_CANDIDATES 9
// preferences[i][j] is jth preference for voter i
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
bool vote(int voter, int rank, string name)
{
// TODO
for(int i = 0; i < candidate_count; i++)
{
if(strcmp(name,candidates[i].name) == 0)
{
preferences[voter][rank] = i;
return true;
}
}
return false;
}
// 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++)
{
if(candidates[i].votes > (voter_count / 2))
{
printf("%s\n",candidates[i].name);
return true;
}
}
return false;
}
// Return the minimum number of votes any remaining candidate has
int find_min(void)
{
// TODO
int min = 0;
for(int i = 0; i < candidate_count; i++)
{
if(candidates[i].eliminated == false)
{
if(min >= candidates[i].votes)
{
min = candidates[i].votes;
}
}
}
return min;
}
// Return true if the election is tied between all candidates, false otherwise
bool is_tie(int min)
{
// TODO
for(int i = 0; i < candidate_count; i++)
{
if(candidates[i].eliminated == false && candidates[i].votes != min)
{
return false;
}
}
return true;
}
// Eliminate the candidate (or candidates) in last place
void eliminate(int min)
{
// TODO
for(int i = 0; i < candidate_count; i++)
{
if(!candidates[i].eliminated)
{
if(candidates[i].votes == min)
{
candidates[i].eliminated = true;
}
}
}
return;
}
I tried using debugger but the code just keeps on looping and i cant seem to find the error.
i also cant seem to view the elements inside the structure and array in the debugger which in turn makes me unable to debug properly
There may be more, but there's this at least:
void tabulate(void) {
for(int i = 0; i < voter_count; i++) { // <== counting up to ~100 voters
if(!candidates[i].eliminated) // <== indexing array whose max dimension is 9
candidates[preferences[i][0]].votes += 1;
else {
for(int j = 1; j <= candidate_count; j++)
if(candidates[i].eliminated) { // <== and again, here
candidates[preferences[i][j]].votes += 1;
break;
}
}
}
}
Having found at least two problems, I'm won't be correcting the code. This is "homework" for the OP to do.