高校的学生成绩管理系统功能基本包括导入学生成绩记录、保存所有学生记录、读取所有学生记录、按总成绩递减输出、按学号查询成绩、修改学生成绩记录、删除学生成绩记录和退出操作,主界面如图10-1所示。实例实现过程中最重要的就是文件的读取和保存操作, 首先,通过读取文件的方式导入学生成绩,定义学生成绩结构体类型,其中成员包括学号、姓名、性别、数学成绩、英语成绩、C语言成绩和总成绩,并且定义结构体数组,然后,利用文件的读写操作知识,编写函数实现从文件中逐条读取学生成绩信息功能和保存所有学生成绩信息到文件的功能,最后,编写函数实现显示学生全部信息功能、修改某位同学成绩信息功能、删除某位同学成绩信息功能、查询某位同学成绩信息功能和按照总成绩排序的功能
时间: 2023-07-10 14:05:36 浏览: 89
C语言学生成绩管理保存文件版
5星 · 资源好评率100%
这是一个比较完整的学生成绩管理系统,需要涉及到文件操作、结构体、排序等知识点。下面是一个简单的实现示例,供参考:
```c
#include <stdio.h>
#include <string.h>
#define MAX_STUDENT_NUM 100 // 最多学生人数
struct Student {
char id[20]; // 学号
char name[20]; // 姓名
char sex[10]; // 性别
int math; // 数学成绩
int english; // 英语成绩
int c; // C语言成绩
int total; // 总成绩
};
struct Student students[MAX_STUDENT_NUM]; // 学生信息数组
int student_num = 0; // 学生数量
// 导入学生成绩记录
void import_students(const char *filename) {
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("Failed to open file %s\n", filename);
return;
}
while (!feof(fp) && student_num < MAX_STUDENT_NUM) {
struct Student *p = &students[student_num];
fscanf(fp, "%s %s %s %d %d %d", p->id, p->name, p->sex, &p->math, &p->english, &p->c);
p->total = p->math + p->english + p->c;
student_num++;
}
fclose(fp);
}
// 保存所有学生记录到文件
void save_students(const char *filename) {
FILE *fp = fopen(filename, "w");
if (fp == NULL) {
printf("Failed to open file %s\n", filename);
return;
}
for (int i = 0; i < student_num; i++) {
struct Student *p = &students[i];
fprintf(fp, "%s %s %s %d %d %d\n", p->id, p->name, p->sex, p->math, p->english, p->c);
}
fclose(fp);
}
// 按总成绩递减输出
void sort_by_total() {
for (int i = 0; i < student_num - 1; i++) {
for (int j = i + 1; j < student_num; j++) {
if (students[i].total < students[j].total) {
struct Student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
printf("按总成绩递减排序结果:\n");
for (int i = 0; i < student_num; i++) {
struct Student *p = &students[i];
printf("%s %s %s %d %d %d %d\n", p->id, p->name, p->sex, p->math, p->english, p->c, p->total);
}
}
// 按学号查询成绩
void search_by_id(const char *id) {
for (int i = 0; i < student_num; i++) {
struct Student *p = &students[i];
if (strcmp(p->id, id) == 0) {
printf("查询结果:\n%s %s %s %d %d %d %d\n", p->id, p->name, p->sex, p->math, p->english, p->c, p->total);
return;
}
}
printf("未找到学号为%s的学生记录\n", id);
}
// 修改学生成绩记录
void modify_student(const char *id) {
for (int i = 0; i < student_num; i++) {
struct Student *p = &students[i];
if (strcmp(p->id, id) == 0) {
printf("修改前信息:\n%s %s %s %d %d %d %d\n", p->id, p->name, p->sex, p->math, p->english, p->c, p->total);
printf("请输入新的成绩(格式:数学 英语 C语言):");
scanf("%d %d %d", &p->math, &p->english, &p->c);
p->total = p->math + p->english + p->c;
printf("修改成功!\n修改后信息:\n%s %s %s %d %d %d %d\n", p->id, p->name, p->sex, p->math, p->english, p->c, p->total);
return;
}
}
printf("未找到学号为%s的学生记录\n", id);
}
// 删除学生成绩记录
void remove_student(const char *id) {
for (int i = 0; i < student_num; i++) {
struct Student *p = &students[i];
if (strcmp(p->id, id) == 0) {
for (int j = i; j < student_num - 1; j++) {
students[j] = students[j + 1];
}
student_num--;
printf("删除成功!\n");
return;
}
}
printf("未找到学号为%s的学生记录\n", id);
}
// 显示学生全部信息
void show_students() {
printf("全部学生信息:\n");
for (int i = 0; i < student_num; i++) {
struct Student *p = &students[i];
printf("%s %s %s %d %d %d %d\n", p->id, p->name, p->sex, p->math, p->english, p->c, p->total);
}
}
// 主界面
void show_main_menu() {
printf("=====================================\n");
printf("1. 导入学生成绩记录\n");
printf("2. 保存所有学生记录到文件\n");
printf("3. 按总成绩递减输出\n");
printf("4. 按学号查询成绩\n");
printf("5. 修改学生成绩记录\n");
printf("6. 删除学生成绩记录\n");
printf("7. 显示学生全部信息\n");
printf("0. 退出\n");
printf("=====================================\n");
}
int main() {
while (1) {
show_main_menu();
int choice;
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1: {
printf("请输入文件名:");
char filename[100];
scanf("%s", filename);
import_students(filename);
break;
}
case 2: {
printf("请输入文件名:");
char filename[100];
scanf("%s", filename);
save_students(filename);
break;
}
case 3: {
sort_by_total();
break;
}
case 4: {
printf("请输入学号:");
char id[20];
scanf("%s", id);
search_by_id(id);
break;
}
case 5: {
printf("请输入学号:");
char id[20];
scanf("%s", id);
modify_student(id);
break;
}
case 6: {
printf("请输入学号:");
char id[20];
scanf("%s", id);
remove_student(id);
break;
}
case 7: {
show_students();
break;
}
case 0: {
printf("谢谢使用!\n");
return 0;
}
default: {
printf("无效操作,请重新输入\n");
break;
}
}
}
}
```
需要注意的是,这个示例中并没有进行错误处理、越界检查等,实际应用中需要添加这些功能来提高程序的健壮性。
阅读全文