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;
}
}
}
}
