CS50 plurality项目print_winner平局未输出多名获奖者修复咨询
问题原因
你当前print_winner函数的核心错误是排序逻辑只交换了候选人的姓名字段,没有同步交换对应的得票数字段,导致排序后候选人姓名和得票数完全错位,无法正确识别所有最高得票的候选人,因此触发了平局场景下的校验失败。
需要修改的内容
- 移除不必要的全局变量
string x,交换逻辑用到的临时变量可以直接定义在print_winner函数内部 - 排序交换操作需要同时同步候选人的姓名和得票数,最简单的实现是直接交换整个
candidate结构体
修改后的完整
print_winner代码 void print_winner(void) { // 按得票数升序排序所有候选人 for (int i = 0; i < candidate_count - 1; i++) { for (int j = i + 1; j < candidate_count; j++) { if (candidates[j].votes < candidates[i].votes) { // 直接交换整个候选人结构体,保证姓名和得票数同步 candidate temp = candidates[i]; candidates[i] = candidates[j]; candidates[j] = temp; } } } int max_votes = candidates[candidate_count - 1].votes; // 遍历打印所有获得最高票的候选人 for (int k = 0; k < candidate_count; k++) { if (candidates[k].votes == max_votes) { printf("%s\n", candidates[k].name); } } return; }
修改后重新编译运行即可通过所有check50校验项。
内容的提问来源于stack exchange,提问作者Francesca Di Paola
相关产品推荐
相关产品推荐

