CS50 Pset3 Runoff:Tabulate函数中preferences[i][j]实现疑问
实现tabulate函数统计有效选票
你的代码存在几个关键错误,导致无法正确统计选票,下面是修正思路和正确实现:
原代码的问题
- 索引混淆:你用选民的索引
i去访问candidates[i],但i是选民编号,不是候选人编号,应该用preferences[i][j]得到的候选人编号来操作对应候选人 - 错误修改偏好数组:
preferences[i][j]=i是多余且错误的,preferences数组用来存储选民的投票顺序,不能在统计时修改它 - 逻辑偏差:内层循环的判断条件错误,应该检查
preferences[i][j]对应的候选人是否未被淘汰,而不是当前选民相关的候选人
正确实现代码
// 统计未被淘汰候选人的选票 void tabulate(void) { // 遍历每一位选民 for (int i = 0; i < voter_count; i++) { // 遍历当前选民的偏好列表,找到第一个未被淘汰的候选人 for (int j = 0; j < candidate_count; j++) { int candidate_index = preferences[i][j]; // 如果该候选人未被淘汰,给他加一票并跳出当前选民的循环 if (!candidates[candidate_index].eliminated) { candidates[candidate_index].votes++; break; } } } return; }
代码说明
- 外层循环遍历每一位选民(
i是选民索引) - 内层循环遍历当前选民的偏好顺序(
j是偏好顺位) - 用
preferences[i][j]获取当前顺位对应的候选人编号,存储到candidate_index - 检查该候选人是否未被淘汰:
!candidates[candidate_index].eliminated(等同于candidates[candidate_index].eliminated == false) - 找到第一个有效候选人后,给他的票数加1,然后
break跳出内层循环,不再处理该选民的后续偏好 - 所有选民处理完后,函数结束
内容的提问来源于stack exchange,提问作者Robbie
相关产品推荐
相关产品推荐

