0

I am having trouble figuring out what is wrong with my code. The only failure in check50 is (:( print_winner identifies Charlie as winner of election Cause print_winner function did not print winner of election) The problem will be at the bottom as main is given.

#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)
{
    //vote(name);
    for (int i = 0; i < candidate_count; i++) //runs through all candidates
    {

        if (strcmp(name, candidates[i].name) == 0)
        {
            candidates[i].votes = candidates[i].votes + 1;
            return true;

        }


    }
    return false;
}

// Print the winner (or winners) of the election
void print_winner(void)
{
    for (int i = 0; i < candidate_count; i++)
    {
        if (candidates[i].votes < candidates[i + 1].votes)
        {
            //sorts the votes by bubble sort

            int s = candidates[i].votes;
            candidates[i].votes = candidates[i + 1].votes;
            candidates[i + 1].votes = s;

            //sorts the names by bubble sort

            string h = candidates[i].name;
            candidates[i].name = candidates[i + 1].name;
            candidates[i + 1].name = h;

        }
    }

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

    return;
}

2 Answers 2

0

The print_winner() function shown above has several problems. First, it doesn't actually sort anything. All it will do is check if a candidate had fewer votes than the next candidate, and if so, swap them. This is only part of a sort (and it's a stone sort, not a bubble sort.) You would need to rework it to actually get it to sort. Second, I have no idea what the later for loop is supposed to do.

Instead, think about this. All the print_winner() function has to do is determine the highest number of votes received and then print all the candidates with that many votes. Sounds like it just needs to make two passes through the data, without moving anything around. Think about it. ;-)

If this answers your question, please click on the check mark to accept. Let's keep up on forum maintenance. ;-)

0

You first have to count the maximum number of votes any candidate(s) has in the election.

How?

Everytime you have to compare the value of current number of votes with the next value and if next value is greater than store the value and check with next till all candidates have been checked.

int max = 0;
if (max < [next_candidate])
{
  max = store_value;

}

Any candidate(s) who has maximum number of votes

candidate[i].votes == max

Print the name of the candidate.

You must log in to answer this question.

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