生成随机数组:创建一个包含10个随机数的数组 计算平均值:计算数组中所有元素的平均值 重新排列数组:将数组重新排列,使得大于平均值的元素排在前面,小于等于平均值的元素排在后面
#include <stdlib.h>
#include <stdio.h>
#define N 10
// 函数功能:计算数组平均值,并重新排列数组元素
double fun(double *x)
{
int i, j;
double s, av, y[N];
// 第一步:计算数组所有元素的和
s=0;
for(i=0; i<N; i++)
s=s+x[i];
// 第二步:计算平均值
av=s/N;
// 第三步:将大于平均值的元素复制到临时数组y中,并在原数组中标记为-1
for(i=j=0; i<N; i++)
if( x[i]>av ){
y[j++]=x[i]; // 将大于平均值的元素存入y数组
x[i]=-1; // 在原数组中标记为-1
}
// 第四步:将小于等于平均值的元素(即不等于-1的元素)追加到y数组末尾
for(i=0; i<N; i++)
if( x[i]!=-1)
y[j++]=x[i];
// 第五步:将重新排列后的y数组复制回原数组x
for(i=0; i<N; i++)
x[i] = y[i];
return av; // 返回平均值
}
void main()
{
int i;
double x[N];
// 初始化数组:生成10个0-49之间的随机整数
for(i=0; i<N; i++){
x[i]=rand()%50;
printf("%4.0f ",x[i]);
}
printf("\n");
// 调用函数并输出平均值
printf("\nThe average is: %f\n",fun(x));
// 注意:这里有个错误,应该去掉fun(x)调用
printf("\nThe result :\n"); // 应该是这样
// printf("\nThe result :\n",fun(x)); // 原代码有问题
// 输出重新排列后的数组
for(i=0; i<N; i++)
printf("%5.0f ",x[i]);
printf("\n");
}
我来详细解释这个C语言程序的功能和执行过程。## 程序功能分析
这个程序的主要功能是:
- 生成随机数组:创建一个包含10个随机数的数组
- 计算平均值:计算数组中所有元素的平均值
- 重新排列数组:将数组重新排列,使得大于平均值的元素排在前面,小于等于平均值的元素排在后面
详细执行流程
main函数执行过程:
- 初始化数组:生成10个0-49之间的随机整数并打印
- 调用fun函数:计算平均值并重新排列数组
- 输出结果:显示平均值和重新排列后的数组
fun函数详细分析:
第一阶段 - 计算平均值:
s=0;
for(i=0; i<N; i++) s=s+x[i]; // 计算总和
av=s/N; // 计算平均值
第二阶段 - 提取大于平均值的元素:
for(i=j=0; i<N; i++)
if( x[i]>av ){
y[j++]=x[i]; // 将大于平均值的元素存入y数组前部
x[i]=-1; // 在原数组中标记为已处理
}
第三阶段 - 追加小于等于平均值的元素:
for(i=0; i<N; i++)
if( x[i]!=-1) // 找到未被标记的元素(即小于等于平均值的元素)
y[j++]=x[i]; // 追加到y数组末尾
第四阶段 - 复制回原数组:
for(i=0; i<N; i++)
x[i] = y[i]; // 将重新排列的结果复制回原数组
程序问题
代码中有一个小错误:
printf("\nThe result :\n",fun(x));
这行代码会再次调用fun函数,但printf格式字符串中没有占位符,所以返回值被忽略。应该改为:
printf("\nThe result :\n");
运行示例
假设生成的随机数组为:[15, 23, 8, 35, 12, 41, 6, 28, 19, 33]
- 计算平均值:(15+23+8+35+12+41+6+28+19+33)/10 = 22.0
- 重新排列后:[23, 35, 41, 28, 33, 15, 8, 12, 6, 19]
- 前5个元素:大于平均值的元素(23, 35, 41, 28, 33)
- 后5个元素:小于等于平均值的元素(15, 8, 12, 6, 19)
这个程序实现了一种特殊的数组分割算法,将数组分为两部分:大于平均值的元素在前,小于等于平均值的元素在后。

浙公网安备 33010602011771号