使用c语言,用到typedef,设计一个简单的学生成绩管理系统。设有学生成绩文件student.txt,每位学生成绩信息包含学号(num)、姓名(name)、性别(sex)、出生日期(birthday,包括年、月、日,分别表示为year,month,day)、3门功课的成绩(高数、C语言、大学物理)、总分和平均分。设计程序,要求从文件student.txt中读出学生成绩表,之后参对成绩表进行如下操作 (4)排序。分为两个方面,按学号递增排序和按总分递减排序。
时间: 2023-07-10 08:23:31 浏览: 99
好的,根据你的要求,我设计了以下代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100 // 最大学生数
#define MAX_NAME_LEN 20 // 姓名最大长度
typedef struct {
int num; // 学号
char name[MAX_NAME_LEN]; // 姓名
char sex; // 性别
int year, month, day; // 出生日期
int score[3]; // 3门功课成绩
int total_score; // 总分
float average_score; // 平均分
} Student;
Student students[MAX_STUDENT_NUM]; // 学生数组
int student_num = 0; // 学生数量
// 按学号递增排序
void sort_by_num() {
int i, j;
for (i = 0; i < student_num - 1; i++) {
for (j = 0; j < student_num - 1 - i; j++) {
if (students[j].num > students[j + 1].num) {
// 交换两个学生的位置
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
// 按总分递减排序
void sort_by_total_score() {
int i, j;
for (i = 0; i < student_num - 1; i++) {
for (j = 0; j < student_num - 1 - i; j++) {
if (students[j].total_score < students[j + 1].total_score) {
// 交换两个学生的位置
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
int main() {
FILE *fp;
char filename[] = "student.txt";
fp = fopen(filename, "r");
if (fp == NULL) {
printf("Cannot open file %s.\n", filename);
return 0;
}
// 读入学生信息
while (!feof(fp)) {
Student student;
fscanf(fp, "%d%s %c %d-%d-%d %d %d %d", &student.num, student.name, &student.sex, &student.year, &student.month, &student.day, &student.score[0], &student.score[1], &student.score[2]);
student.total_score = student.score[0] + student.score[1] + student.score[2];
student.average_score = (float)student.total_score / 3;
students[student_num++] = student;
}
// 按学号递增排序
sort_by_num();
// 输出排序结果
printf("按学号递增排序结果:\n");
printf("学号\t姓名\t性别\t出生日期\t高数\tC语言\t大学物理\t总分\t平均分\n");
int i;
for (i = 0; i < student_num; i++) {
Student student = students[i];
printf("%d\t%s\t%c\t%d-%d-%d\t%d\t%d\t%d\t%d\t%.2f\n", student.num, student.name, student.sex, student.year, student.month, student.day, student.score[0], student.score[1], student.score[2], student.total_score, student.average_score);
}
// 按总分递减排序
sort_by_total_score();
// 输出排序结果
printf("\n按总分递减排序结果:\n");
printf("学号\t姓名\t性别\t出生日期\t高数\tC语言\t大学物理\t总分\t平均分\n");
for (i = 0; i < student_num; i++) {
Student student = students[i];
printf("%d\t%s\t%c\t%d-%d-%d\t%d\t%d\t%d\t%d\t%.2f\n", student.num, student.name, student.sex, student.year, student.month, student.day, student.score[0], student.score[1], student.score[2], student.total_score, student.average_score);
}
fclose(fp);
return 0;
}
```
这段代码中,我们首先定义了一个 `Student` 结构体,表示学生信息。其中 `name` 字段使用了字符数组,而不是指针,这样更方便操作。
然后,我们定义了一个 `students` 数组,用来存储所有学生的信息。同时,我们使用了 `student_num` 变量记录学生数量,这样就可以在读入文件时动态添加学生信息。
接下来,我们定义了两个排序函数,分别按学号递增排序和按总分递减排序。这里使用了冒泡排序算法,不过实际上可以使用更高效的排序算法。
最后,在 `main` 函数中,我们首先读入学生信息,并按学号递增排序输出。然后,我们按总分递减排序再次输出。注意,我们在每个学生结构体中新增了 `total_score` 和 `average_score` 字段,表示总分和平均分,这些字段在读入学生信息时计算得出。
希望这个代码对你有所帮助!
阅读全文