Skip to content

Instantly share code, notes, and snippets.

@teeschorle
Last active October 21, 2021 06:23
Show Gist options
  • Save teeschorle/4c4c7607d9ae14cab96475b3b10e8fe6 to your computer and use it in GitHub Desktop.
Save teeschorle/4c4c7607d9ae14cab96475b3b10e8fe6 to your computer and use it in GitHub Desktop.
CS50 Problem Set 3 (Fall 2019) - Plurality
#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
for (int i = 0; i < candidate_count; i++)
{
if (strcmp(candidates[i].name, name) == 0)
{
candidates[i].votes++;
return true;
}
}
// TODO end
return false;
}
// Print the winner (or winners) of the election
void print_winner(void)
{
// TODO
int maxvotes = 0;
// find highest number of votes
for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].votes > maxvotes)
{
maxvotes = candidates[i].votes;
}
}
// print winners
for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].votes == maxvotes)
{
printf("%s\n", candidates[i].name);
}
}
// TODO end
return;
}
@tonyandy5630
Copy link

for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].votes > maxvotes)
{
maxvotes = candidates[i].votes;
}
he prompt the program max votes = 0;
then he scan all of the candidates votes
if any votes > maxvotes
then its maxvote e
else the maxvotes remains it value
// print winners
for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].votes == maxvotes)
{
printf("%s\n", candidates[i].name);
}
if any candidate[i]. vote equal to maxvote
printf candidates[i].name

can someone please explain me this part of the program ?

int maxvotes = 0;
// find highest number of votes
for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].votes > maxvotes)
{
maxvotes = candidates[i].votes;
}
}
// print winners
for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].votes == maxvotes)
{
printf("%s\n", candidates[i].name);
}
}

@Alpenblick
Copy link

Can someone please tell me what if (!vote(name)) (line 56) does??

It checkes wether false was returned from vote() if yes it turns it into true (=!false) which indicates that the name does not exist.

@ferialahmed
Copy link

when i had tested the code, it worked well through all the cases.However, by using the check50 property it revealed about 5 mistakes which were already tested and worked will, so what's the reason for this?
thanks in advance.

@singh-sandeep-python
Copy link

Hey guys, so, this is my code:

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 9
int voters;
int no_of_candidates;



bool vote(string a);
void print_winner(void);


typedef struct
{
    string name;
    int votes;
}
candidate;
candidate candidates[MAX];


int main(int argc, string argv[])
{
    no_of_candidates = argc -1;
     if (argc < 2)
    {
        printf("Usage: plurality [candidate]\n");
        return 1;
    }
    if (argc > 10)
    {
        printf("Maximum number of candidates is %i\n", MAX);
        return 1;
    }
    for(int i= 0; i< argc-1; i++)
    {
        candidates[i].name= argv[i+1];
        candidates[i].votes = 0;
    }
    //taking names in command line and storing them in name
    voters = get_int("Number of voter: ");
    string votingfor;

    for(int j =0; j<voters; j++)
    {
        votingfor =get_string("Vote: ");
        if(!vote(votingfor))
        {
        printf("Invalid Vote. \n");
        j--;
        }
    }
    //votes stored in votingfor
print_winner();
}

bool vote(string name)
{
    for( int k=0; k< no_of_candidates ; k++)
    {
        if(strcmp(name, candidates[k].name) == 0)
        {
           candidates[k].votes ++;
           return true;
        }

    }
    return false;
}

void print_winner(void)
{
    int high_vote = 0;
    for(int i=0; i< voters; i++)
    {
        if(candidates[i].votes> high_vote)
        {
            high_vote= candidates[i].votes;
        }
    }
    for(int j=0; j<voters; j++)
    {
        if(high_vote == candidates[j].votes)
        {
            printf("%s\n",candidates[j].name);
        }
    }
}

:) plurality.c exists
:( plurality compiles
code failed to compile
:| vote returns true when given name of first candidate
can't check until a frown turns upside down
:| vote returns true when given name of middle candidate
can't check until a frown turns upside down
:| vote returns true when given name of last candidate
can't check until a frown turns upside down
:| vote returns false when given name of invalid candidate
can't check until a frown turns upside down
:| vote produces correct counts when all votes are zero
can't check until a frown turns upside down
:| vote produces correct counts after some have already voted
can't check until a frown turns upside down
:| vote leaves vote counts unchanged when voting for invalid candidate
can't check until a frown turns upside down
:| print_winner identifies Alice as winner of election
can't check until a frown turns upside down
:| print_winner identifies Bob as winner of election
can't check until a frown turns upside down
:| print_winner identifies Charlie as winner of election
can't check until a frown turns upside down
:| print_winner prints multiple winners in case of tie
can't check until a frown turns upside down
:| print_winner prints all names when all candidates are tied
can't check until a frown turns upside down

And when I click on the link, it says that my code could not compile because:

running clang plurality.c -o plurality -std=c11 -ggdb -lm -lcs50...
running clang plurality_test.c -o plurality_test -std=c11 -ggdb -lm -lcs50...
plurality_test.c:58:1: warning: control may reach end of non-void function
[-Wreturn-type]
}
^
plurality_test.c:109:13: error: use of undeclared identifier 'candidate_count'
candidate_count = 3;
^
1 warning and 1 error generated

I have no candidate_count in my code, also my code is of 91 lines and it shows that the error is at 109.

Please help me out. This problem is troubling me since last few days.

@ShriyaS-23
Copy link

Hi guys,
I had the same problems as @ferialahmed where my program works perfectly through all the tests I run it through but when I put it in check50 loads of problems show up.
Does anyone have any solutions???

@lk7304
Copy link

lk7304 commented Jun 19, 2020

./plurality Max Bob Jeff
Number of voters: 4
Vote: Max
Vote: Bob
Vote: Max
Vote: Max
Max
Bob
Jeff

Why does this happen?

Nevermind.
I found the solution.

Hey - I keep getting that problem and can't figure it out. Any ideas on where I am going wrong? I thought this should not happen as I am only updating the max_vote if the candidates votes are higher. If they are not they should stay at their value and not br printed out but this is not happening.

@sujit-coder
Copy link

I am struggling with how to printf the name of the winner. Any sugestions ?

set the initial value of maxvotes to 0...like maxvotes = 0;

@Blessing82
Copy link

Hi Guys. I am busy with Plurality problem set 3. I am having a challenge when I input an invalid candidate. It gives me Segmentation fault instead of invalid vote and stops from counting. what could be the syntax error.

@jaj096
Copy link

jaj096 commented Aug 12, 2020

@AnnaLisaRebecca
Copy link

Hello together !! My code is the following..when I compile it does what it should but for check50 I get error messages..
I think the winner function is the problem.
Does somebody find my mistake?

Thank you in advance

void print_winner(void)
{
int maxvote;
string winner[MAX - 1];
for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].votes >= maxvote)
{
maxvote = candidates[i].votes;
winner[i] = candidates[i].name;
}
}
for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].votes >= maxvote)
{
printf("%s\n", winner[i]);
}
}
}

error messages
:) plurality.c exists
:) plurality compiles
:) vote returns true when given name of first candidate
:) vote returns true when given name of middle candidate
:) vote returns true when given name of last candidate
:) vote returns false when given name of invalid candidate
:) vote produces correct counts when all votes are zero
:) vote produces correct counts after some have already voted
:) vote leaves vote counts unchanged when voting for invalid candidate
:( print_winner identifies Alice as winner of election
print_winner function did not print winner of election
:( print_winner identifies Bob as winner of election
print_winner function did not print winner of election
:( print_winner identifies Charlie as winner of election
print_winner function did not print winner of election
:( print_winner prints multiple winners in case of tie
print_winner function did not print both winners of election
:( print_winner prints all names when all candidates are tied
print_winner function did not print all three winners of election

@ellag38
Copy link

ellag38 commented Aug 19, 2020

So check50 says that my code doesn't return false when the vote is invalid but it does when I run it.
:) plurality.c exists
:) plurality compiles
:) vote returns true when given name of first candidate
:) vote returns true when given name of middle candidate
:) vote returns true when given name of last candidate
:( vote returns false when given name of invalid candidate
vote function did not return false
:) vote produces correct counts when all votes are zero
:) vote produces correct counts after some have already voted
:( vote leaves vote counts unchanged when voting for invalid candidate
vote function modified vote totals incorrectly
:) print_winner identifies Alice as winner of election
:) print_winner identifies Bob as winner of election
:) print_winner identifies Charlie as winner of election
:) print_winner prints multiple winners in case of tie
:) print_winner prints all names when all candidates are tied

My code:
"bool vote(string name)
{
for (int g = 0; candidates[g].name; g++)
{
for (int j = 0; name[j]; j++)
{
if (candidates[g].name[g] == name[j])
{
candidates[g].votes++;
return true;
}
}
}
return false;
}"

@ellag38
Copy link

ellag38 commented Aug 19, 2020

Hello together !! My code is the following..when I compile it does what it should but for check50 I get error messages..
I think the winner function is the problem.
Does somebody find my mistake?

Thank you in advance

void print_winner(void)
{
int maxvote;
string winner[MAX - 1];
for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].votes >= maxvote)
{
maxvote = candidates[i].votes;
winner[i] = candidates[i].name;
}
}
for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].votes >= maxvote)
{
printf("%s\n", winner[i]);
}
}
}

error messages
:) plurality.c exists
:) plurality compiles
:) vote returns true when given name of first candidate
:) vote returns true when given name of middle candidate
:) vote returns true when given name of last candidate
:) vote returns false when given name of invalid candidate
:) vote produces correct counts when all votes are zero
:) vote produces correct counts after some have already voted
:) vote leaves vote counts unchanged when voting for invalid candidate
:( print_winner identifies Alice as winner of election
print_winner function did not print winner of election
:( print_winner identifies Bob as winner of election
print_winner function did not print winner of election
:( print_winner identifies Charlie as winner of election
print_winner function did not print winner of election
:( print_winner prints multiple winners in case of tie
print_winner function did not print both winners of election
:( print_winner prints all names when all candidates are tied
print_winner function did not print all three winners of election
It doesn't look like you defined maxvote and it needs to be defined to use in an if statement. The if statement itself then arrises so problems as everything that qualifies enters the winners array, and while there can be multiple winners the statement might originally find someone equal to the lower number of votes. The number of votes will still climb leaving the winners array with "winners" that have less voters than the actual winner. I tried to explain that the best I can sorry if it doesn't make since.

@amaanmohd047
Copy link

can some please tell me what line 56 means?

it simply means that
if ( vote(name) is false)

@AlAnRemarkable
Copy link

Hello everyone! I have a problem with "vote" function. It basicly same as above,
2020-09-04 (2)
But when I input an invalid candidate it gives me Segmentation fault instead of invalid vote and stops from counting
2020-09-04 (3)
Can anyone help?

@AlAnRemarkable
Copy link

AlAnRemarkable commented Sep 4, 2020

Hello everyone! I have a problem with "vote" function. It basicly same as above,
2020-09-04 (2)
But when I input an invalid candidate it gives me Segmentation fault instead of invalid vote and stops from counting
2020-09-04 (3)
Can anyone help?

The problem was that in line 70 i should use "candidate_count" instead of "sizeof(candidates)". But i still don't get it.

@Nyctophile0
Copy link

So.. here is the code .. go through it if you feel confused.

#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)
{

// loop for all candidates

for (int i = 0; i < candidate_count; i++)
{
    //checking each candidate names 
    
    if (strcmp(candidates[i].name, name) == 0)
    {
       
        //counting votes of candidate if name found
       
        candidates[i].votes++;
        return true;
    }
}
return false;

}

// Print the winner (or winners) of the election
void print_winner(void)
{
int n = candidates[0].votes, p = 0;
for (int i = 1; i < candidate_count; i++)
{
//founding largest votes
if (candidates[i].votes > n)
{
n = candidates[i].votes; //storing highest vote
p = i; //storing the index location of highest vote
}
}
printf("%s\n", candidates[p].name);

//checking for multiple candidates having same votes
    
for (int j = p + 1; j < candidate_count; j++)
{
    if (candidates[j].votes == n)
    {
        
        //printing candidates if tie
        
        printf("%s\n", candidates[j].name);
    }
    
}

}

@tmpfifferling
Copy link

Hello! I am so confused, I have done exactly the same thing as printed here at the top of the page but somehow it keeps printing all the names, not just the name of the winner. Any idea where I went wrong?

@Nyctophile0
Copy link

Nyctophile0 commented Sep 10, 2020

Hello! I am so confused, I have done exactly the same thing as printed here at the top of the page but somehow it keeps printing all the names, not just the name of the winner. Any idea where I went wrong?

maybe you did something wrong in print_winner function . why dont you share it here

@Yousef02
Copy link

How is the function "vote" going to work if you are not calling it in main? shouldn't we call it to work?

@MrMaskedHornet
Copy link

image
anybody have a fix for this yet?

@MrMaskedHornet
Copy link

image
anybody have a fix for this yet?

nevermind, fixed.

@chimichelle
Copy link

hey, I've finish writing my program, but anything that I write after it prompts me to vote always comes back as invalid vote. Even when the voters name that I've is in the candidates[i],name array. Would anyone know what's causing this problem?
This is my program:

#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
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)
{
for (int i = 0; i < candidate_count; i++)
{
if (strcmp(candidates[i].name, name) == 0)
{
candidates[i].votes++;
return true;
}
}
return false;

void print_winner(void)
{
int max;

for (int i = 0; i < candidate_count; i++)
{

if (candidates[i].votes > max)
{
max = candidates[i].votes;
}

for (int i = 0; i < candidate_count; i++)
{
if (candidates[i].votes == max)
{
printf("%s is the winner with %i votes", candidates[i].name , max);
}
}
}

@josuepviana
Copy link

How is the function "vote" going to work if you are not calling it in main? shouldn't we call it to work?

You call 'vote' in line 56 to check if the inputed name is valid - if it isnt it prints "printf("Invalid vote.\n");". It knows to do that because the default return for it false.

@ghanikhan1
Copy link

How is the function "vote" going to work if you are not calling it in main? shouldn't we call it to work?

Thankyou so much, i was stuck due to not calling "print" function.

@ronaldgreeff
Copy link

can someone explain why we cannot do name == candidates[i].name

you cannot compare a string (a list of chars) to another string (a different list of chars). Does list 1 == list 2? No. They're two different lists (even if they contain the same characters). What you want to do is compare if every character in string 1 matches every character in string 2 / use strcmp().

@Gurjagjot
Copy link

./plurality Max Bob Jeff
Number of voters: 4
Vote: Max
Vote: Bob
Vote: Max
Vote: Max
Max
Bob
Jeff

Why does this happen?

Nevermind.
I found the solution.

can u tell me the solution too please

@Khoihha
Copy link

Khoihha commented Feb 17, 2021

Hi, I would like to know what the argc - 1 do

@Jdallos
Copy link

Jdallos commented Mar 3, 2021

Hi, I would like to know what the argc - 1 do

Hi, Khoihha,

argc is an int storing the total number of arguments from your command line, this includes the program name itself plus any additional arguments (in this case each candidate name is an additional argument). Argc -1 gives us the total number of candidates (the - 1 is essentially removing the program name from the count).
Just doing this myself, hope that helps.

I myself struggled with getting the voter_count to remain unchanged when an invalid name is entered. I resolved this with the i--:

// Check for invalid vote
if (!vote(name))
{
printf("Invalid vote.\n");
i--;
}

However I feel the problem says "You should not modify anything else in plurality.c other than the implementations of the vote and print_winner functions (and the inclusion of additional header files, if you’d like)."
I also see that some of the code shared on here does not do this i-- but i'm not seeing how anyone resolved this issue in a different way.
Anyone?

Thanks

@Fatimat07
Copy link

Can someone please explain how the "vote(name)" function is called in the 'main' code? I only see one condition "if (!vote(i, j, name))" related to this function, and as I understand this just prints "Invalid vote" if the "vote" returns false.

@devvrat3072
Copy link

Sorry to bother you. I am doing my problem set 3 make plurality. I am really confused on the print_winner function definition part // find the highest number of votes.
Could you explain it a little bit when you have time please?
Appreciate it.
I think the theory behind the print_winner function goes as follows;
1)Set an initial maxvotes value to 0 as a starting point to compare to
2)Iterate over the list of candidates, updating the maxvotes value as you move through each element of the array
3)Iterate over the list of candidates again printing those that have numbers of votes equal to the maxvotes values as you go
I am currently working through this myself and I think that is the logic behind it
Thank you very much. Now I understand how the "int maxvotes" works. You are so smart!!
Please feel free to PM me in the future and we can work through problems together

Guys I did everything until problem sets 3 runoff, although I skipped the pset 0 first. Im looking forward for collaboration or If anyone need help, or maybe I need help, pls pm me +65 8619 8015.

Hey I am also looking for someone to collaborate with. Maybe we can ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment