一.题目
输入10个学生5门课的成绩,分别用函数实现下列功能:
①计算每个学生的平均分;
②计算每门课的平均分;
③找出所有50个分数中最高的分数所对应的学生和课程;
④计算平均分方差,其中,x(i)为某一学生的平均分,以下是方差公式:
二.代码
以下是我的解题方法,可能不是最优的方法,推荐看C程序设计习题集.
//笔记:
//1.下面用到了很多for循环,1.其i最初值最好是相同的,2.最好都是由前至后/或由后至前处理数组,以免混淆.
//2.最后显示到屏幕上的值再进行数值处理,都只记相应的数组位置. 比如要显示a[0]是第几位(a[0]是第1个数,所以应该打印1)之前,记录该数的都是i=0,直到打印位数时,用i+1打印位数,以免中间一会儿+1一会儿-1的混淆.
//3.除法的分子分母注意不能都是整形,不然得到的数据会被取整,导致计算结果错误.
//4.打印用的类型符不要写错了,不然会打印出错误的数据.
//5.存储运算结果的变量必须是double或者float类型的,不能是int型,不然数据精度会由误差.
#include <stdio.h>
//extern int studentHighest,gradeHighest;//若用主函数输出需要该声明
void print_averageOfStudents(int all[10][5],int studentNum,int gradeNum);
float averageOfOneStudent(int all[10][5],int gradeNum,int studentId);
void print_averageOfGrades(int all[10][5],int studentNum,int gradeNum);
float averageOfOneGrade(int all[10][5],int studentNum,int gradeId);
void highestOfgrade(int all[10][5],int studentNum,int gradeNum);
void differenceOfTwoSquares(int all[10][5],int n,int gradeNum);
int main()
{
int i,j,studentNum=10,gradeNum=5;
int all[10][5];
for(i=0;i<studentNum;i++)
{
printf("The %d student:\n",i+1);
for(j=0;j<gradeNum;j++)
{
//printf("grade %d=",j+1);
//scanf("%d",&all[i][j]);
all[i][j]=i; // 输入50个太麻烦了,所以就用行暂用数据吧
//printf("\n");
}
}
print_averageOfStudents(all,studentNum,gradeNum);
print_averageOfGrades(all,studentNum,gradeNum);
highestOfgrade(all,studentNum,gradeNum);
differenceOfTwoSquares(all,studentNum,gradeNum);//x学生的平均成绩,n学生个数
return 0;
}
//每个学生的平均分
void print_averageOfStudents(int all[10][5],int studentNum,int gradeNum)
{
int i;
for(i=0;i<studentNum;i++)
{
printf("The NO.%d student of average is %4.1f.\n",i+1,averageOfOneStudent(all,gradeNum,i));
}
}
float averageOfOneStudent(int all[10][5],int gradeNum,int studentId)//最好像这样求每一个学生的平均分作为一个单独的函数,因为下面differenceOfTwoSquares要用一个个的学生的平均分
{
int i;
double sum=0;
for(i=0;i<gradeNum;i++)
sum+=all[studentId][i];
return sum/gradeNum;
}
//每门课平均分
void print_averageOfGrades(int all[10][5],int studentNum,int gradeNum)
{
int i;
for(i=0;i<gradeNum;i++)
{
printf("The NO.%d grade of average is %4.1f.\n",i+1,averageOfOneGrade(all,studentNum,i));
}
}
float averageOfOneGrade(int all[10][5],int studentNum,int gradeId)
{
int i;
double sum=0;
for(i=0;i<studentNum;i++)
sum+=all[i][gradeId];
return sum/studentNum;
}
//所有50个分数中的最高分
//int studentHighest,gradeHighest; //若用主函数输出该变量,则需要共有变量,但是再次定义声明作用域是由此以下,main里使用需要用extern扩展声明
void highestOfgrade(int all[10][5],int studentNum,int gradeNum)
{
int studentHighest,gradeHighest;
studentHighest=0;
gradeHighest=all[0][0];
int i,j;
for(i=0;i<studentNum;i++)
for(j=0;j<gradeNum;j++)
if(gradeHighest<all[i][j])
{
studentHighest=i;
gradeHighest=j;
}
printf("The Highest grade is %d of the NO.%d student's NO.%d grade.\n",all[studentHighest][gradeHighest],studentHighest+1,gradeHighest+1);
}
//每个学生平均分的方差
void differenceOfTwoSquares(int all[10][5],int n,int gradeNum)//n学生个数
{
double sum=0,sum_twosquar=0,differ;
int i;
for(i=0;i<n;i++)
{
double t=averageOfOneStudent(all,gradeNum,i);
sum+=t;
sum_twosquar+=t*t;
}
printf("sum = %6.2f.\nsum_twosquar = %6.2f.\n",sum,sum_twosquar);
sum=sum/n;
differ=(1.0/n)*sum_twosquar-sum*sum; //必须写浮点数1.0不能写整数1,因为除法的分子分母都是整形,得到的结果会被取整.
printf("The average of student 's difference of two squares is %6.2f.\n",differ);
}