用结构体存放学生的若干信息,包括学号、姓名和3门课程的分数,从键盘输入数据,输出每门课程的总平均分,以及最高分的学生的完整数据
时间: 2024-02-12 17:03:48 浏览: 84
好的,这是一个关于结构体和数组的问题。以下是一个示例代码,用于实现您的要求:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 20 // 定义最大字符串长度
#define NUM_STUDENTS 5 // 定义学生数量
#define NUM_COURSES 3 // 定义课程数量
// 定义学生结构体
struct student {
int id;
char name[MAX_LEN];
float scores[NUM_COURSES];
};
int main() {
struct student students[NUM_STUDENTS]; // 定义学生数组
// 从键盘输入每个学生的信息
for (int i = 0; i < NUM_STUDENTS; i++) {
printf("请输入第 %d 个学生的学号:", i + 1);
scanf("%d", &students[i].id);
printf("请输入第 %d 个学生的姓名:", i + 1);
scanf("%s", students[i].name);
for (int j = 0; j < NUM_COURSES; j++) {
printf("请输入第 %d 个学生的第 %d 门课的分数:", i + 1, j + 1);
scanf("%f", &students[i].scores[j]);
}
}
// 计算每门课程的平均分
float averages[NUM_COURSES] = {0};
for (int i = 0; i < NUM_STUDENTS; i++) {
for (int j = 0; j < NUM_COURSES; j++) {
averages[j] += students[i].scores[j];
}
}
for (int i = 0; i < NUM_COURSES; i++) {
averages[i] /= NUM_STUDENTS;
printf("第 %d 门课的平均分为:%.2f\n", i + 1, averages[i]);
}
// 找出最高分的学生的完整数据
int max_index = 0;
float max_score = 0;
for (int i = 0; i < NUM_STUDENTS; i++) {
float sum = 0;
for (int j = 0; j < NUM_COURSES; j++) {
sum += students[i].scores[j];
}
if (sum > max_score) {
max_score = sum;
max_index = i;
}
}
printf("最高分的学生信息如下:\n");
printf("学号:%d 姓名:%s\n", students[max_index].id, students[max_index].name);
printf("三门课的分数:%.2f %.2f %.2f\n", students[max_index].scores[0], students[max_index].scores[1], students[max_index].scores[2]);
return 0;
}
```
这段代码首先定义了一个学生结构体,包括学号、姓名和三门课程的分数。然后定义了一个学生数组,用于存储多个学生的信息。
接下来,通过循环从键盘输入每个学生的信息。在输入过程中,使用了格式化输入函数 `scanf`,可以读取用户输入的数据,并存储到相应的结构体字段中。
然后,计算每门课程的平均分。使用了两个嵌套的循环,分别遍历每个学生和每门课程,并累加每门课程的总分数。最后除以学生数量,得到每门课程的平均分,并输出。
最后,找出最高分的学生的完整数据。使用了两个循环,分别遍历每个学生和每门课程,并计算每个学生的总分数。在计算总分数时,使用了一个 `sum` 变量,用于累加每门课程的分数。如果某个学生的总分数大于之前记录的最高分数,则更新最高分数和最高分数对应的学生下标。最后输出最高分数对应的学生的信息。
以上就是一个简单的实现。注意,这里为了方便起见,使用了一些硬编码的常量,比如学生数量和课程数量。在实际应用中,这些常量应该根据具体情况进行调整。
阅读全文