使用c语言,用到typedef,设计一个简单的学生成绩管理系统。设有学生成绩文件student.txt,每位学生成绩信息包含学号(num)、姓名(name)、性别(sex)、出生日期(birthday,包括年、月、日,分别表示为year,month,day)、3门功课的成绩(高数、C语言、大学物理)、总分和平均分。设计程序,要求从文件student.txt中读出学生成绩表,之后参对成绩表进行如下操作 (11)排序。分为两个方面,按学号递增排序和按总分递减排序。
时间: 2023-07-10 15:20:17 浏览: 155
好的,让我们来一步一步实现这个学生成绩管理系统。
首先,我们需要定义一个结构体来存储每个学生的信息,包括学号、姓名、性别、出生日期和成绩等信息。我们可以使用 typedef 来定义一个新的类型名,方便我们日后的使用。
```c
typedef struct {
int num; // 学号
char name[20]; // 姓名
char sex[5]; // 性别
int year, month, day; // 出生日期
float math, c_language, physics; // 3门功课成绩
float total_score, average_score; // 总分和平均分
} Student;
```
接下来,我们需要读取文件中的学生成绩信息,并将其存储到一个数组中。可以使用 fopen 函数打开文件,使用 fscanf 函数逐行读取学生信息。读取完毕后,我们需要实现两个排序函数,一个按学号递增排序,另一个按总分递减排序。
```c
#define MAX_STUDENT_NUM 100 // 最大学生数量
int read_student_info(Student students[]) {
FILE *fp;
int i = 0;
fp = fopen("student.txt", "r");
if (fp == NULL) {
printf("File not found!\n");
return 0;
}
while (fscanf(fp, "%d %s %s %d/%d/%d %f %f %f", &students[i].num, students[i].name, students[i].sex, &students[i].year, &students[i].month, &students[i].day, &students[i].math, &students[i].c_language, &students[i].physics) != EOF) {
students[i].total_score = students[i].math + students[i].c_language + students[i].physics;
students[i].average_score = students[i].total_score / 3;
i++;
if (i >= MAX_STUDENT_NUM) {
printf("Too many students!\n");
break;
}
}
fclose(fp);
return i;
}
void sort_by_num(Student students[], int n) {
int i, j;
Student temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (students[j].num > students[j+1].num) {
temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
}
void sort_by_total_score(Student students[], int n) {
int i, j;
Student temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (students[j].total_score < students[j+1].total_score) {
temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
}
```
最后,我们在主函数中调用上述函数,并将排序后的结果打印出来,即可实现该程序的功能。
```c
int main() {
Student students[MAX_STUDENT_NUM];
int n = read_student_info(students);
sort_by_num(students, n);
printf("Sort by num:\n");
show_all_students(students, n);
sort_by_total_score(students, n);
printf("Sort by total score:\n");
show_all_students(students, n);
return 0;
}
```
需要注意的是,本程序对于文件格式有要求,每行学生成绩信息需按照以下顺序排列:学号、姓名、性别、出生日期(年、月、日,用斜杠分隔)、高数成绩、C语言成绩、大学物理成绩。如果文件格式不符合要求,程序可能出现错误。
阅读全文