Funzione di voto in Tideman (pset 3 di CS50)
Sto cercando di gestire la funzione di voto e ci sono 2 domande che vorrei chiedere il tuo aiuto:
- Nella definizione della funzione di voto, abbiamo:
bool vote(int rank, string name, int ranks[])
Non capisco a cosa serva il parametro rank e perché è dichiarato qui?
- La mia soluzione per la funzione di voto come segue:
// Update ranks given a new vote
bool vote(int rank, string name, int ranks[])
{
for (int j = 0; j < candidate_count; j++)
{
for (int k = 0; k < candidate_count; k++)
{
//Compare the name provided by the user with the name of the candidates numbered jth in the array candidates[MAX] which already populated above
if (strcmp(name, candidates[k]) == 0)
{
ranks[j] = k;
printf("ranks[%d] = %d\n", j, k);
}
}
return true;
}
return false;
}
Il risultato della funzione printf come segue (con candidati = {a, b, c}, voter_count = 2):
Rango 1: a, classifica [0] = 0; Grado 2: b, ranghi [0] = 1; Grado 3: c, ranghi [0] = 2; Grado 1: c, ranghi [0] = 2; Grado 2: b, ranghi [0] = 1; Grado 3: a, classifica [0] = 0
Il valore di j nei ranghi [j] non è stato aggiornato. Come posso risolvere questo problema?
Grazie mille per il vostro aiuto!
Risposte
Ecco un po 'di codice:
// Update ranks given a new vote
bool vote(int rank, string name, int ranks[]){
//We want to cycle through the list of candidates given
for(int i = 0; i < candidate_count; i++){
//If the candidate(s) in the array matches with string name, we will continue
if(strcmp(candidates[i], name) == 0){
//This is the tricky part to understand. Read below for answer.
ranks[rank] = i;
return true;
}
}
return false;
}
int rank
rappresenta il grado assegnato dall'utente per il candidato e int i
la posizione del candidato nel candidates[]
. Vogliamo aggiornare il ranks[]
secondo il giusto grado. Questo è ancora abbastanza confuso da capire, quindi ecco un esempio.
Abbiamo quattro candidati: John, Jim, Sam, Alex
In
string candidates[MAX];
, John è incandidates[0]
, Jim è incandidates[1]
, Sam è incandidates[2]
e Alex è incandidates[3]
.
Supponiamo che l'utente dia il proprio voto e che voti in questo ordine:
- Alex
- John
- Jim
- Sam
Eseguiamolo nel bool vote(int rank, string name, int ranks[])
.
vote(j, name, ranks)
dove j = 0 , nome = Alex e rank è il rank []- Metteremo in loop il nome Alex finché non lo troveremo
candidates[MAX]
.- Alex si trova in
candidates[i]
dove i = 3.- Vogliamo aggiornare il
ranks[]
ranks[rank] = i;
significherebbe che atranks[rank]
è uguale a i che è 3. In altre parole, ranks [0] è uguale alla i-esima posizione di Alex nelcandidates[MAX]
.
Quindi ripeti questo ciclo fino a completare la classifica dell'elettore.