Сток CS50: алгоритм голосования для подсчета избирательных предпочтений избирателей на выборах второго тура. - PullRequest
0 голосов
/ 29 февраля 2020

Я бы очень признателен за пару sh глаз, чтобы определить мою ошибку! Предпочтения - это двумерный массив (избиратель против предпочтения), содержащий номера кандидатов, которые каждый избиратель выбрал в порядке ранга (например, предпочтение [0] [0] = i указывает, что i является первым кандидатом предпочтения 0-го избирателя). Я не включил al oop в ранг, потому что он увеличивается только в случае исключения кандидата и должен возвращаться к 0 каждый раз, когда рассматривается новый избиратель.

Я работал над этой проблемой довольно некоторое время, но я все еще получаю некоторые ошибки в check50 для tabulate и print_winner. Для таблицы есть проблема только в тех случаях, когда один кандидат был исключен.

void tabulate(void)
{
    // Set rank to equal zero first. 
    // This will only change if the voter's first preference is eliminated.       
    int rank = 0; 
    // Loop through voters.             
    for (int voter = 0; voter < voter_count; voter++)
    {
        for (int i = 0; i < candidate_count; i++)// Loop through candidate possibilities
        { 
        // When candidate has been identified and is not eliminated execute this statement.                 
            if (preferences[voter][rank] == i && candidates[i].eliminated == false) 
            {
                candidates[i].votes += 1;
                rank = 0;
                // Rank is reset to zero as this may have been increased in the else if statement.
            }
            else if (preferences[voter][rank] == i && candidates[i].eliminated == true) 
            {
                // If the candidate has been eliminated the rank is increased.                    
                rank += 1; 
                voter -= 1;
                // The voter is decreased so on returning to the 'for' loop the same voter is checked again. 
            }
        }
    }
}

1 Ответ

0 голосов
/ 01 марта 2020

Это voter -= 1; плохо. Программа все еще находится в i l oop, поэтому ожидайте неожиданное, потому что программа может попытаться посмотреть на preferences[-1][1].

Вот выборы, на которых функция не будет выполнена: 4 кандидата ab c d; 5 избирателей

voter| votes
1    | b c a d  
2    | a d b c  
3    | a d b c  
4    | d a c b
5    | d a c b

"b" и "c" будут исключены. В таблице, кандидат "а" должен получить голос от избирателя 1. Но будут ли они? Поскольку функция перебирает кандидатов, нет. Когда он обрабатывает кандидата «а», он не ранжируется и не исключается; это не получает голоса. И это не будет обработано снова. Исходя из этого, я думаю, что программа должна l oop через ряды вместо кандидатов. Как только подсчет голосов закончится, закончите это l oop.

...