二维数组列平均值计算异常:填充随机数后结果全为0
你的C语言代码问题分析与修正
代码存在的核心问题
数组初始化顺序错误:你在
m、n为0时就定义了变长数组array[m][n]和avg_col,之后输入的m、n不会改变数组的实际大小,导致数组尺寸完全不符合预期,甚至触发越界访问的未定义行为。必须先获取用户输入的m、n,再定义对应大小的数组。随机数生成逻辑完全错误:
ran_num只在程序启动时生成一次,所有数组元素都会被赋值为同一个值;(double)rand() / RAND_MAX生成的是0到1之间的浮点数,赋值给int类型的数组元素时会被直接截断为0,这直接导致所有数组元素都是0,平均值自然为0;- 未初始化随机数种子,
rand()每次运行都会生成完全相同的序列,需要用srand(time(NULL))初始化(需引入<time.h>头文件)。
循环边界越界:循环条件
i <= m和j <= n会让下标超出数组有效范围(数组下标从0开始,有效范围是0~m-1、0~n-1),属于未定义行为,应改为i < m和j < n。平均值数组越界:
double avg_col[] = {0};只初始化了1个元素,当n>1时,访问avg_col[j](j≥1)会触发越界,必须在知道n的大小后定义double avg_col[n] = {0};。整数除法导致精度丢失:
array[i][j] / m是整数除法,即使数组元素是正确数值,也会截断小数部分,应转换为浮点数计算:(double)array[i][j] / m。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> // 用于初始化随机数种子 int main(void) { int m = 0; int n = 0; printf("Enter (m, n > 0): "); scanf("%d, %d", &m, &n); // 先获取m、n,再定义对应大小的数组 int array[m][n]; double avg_col[n] = {0}; // 初始化n个元素的平均值数组 // 初始化随机数种子,确保每次运行生成不同的随机序列 srand(time(NULL)); for(size_t i = 0; i < m; ++i){ for(size_t j = 0; j < n; ++j){ // 生成0到99之间的随机整数(可根据需求调整范围) array[i][j] = rand() % 100; // 转换为浮点数计算,避免整数除法精度丢失 avg_col[j] += (double)array[i][j] / m; } } for(int i = 0; i < n; i++){ printf("Average of column %d : %.3f\n", i ,avg_col[i]); } return 0; }
内容的提问来源于stack exchange,提问作者Pariya
相关产品推荐
相关产品推荐

