【咀嚼C语言】输入10个学生5门课的成绩,分别用函数实现题设计算

【要求】原题在219页

输入10个学生5门课的成绩,分别用函数实现下列功能:

  1. 计算每个学生的平均分;
  2. 计算每门课的平均分;
  3. 找出所有50个分数中最高的分数所对应的学生和课程;
  4. 计算平均分方差:

  σ=∑xi2/n-(∑xi/n)2

  其中,xi为某一学生的平均分。

【咀嚼】

人类已经无法阻止我把一个简单程序写复杂了,哈哈。先贴代码再说吧。

View Code
  1 #include<stdio.h>
2 int M; //实现自定义学生数
3 int main()
4 {
5 int ctu=0;
6 float Savg(float a[][5],int); //每个学生平均成绩
7 void Cavg(float a[][5]); //每门课平均成绩
8 void max(float a[][5]); //最高分数
9 float var(float a[][5]); //平均方差
10 void pc(int); //输出课程名
11 float a[100][5];int i,j; //定义二维数组
12 printf("设定5门课依次是:\n语文、数学、英语、物理、化学\n");
13 do
14 { //begin
15 printf("plez input number of student:\n");
16 scanf("%d",&M); //自定义学生数
17 printf("plez intput %d student's score,\ngrounp by student:\n\n",M); //按学生输入成绩
18 for(i=0;i<M;i++)
19 for(j=0;j<5;j++)
20 scanf("%f",&a[i][j]);
21 printf("\naverage by student:\n\n"); //提示下面输出学生平均成绩
22 for(i=0;i<M;i++)
23 printf("student %d:%.2f\n",i+1,Savg(a,i));
24 printf("\naverage by course:\n\n"); //提示下面输出课程平均成绩
25 Cavg(a); //计算并输出课程平均成绩
26 printf("\nthe max score is:\n\n"); //提示下面输出最高成绩
27 max(a); //找出并输出最高成绩
28 printf("\nthe variance is %.2f\n\n",var(a)); //计算并输出方差
29 printf("press 1 to continue, or any key to quit\n"); //end
30 scanf("%d",&ctu);
31 }while(ctu==1);
32 return 0;
33 }
34
35 float Savg(float a[100][5],int i) //学生平均成绩
36 {
37 int j;float b;
38 for(j=0,b=0;j<5;j++)
39 b=b+a[i][j];
40 return (b/5);
41 }
42
43 void Cavg(float a[100][5]) //计算并输出课程平均成绩
44 {
45 void ptintCavg(int,float);
46 float b;int i,j;
47 for(j=0;j<5;j++)
48 {
49 for(i=0,b=0;i<M;i++)
50 b=b+a[i][j];
51 pc(j);printf(":%.2f\n",b/M);
52 };
53 }
54
55 void pc(int j) //输出课程名
56 {
57 switch(j)
58 {
59 case 0:printf("语文");break;
60 case 1:printf("数学");break;
61 case 2:printf("英语");break;
62 case 3:printf("物理");break;
63 case 4:printf("化学");break;
64 }
65 }
66
67 void max(float a[100][5]) //找最高成绩
68 {
69 int b,i,j,p,q;
70 for(i=0;i<M;i++)
71 for(j=0;j<5;j++)
72 {
73 b=1; //每次比较前重置b
74 for(p=0;p<M;p++)
75 for(q=0;q<5;q++)
76 if(a[i][j]<a[p][q])b=0;
77 if(b==0)continue;
78 printf("%.2f\tstudent %d\t",a[i][j],i+1);
79 pc(j);printf("\n");
80 };
81 }
82
83 float var(float a[100][5])
84 {
85 float Exi2(float a[][5]);
86 float Exi(float a[][5]);
87 float b;
88 b=Exi2(a)/M-(Exi(a)*Exi(a))/(M*M);
89 return b;
90 }
91
92 float Exi2(float a[][5])
93 {
94 float b=0;int i;
95 for(i=0;i<M;i++)
96 b=b+Savg(a,i)*Savg(a,i);
97 return b;
98 }
99
100 float Exi(float a[][5])
101 {
102 float b=0;int i;
103 for(i=0;i<M;i++)
104 b=b+Savg(a,i);
105 return b;
106 }

首先,我做了一个小的变动,即可以自己定义学生的人数(这才符合一个程序)。虽然说在C语言里数组的大小不能自由地自定义,但是变通变通,还是可以“自定义”的,具体怎么实现,好好看看上面的代码,就会明白了(提示,好好研究其中的全局变量M)。

本来每一个小问题写的是独立的函数,但是后面发现在第4个问题里也要用到求每个学生的平均分,于是就重新写了一下第1个问题里的函数,使之独立出来,可供后面使用。这样一来,在第1个问题里调用是,就要显得麻烦一些(见22、23行)。

至于在一个数组,甚至是多维数组里找最值,并要输出其下标的方法,可以参见void max(float a[][5])(第8行),以及从第67行到第81行,其中第73行要特别主要,必不可少,否则将导致程序发生让你抓狂的错误。相同的例子可以看我的另一篇博文【咀嚼C语言】二维数组找鞍点。

其他的,就先不再说了。

新浪微博,欢迎关注,欢迎各种交流

posted @ 2011-11-13 20:57  风自云  阅读(14330)  评论(0)    收藏  举报