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

C语言计算输入数值列表最小值时输出始终为0的问题求助

问题分析与修复方案

核心问题点

  • 数组大小不匹配:你定义的数组是double num[size-1];,但后续循环读取了size个元素,这会触发数组越界访问,属于未定义行为,是最小值异常的核心诱因。
  • max/min初始化时机错误:在读取数组元素前就用num[0]初始化max和min,此时数组元素是未初始化的垃圾值,后续的比较逻辑完全失效。

修复后的代码

#include <stdio.h>
#include <float.h>

int main(int argc, char** argv)
{
    int size;
    
    scanf("%d", &size);
    // 调整数组大小为size,匹配输入元素数量
    double num[size];
    double sum = 0;
    double dx = 0;
    double avg, var;

    // 先读取所有输入元素
    for(int i = 0; i < size; i++){
        scanf("%lf", &num[i]);
    }
    
    // 用第一个有效输入值初始化max和min
    double max = num[0];
    double min = num[0];
    
    // 计算总和同时更新最大值、最小值
    for(int i = 0; i < size; i++){
        sum += num[i];
        if(num[i] < min){
            min = num[i];
        }
        if(num[i] > max){
            max = num[i];
        }
    }
    
    avg = sum/(double)size;
    for(int i = 0; i < size; i++){
        dx += ((num[i]-avg)*(num[i]-avg));
    }

    var = dx/(double)(size);

    printf("AVG: %0.4f\n", avg);
    printf("VAR: %0.4f\n", var);
    printf("MAX: %0.4f\n", max);
    printf("MIN: %0.4f\n", min);
    return 0;
}

关键修改说明

  • 修正数组大小为size,确保能容纳所有输入元素,彻底解决越界问题。
  • 将max和min的初始化移至读取完数组元素之后,使用第一个有效输入值作为基准,保证比较逻辑的正确性。
  • 修复了printf中的换行符格式,改为标准的\n。

额外优化建议

  • 增加size输入合法性检查(如size <= 0时提示错误并退出),避免创建无效的空数组。
  • 若需处理大量数据,建议使用malloc/free动态分配内存,替代变长数组,提升代码兼容性与安全性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:01:25