《实验5宿舍管理系统.doc》由会员分享,可在线阅读,更多相关《实验5宿舍管理系统.doc(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实验报告课程名称数据结构实验成绩实验名称查找和排序方法的综合性、设计性、创新性实验学号B姓名 班级B日期12.5.21-22实验目的: 掌握数据结构的两种基本技术:查找和排序,根据实际情况选择效率较高的算法解决应用问题。实验条件:计算机一台,visual C+6.0实验内容与步骤:1. 问题描述为宿舍管理人员设计一个宿舍管理查询系统, 程序采用交互工作方式,完成下列功能:建立合适的数据结构作为查找表并输入数据;数据分别按关键字姓名、学号、房号进行排序(所学排序算法任选一种效率较高的算法);设计查询菜单,按指定关键字姓名、学号、房号进行查询并输出结果,要求查询采用效率较高的算法实现;可以连续查询
2、;2. 数据结构类型定义typedef structchar S_name31; /学生姓名 char S_number16; /学生学号int D_number; /学生所在寝室的宿舍号Stud;typedef struct Stud studentM; int Total; /学生总数Stu,*St;3. 模块划分(1) 添加学生信息:void Add(St S)(2) 判断学生学号是否重复:void S_number_Judge(St S,int t)(3) 修改学生信息:void Alter(St S)(4) 删除学生信息:void Delete(St S)(5) 显示所有学生信息:v
3、oid Display_All(St S)(6) 按照寝室号从小到大排序:void Sort_D_number(St S)(7) 按照学号从小到大排序:void Sort_S_number(St S)(8) 以姓名为关键字查找:void Query_S_name(St S)(9) 以学号为关键字进行查找:oid Query_S_number(St S)(10) 以寝室号为关键字进行查找:void Query_D_number(St S)(11) 查找操作二级菜单:void Search(St S)(12) 存储函数:void Save(St S)(13) 加载函数:void Load(St S
4、)(14) 判断是否存储过:void Judge_Save(int i,St S)(15) 一级菜单:void Menu()(16) 主函数:void main()4. 详细设计#include#include#include#define M 100int change=0; /用来判断是否已保存操作/定义一个存储学生相关信息的结构体typedef structchar S_name31; /学生姓名 char S_number16; /学生学号int D_number; /学生所在寝室的宿舍号Stud;typedef struct Stud studentM; int Total; /学生
5、总数Stu,*St;/判断学号是否与表中所存学号重复void S_number_Judge(St S,int t)int i;for(i=1;iTotal)-1;i+)if(i!=t)while(strcmp(S-studenti).S_number,(S-studentt).S_number)=0)&(i!=t)printf(学号输入失败,该学号已存在,请重新输入学号!n);printf(请输入学生的学号(15个字符以内):); scanf(%s,(S-studentt).S_number);getchar();i=1;/添加学生信息函数void Add(St S) printf(请输入学生
6、姓名(30个字符以内):);scanf(%s,(S-student+(S-Total).S_name);getchar();/获取换行符printf(请输入学生的学号(15个字符以内):);scanf(%s,(S-studentS-Total).S_number); getchar();S_number_Judge(S,S-Total);/判断输入的学号是否与表中所存在的学号重复printf(请输入宿舍号码:);scanf(%d,&(S-studentS-Total).D_number);getchar();change=1;printf(添加成功!nn);/修改学生信息函数void Alte
7、r(St S)int i;int flag=0; /用来判断表中是否存在所要修改的学生的信息char name20;printf(请输入你要修改学生的姓名:); scanf(%s,name);getchar();for(i=1;iTotal;i+)if(strcmp(S-studenti).S_name,name)=0)flag=i;if(!flag)printf(你所要修改的学生信息在表中不存在!n);elseprintf(新信息如下:n);printf(请输入学生姓名(30个字符以内):);scanf(%s,(S-studentflag).S_name);getchar();printf(
8、请输入学生的学号(15个字符以内):);scanf(%s,(S-studentflag).S_number);getchar();S_number_Judge(S,flag);printf(请输入宿舍号:);scanf(%d,&(S-studentflag).D_number);getchar();change=1;printf(修改成功!n);putchar(n);/删除学生信息void Delete(St S)int i,j;int flag=0; /用来判断表中是否存在所要删除的学生的信息char name20;printf(请输入你要删除学生的姓名:);scanf(%s,name);
9、getchar();for(i=1;iTotal;i+)if(strcmp(S-studenti).S_name,name)=0)flag=i;if(!flag)printf(你所要删除的学生在表中不存在!);else for(i=flag;iTotal;i+) j=i+1; strcpy(S-studenti).S_name,(S-studentj).S_name); strcpy(S-studenti).S_number,(S-studentj).S_number); (S-studenti).D_number=(S-studentj).D_number; (S-Total)-;chang
10、e=1;printf(删除成功!);printf(nn);/显示所有学生信息函数void Display_All(St S)int i;printf(全体学生信息如下:n);printf(学生姓名 学生学号 宿舍号n);for(i=1;iTotal;i+)printf(%-20s%-15s%-5dn,(S-studenti).S_name,(S-studenti).S_number,(S-studenti).D_number);putchar(nn);/排序函数按照寝室号从小到大排序(冒泡法)void Sort_D_number(St S)int i,j,t;char name30;char
11、number15;for(i=1;iTotal;i+)for(j=i;jTotal;j+)if(S-studenti).D_number(S-studentj).D_number)strcpy(name,(S-studenti).S_name);strcpy(number,(S-studenti).S_number);t=(S-studenti).D_number;strcpy(S-studenti).S_name,(S-studentj).S_name);strcpy(S-studenti).S_number,(S-studentj).S_number);(S-studenti).D_num
12、ber=(S-studentj).D_number;strcpy(S-studentj).S_name,name);strcpy(S-studentj).S_number,number);(S-studentj).D_number=t;/排序函数按照学号从小到大排序(冒泡法)void Sort_S_number(St S)int i,j,t;char name30;char number15;for(i=1;iTotal;i+)for(j=i;jTotal;j+)if(strcmp(S-studenti).S_number,(S-studentj).S_number)0)strcpy(name
13、,(S-studenti).S_name);strcpy(number,(S-studenti).S_number);t=(S-studenti).D_number;strcpy(S-studenti).S_name,(S-studentj).S_name);strcpy(S-studenti).S_number,(S-studentj).S_number);(S-studenti).D_number=(S-studentj).D_number;strcpy(S-studentj).S_name,name);strcpy(S-studentj).S_number,number);(S-stud
14、entj).D_number=t;/查询函数以姓名为关键字进行查询(顺序查找)void Query_S_name(St S)int i,j=0;char name31;printf(请输入你要查找的学生的姓名(30个字符以内):);scanf(%s,name);getchar();printf(所查找学生信息如下:n);printf(学生姓名 学生学号 宿舍号n);for(i=1;iTotal;i+)if(strcmp(name,(S-studenti).S_name)=0)printf(%-20s%-15s%-5dn,(S-studenti).S_name,(S-studenti).S_nu
15、mber,(S-studenti).D_number); j=1; if(!j)printf(n查找失败,表中不存在该学生的信息!nn);/查询函数以学号为关键字进行查询(折半查找)void Query_S_number(St S)int flag,top,bottom,mid;char number15;flag=0;bottom=1;top=S-Total;printf(请输入你要查找学生的学号:);scanf(%s,number);getchar();Sort_S_number(S); /将表中原数据按照学号从小到大排序printf(所查找学生信息如下:n);printf(学生姓名 学生
16、学号 宿舍号n);if(strcmp(number,(S-student1).S_number)=0&strcmp(number,(S-studentS-Total).S_number)=0)while(bottomstudentmid).S_number)=0) printf(%-20s%-15s%-5dn,(S-studentmid).S_name,(S-studentmid).S_number,(S-studentmid).D_number);putchar(n);flag=1;break;else if(strcmp(number,(S-studentmid).S_number)0)b
17、ottom=mid+1;elsetop=mid-1;if(!flag)printf(n查找失败,表中不存在该学生的信息!nn);/查询函数以寝室号为关键字进行查询(折半查找)void Query_D_number(St 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-student1).
18、D_number&istudentS-Total).D_number)while(basestudentmid).D_number)m=mid; n=mid-1;while(S-studentm).D_number=i)printf(%-20s%-15s%-5dn,(S-studentm).S_name,(S-studentm).S_number,(S-studentm).D_number); m+;if(mS-Total)break;if(n0)while(S-studentn).D_number=i)printf(%-20s%-15s%-5dn,(S-studentn).S_name,(S
19、-studentn).S_number,(S-studentn).D_number); n-;if(n(S-studentmid).D_number)base=mid+1;elsetop=mid-1;if(!j)printf(n查找失败,表中不存在该寝室的信息!nn);void Search(St S)int j;printf(*n);printf(*按1按姓名查找*n);printf(*按2按学号查找*n);printf(*按3按寝室号查找*n);printf(*n);doprintf(请输入信息n);scanf(%d,&j);getchar();putchar(n);switch(j)ca
20、se 1 : Query_S_name(S); break;case 2 : Query_S_number(S); break;case 3 : Query_D_number(S); break; default: printf(选择错误:请在选项之间选择!nn); break;while (j!=1)&(j!=2)&(j!=3);/存储函数void Save(St S)Stud Std;int i;int flag1=0,flag2=0; /判断存储是否成功FILE *fp; if(fp=fopen(Dorm_Manage,w)=NULL) printf(打开文件失败!nn); flag1=
21、1; exit(0); /结束程序for(i=1;iTotal;i+) if(fwrite(&S-studenti,sizeof(Std),1,fp)!=1) printf(数据写入错误nn); flag2=1;exit(0); if(!flag1&!flag2) printf(数据存储成功!nn);change=0; fclose(fp);/加载记录函数void Load(St S)Stud Std;FILE *fp;if(fp=fopen(Dorm_Manage,r)=NULL)printf(打开文件失败!nn);exit(0);while(!feof(fp)fread(&S-studen
22、t+(S-Total),sizeof(Std),1,fp);fclose(fp); printf(加载数据成功!nn); (S-Total)-; /由于读取问题,表中个数要减去/退出程序时判断是否保存函数void Judge_Save(int i,St S)if(i) Save(S);exit(0);/菜单void Menu()/菜单printf(欢迎进入宿舍管理系统nn);printf(*菜单*n);printf(按a.添加学生信息n);printf(按b.修改学生信息n);printf(按c.删除学生信息n);printf(按d.查询学生信息n);printf(按e.显示所有学生信息n);
23、printf(按f.保存信息n);printf(按g.载入信息n);printf(按h保存退出n);printf(*n);void main()char i;St S;S=(St)malloc(sizeof(Stu);S-Total=0;doMenu();printf(请选择所要实现的功能(请输入ah中的任意一个数字):);scanf(%s,&i);getchar(); /获取换行符putchar(n);switch(i)case a:Add(S); break;case b:Alter(S); break;case c:Delete(S); break;case d:Search(S); break;case e:Display_All(S); break;case f:Save(S); break;case g:Load(S); break;case h:Judge_Save(change,S); exit(0); break;default:printf(选择错误:请在选项之间选择!nn); break;while(i!=h);5. 测试数据及结果实验总结(结论或问题分析):通过本次上机实验,初步学会了如何进行简单系统的设计,了解了结构化程序设计的重要性。学会了用文件保存和加载信息,根据实际情况选择效率较高的算法解决排序和查找数据信息。
限制150内