ACM 2 分步实现 打基础 再实现

求一个值delta,让选上了这一门课(未选的 

 成绩是0)的每个学生的成绩+delta,再计算这门课的平均分,这个平均分恰好等于选了这门课的所有的学生的平均成绩

 以下的程序是对  “ACM 1 分步实现 打基础 再实现”的改进,按照建立基础的的想法可以让ACM1 程序编译执行的速度提高的倍数=课程数。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4  // 先计算每个学生的平均值,然后,再计算detal,这样可以避免在f_pinju里多次重复地计算每个 学生的平均成绩。
  5  void fpin_jun_each( int data[][ 10],  int pinjun[], int student_num, int class_num)
  6 {
  7      int i,j,class_count_stu,sum;
  8      for(j= 0;j<student_num;j++)
  9     {
 10         sum= 0;
 11         class_count_stu= 0;
 12          for(i= 0;i<class_num;i++)
 13         {
 14              if(data[j][i]!= 0)
 15             {
 16                 sum+=data[j][i];
 17                 class_count_stu++;
 18             }
 19         }
 20         pinjun[i]=sum/class_count_stu;
 21     }
 22 
 23 
 24 }
 25 
 26  // int count_in=0;
 27  // int deta=0;
 28 
 29  //  (y1 + y2 + .....y_count_in+(count_in)*detal) / count_in = n1 = sum / count_in
 30  //  y1 表示本门课程的源成绩,
 31  // sum逐个加每个学生(已经选了该门课)所有课程的平均,到下面再除一个count_in就是 所有选这课的学生的 所有成绩 的平均值。
 32  //  count_in表示选本门课的学生数
 33  //  n1表示选了本门课的 所有学生 的 所有的成绩 的平均值。
 34  //  detal即为所求的本门所需的差值。
 35  //  => detal=(sum-(y1+y2....y_count_in)) / count_in
 36  //  => detal= (sum  - totalOfClass ) / count_in.
 37  int f_pinjun( int data[][ 10], int student_num, int row, int class_num)
 38 {
 39      int count_in= 0;
 40      int i,sum= 0,tmp_sum,j,n_stu_class_num,totalOfClass= 0;
 41      // deta=0;
 42 
 43      for(i= 0; i<student_num; i++)
 44     {
 45          if(data[i][row]!= 0)
 46         {
 47              // tmp_sum=0;
 48              n_stu_class_num= 0;
 49          /*     for(j=0;j<class_num;j++)//这个地方的重复的太多(对于第一个课程data[i][row]!=0 时 计算一次,10门复种就计算同一个学生的平均成绩10次,这完全没有必要)。
 50           * ,应当是预先保存每一个学生的平均值,然后调用,这样可以避免重复。
 51              {
 52                  if(data[i][j]!=0)
 53                  {
 54                      n_stu_class_num++;
 55                      tmp_sum+=data[i][j];
 56                  }
 57 
 58              } */
 59 
 60             totalOfClass+=data[i][row];
 61              // tmp_sum/=n_stu_class_num;
 62              count_in++;
 63              // sum+=tmp_sum; // sum逐个加每个学生(已经选了该门课)所有课程的平均,到下面再除一个count_in就是 所有选这课的学生的 所有成绩 的平均值。
 64              sum+=pinjun[i];
 65         }
 66     }
 67      // deta=totalOfClass/count_in;
 68       // return sum/count_in;
 69       return (sum-totalOfClass)/count_in;
 70 }
 71 
 72  int main()
 73 {
 74      char class_name[ 10][ 15];
 75      int student_num,class_num,i,data[ 20][ 10],j;
 76      // int pinjun[10]= {0,0};
 77       int each_pingjun[ 20];
 78     scanf( " %d %d ",&student_num,&class_num);
 79      // printf("%d %d\n",student_num,class_num);
 80 
 81      for(i= 0; i<class_num; i++)
 82     {
 83         scanf( " %s ",class_name[i]);
 84     }
 85 
 86      for(i= 0; i<student_num; i++)
 87     {
 88          for(j= 0; j<class_num; j++)
 89             scanf( " %d ",&data[i][j]);
 90     }
 91     
 92     fpinjun_each(data,each_pingjun,student_num,class_num); //
 93       // print_data(data,student_num,class_num);
 94 
 95      for(i= 0; i<class_num; i++)
 96     {
 97          // pinjun[i]=f_pinjun(data,student_num,i,class_num);
 98           // printf("%d ",pinjun[i]);
 99           // if(i!=class_num-1)
100           // printf("%s %d\n",class_name[i],pinjun[i]-deta);
101           // printf("%d\n",deta);
102          printf( " %s %d\n ",class_name[i],f_pinjun(data,student_num,i,class_num));
103     }
104      // printf("%s %d",class_name[i-1],pinjun[i]-deta);
105 
106      return  0;

107 } 

转载于:https://www.cnblogs.com/zhengmian/archive/2012/05/14/ACM_2.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值