C语言程序设计课后习题解析大总结

正文开始

题目描述:

alt text

解题思想:

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;
}

运行结果如下:

alt text