CS50径流程序正在运行,但check50表示不起作用

时间:2020-01-10 17:37:00

标签: c cs50

所以基本上我的程序应该进行某种径流选举(在这里您可以看到它的内容: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;
}

7 个答案:

答案 0 :(得分:0)

我在函数中声明了winner_vote,它起作用了

问题在于它会将我的函数放入其代码中。因此,winner_vote变量在此处未定义。与1或0无关。顺便说一句,布尔值1表示true,0表示false。为什么我放他们而不是用文字,因为解释视频说如果...则返回1,如果...则返回0,我认为这可能会有所改变。

我的另一个问题是我忘记将答案标记为正确的答案。因此人们仍在尝试提供帮助

答案 1 :(得分:0)

看起来像您忘记了 “如果任何候选人拥有多数(超过50%)的优先投票,该候选人将被宣布为选举的获胜者。”

答案 2 :(得分:0)

用于确定 winner_vote (又名多数)的变量必须为浮点数,即选民数/2。如果必须除以3/2或5/2,则整数将不起作用

此外,为了赢得多数,候选人[f] .votes必须是>多数,而不是> =。在后一种情况下,将在print_winner函数中打印两个候选者之间的平局。在代码的稍后部分的is_tie函数中确定联系。

布尔函数的返回值必须为true或false。

答案 3 :(得分:0)

这里的问题是您的printer_winner将返回0或1。 check50期望为TRUE或FALSE。

一个简单的语句将为您解决该问题:

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

这会将1和0转换为TRUE和FALSE。 希望这可以帮助。这里是第一次程序员;)。

答案 4 :(得分:0)

您可以初始化两个全局变量,一个整数,另一个浮点(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;
}

答案 5 :(得分:0)

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;
}

你为什么不试试这个呢? 当指定的类型为bool时,为什么返回int?

答案 6 :(得分:0)

您也可以使用它作为替代

 bool won = print_winner();
    if (won)
    {
        break;
    }

    // Eliminate last-place candidates
    int min = find_min();
    bool tie = is_tie(min);

    // If tie, everyone wins
    if (tie)
    {
        for (int i = 0; i < candidate_count; i++)
        {
            if (!candidates[i].eliminated)
            {
                printf("%s\n", candidates[i].name);
            }
        }
        break;
    }