谭浩强C语言程序设计第五版课后习题详细讲解-第8章习题-15

正文开始

题目描述:

请添加图片描述

解题思想:

4个学生5门课程:其实就是一个4x5的矩阵,每一行代表一个学生的5门成绩,float arr[4][5]就可以表示这个矩阵。

第1小题

1. 求第1门课程的平均分:其实就是每个学生的第0门(通过下标进行访问)成绩总和除以4

(arr[0][0]+arr[1][0]+arr[2][0]+arr[3][0])/4 //结果要求为float类型(双精度浮点数),例如:85.5

第2小题

2. 2门课程不及格的同学,输出学号以及全部成绩,以及平均成绩

  1. 遍历每个学生的每门成绩,统计小于60分的课程数量,大于2则符合要求

  2. 输出学号(第n行的下标)

  3. 输出所有成绩(编写一个成绩输出函数)

  4. 输出平均成绩(编写一个计算平均成绩的函数,传递一行数据(子数组的地址)),进行总和相加除以5,保留两位小数

第3小题

3. 平均成绩90分以上,或者全部成绩在85分以上,输出优秀学生学号

  1. 遍历每个学生的成绩的同时,计算学生的平均成绩,计算成绩在85分以上的课程数量,平均成绩>90 ||(或) course_count ==5(假设每门课程成绩>85分)

代码呈现:

#include <stdio.h>

// 函数用于统计指定课程的成绩平均值
// 参数: 
//   arr - 学生成绩二维数组的指针
//   row - 行数(学生数量)
//   col - 列数(课程数量)
//   course_id - 需要计算平均分的课程编号
// 返回值:
//   指定课程的平均成绩
float course_avg(float (*arr)[5], int row, int col, int course_id)
{
    float sum = 0;
    // 遍历所有学生在指定课程的成绩并累加
    for (int i = 0; i < row; i++)
    {
        sum += *(*(arr + i) + course_id); // arr[i][course_id]
    }
    // 计算平均分并返回
    return (sum / row);
}

// 函数用于计算给定数组的平均值
// 参数:
//   score - 成绩数组的指针
//   sz - 数组元素个数
// 返回值:
//   数组元素的平均值
float stu_avg(float *score, int sz)
{
    float sum = 0;
    // 遍历数组累加所有成绩
    for (int i = 0; i < sz; i++)
    {
        sum += *(score + i); // 相当于 score[i]
    }
    // 计算平均值并返回
    return (sum / sz);
}

// 函数用于打印学生的所有成绩
// 参数:
//   score - 指向学生单行成绩数组的指针
//   sz - 该学生成绩的数量(本例中为5,代表5门课程)
void print_stu_score(float *score, int sz)
{
    printf("此学生的所有成绩如下:");
    // 打印每个成绩,保留两位小数
    for (int i = 0; i < sz; i++)
    {
        printf("%.2f ", *(score + i)); // 相当于 score[i]
    }
    printf("\n");
}

// 函数用于输出不及格学生的信息
// 参数:
//   arr - 学生成绩二维数组的指针
//   row - 学生数量
//   col - 课程数量
void fail(float (*arr)[5], int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        int fail_count = 0;
        // 统计不及格课程数量
        for (int j = 0; j < col; j++)
        {
            if (*(*(arr + i) + j) < 60)
            {
                fail_count++;
            }
        }
        // 如果不及格课程超过2门,则打印该学生信息
        if (fail_count > 2)
        {
            printf("%d 号学生,有两门以上课程不及格\n", i);
            printf("这个学生的平均成绩是:%f\n", stu_avg(*(arr + i), col)); // 计算并打印该生平均成绩
            print_stu_score(*(arr + i), col); // 打印该生所有成绩
        }
    }
}

// 函数用于输出优秀学生的信息
// 参数:
//   arr - 学生成绩二维数组的指针
//   row - 学生数量
//   col - 课程数量
void excellent(float (*arr)[5], int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        int course_count = 0;
        float num = 0;
        // 统计90分以上课程数量及总成绩
        for (int j = 0; j < col; j++)
        {
            if (*(*(arr + i) + j) > 85)
            {
                course_count++;
            }
            num += arr[i][j]; // 累加成绩
        }
        // 如果所有课程均高于90分或至少一门课程高于85分,认为是优秀学生
        if (num / col > 90 || course_count == col)
        {
            printf("%d 号学生,真是好学生!\n", i);
            print_stu_score(*(arr + i), col); // 打印该生所有成绩
        }
    }
}

int main() 
{
    // 初始化一个4x5的学生成绩数组
    float score[4][5] = {
        {32, 48, 58, 36, 75},
        {98, 70, 99, 100, 90},
        {87, 88, 89, 86, 87},
        {68, 98, 75, 78, 82},
    };
    // 计算并输出第1门课程的平均分
    float cour_avg_score = course_avg(score, 4, 5, 0);
    printf("第1门课程的平均分:%.2f\n", cour_avg_score);
    // 输出不及格学生的信息
    fail(score, 4, 5);
    // 输出优秀学生的信息
    excellent(score, 4, 5);
    return 0;
}

运行结果如下:

请添加图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值