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

C语言程序int类型计算异常求助:输入int时结果恒为0

修复输入int类型时计算结果恒为0的问题

当前程序存在多处错误,不仅导致输入int类型时结果为0,所有场景下的计算结果都不正确,以下是错误分析和修复方案:

核心错误分析

  • 调用逻辑完全失效:main函数中循环调用calculate_expression(1, type, x)没有保存结果,属于无效操作;最后调用calculate_expression(n)时未传入任何类型和数值参数,函数内部读取栈上垃圾数据,导致计算结果异常。
  • int类型读取错误:选择类型0(整数)时,用%lf格式符读取数据,这是double类型的格式,会导致整数输入被错误解析,后续计算数值完全错误。
  • 整数除法隐式错误:原计算逻辑中x * x / (double)i,若x*x结果超过int范围会溢出,且未显式转换整个乘法结果为double,可能导致精度丢失。

修复方案

1. 替换可变参数为数组传递

可变参数stdarg容易引发未定义行为,改用数组存储类型和数值,更安全且易维护。

2. 修正输入读取逻辑

整数类型用%d格式符读取,再转换为double存储;浮点数保持%lf读取。

3. 修正计算中的类型转换

显式将整数乘法结果转为double,避免整数溢出和除法精度问题。

4. 正确传递所有参数

收集完所有输入数据后,一次性传入计算函数,确保所有元素参与运算。

修复后的完整代码

#include <stdio.h>

// 改用数组参数传递类型和数值,避免可变参数的未定义行为
double calculate_expression(int n, int types[], double values[]) {
    double result = 0.0;
    for (int i = 1; i <= n; i++) {
        int type = types[i-1];
        if (type == 0) { 
            // 将存储的double转回int(输入时已确保是整数)
            int x = (int)values[i-1];
            // 显式转换乘法结果为double,避免整数溢出和除法精度问题
            result -= (double)(x * x) / i;
        } else if (type == 1) { 
            double x = values[i-1];
            result += x * x / i * (i % 2 == 0 ? -1 : 1);
        }
    }
    return result;
}

int main() {
    int n;
    printf("Введіть кількість чисел у числовій послідовності: ");
    scanf("%d", &n);

    // 存储每个元素的类型和对应数值
    int types[n];
    double values[n];

    printf("\nВведіть тип елементу (0 для цілих, 1 для дробових), а потім елемент:\n");

    for (int i = 0; i < n; ++i) {
        int type;
        printf("%d елемент: ", i+1);
        scanf("%d", &type);
        types[i] = type;

        if (type == 0) {
            int x;
            scanf("%d", &x);
            values[i] = (double)x;
        } else if (type == 1) {
            scanf("%lf", &values[i]);
        }
    }

    // 传入所有数据计算结果
    double result = calculate_expression(n, types, values);
    printf("\nResult: %lf\n", result);

    return 0;
}

额外说明

如果一定要保留可变参数的实现,需要在main函数中手动构建参数列表,但C语言不支持动态可变参数传递,因此需要使用va_list转发,不过这种方式依然存在风险。上面的数组传递方案是更稳妥的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:20:57