Closed woshiayu closed 5 years ago
//头文件 #include <stdio.h> #include <stdlib.h> #include <string.h> //存储学生信息的结构体 typedef struct employee { int num; //学生号 int rnum[5]; //学生房间号 int bnum[3]; //学生床号 char name[10]; //学生姓名 char sex[3]; //学生性别 unsigned char age; //学生年龄 struct employee *next; }EMP; //全局变量 EMP *emp_first,*emp_end; //定义指向链表的头结点和尾节点的指针 char gsave,gfirst; //判断标示 //自定义函数声明 void addemp(void); //添加学生信息的函数 void findemp(void); //查找学生信息的函数 void delemp(void); //删除学生信息的函数 EMP *findnum(int num); //按学生学号查找学生信息 /** * 学生信息添加 */ void addemp() { FILE *fp; //声明一个文件型指针 EMP *emp1; //声明一个结构型指针 int i=0; char choice='y'; if((fp=fopen("employee.dat","ab"))==NULL) //判断信息文件中是否有信息 { printf("打开文件employee.dat出错!\n"); getch(); return; } do{ i++; emp1=(EMP *)malloc(sizeof(EMP)); //申请一段内存 if(emp1==NULL) //判断内存是否分配成功 { printf("内存分配失败,按任意键退出!\n"); getch(); return; } printf("请输入第%d个学生的信息,\n",i); printf("学号:"); scanf("%d",&emp1->num); printf("姓名:"); scanf("%s",&emp1->name); printf("性别:"); scanf("%s",&emp1->sex); printf("年龄:"); scanf("%s",&emp1->age); printf("房间号:"); scanf("%s",&emp1->rnum); printf("床号:"); scanf("%s",&emp1->bnum); emp1->next=NULL; if(emp_first==NULL) //判断链表头指针是否为空 { emp_first=emp1; emp_end=emp1; }else { emp_end->next=emp1; emp_end=emp1; } fwrite(emp_end,sizeof(EMP),1,fp); //对数据流添加数据项 gfirst=0; printf("\n"); printf("\n是否继续输入?(y/n)"); fflush(stdin); //清除缓冲区 choice=getch(); if(toupper(choice)!='Y') //把小写字母转换成大写字母 { fclose(fp); //关闭文件流 printf("\n输入完毕,按任意键返回\n"); getch(); return; } system("cls"); }while(1); } //删除 void delemp() { int findok=0; EMP *emp1,*emp2; char name[10],choice; system("cls"); //对屏幕清屏 printf("\n输入要删除的学生姓名:"); scanf("%s",name); emp1=emp_first; emp2=emp1; while(emp1) { if(strcmp(emp1->name,name)==0) { findok=1; system("cls"); printf("学生:%s的信息如下:\n",emp1->name); printf("学号:%d\n",emp1->num); printf("姓名:%s\n",emp1->name); printf("性别:%s\n",emp1->sex); printf("年龄:%d\n",emp1->age); printf("房间号:%d\n",emp1->rnum); printf("床号:%d\n",emp1->bnum); printf("您真的要删除该学生吗?(y/n)"); fflush(stdin); //清除缓冲区 choice=getchar(); if(choice!='y' && choice!='Y') { return; } if(emp1==emp_first) { emp_first=emp1->next; } else { emp2->next=emp1->next; } printf("学生%s已被删除",emp1->name); getch(); free(emp1); gsave=1; return; } else{ emp2=emp1; emp1=emp1->next; } } if(!findok) { printf("\n没有找到姓名是:%s的信息!\n",name); //没找到信息后的提示 getch(); } return; } void displayemp(EMP *emp,char *field,char *name) { if(emp) { printf("\n%s:%s信息如下:\n",field,name); printf("学号:%d\n",emp->num); printf("姓名:%s\n",emp->name); printf("性别:%s\n",emp->sex); printf("年龄:%d\n",emp->age); printf("房间号:%d\n",emp->rnum); printf("床号:%d\n",emp->bnum); }else { printf("资料库中没有%s为:%s的学生!请重新确认!",field,name); } return; } /** * 按照学生号查询 */ EMP *findnum(int num) //声明一个结构体指针 { EMP *emp1; emp1=emp_first; while(emp1) { if(num==emp1->num) return emp1; emp1=emp1->next; } return NULL; } void menu() { char choice; system("cls"); do{ printf("\n\t\t\t\t 学生管理系统\n\n"); printf("\t\t\t-------------------------------------\n"); printf("\t\t\t|\t\t\t\t |\n"); printf("\t\t\t| \t1、输入学生信息\t\t |\n"); printf("\t\t\t|\t\t\t\t |\n"); printf("\t\t\t| \t2、查询学生信息\t\t |\n"); printf("\t\t\t|\t\t\t\t |\n"); printf("\t\t\t| \t3、显示学生信息\t\t |\n"); printf("\t\t\t|\t\t\t\t |\n"); printf("\t\t\t| \t4、修改学生信息\t\t |\n"); printf("\t\t\t|\t\t\t\t |\n"); printf("\t\t\t| \t5、删除学生信息\t\t |\n"); printf("\t\t\t|\t\t\t\t |\n"); printf("\t\t\t| \t6、统计学生信息\t\t |\n"); printf("\t\t\t|\t\t\t\t |\n"); printf("\t\t\t| \t7、重置系统密码\t\t |\n"); printf("\t\t\t|\t\t\t\t |\n"); printf("\t\t\t| \t0、退出系统\t\t |\n"); printf("\t\t\t|\t\t\t\t |\n"); printf("\t\t\t-------------------------------------\n"); printf("\n\t\t\t请选择您需要的操作:"); do{ fflush(stdin); choice=getchar(); system("cls"); switch(choice) { case '1': addemp(); //调用学生信息添加函数 break; case '2': if(gfirst) { printf("系统信息中无学生信息,请先添加学生信息!\n"); getch(); break; } findemp(); //调用学生信息查找函数 break; case '3': if(gfirst) { printf("系统信息中无学生信息,请先添加学生信息!\n"); getch(); break; } break; case '4': if(gfirst) { printf("系统信息中无学生信息,请先添加学生信息!\n"); getch(); break; } modifyemp(); //学生信息修改函数 break; case '5': if(gfirst) { printf("系统信息中无学生信息,请先添加学生信息!\n"); getch(); break; } delemp(); //删除学生信息的函数 break; case '6': if(gfirst) { printf("系统信息中无学生信息,请先添加学生信息!\n"); getch(); break; } break; default: printf("请输入0~7之间的数字"); getch(); menu(); } } while(choice<'0'||choice>'7'); system("cls"); }while(1); } char *modi_field(char *field,char *content,int len) { char *str; str=malloc(sizeof(char)*len); if(str==NULL) { printf("内存分配失败,按任意键退出!"); getch(); return NULL; } printf("原来%s为:%s\n",field,content); printf("修改为(内容不要超过%d个字符!):",len); scanf("%s",str); return str; } /*读取数据*/ void readdata(void) { FILE *fp; EMP *emp1; if((fp=fopen("employee.dat","rb"))==NULL) { gfirst=1; return; } while(!feof(fp)) { emp1=(EMP *)malloc(sizeof(EMP)); if(emp1==NULL) { printf("内存分配失败!\n"); getch(); return; } fread(emp1,sizeof(EMP),1,fp); if(feof(fp)) break; if(emp_first==NULL) { emp_first=emp1; emp_end=emp1; }else{ emp_end->next=emp1; emp_end=emp1; } emp_end->next=NULL; } gfirst=0; fclose(fp); }
题目名称