C程序设计,习题7.14笔记

一.题目

输入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);
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值