我一开始就陷入CS50 pset3径流。香港专业教育学院使用了几种外部资源,但没有任何意义。请帮助我,因为我不明白,这组设置即将退出。
以下是说明:
这是我的代码:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
// Max voters and candidates
#define MAX_VOTERS 100
#define MAX_CANDIDATES 9
// preferences[i][j] is jth preference for voter i
int preferences[MAX_VOTERS][MAX_CANDIDATES];
// Candidates have name, vote count, eliminated status
typedef struct
{
string name;
int votes;
bool eliminated;
}
candidate;
// Array of candidates
candidate candidates[MAX_CANDIDATES];
// Numbers of voters and candidates
int voter_count;
int candidate_count;
// Function prototypes
bool vote(int voter, int rank, string name);
void tabulate(void);
bool print_winner(void);
int find_min(void);
bool is_tie(int min);
void eliminate(int min);
int main(int argc, string argv[])
{
// Check for invalid usage
if (argc < 2)
{
printf("Usage: runoff [candidate ...]\n");
return 1;
}
// Populate array of candidates
candidate_count = argc - 1;
if (candidate_count > MAX_CANDIDATES)
{
printf("Maximum number of candidates is %i\n", MAX_CANDIDATES);
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: ");
if (voter_count > MAX_VOTERS)
{
printf("Maximum number of voters is %i\n", MAX_VOTERS);
return 3;
}
// Keep querying for votes
for (int i = 0; i < voter_count; i++)
{
// Query for each rank
for (int j = 0; j < candidate_count; j++)
{
string name = get_string("Rank %i: ", j + 1);
// Record vote, unless it's invalid
if (!vote(i, j, name)) // if vote bool is Not true
{
printf("Invalid vote.\n");
return 4;
}
}
printf("\n");
}
// Keep holding runoffs until winner exists
while (true)
{
// Calculate votes given remaining candidates
tabulate();
// Check if election has been won
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;
}
// Eliminate anyone with minimum number of votes
eliminate(min);
// Reset vote counts back to zero
for (int i = 0; i < candidate_count; i++)
{
candidates[i].votes = 0;
}
}
return 0;
}
// Record preference if vote is valid
bool vote(int voter, int rank, string name)
{
for (int i = 0; i < candidate_count; i++)
{
if (strcmp (name, candidates[i].name) == 0)
{
preferences[voter][rank]++;
return true;
}
}
// TO DO
return false;
}
答案 0 :(得分:1)
您的vote
函数中有一个错误可能被您忽略了。如果选民的输入是有效的候选人姓名,则您希望将候选人索引放在首选项数组中,而不仅仅是添加到该选民首选项上。请记住:vote
函数只是更新选民排名的偏好,而tabulate
函数实际上是汇总所有候选人选票的地方。
这是我的意思的一个例子。想象一下,有三名候选人进行决赛选举:爱丽丝,鲍勃和查理。这意味着候选人数组将在零索引中存储爱丽丝,将Bob存储为第一索引,将Charlie存储为第二索引。现在想象一下,第一选民有鲍勃(Bob)作为他们的首选候选人,查理(Charlie)是他们的第二首选候选人,爱丽丝(Alice)是他们的最后选择。根据您的功能,您的preferences[0]
将存储一个包含元素{1,1,1}的数组,因为每次您说preferences[voter][rank]++;
时,您只是在空的首选项数组中加1。您想在preferences[0]
中拥有一个元素为{1、2、0}的数组。这是因为选民的第一选择是Bob,又名candidates[1]
,第二选择是Charlie,又名candidates[2]
,第三选择是Alice,又名candidates[0]
。
因此,通过遍历候选人列表,您可以通过变量i
获得要添加的候选人的正确索引,因此只需将代码行更改为preferences[voter][rank] = i;
。
您的vote
函数应如下所示:
// Record preference if vote is valid
bool vote(int voter, int rank, string name)
{
for (int i = 0; i < candidate_count; i++)
{
if (strcmp(name, candidates[i].name) == 0)
{
preferences[voter][rank] = i;
return true;
}
}
return false;
}
PS:逐步调试50是在这类问题中使用的出色工具。
PPS:我希望您已经解决了这个问题,但是如果没有,我希望您继续学习本课程。问题集具有挑战性,但是当您完成时值得。
您好@ user13569450,如果此问题或任何答案已解决您的问题,请通过单击对勾标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为答题者和您自己赢得了一定声誉。没有义务这样做。