-
-
Save teeschorle/4c4c7607d9ae14cab96475b3b10e8fe6 to your computer and use it in GitHub Desktop.
#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; | |
} | |
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.
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.
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.
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???
./plurality Max Bob Jeff
Number of voters: 4
Vote: Max
Vote: Bob
Vote: Max
Vote: Max
Max
Bob
JeffWhy 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.
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;
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.
https://gist.github.com/teeschorle/4c4c7607d9ae14cab96475b3b10e8fe6#gistcomment-3305509
I also want to know this
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
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;
}"
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.
can some please tell me what line 56 means?
it simply means that
if ( vote(name) is false)
Hello everyone! I have a problem with "vote" function. It basicly same as above,
But when I input an invalid candidate it gives me Segmentation fault instead of invalid vote and stops from counting
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.
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);
}
}
}
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?
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
How is the function "vote" going to work if you are not calling it in main? shouldn't we call it to work?
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);
}
}
}
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.
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.
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().
./plurality Max Bob Jeff
Number of voters: 4
Vote: Max
Vote: Bob
Vote: Max
Vote: Max
Max
Bob
JeffWhy does this happen?
Nevermind.
I found the solution.
can u tell me the solution too please
Hi, I would like to know what the argc - 1 do
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
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.
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 togetherGuys 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 ?
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