;
double x[N];
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));
printf("\nThe result :\n",fun(x));
for(i=0; i<N; i++) printf("%5.0f ",x[i]);
printf("\n");
return 0;
}
解析:现求出数组x中N个元素的平均值av,程序描述为
s=0;
for (i=0; i<N; i++) s=s+x[i];
av= s/N;
之后对数组x的各元素x[i]进行扫描,将高于平均分的元素x[i]依次存储到辅助数组y中,其置x[i]=-1(因为规定数组x中所有元素值均为非负数),此时辅助数组中存储了数组x中大于平均值的数据;再对数组x扫描一遍,将元素值不等于-1的元素值(即数组x中不大于平均值的数据)依次增加到辅助数组y中,此时数组y中存储了原数组x中的所有元素,并且大于平均值的数据存储在数组y的前部,小于等于平均值的数据存储在数组y的后部。
最后将数组y的各元素值对应存储(覆盖)到数组x中即可。
编写的函数fun如下:
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;
for(i=j=0; i<N; i++)
if( x[i]>av )
{
y[j++]=x[i]; x[i]=-1;
}
for(i=0; i<N; i++)
if( x[i]!= -1) y[j++]=x[i];
for(i=0; i<N; i++)x[i] = y[i];
return av;
}
例3 编写函数fun,它的功能是:移动一维数组中的内容,若数组中有n个整数,要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。
例如,一维数组中的原始内容为:1,2,3,4,5,6,7,8,9,10;p的值为3。移动后,一维数组中的内容应为:5,6,7,8,9,10,1,2,3,4。
#include <stdio.h>
#define N 80
void fun(int *w,int p,int n)
{
}
int main()
{
int a[N]={1,2,3,4,5,6,7,8,9,
10,11,12,13,14,15};
int i,p,n=15;
printf("The original data:\n");
for(i=0; i<n; i++) printf("%3d",a[i]);
printf("\n\nEnter p: ");
scanf("%d",&p);
fun(a,p,n);
printf("\nThe data after moving:\n");
for(i=0; i<n; i++) printf("%3d",a[i]);
printf("\n");
return 0;
}
解析:将数组w中的元素w[0]移动到数组的最后,操作描述为
1)暂存w[0]到辅助变量t中;
2)用一重循环将数组元素w[1]~w[n-1]一次前移一位;
3)将暂存的t保存到w[n-1]中。
将上述操作循环执行p+1次,则将下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。
编写的函数fun如下:
void fun(int *w,int p,int n)
{
int i,j,t;
for (i=0;i<=p;i++)
{
t=w[0];
for (j=0;j<n-