第8章习题-15

正文开始

题目描述:

alt text

解题思想:

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

第1小题

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

1
(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分)

代码呈现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#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