CS50 Pset3 Runoff问题:tabulate函数投票统计异常
修复Runoff选举程序的Tabulate函数问题
问题分析
你的tabulate函数存在两处关键逻辑错误,导致票数统计异常:
- 未完整遍历选民偏好:原代码中每个选民的偏好循环仅执行一次就break,无法找到第一个未被淘汰的候选人——如果选民的第一偏好被淘汰,直接给第二偏好加票,但未验证第二偏好是否也被淘汰,更不会继续往后查找有效偏好。
- 数组越界风险:当j为最后一个候选人索引时,
j+1会超出preferences数组的合法范围,引发未定义行为,可能错误地给无关候选人加票。
修复后的Tabulate函数
替换原tabulate函数为以下代码:
// Tabulate votes for non-eliminated candidates void tabulate(void) { // 遍历所有选民 for (int i = 0; i < voter_count; i++) { // 遍历当前选民的所有偏好,直到找到未被淘汰的候选人 for (int j = 0; j < candidate_count; j++) { int candidate_idx = preferences[i][j]; if (!candidates[candidate_idx].eliminated) { candidates[candidate_idx].votes++; break; // 找到有效偏好,停止当前选民的偏好遍历 } } } return; }
修复逻辑说明
- 对每个选民,依次遍历其所有偏好顺序
- 找到第一个未被淘汰的候选人时,为该候选人增加一票,然后跳出当前选民的偏好循环(确保每个选民只投一票)
- 完全避免了数组越界问题,也能正确处理多轮淘汰后的选票转移
验证效果
修复后,程序会正确统计每轮的有效票数:在你提到的测试案例中,5位选民的选票会正确分配给第一个未被淘汰的候选人,最终b将获得多数票成为唯一胜者,解决tabulate handles multiple rounds of preferences的报错。
内容的提问来源于stack exchange,提问作者Meliodas
相关产品推荐
相关产品推荐

