开阔视野的C语言终极实例——学生管理系统

2020.2.14

目的:实现一些简单的学生管理系统的功能,强化对C语言的实际运用

说明:首先进行用户登录,登录成功的同时判断用户类型,然后根据用户的类型显示对应的菜单,然后展开对应的操作。该Demo主要用到文件读取、存储和结构体的一些操作,所以很容易出现文件存与读方面的bug

应对其中出现过的bug的解决与问题总结
1.文件写入与读取的格式一定要正确,若出现信息写不进文件,首先考虑文件路径是否正确,另外信息读取和存储完毕后一定要记得关闭文件,否则会影响下一次的存储与读取,会出现打开文件出错的bug
2.不要随便用指针,除非是你自己申请的内存空间,因为存储课程信息,下意识地就会想到指针,将常量字符串赋值给指针不用申请空间,看上去没有任何问题,但当用户信息写入文件后,那个没有申请内存的临时指针变量便被释放内存,而写入文件的那个指针只会记录之前的那个地址,而不会记录地址里面的值,所以读取文件时可能会显示乱码,因为指针指向的那个被释放内存的地址可能被用了,里面存的值也未知。因此存储课程等信息都采取数组存储,因为将数组写入文件是直接将数组中存储的课程等信息写入文件,而不是什么地址
3.在刷新信息时,一定要将整个结构体重新写入文件,覆盖之前的信息,而不要在之前的信息后面接着写,因为读取信息是以整个结构体为单位来读取的,跟在后面写达不到添加信息的目的,这个思想很重要
4.对于需要重复操作的变量最好将它设置为全局变量,在函数里面操作的临时变量出了函数就没了,这点很重要
5.变量在定义时最好都初始化一下,否则可能会出现疯狂越界找数据的情况,从而出现死循环

学生管理系统图解.png

这么一个庞大的工程,肯定要分为几个文件来写,才便于检查bug,滤清思路,一下是各个源文件的代码

部分效果展示

添加管理员.gif

添加学生.gif

添加老师.gif

文件.png

添加完成后桌面会出现上图所示的txt文件
课程与成绩操作.gif

管理员是C位,所以先按照图一添加管理员,打开注释,再重新注释添加管理员的部分

main.cpp

#include<stdio.h>
#include"Constants.h"
#include"Manager.h"
int main(){
    Welcome();//欢迎界面
    while(1){
    user_login();//用户登录以及登录后的操作
    }
    fflush(stdin);
    getchar();
    return 0;
}

Constants.h

#pragma once//由于多个头文件都引入了此头文件,因此要避免该头文件重复编译
#include<stdio.h>
#include<stdlib.h>
typedef enum{
    GradeOne,
    GradeTwo,
    GradeThree,
    GradeFour
}Grade;
//定义学生年级的枚举
typedef struct student{
    char s_id[15];
    char s_pwd[6];
    Grade s_grade;
    char s_name[20];
    int s_age;
    char s_addr[20];
    char c_ids[15][8];
    char s_sex[5];
    int score[5];
    struct student* next;
}Student;
//定义学生的结构体
typedef struct teacher{
    char t_id[15];
    char t_pwd[6];
    char t_name[20];
    int t_age;
    char t_sex[5];
    char t_addr[20];
    char c_ids[15][8];
    struct teacher* next;
}Teacher;
//定义老师的结构体
typedef struct administrator{
    char a_name[20];
    char a_pwd[6];
}Admin;
//定义管理员的结构体
typedef enum{
    UserTypeNone,
    UserTypeStudent,
    UserTypeTeacher,
    UserTypeAdmin
}UserType;
//用户类型枚举
typedef struct use{
    char name[20];
    char pwd[6];
    UserType type;
    char details[50];
}User;
//用户结构体
#define USER_INFO_PATH "C:\\Users\\1\\Desktop\\users.txt"
//保存用户信息的文件的完整路径
#define BASE_PATH "C:\\Users\\1\\Desktop\\"
//基本路径用于拼接用户文件路径

FileOperation.h

#include"Constants.h"
void save(User user);
//保存用户基本信息
User user_load(FILE *fp);
//从文件中加载出一个用户
bool user_select(User *pUser);
//判断用户是否存在
FILE *file_open(char *path,char *mode);
//打开文件
void load_detail(void *p,User user);
//加载用户的详细信息并传给对应的用户类型

FileOperation.cpp

#include"Constants.h"
#include<string.h>
void save(User user){
    FILE *fp;
    errno_t err;
    err=fopen_s(&fp,USER_INFO_PATH,"a+");
    if(err!=0){
        printf("打开文件出错!");
        fflush(stdin);
        getchar();
        exit(EXIT_FAILURE);
    }
    
    fwrite(&user,sizeof(User),1,fp);
    fclose(fp);
}
FILE *file_open(char *path,char *mode){
    FILE *fp;
    errno_t err;
    err=fopen_s(&fp,path,mode);
    if(err!=0){
        printf("打开文件出错!");
        exit(EXIT_FAILURE);
    }
    return fp;
}
//文件最好只打开一次,因此独立出此方法
User user_load(FILE *fp){
    User temp={};
    //一定要初始化,否则会出现疯狂越界找数据
    fread(&temp,sizeof(User),1,fp);
    return temp;
}
bool user_select(User *pUser){
    FILE *fp=file_open(USER_INFO_PATH,"r");
    while(1){
        while (1) {
        User temp = user_load(fp);
        //从文件中加载一个用户信息
        //判断用户是否有效
        if (temp.type == UserTypeNone) {
            //已经没有了
            fclose(fp);
            return false;
        }
        else {
            if (strcmp(temp.name, pUser->name) == 0) {
                //比较用户名
                pUser->type = temp.type;
                //保存类型
                if (strcmp(temp.pwd, pUser->pwd) == 0) {
                    //比较密码
                    //登录成功
                    strcpy(pUser->details,temp.details);
                    //保存详细信息
                    fclose(fp);
                    return true;
                }
                else {
                    fclose(fp);
                    return false;
                }
            }
        }
    }
}
}
void load_detail(void *p,User user){
    char path[50];
    sprintf(path,"%s%s",BASE_PATH,user.details);
    //拼接文件路径
    FILE *fp=file_open(path,"r");
    //打开文件
    if(user.type==UserTypeStudent){
        Student *ps=(Student*)p;
        fread(ps,sizeof(Student),1,fp);
    }else{
        Teacher *pt=(Teacher*)p;
        fread(pt,sizeof(Teacher),1,fp);
    }
    //分用户类型读取信息
    fclose(fp);
    //关闭文件
}

Manager.h

#include<stdio.h>
void Welcome();
//欢迎界面
void user_login();
//用户登录以及各项操作
int choice(int max);
//输入操作选项
void dealWithStudentchoice(int result);
//处理学生的选择
void dealWithTeacherchoice(int result);
//处理老师的选择
void dealWithAdminchoice(int result);
//处理管理员的选择

Manager.cpp

#include"Constants.h"
#include"Manager.h"
#include"FileOperation.h"
#include<string.h>
#include"Utils.h"
int modify_infor();
char *s_course[]={"高数","英语","思修","计导","体育"};
char *new_smenu[]={"id","年龄","密码","地址","年级"};
char *new_tmenu[]={"id","年龄","密码","地址"};
void Welcome(){
    printf("******************************\n");
    printf("     欢迎使用学生管理系统!\n");
    printf("******************************\n");
}
User global_user={};
//用户输入的信息很多函数都会使用,因此用全局变量User存储
void modify_s_infor(Student* s){
    printf("请选择需要修改的信息序号:\n");
    showMenuDetail(new_smenu,5);
    //显示需要修改信息的学生菜单
    int result=choice(5);
    int s_choice=0;
    char use[20];
    //存储用户输入的新信息
    switch(result){
    case 1:
        printf("请输入新的id:");
        scanf("%s",use);
        strcpy(s->s_id,use);
        break;
    case 2:
        printf("请输入新的年龄:");
        scanf("%d",&s->s_age);
        break;
    case 3:
        printf("请输入新的密码:");
        scanf("%s",use);
        strcpy(s->s_pwd,use);
        break;
    case 4:
        printf("请输入新的地址:");
        scanf("%s",use);
        strcpy(s->s_addr,use);
        break;
    case 5:
        printf("请输入新的年级:\n");
        printf("1.大一\n2.大二\n3.大三\n4.大四");
        s_choice=choice(4);
        switch(s_choice){
        case 1:
            s->s_grade=GradeOne;
            break;
        case 2:
            s->s_grade=GradeTwo;
            break;
        case 3:
            s->s_grade=GradeThree;
            break;
        case 4:
            s->s_grade=GradeFour;
            break;
        }
        break;
    }
    showStudentinfo(s);
    //展示修改后的学生信息
    save_detail(s,UserTypeStudent);
}
void modify_t_infor(Teacher* t){
    printf("请选择需要修改的信息序号:\n");
    showMenuDetail(new_tmenu,4);
    int result=choice(4);
    char use[20];
    switch(result){
    case 1:
        printf("请输入新的id:");
        scanf("%s",use);
        strcpy(t->t_id,use);
        break;
    case 2:
        printf("请输入新的年龄:");
        scanf("%d",&t->t_age);
        break;
    case 3:
        printf("请输入新的密码:");
        scanf("%s",use);
        strcpy(t->t_pwd,use);
        break;
    case 4:
        printf("请输入新的地址:");
        scanf("%s",use);
        strcpy(t->t_addr,use);
        break;
    }
    showTeacherinfo(t);
    save_detail(t,UserTypeTeacher);
}
void addNewuser(UserType type){
    if(type==UserTypeStudent){
        Student s={};
        printf("请输入学生姓名:\n");
        scanf("%s",s.s_name);
        printf("请输入学生性别:\n");
        scanf("%s",s.s_sex);
        printf("请输入学生年龄:\n");
        scanf("%d",&s.s_age);
        printf("请输入学生id:\n");
        scanf("%s",s.s_id);
        printf("请输入学生密码:\n");
        scanf("%s",s.s_pwd);
        printf("请输入学生地址:\n");
        scanf("%s",s.s_addr);
        s.next=NULL;
        printf("请选择学生年级:\n");
        printf("1.大一\n2.大二\n3.大三\n4.大四");
        int s_choice=choice(4);
        switch(s_choice){
        case 1:
            s.s_grade=GradeOne;
            break;
        case 2:
            s.s_grade=GradeTwo;
            break;
        case 3:
            s.s_grade=GradeThree;
            break;
        case 4:
            s.s_grade=GradeFour;
            break;
        }
        add_user(&s,UserTypeStudent);
    }else{
        Teacher t={};
        printf("请输入老师姓名:\n");
        scanf("%s",t.t_name);
        printf("请输入老师性别:\n");
        scanf("%s",t.t_sex);
        printf("请输入老师年龄:\n");
        scanf("%d",&t.t_age);
        printf("请输入老师id:\n");
        scanf("%s",t.t_id);
        printf("请输入老师密码:\n");
        scanf("%s",t.t_pwd);
        printf("请输入老师地址:\n");
        scanf("%s",t.t_addr);
        t.next=NULL;
        add_user(&t,UserTypeTeacher);
    }
    //分添加的用户类型录入信息
}

void choose_course(void *puser,UserType type){
    int c_result=choice(5);
    char path[50]={};
    if(type==UserTypeStudent){
        Student *s=(Student*)puser;
        switch(c_result){
    case 1:
        strcpy(s->c_ids[0],"高数");
        break;
    case 2:
        strcpy(s->c_ids[1],"英语");
        break;
    case 3:
        strcpy(s->c_ids[2],"思修");
        break;
    case 4:
        strcpy(s->c_ids[3],"计导");
        break;
    case 5:
        strcpy(s->c_ids[4],"体育");
        break;
    }
    char file_name[50];
    sprintf(file_name,"%s%s",s->s_name,".txt");
    //拼接文件名
    sprintf(path,"%s%s",BASE_PATH,file_name);
    //拼接完整路径
     FILE *fp=file_open(path,"w");
     //用新的学生结构体覆盖之前的那个,完成信息刷新
    fwrite(s,sizeof(Student),1,fp);
    fclose(fp);
    }else{
        Teacher *t=(Teacher*)puser;
        switch(c_result){
    case 1:
        strcpy(t->c_ids[0],"高数");
        break;
    case 2:
        strcpy(t->c_ids[1],"英语");
        break;
    case 3:
        strcpy(t->c_ids[2],"思修");
        break;
    case 4:
        strcpy(t->c_ids[3],"计导");
        break;
    case 5:
        strcpy(t->c_ids[4],"体育");
        break;
    }
    char file_name[50];
    sprintf(file_name,"%s%s",t->t_name,".txt");
    sprintf(path,"%s%s",BASE_PATH,file_name);
     FILE *fp=file_open(path,"w");//完整路径
    fwrite(t,sizeof(Teacher),1,fp);
    fclose(fp);
    }
    //保存选课信息
}
void show_score(char** s_course,int* array){
    for(int i=0;i<5;i++){
        printf("%d.%s成绩:%d\n",i+1,s_course[i],array[i]);
    }
}
void dealWithStudentchoice(int result){
    Student s={};
    load_detail(&s,global_user);
    //把学生的详细信息读取出来
    switch(result){
        case 1:
            //个人信息
            showStudentinfo(&s);
            break;
        case 2:
            //成绩查询
            show_score(s_course,s.score);
            break;
        case 3:
            //选课
            showMenuDetail(s_course,5);//显示课表选项
            choose_course(&s,UserTypeStudent);
            break;
        case 4:
            //课表查询
            load_detail(&s,global_user);
            showcourse_infor(&s,UserTypeStudent);
            break;
        case 5:
            //退出
            user_exit();
            break;
        }
    pressTocontinue();
}
void dealWithTeacherchoice(int result){
    Teacher t={};
    Student* s=(Student*)malloc(1*sizeof(Student));;
    load_detail(&t,global_user);
    switch(result){
        case 1:
            //个人信息
            showTeacherinfo(&t);
            break;
        case 2:
            //课程查询
            load_detail(&t,global_user);
            showcourse_infor(&t,UserTypeTeacher);
            break;
        case 3:
            //申请课程
            showMenuDetail(s_course,5);
            choose_course(&t,UserTypeTeacher);
            break;
        case 4:
            select_student(s);
            while(1){
            input_course(s,s_course);
            save_detail(s,UserTypeStudent);
            bool a=is_continue();
            if(a==false){
                break;
            }
            }
            break;
        case 5:
            //退出
            user_exit();
            break;
        }
    pressTocontinue();
}
void dealWithAdminchoice(int result){
    Admin a={};
    //load_detail(&a,global_user);
    switch(result){
        case 1:
            //学生信息
            show_infor(UserTypeStudent);
            break;
        case 2:
            //教师信息
            show_infor(UserTypeTeacher);
            break;
        case 3:
            //添加学生
            addNewuser(UserTypeStudent);
            break;
        case 4:
            //添加老师
            addNewuser(UserTypeTeacher);
            break;
        case 5:
            //信息查询
            infor_search();
            break;
        case 6:
            modify_infor();
            break;
        case 7:
            //退出
            user_exit();
            break;
        }
    pressTocontinue();
}
int modify_infor(){
    printf("请输入需要修改信息的用户名:");
    char name[6];
    scanf("%s",name);
    FILE* fp=file_open(USER_INFO_PATH,"r");
    while(1){
        User temp=user_load(fp);
        if(temp.type==UserTypeAdmin){
            continue;
            }
        if (temp.type == UserTypeNone){ 
            fclose(fp);
            printf("用户不存在!!!\n");
            return 1;
        }else{
            if(strcmp(name,temp.name)==0){
                if(temp.type==UserTypeStudent){
                    Student* s;
                    s=(Student*)malloc(1*sizeof(Student));
                    load_detail(s,temp);
                    while(1){
                    modify_s_infor(s);
                    bool a=is_continue();
                    if(a==false){
                        fclose(fp);
                        return 0;
                    }
                    }
                }else{
                    Teacher* t;
                    t=(Teacher*)malloc(1*sizeof(Teacher));
                    load_detail(t,temp);
                    while(1){
                    modify_t_infor(t);
                    bool a=is_continue();
                    if(a==false){
                        fclose(fp);
                        return 0;
                    }
                    }
                }
        }
    }
}
}
void user_login(){
    /*User admin={};
    strcpy(admin.name,"admin");
    strcpy(admin.pwd,"123");
    admin.type=UserTypeAdmin;
    save(admin);*/
    printf("请输入用户名:");
    scanf("%s",global_user.name);
    printf("请输入密码:");
    scanf("%s",global_user.pwd);
    //实现用户输入
    bool result=user_select(&global_user);
    //搜索用户
    if(result==true){
        printf("成功\n");
        showMenu(global_user.type);
    }else{
        if(global_user.type!=UserTypeNone)
        {
            printf("密码错误\n");
        }else{

            printf("用户不存在\n");
        }
    }
}

Utils.h

#include"Constants.h"
void pressTocontinue();
//按任意键继续
void showStudentinfo(Student* s);
//展示学生个人信息
void showTeacherinfo(Teacher* t);
//展示老师个人信息
void showMenu(UserType type);
//显示对应用户类型的菜单
void user_exit();
//退出
void showMenuDetail(char *array[],int count);
//显示所有的课程目录
void showcourse_infor(void *puser,UserType type);
//显示学生所选课程或老师申请的课程
void* connect_user(UserType type);
//将所有学生或者老师连接形成一个链表
int show_infor(UserType type);
//显示所有学生或者老师的个人信息
void infor_search();
//查询用户信息
void input_course(Student* s,char** s_course);
//录入学生科目成绩
bool is_continue();
//判断是否继续
void save_detail(void *pUser,UserType type);
//保存用户的详细信息
void select_student(Student*);
//加载一个学生信息
void add_user(void *pUser,UserType type);
//添加一个用户,将其基本信息与详细信息写入文件

Utils.cpp

#include"Utils.h"
#include"Manager.h"
#include"FileOperation.h"
#include<string.h>
char *s_menu[]={"个人信息","成绩查询","选课","课表查询","退出"};
char *t_menu[]={"个人信息","课程查询","申请课程","录入成绩","退出"};
char *a_menu[]={"学生信息","教师信息","添加学生","添加老师","信息查询","修改信息","退出"};
void save_detail(void *pUser,UserType type);
void pressTocontinue(){
    fflush(stdin);
    printf("按任意键继续:\n");
    getchar();
}
bool is_continue(){
    printf("是否继续修改信息(y/n):");
    while(1){
    fflush(stdin);
    char a=getchar();
    if(a=='y'){
        return true;
    }else if(a=='n'){
        return false;
    }else{
        printf("输入不合法,请重新输入.\n");
    }
    }
}
int choice(int max){
    int num=0;
    while(1){
        printf("请选择操作:\n");
        scanf("%d",&num);
        if(num<=max&&num>=1){
            return num;
        }else{
            printf("输入不合法,请重新输入!\n");
        }
    }
}
void user_exit(){
    printf("感谢使用,再见!");
    exit(EXIT_SUCCESS);
}
void showcourse_infor(void *puser,UserType type){
    if(type==UserTypeStudent){
        Student *p=(Student*)puser;
        printf("已选课程:\n");
        printf("***************************\n");
        for(int i=0;i<5;i++){
            if(p->c_ids[i]!=NULL){
                printf("      %s\n",p->c_ids[i]);
            }
        }
        printf("***************************\n");
    }
    else{
        Teacher *p=(Teacher*)puser;
        printf("教授课程有:\n");
        printf("***************************\n");
        for(int i=0;i<5;i++){
            if(p->c_ids[i]!=NULL){
                printf("      %s\n",p->c_ids[i]);
            }
        }
        printf("***************************\n");
    }
}
void showMenuDetail(char *array[],int count){
    printf("***************************\n");
    for(int i=0;i<count;i++){
        printf("      %d.%s\n",i+1,array[i]);
    }
    printf("***************************\n");
}
void showMenu(UserType type){
    int count=0;
    int result=0;
    switch(type){
    case UserTypeStudent:
        count=sizeof(s_menu)/sizeof(char*);
        while(1){
        showMenuDetail(s_menu,count);
        result=choice(count);
        dealWithStudentchoice(result);
        }
        break;
    case UserTypeTeacher:
        count=sizeof(t_menu)/sizeof(char*);
        while(1){
        showMenuDetail(t_menu,count);
        result=choice(count);
        dealWithTeacherchoice(result);
        }
        break;
    case UserTypeAdmin:
        count=sizeof(a_menu)/sizeof(char*);
        while(1){
        showMenuDetail(a_menu,count);
        result=choice(count);
        dealWithAdminchoice(result);
        }
        break;
    }
}
void add_user(void *pUser,UserType type){
    //拼接用户对应的文件名
    //name.txt
    User user={};
    if(type==UserTypeStudent){
        Student *p=(Student*)pUser;
        strcpy(user.name,p->s_name);
        strcpy(user.pwd,p->s_pwd);
        user.type=UserTypeStudent;
    }else if(type==UserTypeTeacher){
        Teacher *p=(Teacher*)pUser;
        strcpy(user.name,p->t_name);
        strcpy(user.pwd,p->t_pwd);
        user.type=UserTypeTeacher;
    }else{
        Admin *p=(Admin*)pUser;
        strcpy(user.name,p->a_name);
        strcpy(user.pwd,p->a_pwd);
        user.type=UserTypeAdmin;
    }
    sprintf(user.details,"%s.txt",user.name);
    save(user);
        //保存用户
    if(type!=UserTypeAdmin){
        save_detail(pUser,type);
        //保存用户的详细信息
    }
}
void save_detail(void *pUser,UserType type){
    size_t size;
    char file_name[50];
    if(type==UserTypeStudent){
        Student *p=(Student*)pUser;
        sprintf(file_name,"%s%s",p->s_name,".txt");
        size=sizeof(Student);
    }else{
        Teacher *p=(Teacher*)pUser;
        sprintf(file_name,"%s%s",p->t_name,".txt");
        size=sizeof(Teacher);
    }
    char path[50]={};
    sprintf(path,"%s%s",BASE_PATH,file_name);
    FILE *fp=file_open(path,"w");//完整路径
    fwrite(pUser,size,1,fp);
    fclose(fp);
}
void showStudentinfo(Student* s){
    printf("***************************\n");
    printf("     1. name:%s\n",s->s_name);
    printf("     2. sex:%s\n",s->s_sex);
    printf("     3. id:%s\n",s->s_id);
    printf("     4.age:%d\n",s->s_age);
    printf("     5.pwd:%s\n",s->s_pwd);
    printf("     6.addr:%s\n",s->s_addr);
    switch(s->s_grade){
    case GradeOne:
        printf("     7.年级:大一\n");
        break;
    case GradeTwo:
        printf("     7.年级:大二\n");
        break;
    case GradeThree:
        printf("     7.年级:大三\n");
        break;
    case GradeFour:
        printf("     7.年级:大四\n");
        break;
    }
    printf("***************************\n");
}
void showTeacherinfo(Teacher* t){
    printf("***************************\n");
    printf("      1.name:%s\n",t->t_name);
    printf("      2.sex:%s\n",t->t_sex);
    printf("      3.id:%s\n",t->t_id);
    printf("      4.age:%d\n",t->t_age);
    printf("      5.pwd:%s\n",t->t_pwd);
    printf("      6.addr:%s\n",t->t_addr);
    printf("***************************\n");
}
void* connect_user(UserType type){
    FILE *fp=file_open(USER_INFO_PATH,"r");
    Student* s_head=NULL;
    Student* s_tail=NULL;
    Teacher* t_head=NULL;
    Teacher* t_tail=NULL;
    if(type==UserTypeStudent){
    while(1){
            User user={};
            user=user_load(fp);
        if(user.type==UserTypeAdmin){
            continue;
        }
        //跳过管理员
        if(user.type == UserTypeNone){
            //没有了一定要关闭文件
            fclose(fp);
            //没有了
            if(s_head==NULL){
                return NULL;
            }
                s_tail->next=NULL;
                return s_head;
            }
        if(user.type==UserTypeStudent){
            Student* s=(Student*)malloc(1*sizeof(Student));
            load_detail(s,user);//加载信息
            if(s_head==NULL){
                s_head=s;
                //是第一个,就让头指针指向他
                s_tail=s;
                //同时让尾指针也指向他
            }else{
                s_tail->next=s;
                //否则就让一个人的next指针指向他
                s_tail=s;
                //尾指针移动到当前这个人
            }
            }
        }
    }else{
        while(1){
            User user={};
            user=user_load(fp);
            if(user.type==UserTypeAdmin){
            continue;
            }
            if(user.type == UserTypeNone){
                fclose(fp);
                if(t_head==NULL){
                //若头指针为空,则说明没有一个学生,老师同理
                return NULL;
            }
                t_tail->next=NULL;
                return t_head;
            }
            if(user.type==UserTypeTeacher){
            Teacher* t;
            t=(Teacher*)malloc(sizeof(Teacher));
            load_detail(t,user);
            if(t_head==NULL){
                t_head=t;
                t_tail=t;
            }else{
                t_tail->next=t;
                t_tail=t;
            }
            }
        }
    }
}
int show_infor(UserType type){
    if(type==UserTypeStudent){
        Student* s=(Student*)connect_user(UserTypeStudent);
        if(s==NULL){
            //返回的头指针为空,直接退出函数
            printf("无效操作,没有学生名单!\n");
            return 1;
        }
        while(1){
            showStudentinfo(s);
            printf("\n");
            if(s->next==NULL){
                return 0;
            }else{
                s=s->next;
                //移动到下一个人
            }
        }
    }else{
        Teacher* t=(Teacher*)connect_user(UserTypeTeacher);
        if(t==NULL){
            printf("无效操作,没有老师名单!\n");
            return 1;
        }
        while(1){
            showTeacherinfo(t);
            printf("\n");
            if(t->next==NULL){
                return 0;
            }else{
                t=t->next;
            }
        }
    }
}
void infor_search(){
    printf("请输入用户名:");
    char name[6];
    scanf("%s",name);
    //输入需要查询的名字
    FILE* fp=file_open(USER_INFO_PATH,"r");
    //打开文件
    while(1){
        User temp=user_load(fp);
        if(temp.type==UserTypeAdmin){
            continue;
            }
        if (temp.type == UserTypeNone){ 
            fclose(fp);
            printf("用户不存在!!!\n");
            break;
        }else{
            if(strcmp(name,temp.name)==0){
                if(temp.type==UserTypeStudent){
                    Student* s;
                    s=(Student*)malloc(1*sizeof(Student));
                    load_detail(s,temp);
                    printf("***************************\n");
                    printf("查找结果是一个学生,详细信息如下:\n");
                    showStudentinfo(s);
                    break;
                }else{
                    Teacher* t;
                    t=(Teacher*)malloc(1*sizeof(Teacher));
                    load_detail(t,temp);
                    printf("***************************\n");
                    printf("查找结果是一个老师,详细信息如下:\n");
                    showTeacherinfo(t);
                    break;
                }
            }
        }
    }
}
void input_course(Student* s,char** s_course){
    printf("请请选择录入学生的科目成绩:\n");
    for(int i=0;i<5;i++){
        printf("%d.%s\n",i+1,s_course[i]);
    }
    int result=choice(5);
    printf("请输入该课程成绩:");
    int score=0;
    scanf("%d",&score);
    switch(result){
    case 1:
        s->score[0]=score;
        break;
    case 2:
        s->score[1]=score;
        break;
    case 3:
        s->score[2]=score;
        break;
    case 4:
        s->score[3]=score;
        break;
    case 5:
        s->score[4]=score;
        break;
    }
}
void select_student(Student* s){
    printf("请输入用户名:");
    char name[6];
    scanf("%s",name);
    FILE* fp=file_open(USER_INFO_PATH,"r");
    while(1){
        User temp=user_load(fp);
        if(temp.type==UserTypeAdmin){
            continue;
            }
        if(temp.type==UserTypeTeacher){
            continue;
        }
        //跳过老师和管理员
        if (temp.type == UserTypeNone){ 
            fclose(fp);
            printf("用户不存在!!!\n");
            break;
    }else{
        if(strcmp(name,temp.name)==0){
            load_detail(s,temp);
            //加载详细信息
            break;
        }
        }
}
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容