编写函数计算一维实型数组前n个元素的最大值、最小值和平均值。数组、n、最大值、最小值和平均值均作为函数形参,函数无返回值;在主函数中输入数据,调用函数得到结果。(要求用指针方法实现)

这是题目

img

#include <stdio.h>
int main()
{
    void data(int n,float *p);
    float m[10000],*p=m;
    int a,i;
    scanf("%d",&a);
    for(i=0;i<a;i++,p++)
    scanf("%f",p);
    p=m;
    data(a,p);
    return 0;
}
void data (int n,float *p)
{
    float max,min,aveg,t,sum;
    int i,j,k;
    float *m=p;
    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
        {
            if(*(p+j)>*(p+k))k=j;
            if(k!=i)
            {
                t=*p;*p=*(p+1);*(p+1)=t;
            }
        }
    }
    sum=0;
    for(i=0;i<n;p++)
    {
    sum+=*p;
    }
    p=m;
    aveg=sum/n;
    printf("max=%.2f\nmin=%.2f\naveg=%.2f\n",*(p+n-1),*p,aveg);
}

这个循环多余,并且导致了错误,可以去掉

img

#include <stdio.h>
int main()
{
    void data(int n,float *p);
    float m[10000];
    float *p=m;
    int a,i;
    scanf("%d",&a);
    for(i=0;i<a;i++)
       scanf("%f",&m[i]);
    p=m;
    data(a,m);
    return 0;
}
void data (int n,float *p)
{
    float max,min,aveg,t;
    float *loac=p;    //此处要保存一下,因为后面求aver会改变p 
    int i,j,k;
    for(i=0;i<=n-2;i++)
    {
        k=i;
        for(j=i+1;j<=n-1;j++)
        {
            if(*(p+j)>*(p+k))k=j;
            if(k!=i)
            {
                t=*(p+k);*(p+k)=*(p+i);*(p+i)=t;
            }
        }
    }
    aveg=0;
    for(i=0;i<n;p++)
    {
       aveg+=*p;
       i++;   //此处要加上i++ 
    }
    printf("max=%.2f\nmin=%.2f\naveg=%.2f\n",*loac,*(loac+n-1),aveg/3);
}