P027 找出平均分及以上的学生 ★★

03-程序设计题 软件121, 唐鼎威 680浏览

所属年份:2011.3;
学生的记录由学号和成绩组成。N名学生的数据已放入主函数中的结构体数组s中,请编写函数fun,其功能是:把高于等于平均分的学生数据放在b所指的数组中,高于等于平均分的学生人数通过形参n传回,平均分通过函数值返回。

#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 higher than %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("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);
}

【考点分析】
本题考查:结构体类型;for循环语句和if条件语句的应用。

【解题思路】
本题中第1个循环的作用求出所有分数的总和,然后进行av=av/N后得到平均值。第2个循环的作用是将大于等于平均分的学生存入b所指存储单元中。注意同一结构体变量之间可以互相赋值。
本程序中直接用*n来表示b的下标,注意开始时要给*n赋初值0,且使用时不能少*号,因为单独的n是一个指针变量,而我们要用的是它所指向的存储单元中的值。

【参考答案】

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;} 
       /*将高于等于平均分的学生存入b所指存储单元中,并统计人数*/ 
  return av;                   /*返回平均分*/
}
double  fun( STREC  *a, STREC *b, int *n )
{
    int i, j=0;
    double av=0.0;
    for(i=0; i<N; i++)
        av=av+a[i].s;
    av=av/N;
    for(i=0; i<N; i++)
        if (a[i].s>av) 
            b[j++]=a[i];         
    *n = j;
    return av;
}