结构体编写程序:从键盘输入n个学生的6门课程考试成绩,计算每个学生的平均成 绩,并按平均成绩从高到低输出每个学生的信息(包括学号、姓名和6门成绩)。
时间: 2023-12-10 10:38:26 浏览: 61
以下是一个可能的解决方案,使用了结构体和动态内存分配:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct {
char id[20]; // 学号
char name[20]; // 姓名
float scores[6]; // 6门成绩
float avg_score; // 平均成绩
} Student;
int main() {
int n; // 学生个数
printf("请输入学生个数:");
scanf("%d", &n);
// 动态分配内存存储学生数组
Student *students = (Student*)malloc(n * sizeof(Student));
// 输入每个学生的信息
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的学号、姓名和6门成绩(用空格分隔):", i+1);
scanf("%s %s", students[i].id, students[i].name);
for (int j = 0; j < 6; j++) {
scanf("%f", &students[i].scores[j]);
}
// 计算平均成绩
float sum = 0;
for (int j = 0; j < 6; j++) {
sum += students[i].scores[j];
}
students[i].avg_score = sum / 6.0;
}
// 按平均成绩从高到低排序
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (students[j].avg_score < students[j+1].avg_score) {
// 交换两个学生的信息
Student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
// 输出每个学生的信息
for (int i = 0; i < n; i++) {
printf("%s %s ", students[i].id, students[i].name);
for (int j = 0; j < 6; j++) {
printf("%.2f ", students[i].scores[j]);
}
printf("%.2f\n", students[i].avg_score);
}
// 释放动态分配的内存
free(students);
return 0;
}
```
注意,上述代码中使用了 `scanf("%s %s", students[i].id, students[i].name)` 来输入学号和姓名,这里假设学号和姓名中不包含空格。如果学号和姓名中可能包含空格,可以使用 `fgets()` 函数来输入字符串。此外,由于涉及动态内存分配,需要在程序结束前使用 `free()` 函数释放分配的内存。