我必须编写一个包含print_winner函数的程序,该函数应该在候选人数组中找到票数最多的候选人并打印他们的名字。候选人是一个复合数据类型,由候选人姓名的字符串和他们投票的整数组成。每有一张选票投给一个候选人,该候选人的票数就增加1。
// 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 ++;
return true;
}
}
return false;
}
我可以用print_winner()编写一个程序,其中只能有一个候选者。当我必须为两个或多个获胜候选人获得相同票数的可能性编写代码时,问题就出现了,在这种情况下,我必须打印他们所有的名字
我首先创建一个变量x的数组,它由一个字符串和一个int组成,与候选
相同typedef struct
{
int votes;
string name;
}
winner;
winner x[candidate_count];
然后,我将数组中的所有x变量设置为0票(写这个我认为这一步是不必要的,因为x变量不必有一个值,如果我错了,让我知道)。
for(int i=0; i<candidate_count; i++)
{
x[i].votes=candidates[0].votes=0;
x[i].name=candidates[0].name="None";
}
之后,我沿着候选项进行迭代,将每个候选项与数组中的第一个x进行比较。如果该候选人的票数多于x,那么我将该候选人的姓名和票数插入数组中的第一个x。如果有一个候选人的票数与数组中的第一个x相同,那么我将沿着x使用迭代将该候选人的值插入到下一个x中。如果有第三个候选人具有相同的票数,则会发生相同的情况,但这些值被插入到数组中的第三个x中。按照我的编码方式,我希望数组中的第一个x永远不会比数组中的其他x拥有更少的投票。
for(int i=0; i<candidate_count; i++)
{
{
if(x[0].votes<candidates[i].votes)
{
x[0].votes=candidates[i].votes;
x[0].name=candidates[i].name;
}
else if(x[0].votes==candidates[i].votes)
{
for(int j=0; j<candidate_count-1; j++)
{
if(x[j].votes>x[j+1].votes)
{
x[j+1].votes=candidates[i].votes;
x[j+1].name=candidates[i].name;
}
}
}
}
}
最后是打印部分。我对x数组进行了另一次迭代,我将数组中的每个x值(x[I])与下一个x值(x[I +1])进行比较,如果它们有相同的投票数和不同的名字,这意味着我有不同的候选人,他们都是获胜者。因此,我输出x[I]的名称并继续迭代。只要我遇到一个x[I],其x[I +1]得到的选票较少,或者名字相同(在这次选举中,没有两个候选人可以有相同的名字),我就打印x[I]并打破循环。
for(int i=0; i<candidate_count; i++)
{
if (x[i].votes==x[i+1].votes && !(strcmp(x[i].name,x[i+1].name)==0))
{
printf("%sn",x[i].name);
}
printf("%sn",x[i].name);
break;
}
return;
但是当我在平局情况下运行程序时,它不会给出正确的结果:
$ ./plurality a b c投票人数:6人投票:投票:投票:投票:b投票:b投票:b赢家:b
我该怎么办?
假设你的代码在check50处一切正常…
作为多个规范,除vote
和print_winner
函数外,不应修改代码
你不应该修改
plurality.c
中除了vote
和print_winner
函数的实现(以及如果您愿意,可以包含额外的头文件)。
所以我的建议是删除以下内容及其后果:
typedef struct
{
int votes;
string name;
}
winner;
winner x[candidate_count];
print_winner
函数的一种工作方法是确保(所有在该函数内):
在候选人中查找获得最多选票的候选人,将确定的获胜者保存在变量中。是否有领带真的不重要。
通过将获胜者称为变量来打印得票最多的候选人。
在其他候选人中寻找那些拥有相同选票的人,如果是的话,打印出来。
请勿转载获奖名单
请注意,我的print winner函数大约有20行长,所以我建议您避免使用复杂或非常长的函数。