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 } 

posted @ 2012-05-14 06:40  zhengmian  阅读(349)  评论(0编辑  收藏  举报