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
相关产品推荐
相关产品推荐

