标签:宿舍管理
#include<stdio.h> #include<string.h> #include<stdlib.h> #define M 100 int dirty=0; //用来判断是否已保存操作 //定义一个存储学生相关信息的结构体typedef struct { char S_name[31]; //学生姓名 char S_number[16]; //学生学号 int D_number; //学生所在寝室的宿舍号 int Total; //学生总数 }Student[M], St; //判断学号是否与表中所存学号重复 void S_number_Judge(Student S,int t) { int i; for(i=1;i<=(S->Total)-1;i++) while(strcmp(S[i].S_number,S[t].S_number)==0) { printf("学号输入失败,该学号已存在,请重新输入学号!\n"); printf("请输入学生的学号(15个字符以内):"); scanf("%s",S[t].S_number); getchar(); i=1; } } //添加学生信息函数void Add(Student S) { printf("请输入学生姓名(30个字符以内):"); scanf("%s",S[++(S->Total)].S_name); getchar();//获取换行符 printf("请输入学生的学号(15个字符以内):"); scanf("%s",S[S->Total].S_number); getchar(); S_number_Judge(S,S->Total);//判断输入的学号是否与表中所存在的学号重复 printf("请输入宿舍号码:"); scanf("%d",&S[S->Total].D_number); getchar(); dirty=1; printf("添加成功!\n\n"); } //修改学生信息函数 void Alter(Student S) { int i; int flag=0; //用来判断表中是否存在所要修改的学生的信息 char name[20]; printf("请输入你要修改学生的姓名:"); scanf("%s",name); getchar(); for(i=1;i<=S->Total;i++) if(strcmp(S[i].S_name,name)==0) flag=i; if(!flag) printf("你所要修改的学生信息在表中不存在!\n"); else { printf("新信息如下:\n"); printf("请输入学生姓名(30个字符以内):"); scanf("%s",S[flag].S_name); getchar(); printf("请输入学生的学号(15个字符以内):"); scanf("%s",S[flag].S_number); getchar(); S_number_Judge(S,flag); printf("请输入宿舍号:"); scanf("%d",&S[flag].D_number); getchar(); dirty=1; printf("修改成功!\n"); } putchar(‘\n‘); } //删除学生信息 void Delete(Student S) { int i,j; int flag=0; //用来判断表中是否存在所要删除的学生的信息 char name[20]; printf("请输入你要删除学生的姓名:"); scanf("%s",name); getchar(); for(i=1;i<=S->Total;i++) if(strcmp(S[i].S_name,name)==0) flag=i; if(!flag) printf("你所要删除的学生在表中不存在!"); else { for(i=flag;i<S->Total;i++) { j=i+1; strcpy(S[i].S_name,S[j].S_name); strcpy(S[i].S_number,S[j].S_number); S[i].D_number=S[j].D_number; } (S->Total)--; dirty=1; printf("删除成功!"); } printf("\n\n"); } //显示所有学生信息函数 void Display_All(Student S) { int i; printf("全体学生信息如下:\n"); printf("学生姓名 学生学号 宿舍号\n"); for(i=1;i<=S->Total;i++) printf("%-20s%-15s%-5d\n",S[i].S_name,S[i].S_number,S[i].D_number); putchar(‘\n\n‘); } //排序函数按照寝室号从小到大排序(冒泡法) void Sort_D_number(Student S) { int i,j,t; char name[30]; char number[15]; for(i=1;i<=S->Total;i++) for(j=i;j<=S->Total;j++) if(S[i].D_number>S[j].D_number) { strcpy(name,S[i].S_name); strcpy(number,S[i].S_number); t=S[i].D_number; strcpy(S[i].S_name,S[j].S_name); strcpy(S[i].S_number,S[j].S_number); S[i].D_number=S[j].D_number; strcpy(S[j].S_name,name); strcpy(S[j].S_number,number); S[j].D_number=t; } } //排序函数按照学号从小到大排序(冒泡法) void Sort_S_number(Student S) { int i,j,t; char name[30]; char number[15]; for(i=1;i<=S->Total;i++) for(j=i;j<=S->Total;j++) if(strcmp(S[i].S_number,S[j].S_number)>0) { strcpy(name,S[i].S_name); strcpy(number,S[i].S_number); t=S[i].D_number; strcpy(S[i].S_name,S[j].S_name); strcpy(S[i].S_number,S[j].S_number); S[i].D_number=S[j].D_number; strcpy(S[j].S_name,name); strcpy(S[j].S_number,number); S[j].D_number=t; } } //查询函数以姓名为关键字进行查询(顺序查找) void Query_S_name(Student S) { int i,j=0; char name[31]; printf("请输入你要查找的学生的姓名(30个字符以内):"); scanf("%s",name); getchar(); printf("所查找学生信息如下:\n"); printf("学生姓名 学生学号 宿舍号\n"); for(i=1;i<=S->Total;i++) if(strcmp(name,S[i].S_name)==0) { printf("%-20s%-15s%-5d\n",S[i].S_name,S[i].S_number,S[i].D_number); j=1; } if(!j) printf("\n查找失败,表中不存在该学生的信息!\n\n"); } //查询函数以学号为关键字进行查询(折半查找) void Query_S_number(Student S) { int i,j,top,base,mid; char number[15]; j=0; base=1; top=S->Total; printf("请输入你要查找学生的学号:"); scanf("%s",number); getchar(); Sort_S_number(S); //将表中原数据按照学号从小到大排序 printf("所查找学生信息如下:\n"); printf("学生姓名 学生学号 宿舍号\n"); if(strcmp(number,S[1].S_number)>=0&&strcmp(number,S[S->Total].S_number)<=0) { while(base<=top) { mid=(base+top)/2; if(strcmp(number,S[mid].S_number)==0) { printf("%-20s%-15s%-5d\n",S[i].S_name,S[i].S_number,S[i].D_number); putchar(‘\n‘); j=1; break; } else if(strcmp(number,S[mid].S_number)>0) base=mid+1; else top=mid-1; } } if(!j) printf("\n查找失败,表中不存在该学生的信息!\n\n"); } //查询函数以寝室号为关键字进行查询(折半查找) void Query_D_number(Student S) { int i,j,m,n,base,top,mid; j=0; base=1; top=S->Total; printf("请输入你要查询的寝室号:"); scanf("%d",&i); getchar(); Sort_D_number(S);//将表中原数据按照寝室号从小到大排序 printf("所查找寝室信息如下:\n"); printf("学生姓名 学生学号 宿舍号\n"); if(i>=S[1].D_number&&i<=S[S->Total].D_number) { while(base<=top) { mid=(base+top)/2; if(i==S[mid].D_number) { m=mid; n=mid-1; while(S[m].D_number==i) { printf("%-20s%-15s%-5d\n",S[m].S_name,S[m].S_number,S[m].D_number); m++; if(m>S->Total) break; } if(n>0) { while(S[n].D_number==i) { printf("%-20s%-15s%-5d\n",S[n].S_name,S[n].S_number,S[n].D_number); n--; if(n<1) break; } } j=1; putchar(‘\n‘); break; } else if(i>S[mid].D_number) base=mid+1; else top=mid-1; } } if(!j) printf("\n查找失败,表中不存在该寝室的信息!\n\n"); } //存储函数 void Save(Student S) { St Std; int i; int flag1=0,flag2=0; //判断存储是否成功 FILE *fp; if((fp=fopen("Dorm_Manage","w"))==NULL) { printf("打开文件失败!\n\n"); flag1=1; exit(0); //结束程序 } for(i=1;i<=S->Total;i++) if(fwrite(&S[i],sizeof(Std),1,fp)!=1) { printf("数据写入错误\n\n"); flag2=1; exit(0); } if(!flag1&&!flag2) { printf("数据存储成功!\n\n"); dirty=0; } fclose(fp); } //加载记录函数 void Load(Student S) { St Std; FILE *fp; if((fp=fopen("Dorm_Manage","r"))==NULL) { printf("打开文件失败!\n\n"); exit(0); } while(!feof(fp)) fread(&S[++(S->Total)],sizeof(Std),1,fp); fclose(fp); printf("加载数据成功!\n\n"); (S->Total)--; //由于读取问题表中个数要减去 } //退出程序时判断是否保存函数 void Judge_Save(int i,Student S) { char ch; if(i) { printf("表中数据已改变是否保存后再退出(Y/N)?:"); ch=getchar(); getchar(); while(ch!=‘n‘&&ch!=‘N‘&&ch!=‘y‘&&ch!=‘Y‘) { printf("请输入N(n)或者Y(y):"); ch=getchar(); getchar(); } if(ch==‘y‘||ch==‘Y‘) Save(S); } } //菜单 void Menu() { //菜单 printf(" 宿舍管理\n\n"); printf("*************************************菜单*************************************\n"); printf("1.添加学生信息 | 7.按照寝室号从小到大排序\n"); printf("2.修改学生信息 | 8.按照学号从小到大排序\n"); printf("3.删除学生信息 | 9.显示所有学生的相关信息\n"); printf("4.以姓名查询学生信息 | 10.保存操作\n"); printf("5.以学号查询学生信息 | 11.加载记录\n"); printf("6.以寝室号查询该寝室中的全部学生信息 | 12.退出程序\n"); printf("******************************************************************************\n"); } void main() { int i; Student S; S->Total=0; do { Menu(); printf("请选择所要实现的功能(请输入~12中的任意一个数字):"); scanf("%d",&i); getchar(); //获取换行符 putchar(‘\n‘); switch(i) { case 1:Add(S); break; case 2:Alter(S); break; case 3:Delete(S); break; case 4:Query_S_name(S); break; case 5:Query_S_number(S); break; case 6:Query_D_number(S); break; case 7:Sort_D_number(S); printf("排序完成!\n\n"); break; case 8:Sort_S_number(S); printf("排序完成!\n\n"); break; case 9:Display_All(S); break; case 10:Save(S); break; case 11:Load(S); break; case 12:Judge_Save(dirty,S); exit(0); break; default:printf("选择错误:请在选项到之间选择!\n\n"); break; } }while(i!=12); }
标签:宿舍管理
原文地址:http://11649402.blog.51cto.com/11639402/1787086