C语言程序设计第七章课后习题第14题解题过程(附有完整注释)

题目:14.输入10个学生5门课的成绩,分别用函数实现下列功能:
1.计算每个学生的平均分;
2.计算每门课的平均分;
3.找出所有个分数中最高的分数所对应的学生和课程;
4.计算平均分方差;

//14.输入10个学生5门课的成绩,分别用函数实现下列功能:
//1.计算每个学生的平均分;
//2.计算每门课的平均分;
//3.找出所有个分数中最高的分数所对应的学生和课程;
//4.计算平均分方差;
#include <stdio.h>
#include <math.h>//因为我调用了pow函数,就要声明它的头文件!
int main()
{//下面四行是对我所定义的函数的一个声明!
    double average_stu(int arr[][10], int n);
    double average_clo(int arr[][10], int n);
    void findgrade_max(int arr[][10], char arr1[][100]);//声明时是要写清楚有多少列的!
    double average_s(int arr[][10]);//列的话可以写大一点,如果自己使用不到这么多的话,就可以自己在后面再传一个参数进去即可!
    char arr1[10][100] = {};
    int arr2[10][10] = { 0 };
    int i = 0;
    int j = 0;
    for (i = 0; i < 10; i++)
    {
        printf("请输入第%d个人的名字:\n", i + 1);
        gets_s(arr1[i]);//注意运用gets函数时以enter键结束输入!
        //运用gets函数的时候将其所输入的一个字符串放进二维数组的每一行,每一行最多有多少个字符,自己要设定!
        //我所设定的就是100,但是可能太多了!
        printf("请输入这个人的五科成绩:\n");
        for (j = 0; j < 5; j++)
        {
            scanf_s("%d", &arr2[i][j]);//将每一个成绩放进一个10*10的数组中,其实数组大一点无所谓,刚刚好也行!
            //(void)getchar;//这里加一个getchar是没有用的!
        }
        //getchar是写在for循环里面的,记住!
        //相当于只有最后一个svanf函数才留下了一个斜杠0在最后,所以你要加一个getchar去吃掉它!
        (void)getchar();//注意使用getchar函数吃掉一个回车符,后面是要有一个小括号的!
    }//我当时没有加小括号,导致怎么也不对!后面发现自己没有加小括号,笑死!一定要注意!
    int f = 0;
    for (f = 0; f < 10; f++)
    {
        printf("第%d个学生的平均分是%lf\n", f + 1, average_stu(arr2, f));
    }//利用for循环加上自定义的函数来求每一个学生的平均成绩!
    int g = 0;
    for (g = 0; g < 5; g++)
    {
        printf("第%d门课的平均分是%lf\n", g + 1, average_clo(arr2, g));
    }//利用for循环和自定义的函数来求每一门课的平均成绩!
    findgrade_max(arr2, arr1);
    printf("最后的平均分方差是%lf\n", average_s(arr2));
    return 0;
}
//下面这个函数是进行计算每个学生的平均分
double average_stu(int arr[][10], int n)
{
    int y = 0;
    double sum = 0;
    for (y = 0; y < 5; y++)
    {
        sum += arr[n][y];
    }//n代表的是行,y代表的是列!当我给n赋值时,他就可以求出每一个学生的平均成绩!
    return (sum / 5);
}
//下面这个函数是计算每门课的平均分
double average_clo(int arr[][10], int n)//这里就是在自定义函数后面加一个参数,从而实现特殊的作用!
{
    int h = 0;
    double sum1 = 0;
    for (h = 0; h < 10; h++)
    {
        sum1 += arr[h][n];//这个函数是用来求具体每一门课的平均成绩!
    }//h代表的是行,n代表的是列,当我给n赋值时,他就可以求每一门课的平均成绩!
    return (sum1 / 10);//
}
//下面这个函数是找出最高的分数以及它所对应的学生和课程
void findgrade_max(int arr[][10], char arr1[][100])
{
    int t, h;
    int max = arr[0][0];
    int a, b;
    for (a = 0; a < 10; a++)
    {
        for (b = 0; b < 5; b++)
        {
            if (arr[a][b] > max)
            {
                max = arr[a][b];//这里使用break语句只能跳出最靠近的一层循环!
                t = a;//并不能跳出所有循环!
                h = b;//这里我也想使用goto语句但是不可以,我也不知道为什么不可以!
            }
        }
    }
    printf("这50个成绩中最高分是%d,所对应的学生是%s,分数所对应的课程是第%d门课程\n", max, arr1[t], h + 1);
}//这里是打印max哦!不是打印arr[t][h]哦,因为你已经把它的值赋给max了,所以是打印max的值!
//下面这个函数是要来计算平均分的方差
double average_s(int arr[][10])//这里定义函数时,如果包含二维数组的话,二维数组的有多少列可以讲清楚,
{//有多少行是可以不讲的,其实有多少列也可以不讲的,也可以在定义函数后面加一个参数即可,然后将这个参数使用到函数里面就行了!
    double sum = 0;//这样就可以实现就算不定义数组的大小,也可以实现数组的精确使用!从而达到我所想要的目的!
    double sum1 = 0;
    int j, z;
    for (j = 0; j < 10; j++)
    {
        for (z = 0; z < 5; z++)
        {
            sum += pow(arr[j][z], 2);//这里将公式的一个核心部分存储到sum当中去即可!
            sum1 += arr[j][z];//这里将公式的另一个核心部分存储到sum1当中去就行了!
        }
    }
    return ((sum / 50) - pow(sum1 / 50, 2));//这里直接是用公式进行返回值就行!
}

 总结:在使用完scanf之后,要想在使用gets函数输入字符串的话,就必须在它后面加一个getchar去吃掉它!由于getchar是去吃掉那个回车键的,所以不需要返回值,所以在使用时,就可以写成

void getchar();这种类型即可,千万要注意getchar后面有一个小括号,别忘记!

最后,看完了之后,一定要自己去尝试着打一下代码哦!看懂并不意味这可以自己独立地打出来!

还有,最后一定要开开心心地哦,把今天的伤心事忘记吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值