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