首先,定义学生成绩结构体类型,其中成员包括学号、姓名、性别、数学成绩、英语成绩、C语言成绩和总成绩,并且定义结构体数组,然后,利用文件的读写操作知识,编写函数实现从文件中逐条读取学生成绩信息功能和保存所有学生成绩信息到文件的功能,最后,编写函数实现显示学生全部信息功能、修改某位同学成绩信息功能、删除某位同学成绩信息功能、查询某位同学成绩信息功能和按照总成绩排序的功能。
时间: 2024-03-01 18:49:56 浏览: 83
好的,根据您的要求,我给您提供一个示例代码,供您参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 100
#define MAX_NAME_LEN 20
// 学生成绩结构体类型
typedef struct {
int id; // 学号
char name[MAX_NAME_LEN]; // 姓名
char gender; // 性别
int math_score; // 数学成绩
int eng_score; // 英语成绩
int c_score; // C语言成绩
int total_score;// 总成绩
} Student;
// 学生数组
Student students[MAX_STUDENTS];
int num_students = 0;
// 从文件中逐条读取学生成绩信息
void load_students(const char* filename) {
FILE* fp = fopen(filename, "r");
if (fp == NULL) {
printf("Error opening file %s\n", filename);
return;
}
while (!feof(fp)) {
Student s;
int ret = fscanf(fp, "%d %s %c %d %d %d %d",
&s.id, s.name, &s.gender,
&s.math_score, &s.eng_score, &s.c_score,
&s.total_score);
if (ret != 7) continue; // 如果读取失败,则跳过这条记录
students[num_students++] = s;
}
fclose(fp);
}
// 保存所有学生成绩信息到文件
void save_students(const char* filename) {
FILE* fp = fopen(filename, "w");
if (fp == NULL) {
printf("Error opening file %s\n", filename);
return;
}
for (int i = 0; i < num_students; i++) {
Student s = students[i];
fprintf(fp, "%d %s %c %d %d %d %d\n",
s.id, s.name, s.gender,
s.math_score, s.eng_score, s.c_score,
s.total_score);
}
fclose(fp);
}
// 显示学生全部信息
void show_all_students() {
printf("ID\tName\tGender\tMath\tEnglish\tC\tTotal\n");
for (int i = 0; i < num_students; i++) {
Student s = students[i];
printf("%d\t%s\t%c\t%d\t%d\t%d\t%d\n",
s.id, s.name, s.gender,
s.math_score, s.eng_score, s.c_score,
s.total_score);
}
}
// 修改某位同学成绩信息
void modify_student_score(int id, int math_score, int eng_score, int c_score) {
for (int i = 0; i < num_students; i++) {
if (students[i].id == id) {
students[i].math_score = math_score;
students[i].eng_score = eng_score;
students[i].c_score = c_score;
students[i].total_score = math_score + eng_score + c_score;
return;
}
}
printf("Student with ID=%d not found\n", id);
}
// 删除某位同学成绩信息
void delete_student(int id) {
for (int i = 0; i < num_students; i++) {
if (students[i].id == id) {
// 将后面的元素向前移动
memmove(&students[i], &students[i+1], sizeof(Student) * (num_students - i - 1));
num_students--;
return;
}
}
printf("Student with ID=%d not found\n", id);
}
// 查询某位同学成绩信息
void query_student(int id) {
for (int i = 0; i < num_students; i++) {
if (students[i].id == id) {
Student s = students[i];
printf("ID\tName\tGender\tMath\tEnglish\tC\tTotal\n");
printf("%d\t%s\t%c\t%d\t%d\t%d\t%d\n",
s.id, s.name, s.gender,
s.math_score, s.eng_score, s.c_score,
s.total_score);
return;
}
}
printf("Student with ID=%d not found\n", id);
}
// 按照总成绩排序
int compare_students_by_total_score(const void* s1, const void* s2) {
Student* st1 = (Student*)s1;
Student* st2 = (Student*)s2;
return st2->total_score - st1->total_score;
}
void sort_students_by_total_score() {
qsort(students, num_students, sizeof(Student), compare_students_by_total_score);
}
int main() {
// 加载学生信息
load_students("students.txt");
// 显示学生信息
show_all_students();
// 修改学生成绩
modify_student_score(1001, 90, 80, 70);
// 删除学生记录
delete_student(1003);
// 查询学生记录
query_student(1002);
// 按照总成绩排序
sort_students_by_total_score();
show_all_students();
// 保存学生信息
save_students("students.txt");
return 0;
}
```
注释说明:
- `Student` 结构体类型定义了学生成绩的各个字段。
- `students` 数组用于存储所有学生信息。
- `num_students` 记录了当前学生数量。
- `load_students` 函数从文件中读取学生信息,逐条解析文件中的每一行数据,生成一个学生对象,存储到 `students` 数组中。
- `save_students` 函数将所有学生信息保存到文件中。
- `show_all_students` 函数用于显示所有学生的信息。
- `modify_student_score` 函数用于修改某个学生的成绩信息。
- `delete_student` 函数用于删除某个学生的成绩信息。
- `query_student` 函数用于查询某个学生的成绩信息。
- `compare_students_by_total_score` 函数用于按照总成绩排序。
- `sort_students_by_total_score` 函数用于对学生按照总成绩排序。
- `main` 函数是程序的入口,先加载学生信息,然后展示学生信息,接着修改、删除、查询学生信息,最后按照总成绩排序,显示所有学生信息,最后保存学生信息到文件中。
阅读全文