C语言实现教务管理系统

1.明确教务系统实现功能

系统角色有学生,教师,和管理员
学生有姓名,学号,年龄,班级信息,能够查询多科成绩,查询成绩排名
教师具有姓名,年龄,班级信息,能够查询学生信息,录入多科成绩,查询多科成绩,查询成绩排名操作
管理员可以对学生和老师的信息进行录入,删除和修改

2.定义学生和教师的信息结构

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX 100
#define MAX_NAME 20
#define MAX_ID 12
#define MAX_SUBJECTS 5

typedef struct Student{
    char name[MAX_NAME];
    char ID[MAX_ID];
    int age;
    int Class;
    int scores[MAX_SUBJECTS];
    char* subjects[MAX_SUBJECTS];
    int totalScores;
}Student;

typedef struct Teacher{
    char name[MAX_NAME];
    int age;
    int Class;
}Teacher;

typedef struct Admin{
    Student stuDate[MAX];
    Teacher teacherDate[MAX];
    int stuCount;
    int teacherCount;
}Admin;

void Initsystem(Admin* pc){
    pc->stuCount=0;
    pc->teacherCount=0;
    memset(pc->stuDate, 0, sizeof(pc->stuDate));
    memset(pc->teacherDate, 0, sizeof(pc->teacherDate));
}

//初始化学科
void initializeStudent(Student* student) {
    student->subjects[0] = "Chinese";
    student->subjects[1] = "Math";
    student->subjects[2] = "English";
    student->subjects[3] = "Physics";
    student->subjects[4] = "Chemistry";
}

这里并未定义账号和密码,而是采用了写入文件的方法,最好预先创建对应的txt文本,否则会导致验证学生和教师时失败,下文将会提到如何实现 

3.分块解决问题

定义需要的辅助函数
验证身份的函数

int checkAdmin(){
    char username[50];
    char password[50];
    printf("请输入用户名:\n");
    scanf("%s", username);
    printf("请输入密码:\n");
    scanf("%s", password);
    if (strcmp(username, "admin") == 0 && strcmp(password, "123456") == 0) {
        printf("登录成功!\n");
        return 1;
    }else{
        printf("用户名或密码错误!\n");
        return 0;
    }
}

//验证学生和教师登录
int checkstudent() {
    char username[50];
    char password[50];
    char stored_username[50];
    char stored_password[50];
    printf("请输入用户名:\n");
    scanf("%s", username);
    printf("请输入密码:\n");
    scanf("%s", password);
    FILE *file = fopen("student.txt", "r");
    if (file == NULL) {
        printf("无法打开文件!\n");
        return 0;
    }
    while (fscanf(file, "%s%s", stored_username, stored_password) != EOF) {
        if (strcmp(username, stored_username) == 0 && strcmp(password, stored_password) == 0) {
            printf("登录成功!\n");
            fclose(file);
            return 1;
        }
    }
    printf("用户名或密码错误!\n");
    fclose(file);
    return 0;
}

//检查教师登录
int checkteacher() {
    char username[50];
    char password[50];
    char stored_username[50];
    char stored_password[50];
    printf("请输入用户名:\n");
    scanf("%s", username);
    printf("请输入密码:\n");
    scanf("%s", password);
    FILE *file = fopen("teacher.txt", "r");
    if (file == NULL) {
        printf("无法打开文件!\n");
        return 0;
    }
    while (fscanf(file, "%s%s", stored_username, stored_password) != EOF) {
        if (strcmp(username, stored_username) == 0 && strcmp(password, stored_password) == 0) {
            printf("登录成功!\n");
            fclose(file);
            return 1;
        }
    }
    printf("用户名或密码错误!\n");
    fclose(file);
    return 0;
}

写入账号密码的函数

//写入学生账号密码
int writeStudent() {
    char username[50];
    char password[50];
    char stored_username[50];
    char stored_password[50];
    printf("请输入要写入的用户名:\n");
    scanf("%s", username);
    printf("请输入要写入的密码:\n");
    scanf("%s", password);
    FILE *file = fopen("student.txt", "r");
    if (file != NULL) {
        while (fscanf(file, "%s%s", stored_username, stored_password) != EOF) {
            if (strcmp(username, stored_username) == 0) {
                printf("用户名已存在,不再写入!\n");
                fclose(file);
                return 0;
            }
        }
        fclose(file);
    }
    file = fopen("student.txt", "a");
    if (file == NULL) {
        printf("无法打开文件!\n");
        return 1;
    }
    fprintf(file, "%s\n%s\n", username, password);
    fclose(file);
    printf("用户名和密码已写入文件!\n");
}

//写入教师账号密码
int writeTeacher() {
    char username[50];
    char password[50];
    char stored_username[50];
    char stored_password[50];
    printf("请输入要写入的用户名:\n");
    scanf("%s", username);
    printf("请输入要写入的密码:\n");
    scanf("%s", password);
    FILE *file = fopen("teacher.txt", "r");
    if (file != NULL){
        while (fscanf(file, "%s%s", stored_username, stored_password) != EOF) {
            if (strcmp(username, stored_username) == 0) {
                printf("用户名已存在,不再写入!\n");
                fclose(file);
                return 0;
            }
        }
        fclose(file);
    }
    file = fopen("teacher.txt", "a");
    if (file == NULL) {
        printf("无法打开文件!\n");
        return 1;
    }
    fprintf(file, "%s %s\n", username, password);
    fclose(file);
    printf("用户名和密码已写入文件!\n");
}

 菜单函数

//学生的菜单
void menuStudent(){
    printf("**************************************\n");
    printf("******    1.查询指定学生信息    ******\n");
    printf("******    2.查询学生单科排名    ******\n");
    printf("******    3.查询学生的总成绩排名******\n");
    printf("******    0.退出                ******\n");
    printf("**************************************\n");
}

//老师的菜单
void menuTeacher(){
    printf("**************************************\n");
    printf("******    1.查询指定学生信息    ******\n");
    printf("******    2.展示学生各科成绩    ******\n");
    printf("******    3.输入学生单科成绩    ******\n");
    printf("******    4.输入学生全科成绩    ******\n");
    printf("******    5.学生单科成绩排序    ******\n");
    printf("******    6.学生的总成绩排序    ******\n");
    printf("******    7.查询学生单科排名    ******\n");
    printf("******    8.查询学生的总成绩排名******\n");
    printf("******    0.退出                ******\n");
    printf("**************************************\n");
}

//管理员菜单
void menuAdmin(){
    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");
}

//选择身份的菜单
void menu(){
    printf("请选择登录的身份\n1.管理员\n2.教师\n3.学生\n0.退出\n");
}

//学科菜单
void menuSubject(){
    printf("**************************************\n");
    printf("******         1.语文          *******\n");
    printf("******         2.数学          *******\n");
    printf("******         3.英语          *******\n");
    printf("******         4.物理          *******\n");
    printf("******         5.化学          *******\n");
    printf("**************************************\n");
}

管理员实现增删查改学生基本信息
录入学生信息

//输入学生信息
void enterStudent(Admin *pc) {
    if(pc->stuCount==MAX){
        printf("数据库已存满\n");
        return;
    }
    printf("添加学生信息\n");
    printf("\n请输入姓名: ");
    scanf("%s",pc->stuDate[pc->stuCount].name);
    printf("\n请输入ID: ");
    scanf("%s",pc->stuDate[pc->stuCount].ID);
    printf("\n请输入年龄:");
    scanf("%d",&(pc->stuDate[pc->stuCount].age));
    printf("\n请输入班级: ");
    scanf("%d",&(pc->stuDate[pc->stuCount].Class));
    if(writeStudent()){
        pc->stuCount++;
        printf("添加成功\n");
    }
}

删除学生信息

想要删除学生信息,首先需要查找该学生,这里用名字作为关键词索引

//按名字索引学生
int Findstuname(Admin* pc,char name[]){
    for(int i=0;i<pc->stuCount;i++){
        if(strcmp(pc->stuDate[i].name,name)==0){
            return i;
        }
    }
    return -1;
}

 然后实现删除功能(这里同时删除了该学生对应的账号密码)

//删除学生信息
void deleteStudent(Admin* pc){  
    char name[MAX_NAME];
    printf("请输入删除学生的姓名:");
    scanf("%s",name);
    //先查找
    int num=Findstuname(pc,name);
    if(num==-1){
        printf("该学生信息不存在\n");
        return;
    }
    //再删除(覆盖达到删除目的) 
    for(int i=num;i<pc->stuCount-1;i++){ 
        pc->stuDate[i]=pc->stuDate[i+1]; 
    } 
    pc->stuCount--; 
    // 删除对应的账号密码
    FILE* oldFile = fopen("student.txt", "r");
    FILE* newFile = fopen("temp.txt", "w");
    char line[1000];
    int i = 0;
    while (fgets(line, sizeof(line), oldFile)) {
        if (i != num) {
            fputs(line, newFile);
        }
        i++;
    }
    fclose(oldFile);
    fclose(newFile);
    remove("student.txt");
    rename("temp.txt", "student.txt");
    printf("删除成功\n"); 
}

修改学生信息

不再修改账号密码,想要修改账号密码可以参照删除信息的函数

void modifyStudent(Admin* pc){ 
    if(pc->stuCount==0){
        printf("数据已被清空\n");
        return;
    }
    char name[MAX_NAME];
    printf("请输入修改学生的姓名:");
    scanf("%s",name);
    //先查找
    int num=Findstuname(pc,name);
    if(num==-1){
        printf("该学生信息不存在\n");
        return;
    }
    printf("\n请输入姓名: "); 
    scanf("%s",pc->stuDate[num].name); 
    printf("\n请输入ID: "); 
    scanf("%s",pc->stuDate[num].ID); 
    printf("\n请输入年龄:"); 
    scanf("%d",&(pc->stuDate[num].age)); 
    printf("\n请输入班级: "); 
    scanf("%d",&(pc->stuDate[num].Class)); 
    printf("修改成功\n"); 
}

 实现教师的信息操作

与学生类似,不再赘述

//输入教师信息
void enterTeacher(Admin *pc) {
    if(pc->teacherCount==MAX){
        printf("数据库已存满\n");
        return;
    }
    printf("添加教师信息\n");
    printf("\n请输入姓名: ");
    scanf("%s",pc->teacherDate[pc->teacherCount].name);
    printf("\n请输入年龄:");
    scanf("%d",&(pc->teacherDate[pc->teacherCount].age));
    printf("\n请输入班级: ");
    scanf("%d",&(pc->teacherDate[pc->teacherCount].Class));
    if(writeTeacher()){
        pc->teacherCount++;
        printf("添加成功\n");
    }
}


//查询指定的教师
int FindTeachername(Admin* pc,char name[]){
    for(int i=0;i<pc->teacherCount;i++){
        if(strcmp(pc->teacherDate[i].name,name)==0){
            return i;
        }
    }
    return -1;
}


//删除教师信息
void deleteTeacher(Admin* pc) {
    if(pc->teacherCount==0){
        printf("数据已被清空\n");
        return;
    }
    char name[MAX_NAME];
    printf("请输入删除教师的姓名:");
    scanf("%s",name);
    //先查找
    int num=FindTeachername(pc,name);
    if(num==-1){
        printf("该教师信息不存在\n");
        return;
    }
    //再删除(覆盖达到删除目的)
    for(int i=num;i<pc->teacherCount-1;i++){
        pc->teacherDate[i]=pc->teacherDate[i+1];
    }
    pc->teacherCount--;
    // 删除对应的账号密码
    FILE* oldFile = fopen("teacher.txt", "r");
    FILE* newFile = fopen("temp.txt", "w");
    char line[1000];
    int i = 0;
    while (fgets(line, sizeof(line), oldFile)) {
        if (i != num) {
            fputs(line, newFile);
        }
        i++;
    }
    fclose(oldFile);
    fclose(newFile);
    remove("teacher.txt");
    rename("temp.txt", "teacher.txt");
    printf("成功删除\n");
}


//修改教师信息
void ModifyTeacher(Admin* pc){
    char name[MAX_NAME];
    printf("请输入被修改教师的姓名:");
    scanf("%s",name);
    int num=FindTeachername(pc,name);
    if(num==-1){
        printf("该教师信息不存在\n");
        return;
    }
    printf("\n请输入姓名: ");
    scanf("%s",pc->teacherDate[num].name);
    printf("\n请输入年龄:");
    scanf("%d",&(pc->teacherDate[num].age));
    printf("\n请输入班级: ");
    scanf("%d",&(pc->teacherDate[num].Class));
    printf("修改成功\n");
}

展示所有录入的信息

//展示录入的信息
void ShowAll(Admin* pc){
    printf("学生信息\n%-10s\t%-3s\t%-6s\t%-20s\n","姓名","ID","年龄","班级");
    for(int i=0;i<pc->stuCount;i++){
        printf("%-10s\t%-3s\t%-6d\t%-20d\n",pc->stuDate[i].name,
            pc->stuDate[i].ID,
            pc->stuDate[i].age,
            pc->stuDate[i].Class);
    }
    printf("\n教师信息\n%-10s\t%-3s\t%-6s\n","姓名","年龄","班级");
    for(int i=0; i<pc->teacherCount; i++){
        printf("%-10s\t%-3d\t%-6d\n", pc->teacherDate[i].name, 
            pc->teacherDate[i].age, 
            pc->teacherDate[i].Class);
    }
}

 实现教师及学生的操作的函数
查询指定学生信息

//查询指定学生信息
void queryStudentInfo(Admin* admin) {
    char student_id[50];
    printf("请输入学生ID:\n");
    scanf("%s", student_id);
    for (int i = 0; i < admin->stuCount; i++){
        if (strcmp(admin->stuDate[i].ID, student_id) == 0) {
            printf("%-10s\t%-3s\t%-6s\t%-20s\n","姓名","ID","年龄","班级");
            printf("%-10s\t%-3s\t%-6d\t%-20d\t\n",admin->stuDate[i].name,
                admin->stuDate[i].ID,
                admin->stuDate[i].age,
                admin->stuDate[i].Class);
            printf("学生 %s 的各科成绩如下:\n", student_id);
            for (int j = 0; j < MAX_SUBJECTS; j++){
                printf("%s: %d\n", admin->stuDate[i].subjects[j], admin->stuDate[i].scores[j]);
            }
            return;
        }
    }
    printf("未找到对应的学生\n");
}

录入学生单科成绩 

//录入学生单科成绩
void entersingleScores(Admin* admin) {
    char subject[50];
    char student_id[50];
    int score;
    printf("请输入学科名:\n");
    scanf("%s", subject);
    printf("请输入学生ID:\n");
    scanf("%s", student_id);
    printf("请输入成绩:\n");
    scanf("%d", &score);
    for (int i = 0; i < admin->stuCount; i++) {
        if (strcmp(admin->stuDate[i].ID, student_id) == 0) {
            for (int j = 0; j < MAX_SUBJECTS; j++) {
                if (strcmp(admin->stuDate[i].subjects[j], subject) == 0) {
                    admin->stuDate[i].scores[j] = score;
                    printf("成绩已录入\n");
                    printf("学生 %s 的各科成绩如下:\n", student_id);
                    for (int k = 0; k < MAX_SUBJECTS; k++) {
                        printf("%s: %d\n", admin->stuDate[i].subjects[k], admin->stuDate[i].scores[k]);
                    }
                    return;
                }
            }
            printf("未找到对应的学科\n");
            return;
        }
    }
    printf("未找到对应的学生\n");
}

一次性录入学生成绩 

//一次性录入学生成绩
void enterAllScores(Admin* admin) {
    char student_id[50];
    int scores[MAX_SUBJECTS];
    printf("请输入学生ID:\n");
    scanf("%s", student_id);
    for (int i = 0; i < admin->stuCount; i++) {
        if (strcmp(admin->stuDate[i].ID, student_id) == 0) {
            for (int j = 0; j < MAX_SUBJECTS; j++) {
                printf("请输入 %s 的成绩:\n", admin->stuDate[i].subjects[j]);
                scanf("%d", &scores[j]);
                admin->stuDate[i].scores[j] = scores[j];
            }
            printf("成绩已录入\n");
            printf("学生 %s 的各科成绩如下:\n", student_id);
            for (int k = 0; k < MAX_SUBJECTS; k++) {
                printf("%s: %d\n", admin->stuDate[i].subjects[k], admin->stuDate[i].scores[k]);
            }
            return;
        }
    }
    printf("未找到对应的学生\n");
}

显示所有学生的成绩 

//显示所有学生的成绩
void displayAllScores(Admin* admin) {
    for (int i = 0; i < admin->stuCount; i++) {
        printf("学生 %s 的各科成绩如下:\n", admin->stuDate[i].name);
        for (int j = 0; j < MAX_SUBJECTS; j++) {
            printf("%s: %d\n", admin->stuDate[i].subjects[j], admin->stuDate[i].scores[j]);
        }
        printf("\n");
    }
}

查询指定学生总排名 

//查询指定学生总排名
void findRankBy_Tatalscores(Admin* pc){
    for(int i=0;i<pc->stuCount;i++){
        for(int j=0;j<MAX_SUBJECTS;j++){
            pc->stuDate[i].totalScores+=pc->stuDate[i].scores[j];
        }
    }
    //从高到低冒泡排序
    for (int i = 0; i < pc->stuCount - 1; i++){
        for (int j = 0; j < pc->stuCount - i - 1; j++){
            if (pc->stuDate[j].totalScores < pc->stuDate[j+1].totalScores){
                Student temp = pc->stuDate[j];
                pc->stuDate[j] = pc->stuDate[j + 1];
                pc->stuDate[j + 1] = temp;
            }
        }
    }
    //输入要索引的对象的姓名
    char name[100];
    printf("请输入要查找的学生的姓名:");
    scanf("%s",name);
    // 遍历排序后的学生列表,找到指定的学生
    for (int i = 0; i < pc->stuCount; i++) {
        if (strcmp(pc->stuDate[i].name, name) == 0) {
            // 打印学生的排名,注意排名是从1开始的,所以这里要加1
            printf("学生 %s 总成绩的排名是:%d\n", name, i + 1);
            return;
        }
    }
    // 如果没有找到指定的学生,打印错误信息
    printf("没有找到名字为 %s 的学生\n", name);
}

 查询指定学生单科成绩排名

//查询指定学生单科成绩排名
void findRankBy_Subject(Admin* admin){
    // 先按照指定的学科对学生进行排序
    menuSubject();
    printf("请输入索引的学科");
    int subjectIndex;
    scanf("%d",&subjectIndex);
    //从高到低冒泡排序
    for (int i = 0; i < admin->stuCount - 1; i++){
        for (int j = 0; j < admin->stuCount - i - 1; j++){
            if (admin->stuDate[j].scores[subjectIndex] < admin->stuDate[j + 1].scores[subjectIndex]){
                Student temp = admin->stuDate[j];
                admin->stuDate[j] = admin->stuDate[j + 1];
                admin->stuDate[j + 1] = temp;
            }
        }
    }
    //输入要索引的对象的姓名
    char name[100];
    printf("请输入要查找的学生的姓名:");
    scanf("%s",name);
    // 遍历排序后的学生列表,找到指定的学生
    for (int i = 0; i < admin->stuCount; i++) {
        if (strcmp(admin->stuDate[i].name, name) == 0) {
            // 打印学生的排名,注意排名是从1开始的,所以这里要加1
            printf("学生 %s 的 %s 的排名是:%d\n", name, admin->stuDate->subjects[subjectIndex+1],i + 1);
            return;
        }
    }
    // 如果没有找到指定的学生,打印错误信息
    printf("没有找到名字为 %s 的学生\n", name);
}

 所有学生按单科成绩排序

//所有学生按单科成绩排序
void sort_Students_By_Singal_Subject(Admin* admin){
    menuSubject();
    printf("请输入排序的学科");
    int subjectIndex;
    scanf("%d",&subjectIndex);
    subjectIndex+=1;
    if(subjectIndex <= 0 || subjectIndex > MAX_SUBJECTS) {
        printf("Invalid subject index\n");
        return;
    }
    //从高到低冒泡排序
    for (int i = 0; i < admin->stuCount - 1; i++){
        for (int j = 0; j < admin->stuCount - i - 1; j++){
            if (admin->stuDate[j].scores[subjectIndex] < admin->stuDate[j + 1].scores[subjectIndex]){
                Student temp = admin->stuDate[j];
                admin->stuDate[j] = admin->stuDate[j + 1];
                admin->stuDate[j + 1] = temp;
            }
        }
    }
    // 打印排序后的学生及其对应学科的名字
    printf("按照 %s 成绩排序的学生列表:\n", admin->stuDate[0].subjects[subjectIndex]);
    for (int i = 0; i < admin->stuCount; i++) {
        printf("学生名字:%s,%s 成绩:%d\n", admin->stuDate[i].name, admin->stuDate[i].subjects[subjectIndex], admin->stuDate[i].scores[subjectIndex]);
    }
}

 所有学生按总成绩排序

//所有学生按总成绩排序
void sort_Students_By_All_Subject(Admin* pc){
    for(int i=0;i<pc->stuCount;i++){
        for(int j=0;j<MAX_SUBJECTS;j++){
            pc->stuDate[i].totalScores+=pc->stuDate[i].scores[j];
        }
    }
    //从高到低冒泡排序
    for (int i = 0; i < pc->stuCount - 1; i++){
        for (int j = 0; j < pc->stuCount - i - 1; j++){
            if (pc->stuDate[j].totalScores < pc->stuDate[j+1].totalScores){
                Student temp = pc->stuDate[j];
                pc->stuDate[j] = pc->stuDate[j + 1];
                pc->stuDate[j + 1] = temp;
            }
        }
    }
    // 打印排序后的学生
    for (int i = 0; i < pc->stuCount; i++) {
        printf("学生名字:%s, 总成绩:%d\n", pc->stuDate[i].name, pc->stuDate[i].totalScores);
    }
}

文件操作函数

//导入已存在的信息
void loadData(Admin* admin) {
    FILE* stuFile = fopen("stusource.txt", "r");
    FILE* teaFile = fopen("teasource.txt", "r");
    //使用w模式可以每次打开时重置txt为空
    FILE* stuAccountFile = fopen("student.txt", "w");
    FILE* teaAccountFile = fopen("teacher.txt", "w");
    if (stuFile == NULL || teaFile == NULL || stuAccountFile == NULL || teaAccountFile == NULL) {
        printf("无法打开文件\n");
        return;
    }
    char account[MAX_NAME];
    char password[MAX_NAME];
    // 读取学生数据
    while (fscanf(stuFile, "%s %s %d %d", admin->stuDate[admin->stuCount].name, admin->stuDate[admin->stuCount].ID, &admin->stuDate[admin->stuCount].age, &admin->stuDate[admin->stuCount].Class) != EOF) {
        for (int i = 0; i < MAX_SUBJECTS; i++) {
            fscanf(stuFile, "%d", &admin->stuDate[admin->stuCount].scores[i]);
        }
        fscanf(stuFile, "%s %s", account, password);
        fprintf(stuAccountFile, "%s %s\n", account, password);
        initializeStudent(&admin->stuDate[admin->stuCount]);
        admin->stuCount++;
    }
    // 读取教师数据
    while (fscanf(teaFile, "%s %d %d", admin->teacherDate[admin->teacherCount].name, &admin->teacherDate[admin->teacherCount].age, &admin->teacherDate[admin->teacherCount].Class) != EOF) {
        fscanf(teaFile, "%s %s", account, password);
        fprintf(teaAccountFile, "%s %s\n", account, password);
        admin->teacherCount++;
    }
    fclose(stuFile);
    fclose(teaFile);
    fclose(stuAccountFile);
    fclose(teaAccountFile);
    printf("成功导入已有信息\n");
}


// 从文件中读取账号和密码
void readCredentials(const char* filename, char credentials[MAX][2][MAX_NAME]) {
    FILE* file = fopen(filename, "r");
    if (file == NULL) {
        printf("无法打开文件 %s\n", filename);
        return;
    }
    int i = 0;
    while (fscanf(file, "%s %s", credentials[i][0], credentials[i][1]) != EOF && i < MAX) {
        i++;
    }
    
    fclose(file);
}


//所有信息并写入存储本次操作的文件
void WriteToFile(Admin* admin){
    char studentCredentials[MAX][2][MAX_NAME];
    char teacherCredentials[MAX][2][MAX_NAME];
    readCredentials("student.txt", studentCredentials);
    readCredentials("teacher.txt", teacherCredentials);
    FILE* studentFile = fopen("store_stu.txt", "w");
    FILE* teacherFile = fopen("store_tea.txt", "w");
    //和写入学生信息
    for (int i = 0; i < admin->stuCount; i++){
        fprintf(studentFile, "%s %s %d %d ", admin->stuDate[i].name, admin->stuDate[i].ID, admin->stuDate[i].age, admin->stuDate[i].Class);
        for (int j = 0; j < MAX_SUBJECTS; j++){
            fprintf(studentFile, "%d ", admin->stuDate[i].scores[j]);
        }
        fprintf(studentFile, "%s %s\n", studentCredentials[i][0], studentCredentials[i][1]);
    }
    //写入教师信息
    for (int i = 0; i < admin->teacherCount; i++){
        fprintf(teacherFile, "%s %d %d %s %s\n", admin->teacherDate[i].name, admin->teacherDate[i].age, admin->teacherDate[i].Class, teacherCredentials[i][0], teacherCredentials[i][1]);
    }
    fclose(studentFile);
    fclose(teacherFile);
}

文件数据

teasource.txt

liulei 30 1 liulei 123456
chenyang 31 2 chenyang 123456
yanglin 32 3 yanglin 123456
zhangyang 33 4 zhangyang 123456
wanglei 34 5 wanglei 123456
zhaobo 35 6 zhaobo 123456
sunpeng 36 7 sunpeng 123456
zhoulai 37 8 zhoulai 123456
wuyang 38 9 wuyang 123456
zhenglin 39 10 zhenglin 123456

stusource.txt

lihua 001 18 1 80 90 85 88 92 lihua 123456
zhangming 002 19 1 85 92 88 90 85 zhangming 123456
wangqiang 003 18 2 88 85 92 90 88 wangqiang 123456
zhaoli 004 19 2 90 88 85 92 90 zhaoli 123456
sunfei 005 18 3 92 90 88 85 92 sunfei 123456
zhoujie 006 19 3 85 92 90 88 85 zhoujie 123456
wulan 007 18 4 88 85 92 90 88 wulan 123456
zhengfeng 008 19 4 90 88 85 92 90 zhengfeng 123456
fengdong 009 18 5 92 90 88 85 92 fengdong 123456
chendong 010 19 5 85 92 90 88 85 chendong 123456

定义函数指针数组

增加了代码的可读性

// 定义管理员函数指针数组
void (*Admin_func_ptr[7])(Admin *) = {enterStudent, modifyStudent, deleteStudent, enterTeacher, ModifyTeacher, deleteTeacher, ShowAll};

//定义教师函数指针数组
void (*Teacher_func_ptr[8])(Admin *) = {queryStudentInfo, displayAllScores, entersingleScores, enterAllScores, sort_Students_By_Singal_Subject, sort_Students_By_All_Subject, findRankBy_Subject, findRankBy_Tatalscores};

//定义学生函数指针数组
void (*Student_func_ptr[3])(Admin *) = {queryStudentInfo, findRankBy_Subject, findRankBy_Tatalscores};

 主函数实现所有功能

//主函数开始执行
int main(){
    int Identify;
    Admin con;
    Initsystem(&con);
    loadData(&con);
    menu();
    scanf("%d",&Identify);
    while(Identify){
        switch (Identify) {
        case 1:
            if(checkAdmin()==1){
                int input;
                do{
                    menuAdmin();
                    printf("请进行操作: ");
                    scanf("%d",&input);
                    if(input>0&&input<8)
                        Admin_func_ptr[input-1](&con);
                }while(input);
            }
            break;
        case 2:
            if(checkteacher()==1){
                int input;
                do{
                    menuTeacher();
                    printf("请进行操作: ");
                    scanf("%d",&input);
                    Teacher_func_ptr[input-1](&con);
                }while(input);
            }
            break;
        case 3:
            if(checkstudent()==1){
                int input;
                do{
                    menuStudent();
                    printf("请进行操作: ");
                    scanf("%d",&input);
                    Student_func_ptr[input-1](&con);
                }while(input);
            }
            break;
        default:
            printf("输入错误,重新输入\n");
            break;
        }
        menu();
        printf("请输入新的操作码: ");
        scanf("%d",&Identify);
    }
    WriteToFile(&con);
    return 0;
}

到这里,我们已经完成了既定的所有要求,如有不妥之处,请在评论区留下您的宝贵建议,如果觉的不错,点个赞呗

  • 23
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值