You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.525
  • var1 = 120.0/181 ≈ 0.66298
  • var2 = 2.525 + 0.66298 ≈ 3.18798
  • coima = 3.18798 * 300 ≈ 956.394,与预期的956.4一致

内容的提问来源于stack exchange,提问作者Alexandre Santos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:21:34