CS50 Runoff программа работает, но check50 говорит, что это не так - PullRequest
0 голосов
/ 10 января 2020

Таким образом, в основном моя программа должна сделать что-то вроде второго тура выборов (Здесь вы можете увидеть, что это такое: https://cs50.harvard.edu/x/2020/psets/3/runoff/). Мне нужно было реализовать 6 функций, чтобы сделать это, и я сделал это. Моя программа работает отлично, но check50 говорит, что функция print_winner не работает (хотя стоит всего 4/24 возможных баллов). Эта функция должна печатать кандидата на выборах, если он имеет большинство всех голосов (> 50%). В ошибке говорится, что «print_winner должен печатать имя, когда кто-то имеет большинство, print_winner не печатал победителя выборов» и еще 3 таких ошибки.

Вот весь код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cs50.h>
#include <math.h>

#define MAX 9

typedef struct
{
    string name;
    int votes;
    bool eliminated;
}
candidate;

candidate candidates[MAX];

int voter_count;
int candidate_count;
int preferences[MAX][MAX];
float winner_vote;

//void check_preference(void);
bool is_tie(int min);
bool vote(int voter, int rank, string name);
bool print_winner(void);
void tabulate(void);
int find_min(void);
void eliminate(int min);


int main(int argc, string argv[])
{
    if (argc < 2)
    {
        printf("Usage: plurality [candidate ...]\n");
        return 1;
    }

    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;
        candidates[i].eliminated = false;
    }

    voter_count = get_int("Number of voters: ");

    winner_vote = voter_count / 2;
    int integer = winner_vote;

    if (winner_vote == integer)
    {
        winner_vote++;
    }
    else
    {
        winner_vote = ceil(winner_vote);
    }

    for (int i = 0; i < voter_count; i++)
    {
        for (int j = 0; j < candidate_count; j++)
        {


            string name = get_string("Rank %i ", j + 1);

            if (!vote(i, j, name))

            {
                printf("Invalid vote\n");
                j--;
            }

        }
        printf("\n");
    }


    //check_preference();

    while (true)
    {
        tabulate();

        if (print_winner())
        {
            return 1;
        }
        else if (is_tie(find_min()))
        {
            return 1;
        }
        else
        {
            eliminate(find_min());
        }

    }
}


void eliminate(int min)
{
    for (int i = 0; i < candidate_count; i++)
    {
        if (candidates[i].eliminated)
        {
            continue;
        }
        else if (min == candidates[i].votes)
        {
            candidates[i].eliminated = true;
        }
    }

}




int find_min(void)
{
    int min = MAX;
    for (int i = 1; i < candidate_count; i++)
    {
        if (candidates[i].eliminated)
        {
            continue;
        }
        else if (min > candidates[i].votes)
        {
            min = candidates[i].votes;
        }
    }

    return min;



}


bool is_tie(int min)
{
    for (int i = 0; i < candidate_count; i++)
    {
        if (candidates[i].eliminated)
        {
            continue;
        }
        else if (min == candidates[i].votes)
        {
            continue;
        }
        else
        {
            return 0;
        }
    }
    return 1;
}




bool vote(int voter, int rank, string name)
{
    bool exist = false;



    for (int i = 0; i < candidate_count; i++)
    {
        if (strcmp(name, candidates[preferences[voter][i]].name) == 0 && rank > 0)
        {
            return 0;
        }

        if (strcmp(name, candidates[i].name) == 0)
        {

            preferences[voter][rank] = i;
            exist = true;
            break;
        }
    }

    return exist;
}







bool print_winner(void)
{
    // candidate candidateHolder;
    for (int f = 0; f < candidate_count; f++)
    {
        //candidateHolder = candidates[f];
        if (candidates[f].votes >= winner_vote)
        {
            printf("%s\n", candidates[f].name);
            return 1;
        }

    }
    return 0;
}

void tabulate(void)
{
    int check = 0;
    for (int i = 0; i < voter_count; i++)
    {
        if (!candidates[preferences[i][check]].eliminated)
        {
            candidates[preferences[i][check]].votes++;
            check = 0;
        }
        else
        {
            check++;
            i--;
        }
    }
}

Вот функция, которая создает ошибку:

bool print_winner(void)
{
    // candidate candidateHolder;
    for (int f = 0; f < candidate_count; f++)
    {
        //candidateHolder = candidates[f];
        if (candidates[f].votes >= winner_vote)
        {
            printf("%s\n", candidates[f].name);
            return 1;
        }

    }
    return 0;
}

Ответы [ 6 ]

0 голосов
/ 05 мая 2020
bool print_winner(void)
{
    int maj = voter_count / 2;
    for (int i = 0; i < candidate_count; i++)
    {
        if (candidates[i].votes > maj)
        {
            printf("%s\n",candidates[i].name);
            return true;
        }
    }
    return false;
}

Почему бы вам не попробовать это вместо этого ?? Почему вы возвращаете int, если указан тип bool?

0 голосов
/ 20 апреля 2020

Вы можете инициализировать две глобальные переменные: одно целое, другое - с плавающей запятой (int max; float pmax;) и удалить ненужный код и переменные в начале.

Ниже содержания вашей функции:

bool print_winner(void)
{
    for (int i = 0; i < candidate_count; i++)
    {
        if (max < candidates[i].votes)
        {
            max = candidates[i].votes;
            pmax = ((float) max /(float) voter_count);
            if (pmax > 0.5)
            {
                printf("%s\n", candidates[i].name);
                return true;
            }
        }
    }
    return false;
}
0 голосов
/ 14 января 2020

Проблема здесь в том, что ваш printer_winner вернет 0 или 1. check50 ожидает TRUE или FALSE.

простое утверждение исправит это для вас:

printf ("% s", winner_vote? "true": "false");

Это преобразует 1 и 0 в ИСТИНА и ЛОЖЬ. Надеюсь это поможет. Первый раз программист здесь;).

0 голосов
/ 14 января 2020

Переменные, которые используются для определения winner_vote (он же), большинство должны быть числами с плавающей точкой, т.е. voter_count / 2. Целые числа не будут работать, если вам нужно разделить 3/2 или 5/2

Кроме того, чтобы выиграть большинство, кандидаты [f]. Голосов должны быть> большинством, а не> =. В последнем случае ie между двумя кандидатами будет напечатано в функции print_winner. Связи определяются в функции is_t ie позже в коде.

Функции Bool должны иметь возвращаемое значение true или false.

0 голосов
/ 10 января 2020

выглядит так, как будто вы забыли: «Если какой-либо кандидат имеет большинство (более 50%) голосов первого предпочтения, этот кандидат объявляется победителем выборов».

0 голосов
/ 10 января 2020

Я объявил winner_vote в функции, и она сработала

Проблема в том, что она помещает мою функцию в их код. Так что переменная winner_vote там не определена. Там нет ничего общего с 1 или 0. Кстати, 1 в bool означает true, а 0 означает false. Почему я ставлю их вместо слов, потому что в пояснительном видео говорится, что возвращаем 1, если ..., и возвращаем 0, если ... Я думал, может быть, это что-то изменит.

И еще одна проблема заключалась в том, что я забыл пометить свой ответь как правильный. Поэтому люди все еще пытаются помочь

...