0

My code does not print out the winners at all...It only outputs their names. Is anybody able to pick out what's incorrect or if the code is missing something? Many thanks in advance :)

#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)
{
    // TODO 1) look for candidate called "name" 2) if found, update vote total and return true 3) if not found, return false and dont update vote total
    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 election
    void print_winner(void)
{
        int winner_votes = 0;

for (int i=0; i<candidate_count; i++)
{
    if (candidates[i].votes > winner_votes)
    {
        candidates[i].votes = winner_votes;
    }
}
for (int i=0; i<candidate_count; i++)
{
    if (candidates[i].votes == winner_votes)
        {
            printf("%s\n", candidates[i].name);
        }
}

        return;

}

2 Answers 2

0

In the first 'for loop' in print_winner(void) the line: candidates[i].votes = winner_votes; is setting votes of all candidates to 0. Reverse this as: winner_votes = candidates[i].votes; This should result in printing the winner.

1
  • Thank you! This is slightly confusing as I would have thought "=" has the same function whatever the order. I would have never known that myself. Much appreciated!
    – Soya
    Jan 27, 2022 at 1:13
0

winner_votes never changes, it is always 0. This line candidates[i].votes = winner_votes; changes all candidates' votes to winner_votes (which is always 0). Therefore the print loop will print all candidates.

1
  • Thank you so much for this.
    – Soya
    Jan 27, 2022 at 1:13

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .