Funzione di voto in Tideman (pset 3 di CS50)

Aug 23 2020

Sto cercando di gestire la funzione di voto e ci sono 2 domande che vorrei chiedere il tuo aiuto:

  1. 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?

  1. 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

ManavDubey Aug 23 2020 at 23:35

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 rankrappresenta il grado assegnato dall'utente per il candidato e int ila 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 è in candidates[0], Jim è in candidates[1], Sam è in candidates[2]e Alex è in candidates[3].

Supponiamo che l'utente dia il proprio voto e che voti in questo ordine:

  1. Alex
  2. John
  3. Jim
  4. Sam

Eseguiamolo nel bool vote(int rank, string name, int ranks[]).

  1. vote(j, name, ranks)dove j = 0 , nome = Alex e rank è il rank []
  2. Metteremo in loop il nome Alex finché non lo troveremo candidates[MAX].
  3. Alex si trova in candidates[i]dove i = 3.
  4. Vogliamo aggiornare il ranks[]
  5. ranks[rank] = i;significherebbe che at ranks[rank]è uguale a i che è 3. In altre parole, ranks [0] è uguale alla i-esima posizione di Alex nel candidates[MAX].

Quindi ripeti questo ciclo fino a completare la classifica dell'elettore.