0

For those who don't know, this pset is for calculating votes in an election. We were told to code the two functions vote and print_winner, and not to touch any of the other code.

The program seems to function properly, it prints out the names of any winners, but every time I type in a candidate's name to vote for them, it prints "Invalid Vote" as if the name doesn't exist in the array, but it does, and it later prints the proper winner(s). So it definitely knows it's there, but also thinks it's not for some reason. Code below, help is appreciated!

#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 - use linear search to look for the name of the candidate and increment vote total if found

    bool exist = false;

    for (int i = 0; i < candidate_count; i++)
    {
        if (strcmp(candidates[i].name, name) == 0)      //if match between cadidates.name and name found
            {
            candidates[i].votes++;                      //increment candidate vote count
            exist = true;                               //candidate exists
            break;

            }
    }

    return false;
}

// Print the winner (or winners) of the election
void print_winner(void)
{
    // TODO

    int maxvote = 0;

    for (int k = 0; k < candidate_count; k++)
        if (candidates[k].votes > maxvote)
            maxvote = candidates[k].votes;

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

    return;
}

1 Answer 1

4

Pretty straightforward problem. Your vote function ALWAYS returns false, even after registering the vote. If false is returned to main, it'll print the invalid vote message.

If vote() succeeds in finding the name, it should return true, not execute a break. Once the name is found, there's no need to do anything else in the function after registering the vote, so just return true at that point to terminate the call to vote().

Note that break; does not terminate a function. Only return will do that (generally speaking. A call to exit() will terminate the entire program from anywhere, generally due to an error condition.)

Also, the var exist serves no purpose and can be removed.

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

You must log in to answer this question.

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