CS50 : S3 | Плюрализм


Плюрализм

Возвращаясь к задачам CS50x (онлайн-версия), мы переходим к третьей неделе.

В этой задаче нам предлагается выполнить две функции, а именно функцию vote и функцию print_winner.

Функция голосования

По мере загрузки файлов мы получаем функцию таким образом:

// Update vote totals given a new vote
bool vote(string name)
{
    // TODO
    return false;
}
Войдите в полноэкранный режим Выход из полноэкранного режима
  • Если имя совпадает с именем одного из кандидатов на выборах, то его значение количества голосов будет приращено новым голосом. Таким образом, функция вернет true, чтобы показать, что голосование прошло успешно.

Здесь мы должны обратить внимание на структуру, уже созданную кодом, который мы загрузили, у нас есть эта struct, которая определяет, что каждый кандидат, будет иметь name и votes, это характеристики этой структуры данных.

// Candidates have name and vote count
typedef struct
{
    string name;
    int votes;
}
candidate;
Войдите в полноэкранный режим Выход из полноэкранного режима

И анализируя код, мы также имеем эту важную информацию, указывающую на то, что у нас будет вектор (массив) с именем candidates типа candidate, то есть, если будет создан вектор с тремя (3) пространствами, каждое пространство этого типа данных, будет иметь структуру, включающую name и vote для каждого кандидата.

// Array of candidates
candidate candidates[MAX];
Войдите в полноэкранный режим Выход из полноэкранного режима

Затем нам придется пройтись по этому списку и посмотреть, есть ли для каждого кандидата «совпадение» с именем, введенным для голосования.

for(int i = 0; i < candidate_count; i++) {
        if(strcmp(name, candidates[i].name) == 0) {
            candidates[i].votes += 1;
            return true;
        }
    }
Войдите в полноэкранный режим Выход из полноэкранного режима
  1. Мы проходим по этому списку от начального индекса (помня, что он основан на числе 0 в качестве начальной позиции) до количества кандидатов.
  2. В языке C для сравнения значений строк необходимо использовать функцию strcmp(). Мы установили его равным нулю, потому что так сказано в документации:
This function returns

    an int less than 0 if s1 comes before s2,
    0 if s1 is the same as s2,
    an int greater than 0 if s1 comes after s2.
Войдите в полноэкранный режим Выход из полноэкранного режима

Так, если name равно candidates[i].name, то будет возвращено значение ноль (0).

  1. Найдя его, увеличивает значение кандидата на 1.
  2. Возврат true
  • Если name не совпадает с именем ни одного кандидата на выборах, то общее значение голосов не изменяется, и функция возвращает false, чтобы указать, что голоса не были вычислены.

Затем у нас есть функция vote final.

// Update vote totals given a new vote
bool vote(string name)
{
    for(int i = 0; i < candidate_count; i++) {
        if(strcmp(name, candidates[i].name) == 0) {
            candidates[i].votes += 1;
            return true;
        }
    }
    return false;
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Функция print_winner

  • Функция должна вернуть имя кандидата с наибольшим количеством голосов, а затем вывести новую строку.

Сначала посмотрим на общее количество голосов, которые есть у данного вектора кандидатов. И давайте воспользуемся циклом и создадим переменную для хранения наибольшего суммарного значения голосов, которое существует среди кандидатов.

// Print the winner (or winners) of the election
void print_winner(void)
{
    int max_votes = 0;
    for(int i = 0; i < candidate_count; i++) {
        if(candidates[i].votes > max_votes) {
            max_votes = candidates[i].votes;
        }
    }
}
Войдите в полноэкранный режим Выход из полноэкранного режима
  1. Я создаю переменную типа int для записи наибольшего числа голосов, которое существует среди кандидатов.
  2. Я прокручиваю список кандидатов и сравниваю количество голосов каждого кандидата со значением моей переменной.
  3. Если значение голосов кандидата больше, чем значение моей исходной переменной, то количество голосов кандидата присваивается переменной max_votes.
  • Выборы могут закончиться ничьей, когда несколько кандидатов имеют одинаковое количество голосов. В этом случае напечатайте имя каждого кандидата на отдельных строках.

Здесь я решил пройтись по списку еще раз и теперь сравнить, у каких кандидатов одинаковое количество голосов с переменной max_votes. Таким образом, независимо от того, один это кандидат или несколько, на экране всегда будут выводиться те кандидаты, у которых количество голосов совпадает с ранее заполненной переменной.

// Print the winner (or winners) of the election
void print_winner(void)
{
    int max_votes = 0;
    for(int i = 0; i < candidate_count; i++) {
        if(candidates[i].votes > max_votes) {
            max_votes = candidates[i].votes;
        }
    }

    for(int i = 0; i < candidate_count; i++) {
        if(candidates[i].votes == max_votes) {
            printf("%sn", candidates[i].name);
        }
    }

}
Войдите в полноэкранный режим Выход из полноэкранного режима
  1. Я просматриваю список и сравниваю количество голосов за каждого кандидата с максимальным количеством голосов, вычисленным ранее.
  2. Если они равны, имя будет выведено на экран, а также маркер n для перехода к следующей строке.

Вот и все, друзья!

На этом мы заканчиваем третью неделю PSET.

Оцените статью
devanswers.ru
Добавить комментарий