-
Notifications
You must be signed in to change notification settings - Fork 2
/
plurality.c
140 lines (122 loc) · 3.3 KB
/
plurality.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Simula uma eleição com até 9 candidatos
#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)
{
// Variável para conferir se o nome digitado pertence a um candidato
bool candidateFound = false;
// Compara o nome com cada candidato, se for igual adiciona um voto ao candidato
for (int i = 0; i < candidate_count; i++)
{
if (strcmp(name, candidates[i].name) == 0)
{
candidates[i].votes++;
candidateFound = true;
}
}
// Caso em que o nome não pertence a nenhum candidato
if (!candidateFound)
{
return false;
}
return true;
}
// Print the winner (or winners) of the election
void print_winner(void)
{
// Declara a listna de ganhadores, e as variáveis para conferir se há empate e quantos ganhadores estão nesse empate
candidate winners[MAX];
bool tie = false;
int winners_count = 1;
// Confere a quantidade de votos de cada candidato e armazena o(s) com mais votos na lista winners
for (int i = 0; i < candidate_count; i++)
{
if (i == 0)
{
winners[0] = candidates[i];
}
else if (candidates[i].votes > winners[0].votes)
{
if (!tie)
{
winners[0] = candidates[i];
}
else
{
// Em caso de haver empate mas um candidato ter mais votos que os candidatos empatados
// Limpa a lista de ganhadores empatados e declara tal candidato o ganhador
for (int j = 0; j < winners_count; j++)
{
winners[j] = winners[winners_count];
}
winners[0] = candidates[i];
tie = false;
winners_count = 1;
}
}
else if (candidates[i].votes == winners[0].votes)
{
winners[winners_count] = candidates[i];
tie = true;
winners_count++;
}
}
// Mostra na tela os ganhadores
for (int i = 0; i < winners_count; i++)
{
printf("%s\n", winners[i].name);
}
return;
}