C语言程序整数除法错误及计算结果异常求助
C语言罚款计算程序的输出异常修复方案
核心问题与修复步骤
- 整数除法错误:
x/y中x、y为int类型,执行整数除法会截断小数部分(比如120/181得到0而非0.663)。修复方式是将其中一个操作数转为浮点型:var1 = (double)x / y; - 赋值代替比较:代码中
if ((z = 0))和else if ((z = 1))是赋值操作,而非比较判断,会导致分支逻辑完全错误。应改为相等比较运算符==:if (z == 0) // ... else if (z == 1) - 返回值错误:
z=1分支最后返回的是var1,而非计算好的罚款值coima,直接导致输出结果异常。需修改返回语句为:return coima; - 变量重定义:
test_coima函数中,局部变量double z与参数int z重名,会覆盖参数值引发错误。将局部变量名改为result:double result = coima(x,y,z); printf("%lf\n", result); - 边界情况缺失:
z=1分支未处理km_passados <= 0的情况,会导致coima未初始化就返回,补充该判断:if (km_passados <= 0) { coima = 0; }
修正后的完整代码
#include <stdio.h> #include <math.h> double coima(int x, int y, int z) { double var2; double var1; double var; double coima; double km_passados = y - x; if (z == 0) { if (km_passados <= 0) { coima = 0; } else if (km_passados <= 20) { var = 1 + (0.25 * (y - x) / 10); var1 = (double)x / y; var2 = var1 + var; coima = var2 * 60; } else if (km_passados > 20 && km_passados <= 40) { var = 1 + (0.25 * (y - x) / 10); var1 = (double)x / y; var2 = var1 + var; coima = var2 * 120; } else if (km_passados > 40 && km_passados <= 60) { var = 1 + (0.25 * (y - x) / 10); var1 = (double)x / y; var2 = var1 + var; coima = var2 * 300; } else if (km_passados > 60) { var = 1 + (0.25 * (y - x) / 10); var1 = (double)x / y; var2 = var1 + var; coima = var2 * 500; } return coima; } else if (z == 1) { if (km_passados <= 0) { coima = 0; } else if (km_passados <= 30) { var = 1 + (0.25 * (y - x) / 10); var1 = (double)x / y; var2 = var1 + var; coima = var2 * 60; } else if (km_passados > 30 && km_passados <= 60) { var = 1 + (0.25 * (y - x) / 10); var1 = (double)x / y; var2 = var1 + var; coima = var2 * 120; } else if (km_passados > 60 && km_passados <= 80) { var = 1 + (0.25 * (y - x) / 10); var1 = (double)x / y; var2 = var1 + var; coima = var2 * 300; } else if (km_passados > 80) { var = 1 + (0.25 * (y - x) / 10); var1 = (double)x / y; var2 = var1 + var; coima = var2 * 500; } return coima; } // 处理z不为0或1的情况,避免未定义行为 return 0; } double test_coima() { int x; //velocidade permitida int y; //velocidade atingida int z; //dentro ou fora da localidade while (scanf("%d%d%d", &x, &y, &z) != EOF) { double result = coima(x,y,z); printf("%lf\n", result); } return 0; } int main() { test_coima(); return 0; }
验证测试
输入120 181 1时,计算过程如下:
km_passados = 181-120=61,进入z=1分支的60<km_passados<=80区间var = 1 + (0.25*61)/10 = 1 + 15.25/10 = 2.525var1 = 120.0/181 ≈ 0.66298var2 = 2.525 + 0.66298 ≈ 3.18798coima = 3.18798 * 300 ≈ 956.394,与预期的956.4一致
内容的提问来源于stack exchange,提问作者Alexandre Santos
相关产品推荐
相关产品推荐

