题目如下:
Please write a program, enter the scores of the three courses for 5 students, and use the function to find:
- Average score per student (first line output);
- Average score for each course (second line output);
- Average variance (third line output).
where xi is the average score of a student and the output decimal place is 3 digits.
在主函数中先定义一个double型3行5列的数组(double ss[3][5];),用来储存这五个学生的各科成绩,因为此题需要运用多次循环结构,所以接着再定义几个整型变量,用于实现循环结构。(int i,x, y, z;)
运用循环以及scanf_s函数从键盘上把数据存储到数组中。
for(z = 0; z <= 4; z++)
{
printf("请分别输入学生%d的3科成绩:", z + 1);
scanf_s("%lf %lf %lf", &ss[0][z], &ss[1][z],&ss[2][z]);
}
printf函数是提示我们在键盘上怎样输入数据,scanf_s函数的作用则是让输入的数据按每一列从上到下的顺序存储在数组中,其中,每一列就代表一个学生三门课程的成绩,因为我们定义的是一个double型的数组,在输入它其中的元素时需要用%lf格式,不然就会出错。循环结构在此处的作用是让我们一共输入五次,每次输入的是一个学生的三门成绩。
得到数据之后,我们就需要使用函数来帮我们进行下一步的数据处理,由题意可知,解题需要用到求数据的平方,因此,我们在开头添加一个提供包含数学公式的头文件(#include
double average_ps(int n, double ss[3][5])
{
int x;
double sum;
x = n - 1;
sum = (ss[0][x] + ss[1][x] + ss[2][x]) / 3;
return sum;
}
由于我们传入的整数n是1~5,但是数组中的排序是从0开始的,因此需要(int x;),再对x进行减一,就得到此学生在数组中真正的排序。因为此函数需要返回一个带有小数的数据,因此我们(double sum;),利用sum来存储计算好的数据,最后再返回它到主函数中。(sum = (ss[0][x] + ss[1][x] + ss[2][x]) / 3;)此行代码是求平均分的核心代码,括号中表示调用数组中属于这个学生的三科成绩,(ss[0][x])中的x是定位到属于此学生的成绩的那一列,因为数组中的排序是从0开始的,所以0就表示这个学生第一科的成绩,以此类推,这括号中的代码就表示这个学生的三科成绩,最后在除以3,就得到了这个学生的平均分。
接着是定义第二个函数(double average_ec(int n, double ss[3][5]);),函数代码如下:
double average_ec(int n, double ss[3][5]) {
int i, x;
double sum = 0, average;
x = n - 1;
for (i = 0; i <= 4; i++) {
sum = sum + ss[x][i];
}
average = sum / 5;
return average;
}
与之前求个人平均分的代码不同,这串代码中的n表示的是某科的意思,n的范围是1~3,分别表示第一科,第二科和第三科。因为我们计算各科平均分时需要把所有的分数加起来,并且所求得的数据带有小数,所以(double sum = 0, average;)(int i),定义的这个i用来进行循环,把所有的分数都加起来。sum表示的是所有数据加起来的总和,average就是所要求的平均分。
(for (i = 0; i <= 4; i++) {
sum = sum + ss[x][i];
})
此段代码就是对每个学生的这一科成绩进行累加,因为我们在数组中的每一行表示的就是一科的成绩,每一列就表示某个学生的三科成绩,因此,i就代表了数组中某行的第i+1个元素,x就代表的是第x+1行。利用这段循环,我们就可以得到某一科的总分sum,最后再对sum除以5得到average,也就是这一科的平均分。最后在把此平均分返回到主函数中,我们的这个函数就达到了求各科平均分的作用。
接下来就到主函数的代码部分:
第一段代码:
for (y = 1; y <= 5; y++) {
p[y - 1] = average_ps(y, ss);
printf("学生%d:",y);
printf("%.2f ", p[y-1]);
}
我们在主函数中对所要使用的函数进行了申明,需要用到函数处理数据时,我们就可以直接调用需要用到的函数。
这段代码是分别对每一个学生求他们的平均分,所以我们需要定义一个数组(double p[5];),用来储存他们的平均分。y从1到5,进行五次循环,并且y也代表了学生1到学生5。(p[y - 1] = average_ps(y, ss);),因为数组中的排序是从0开始的,因此p[y-1]就表示第一个学生的平均分,再利用average_ps(y, ss)这个函数求得平均分的值,把它赋予等号左边数组中的元素,用来储存。接着:
printf("学生%d:",y);
printf("%.2f ", p[y-1]);
就是输出学生y的平均分是多少,格式是保留两位小数,数据后有一个空格把接下来的数据隔开。
在输出数据之后为了达到美观的效果,我们在每段输出之后用一个换行符隔开。
第二段代码
for ( x= 1; x <=3 ; x++) {
printf("科目%d平均分:",x);
printf("%.2f ", average_ec(x, ss));
}
此段代码是利用循环和average_ec函数求各科的平均分以及输出此平均分,x从1到3表示进行三次循环,同时也表示第1~3科目。
题目已经给出了求方差的公式
因此我们接下来就要求平均分的方差
第三段代码如下:
for (i = 0,pfqh=0,qh=0; i <= 4; i++) {
pfqh += p[i]*p[i];
qh += p[i];
d = pfqh / 5 - pow(qh / 5, 2);
printf("variance:%lf", d);
}
根据公式, 表示的是某个学生的平均分,我们在之前的p数组中正好储存了学生们的平均分,所以其中的元素可以用来表示 ,接着我们在主函数中(double pfqh,qh,d;),并赋予pfqh,和qh初值等于0 ,否则在进行循环求值是会出错。pfqh表示的是∑xi²,qh表示的是∑xi,d表示的是所求的平均方差。i的范围是0~4,进行五次循环,p[i]表示的是数组中第i+1个元素。
pfqh += p[i]*p[i];
qh += p[i];
这两行代码就是对数组中的元素进行累加,最后得到∑xi²和∑xi 。
d = pfqh / 5 - pow(qh / 5, 2);
这段代码表示的就是题目中给的公式,pow() 函数用来求∑xi /5的 2 次幂(次方)。
最后,printf("variance=%lf", d); 输出平均方差。
运行结果如下:
#include#include int main(){ double ss[3][5]; int i,x, y, z; double average_ps(int n, double ss[3][5]); double average_ec(int n, double ss[3][5]); double p[5],pfqh,qh,d; for(z = 0; z <= 4; z++) { printf("请分别输入学生%d的3科成绩:", z + 1); scanf_s("%lf %lf %lf", &ss[0][z], &ss[1][z],&ss[2][z]); } //分别录入5个学生的3门成绩 for (y = 1; y <= 5; y++) { p[y - 1] = average_ps(y, ss); printf("学生%d:",y); printf("%.2f ", p[y-1]); } //输出每个学生的平均分 printf("n"); for ( x= 1; x <=3 ; x++) { printf("科目%d平均分:",x); printf("%.2f ", average_ec(x, ss)); } //输出每科成绩的平均分 printf("n"); for (i = 0,pfqh=0,qh=0; i <= 4; i++) { pfqh += p[i]*p[i]; qh += p[i]; } d = pfqh / 5 - pow(qh / 5, 2); //计算平均分方差 printf("variance=%lf", d); return 0; } double average_ps(int n, double ss[3][5]) { int x; double sum; x = n - 1; sum = (ss[0][x] + ss[1][x] + ss[2][x]) / 3; return sum; } //求每个学生的平均分 double average_ec(int n, double ss[3][5]) { int i, x; double sum = 0, average; x = n - 1; for (i = 0; i <= 4; i++) { sum = sum + ss[x][i]; } average = sum / 5; return average; } //计算各科成绩的平均值



