CS50 Plurality问题print_winner函数仅Bob测试用例失败排查
CS50 Plurality 题目print_winner函数逻辑问题说明
你提交的print_winner函数存在3个核心逻辑错误,是导致官方检测大部分用例不通过的原因:
- 未做真正的元素交换,直接覆盖原始数据
代码判断到索引i的候选人得票高于数组最后一位候选人时,直接把最后一位的votes和name赋值为i位置的值,原最后一位候选人的得票数据被直接覆盖丢失,后续做同票比对时用的是被篡改过的数据,根本无法正确识别所有符合条件的获胜者。 - 循环逻辑完全无效,边界错误
内层循环定义的变量j在整个循环体中从未被使用,属于无意义的冗余循环;同时循环边界设置错误,遍历过程无法覆盖所有候选人的得票比对场景,会漏掉部分高得票候选人的判断。 - 实现思路冗余易错,不必要修改原数组
找最高获胜者根本不需要修改、挪动原candidates数组的存储内容,你当前的排序/换位思路本身就增加了出错概率。
正确的实现逻辑非常简单,全程不需要改动原始候选人数据:
- 第一遍遍历所有候选人,记录下全局最高得票数
- 第二遍遍历所有候选人,把得票数等于最高值的候选人姓名全部打印即可,天然支持多候选人同票并列获胜的场景。
修正后的参考代码:
// Print the winner (or winners) of the election void print_winner(void) { // 遍历获取最高得票数 int max_vote = 0; for (int i = 0; i < candidate_count; i++) { if (candidates[i].votes > max_vote) { max_vote = candidates[i].votes; } } // 输出所有得票等于最高值的候选人 for (int i = 0; i < candidate_count; i++) { if (candidates[i].votes == max_vote) { printf("%s\n", candidates[i].name); } } return; }
你提到的仅Bob相关测试项通过,是因为该组测试用例中Bob刚好是你错误遍历逻辑能覆盖到的最高得票者,其余测试用例的最高得票者不在你错误逻辑的覆盖范围内,加上原始数据被覆盖篡改,自然全部无法通过。
内容的提问来源于stack exchange,提问作者Jupiter1
相关产品推荐
相关产品推荐

