C语言按优先级筛选数组元素求和及显示异常问题排查
C语言清单筛选功能异常问题修复
问题原因
两处运行异常对应三个明确的代码编写错误:
- 求和值未正确重置:进入优先级筛选分支时写的是
sum == 0;,这是无实际效果的比较运算,不会把sum赋值为0,sum始终保留全量物品的总金额230101.70,最终输出的合计值自然是全量总和,而非筛选结果的合计。 - 循环终止条件错误:遍历物品的for循环把
priority[i] == 1写进了循环执行判断条件,遍历到第二个物品(优先级为3)时条件不成立,直接终止循环,只会输出第一个优先级为1的物品,不会遍历到后面第四个优先级为1的物品。 - 额外逻辑漏洞:
- 读取用户输入的筛选优先级时,直接把值写入了存储原始物品数据的
priority[i]数组,会覆盖原有物品的优先级数据; - 筛选逻辑硬编码只判断优先级1,用户选2、3级优先级时不会执行任何展示和计算。
- 读取用户输入的筛选优先级时,直接把值写入了存储原始物品数据的
修复方案
- 单独定义变量存储用户输入的筛选优先级,避免污染原始物品数据;
- 把
sum ==0改为sum =0,进入筛选分支前正确重置求和值; - 调整for循环逻辑:循环只负责遍历所有物品,在循环内部判断当前物品优先级是否匹配筛选值,匹配才输出、累加金额,去掉循环条件里的优先级判断,同时去掉硬编码的优先级1判断,支持1-3所有优先级筛选。
修复后核心代码
int filterPriority; // 存储用户选择的筛选优先级 do { printf("\nHow do you want to forecast your wish list?\n" " 1. All items (no filter)\n" " 2. By priority\n" " 0. Quit/Exit\n"); printf("Selection: "); scanf(" %d", &selection); if (selection == 1) { printf("\n====================================================\n"); printf("Filter: All items\n"); printf("Amount: $%10.2lf\n", sum); printf("Forecast: %d years, %d months\n", ((int)(sum / netIncome) / 12), (((int)(sum / netIncome) % 12) + 1)); printf("====================================================\n"); } else if (selection == 2) { sum = 0; // 正确重置求和变量 printf("\nWhat priority do you want to filter by? [1-3]: "); scanf(" %d", &filterPriority); // 筛选值存入独立变量,不修改原始数据 printf("\n====================================================\n"); printf("Filter: by priority (%d)\n", filterPriority); // 遍历所有物品 for (i = 0; i < item; i++) { // 匹配筛选优先级才输出、累加 if (priority[i] == filterPriority) { printf("%3d %5d %5c %11.2lf\n", i + 1, priority[i], finance[i], cost[i]); sum += cost[i]; } } printf("Amount: $%10.2lf\n", sum); printf("Forecast: %d years, %d months\n", ((int)(sum / netIncome) / 12), (((int)(sum / netIncome) % 12) + 1)); printf("====================================================\n"); } else if (selection < 0 || selection > 2) { printf("\nERROR: Invalid menu selection.\n"); } } while (selection != 0);
修复后筛选优先级1时,会正确输出两个匹配条目,合计金额为59900.15+16700.75=76600.90,符合预期。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

