账单计算C程序未输出预期结果的原因排查及修复方案
问题分析与修复方案
错误原因分析
- 高价商品判断逻辑错误:代码在循环结束后仅判断最后一个商品的单价是否超过7 JOD,而非检查是否存在任意一件单价超7 JOD的商品,导致符合规则4的情况无法触发折扣。
- 折扣叠加逻辑错误:当前代码中,规则4的1%折扣会被后续的if-else分支直接覆盖,无法实现折扣叠加。例如当同时满足规则1和规则4时,1%的折扣会被7%的折扣覆盖,导致总折扣计算错误。
- 最大折扣检查不全面:仅在
n>2且total>=20的分支中检查折扣是否超过50%,其他场景下未做限制,违反规则5。 - 冗余变量:定义了
count变量但未使用,属于无效代码。
修复后的代码
#include <stdio.h> int main() { int n, i; float price, total = 0, discount = 0; // 标记是否存在单价超过7 JOD的商品 int has_expensive_item = 0; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%f", &price); total += price; // 循环内检查每个商品单价,只要有一个超过7就标记为1 if (price > 7) { has_expensive_item = 1; } } // 按规则计算基础折扣 if (n > 2) { if (total < 20) { discount += total * 0.07; // 规则1 } else { discount += total * 0.15; // 规则2+规则3 } } else { if (total >= 20) { discount += total * 0.1; // 规则2 } // total<20且n<=2时无基础折扣,无需处理 } // 叠加规则4的额外折扣 if (has_expensive_item) { discount += total * 0.01; } // 统一检查最大折扣不超过50% if (discount > total * 0.5) { discount = total * 0.5; } printf("%.2f\n", total - discount); return 0; }
修复说明
- 修正高价商品判断:新增
has_expensive_item变量,在循环内逐个检查商品单价,确保只要存在符合条件的商品就能触发规则4的折扣。 - 调整折扣逻辑为叠加模式:将所有折扣计算改为累加方式,避免后续分支覆盖之前的折扣值,确保符合多个规则时折扣可以叠加。
- 全局检查最大折扣:在所有折扣计算完成后统一判断是否超过50%,确保所有场景都符合规则5。
- 移除冗余变量:删除未使用的
count变量,精简代码。
内容的提问来源于stack exchange,提问作者Afnan Mohammed
相关产品推荐
相关产品推荐

