CS50 Pset3 Runoff:print_winner函数系统测试失败求助
print_winner函数系统测试失败问题分析与修复
问题现象
手动输入测试时函数运行正常,但官方系统测试未通过两项检查:
- 当候选人获得多数票时,print_winner未打印获胜者姓名
- 当候选人获得多数票时,print_winner未打印获胜者并返回true
原代码
int votes_need; // printf("votes needed: %i\n", votes_need); for (int i = 0; i < candidate_count; i++) { if (voter_count % 2 != 0) { votes_need = ((voter_count + 1 )/ 2); if (candidates[i].votes >= votes_need) { printf("%s\n", candidates[i].name); return true; } else { printf("no winner yet!!!\n"); return false; } } else { votes_need = ((voter_count)/ 2); if (candidates[i].votes > votes_need) { printf("%s\n", candidates[i].name); return true; } else { printf("no winner yet!!!\n"); return false; } } } return false;
核心错误分析
- 循环提前终止:循环仅检查第一个候选人后就直接返回。如果第一个候选人未达标,函数立即返回false,完全不会检查后续候选人,导致存在其他达标候选人时无法被识别。
- 冗余计算:votes_need在循环内重复计算,每次迭代都重新计算一次,既低效又没必要。
- 错误输出干扰:第一个候选人未达标时就打印"no winner yet!!!",但此时可能还有其他候选人满足条件,该输出会干扰系统测试的判断逻辑。
修复后的代码
bool print_winner(int voter_count, candidate_t candidates[], int candidate_count) { int votes_need; // 一次性计算所需多数票数 if (voter_count % 2 != 0) { votes_need = (voter_count + 1) / 2; } else { // 偶数情况下,多数票需超过半数,等价于 >= 半数+1 votes_need = voter_count / 2 + 1; } // 遍历所有候选人,检查是否有达标者 for (int i = 0; i < candidate_count; i++) { if (candidates[i].votes >= votes_need) { printf("%s\n", candidates[i].name); return true; } } // 无达标候选人时返回false return false; }
修复说明
- 将votes_need的计算移至循环外,避免重复计算,提升效率。
- 移除循环内的提前返回逻辑,确保所有候选人都被检查。
- 统一多数票判断逻辑:无论票数奇偶,都使用
>= votes_need,避免条件混淆。 - 移除多余的"no winner yet!!!"输出,符合系统测试的输出要求。
内容的提问来源于stack exchange,提问作者rohit narwal
相关产品推荐
相关产品推荐

