活动设计题      学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把高于等于平均分的学生数据放在b所指的数组中,高于等于平均分的学生人数通过形参n传回,平均分通过函数值返回。
    请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
    给定源程序:
    #include<stdio.h>
    #define N 12
    typedef struct
    {char num[10];
    double s;
    }STREC;
    double fun(STREC*a,STREC*b,int*n)
    {
    }
    main()
    {STREC s[N]={{'GA05',85},{'GA03',76},{'GA02',69},{'GA04',85},
    {'GA01',91},{'GA07',72},{'GA08',64},{'GA06',87},
    {'GA09',60},{'GA11',79},{'GA12',73},{'GA10',90}};
    STREC h[N],t;FILE*out;
    int i,j,n;double ave;
    ave=fun(s,h,&n);
    printf('The %d student data which is higherthan %7.3f:\n',n,ave);
    for(i=0;i<n;i++)
    printf('%s %4.1f\n',h[i].num,h[i].s);
    printf('\n');
    out=fopen('c:\\test\\out.dat','w');
    fprintf(out,'%d\n%7.3f\n',n,ave);
    for(i=0;i<n-1;i++)
    for(j=i+1;j<n;j++)
    if(h[i].s<h[j].s){t=h[i];h[i]=h[j];
    h[j]=t;}
    for(i=0;i<n;i++)
    fprintf(out,'%4.1f\n',h[i].s);
    fclose(out);
    }
 
【正确答案】double fun(STREC *a, STREC *b, int *n) { int i; double av=0.0; *n=0; for(i=0;i<N;i++) av=av+a[i].s; av=av/N; /*求平均值*/ for(i=0;i<N;i++) if(av<=a[i].s) {b[*n]=a[i];*n=*n+1;} return av; /*返回平均分*/ }
【答案解析】本题中第1个循环的作用求出所有分数的总和,然后进行av=av/N后得到平均值。第2个循环的作用是将大于等于平均分的学生存入b所指存储单元中。注意同一结构体变量之间可以互相赋值。 本程序中直接用*n来表示b的下标,注意开始时要给*n赋初值0,且使用时不能少*号,因为单独的n是一个指针变量,而我们要用的是它所指向的存储单元中的值。