电力账单计算代码执行异常排查及优化方案咨询
电力账单计算代码错误分析与优化方案
一、错误原因
原代码的核心问题是重复累加所有满足条件的区间费用,完全违背阶梯计费逻辑:
当输入750单位时,四个if条件全部成立,代码会执行:
b = 750*5 + 650*5.5 + 550*6.5 + 250*7 = 3750 + 3575 + 3575 + 1750 = 12650
而正确的阶梯计费应该是仅对每个区间的超出部分按对应单价收费,而非叠加所有区间的费用。
二、不使用逻辑与运算符的优化实现
方法1:阶梯式if-else判断
利用else if的排他性,确保每个区间仅被计算一次,无需逻辑与运算符:
/* 100单位以内 - 5卢比/单位 100-200单位区间 - 5.5卢比/单位 200-500单位区间 - 6.5卢比/单位 500单位以上区间 - 7卢比/单位 */ #include<stdio.h> int main () { int a; float b = 0.0; printf("Enter Your Consumption in Units: "); scanf("%d", &a); if (a > 500) { b = 100*5 + 100*5.5 + 300*6.5 + (a-500)*7; } else if (a > 200) { b = 100*5 + 100*5.5 + (a-200)*6.5; } else if (a > 100) { b = 100*5 + (a-100)*5.5; } else if (a > 0) { b = a*5; } else { printf("Invalid consumption value!\n"); return 1; } printf("\nYour Bill is Rs. %.2f\n", b); return 0; }
方法2:从高到低分段抵扣计算
先计算最高区间的超出费用,再将剩余电量降至区间上限,依次处理更低区间,全程无需逻辑与:
/* 100单位以内 - 5卢比/单位 100-200单位区间 - 5.5卢比/单位 200-500单位区间 - 6.5卢比/单位 500单位以上区间 - 7卢比/单位 */ #include<stdio.h> int main () { int a; float b = 0.0; printf("Enter Your Consumption in Units: "); scanf("%d", &a); if (a < 0) { printf("Invalid consumption value!\n"); return 1; } // 处理500以上的部分 if (a > 500) { b += (a - 500) * 7; a = 500; // 剩余电量降到500,处理下一个区间 } // 处理200-500的部分 if (a > 200) { b += (a - 200) * 6.5; a = 200; // 剩余电量降到200 } // 处理100-200的部分 if (a > 100) { b += (a - 100) * 5.5; a = 100; // 剩余电量降到100 } // 处理100以内的部分 b += a * 5; printf("\nYour Bill is Rs. %.2f\n", b); return 0; }
两种方法输入750单位时,都会得到正确结果4750卢比。
内容的提问来源于stack exchange,提问作者user15221508
相关产品推荐
相关产品推荐

