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

C语言如何访问数组各列并计算每列元素平均值

核心问题说明

你当前的代码存在几个逻辑错误,导致无法正确计算列平均值:

  • 列访问逻辑不完整:你用一维数组按行优先规则存储3列的二维数据时,第i行第j列的元素访问方式确实是*(array + 3*i +j),但你没有对整列元素做累加,且在循环内直接给平均值赋值,最终结果只会保留最后一行的计算值,前面的循环赋值都会被覆盖。
  • 存在整数除法精度错误:代码中100/50、100/65属于整数运算,C语言会直接截断小数部分,比如100/65会得到结果1而非浮点数1.538,计算结果完全失真。
  • 冗余变量:定义的double sum = 0全程没有使用,属于无效代码。
  • 求和逻辑缺失:没有先对每列所有元素做累加,直接拿单行元素除以行数,结果不符合平均值计算要求。
修改后实现

假设你的数组共4行(对应宏SIZE为总行数),修改后的代码如下:

#define SIZE 4  // 对应数组总行数
void percentage(float* array, int* carbohydrate_avg, int* protein_avg, int* fat_avg){
    // 初始化三列的累加和为0,用浮点数存储避免精度损失
    float carb_total = 0.0f;
    float protein_total = 0.0f;
    float fat_total = 0.0f;

    for(int i = 0; i < SIZE; i++){
        // 逐行计算每个元素的归一化值,所有运算常量加.0f后缀强制走浮点数运算
        float* cur_row = array + 3*i; // 先拿到当前行的首地址,简化写法
        cur_row[0] = cur_row[0] * 100.0f / 300.0f;
        cur_row[1] = cur_row[1] * 100.0f / 50.0f;
        cur_row[2] = cur_row[2] * 100.0f / 65.0f;

        // 当前行三个值分别累加到对应列的总和中
        carb_total += cur_row[0];
        protein_total += cur_row[1];
        fat_total += cur_row[2];
    }

    // 所有行遍历完成后计算平均值,转为int后赋值给输出参数
    *carbohydrate_avg = (int)(carb_total / SIZE);
    *protein_avg = (int)(protein_total / SIZE);
    *fat_avg = (int)(fat_total / SIZE);
}
列访问逻辑说明

行优先存储的一维数组模拟M行N列二维结构时,固定列号j遍历所有行号i,就能拿到整列的所有元素:

  • 碳水是第0列:所有行的该列元素偏移为3*i + 0
  • 蛋白质是第1列:所有行的该列元素偏移为3*i + 1
  • 脂肪是第2列:所有行的该列元素偏移为3*i + 2
    遍历过程中把同列的值累加,最后除以总行数就能得到正确列平均值。

内容的提问来源于stack exchange,提问作者CJ. T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:03:30