【问题标题】:CS50 runoff: voting algorithm to tabulate the voting preferences of voters in a runoff electionCS50 决选:投票算法将决选中选民的投票偏好制表
【发布时间】:2020-02-29 10:13:18
【问题描述】:

我真的很感激有一双新的眼睛来发现我的错误! Preferences 是一个二维数组(选民与偏好),其中包含每个选民按排名顺序选择的候选人的数量(例如,preference[0][0] = i 表示 i 是第 0 个选民的首选候选人)。我没有包含排名循环,因为只有在候选人被淘汰时才会增加,并且每次考虑新选民时它都应该恢复为 0。

我已经解决这个问题很长一段时间了,但我在制表和 print_winner 的 check50 中仍然遇到一些错误。对于制表,只有在一个候选人被淘汰的情况下才会出现问题。

void tabulate(void)
{
    // Set rank to equal zero first. 
    // This will only change if the voter's first preference is eliminated.       
    int rank = 0; 
    // Loop through voters.             
    for (int voter = 0; voter < voter_count; voter++)
    {
        for (int i = 0; i < candidate_count; i++)// Loop through candidate possibilities
        { 
        // When candidate has been identified and is not eliminated execute this statement.                 
            if (preferences[voter][rank] == i && candidates[i].eliminated == false) 
            {
                candidates[i].votes += 1;
                rank = 0;
                // Rank is reset to zero as this may have been increased in the else if statement.
            }
            else if (preferences[voter][rank] == i && candidates[i].eliminated == true) 
            {
                // If the candidate has been eliminated the rank is increased.                    
                rank += 1; 
                voter -= 1;
                // The voter is decreased so on returning to the 'for' loop the same voter is checked again. 
            }
        }
    }
}

【问题讨论】:

  • 请比“遇到一些错误”更具体。
  • :) 当所有候选人都留在选举中时,将票数统计为表格。 :) 当一名候选人被淘汰时,制表计票。 :( 当多个候选人被淘汰时,表格会计算选票。所以我编写的代码可以工作,除非有多个候选人被淘汰出局......

标签: c arrays cs50


【解决方案1】:

这个voter -= 1; 不好。程序仍在i 循环中,所以期待意外,因为程序可能会尝试查看preferences[-1][1]

这是一个函数将失败的选举:4 个候选人 a b c d; 5个选民

voter| votes
1    | b c a d  
2    | a d b c  
3    | a d b c  
4    | d a c b
5    | d a c b

“b”和“c”将被淘汰。在表格中,候选人“a”应该得到选民 1 的投票。但他们会吗?由于函数正在遍历候选者,因此没有。处理候选“a”时,既不是rank 0,也不是被淘汰;它没有投票权。并且不会再次处理。基于此,我认为程序需要循环遍历排名而不是候选人。一旦计票,结束该循环。

【讨论】:

  • 哦,感谢您指出这一点!当我在 voter -=1 之后添加一个 break 语句时;它解决了问题!我尝试了另一种方式,按照您的建议遍历排名,但我无法让它工作......我确信有一种更简洁的做事方式,但我很高兴这最终奏效了:): )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
相关资源
最近更新 更多