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;
}
@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