《数据结构课程设计之宿舍管理系统》由会员分享,可在线阅读,更多相关《数据结构课程设计之宿舍管理系统(42页珍藏版)》请在金锄头文库上搜索。
1、#大学数据结构课程设计报告题目: 宿舍管理查询软件 院(系): 学生姓名: 班级: 学号: 起迄日期: 2011.6.20-2011.7.1指导教师: 指导教师评语: 成绩:签名:年 月 日20102011 年度 第 2 学期 一、需求分析1.问题描述:程序设计要求:为宿舍管理人员编写一个宿舍管理查询软件(1)采用交互工作方式(2)建立数据文件,数据文件按关键字(姓名、学号、放号)进行排序(冒泡、选择、插入排序等任选一种)(3) 查询菜单:(用二分查找实现以下操作)按姓名查询按学号查询按放号查询(4)打印任一查询结果(可以连续操作)程序分析:(1)程序采用交互工作方式,也就是说要有一个人性化的
2、操作界面。将每一 种操作赋给一个数字,通过输入不同的数字来实现不同的操作。这样使人一看就能明白如何实现不同的操作。全部使用提示选择方式,只需要输入你要使用方式的代号即可。(2)本系统无数据信息,在使用的时候首先创建一个数据文件,开发一个录入数据的功能,使得所需要的数据存储到软件中,并暂时存在内存中,以便使用。(3)录入和修改函数:建立相应的函数,在主函数中得到调用,以便于对学生信息的增加和修改。(4)查询:以不同的关键字分别使用二分查找实现。 (5)为了使用方便和安全,增加了密码登录、密码锁定、退出、删除、全部删除、修改、存储为文本文档信息等功能。 2.基本功能(1)录入学生信息(2)显示学生
3、信息(分别按学号、宿舍号、姓名进行排序后显示并在磁盘上以“.txt”格式保存显示的信息)(3)查询学生信息(分别按学号、宿舍号、姓名进行查询并显示)(4)修改学生信息(可进行单个删除、全部删除和修改学生信息)(5)存储学生信息(存储到磁盘上,保存为“.txt”格式)(6)锁定管理系统(进入密码登录界面,以确保安全)(7)退出管理系统 3.输入输出各种功能之间的选择采用了数字提示方式,只需要根据提示进行选择相应的数字,在录入学生信息功能中姓名为长度30以内的任意字符,学生学号和宿舍号控制住15个数字以内。二、 概要设计1.设计思路:所有的程序从主函数void main()开始,首先调用了load
4、()函数进行密码登录,然后调用Menu()主菜单函数。然后在Menu()函数中又依次增加了各种功能,然后通过switch语句分别选择录入、显示、查询、修改、存储、锁定、退出功能。选择录入功能时调用Add()录入信息函数;选择显示功能时,首先调用showhead()表头显示函数,然后分别调用Sort_S_number(Student SM),Sort_D_number(Student SM),Sort_S_name(Student SM)函数根据学生学号、学生宿舍号、学生姓名关键字进行冒泡或者直接插入排序方法排序,然后显示;选择查询功能时,首先调用searchheader(),表头显示函数,然后
5、分别调用searh_S_number(Student SM);searh_D_number(Student SM);searh_S_name(Student SM);以学生学号、学生宿舍号、学生姓名为关键字进行查找,然后调用Display_All(Student SM);显示函数;选择修改功能,在通过switch语句进行选择删除、全部删除、修改功能;存储功能进行磁盘文本文档信息存储;锁定功能调用load()登录函数进行锁定;退出功能。大体框架设计以后,然后依次对每个功能进行详细的设计。2.数据结构设计:逻辑结构:线性存储结构:链式/-线性表的静态单链表表示存储结构- /定义一个存储学生相关信息
6、的结构体 #define M 100 /链表的最大长度typedef struct char S_name31; /学生姓名 char S_number16; /学生学号 char S_sex15;/学生性别char D_number15; /学生所在寝室的宿舍号 int Total; /学生总数Student,StM;这种描述方法避免了“指针”类型的使用,在上述描述的链表中,数组的一个分量表示一个结点,同时用游标(总数Total)代替指针指示结点在数组中的相对位置。数组的第零分量可以看成头结点,其指针域指示链表的第一个结点。定义程序中用到的抽象数据类型:ADT List数据对象:D=a i|
7、 ai ElemSet,i=1,2,3,n,n0数据关系:R1=| ai-1,ai D,i=1,2,3,,n基本操作:Add(Student *S)初始条件:链表不存在。操作结果:录入信息进行创建新的链表 Display_All(S)初始条件:链表 S 已存在操作结果:打印所有 S 的数据searh_S_name(Student *S)初始条件:链表S已存在。操作结果:按照名字查找指定的某元素。searh_S_number(Student *S)初始条件:链表S已存在。操作结果:按照学生学号查找指定的某元素。searh_D_number(Student *S)初始条件:链表S已存在。操作结果:
8、按照学生宿舍号查找指定的某元素。Sort_D_number(Student *S)初始条件:链表 S 已存在。操作结果:对链表 S 按照宿舍号的大小进行排序。Sort_S_name(Student *S)初始条件:链表 S 已存在。操作结果:对链表 S 按照学生姓名的先后进行排序。Sort_S_number(Student *S)初始条件:链表 S 已存在。操作结果:对链表 S 按照学生学号的大小进行排序。3.软件结构设计:(1)模块划分录入学生信息 void Add(Student *S)显示学生信息 void Display_All(Student *S)查询学生信息 void searc
9、h(Student *S)修改学生信息 void Exchange(Student *S)存储学生信息锁定管理系统 void load()退出管理系统(2)函数原型Void main();/主函数void Add(Student SM);/声明录入学生信息函数void Display_All(Student SM); /声明显示函数void Exchangehead();/声明修改学生信息表头函数(删除和修改)void Clear();/声明清屏函数void load();/声明登录函数(密码登录和密码锁定)void Menu();/声明主菜单函数void searchheader();/声明
10、查询表头函数void showhead();/声明显示方式表头函数void Sort_S_number(Student SM);/声明学生学号按从小到大的排序函数(冒泡法/直接插入法) void Sort_D_number(Student SM);/声明排序函数按照宿舍号从小到大排序(冒泡法/直接插入法)void Sort_S_name(Student SM);/按姓名排序(冒泡法/直接插入法) void searh_S_number(Student SM);/声明查询函数以学号为关键字进行查询(折半查找)void searh_D_number(Student SM);/声明查询函数以宿舍号为
11、关键字进行查询(折半查找)void searh_S_name(Student SM);/查询函数以姓名为关键字进行查询(折半查找)(3)关系图(见详细设计)三、 详细设计 1.所有用到的数据结构的基本操作实现 (1)录入学生信息void Add(Student *S) /定义录入函数 docoutSS0.Total+1.S_number;/输入学生学号cinSS0.Total+1.S_name;/输入学生姓名cinSS0.Total+1.S_sex;/输入学生性别cinSS0.Total+1.D_number;/输入学生宿舍号S0.Total+;/每增加一个学生信息,总数+coutch;whi
12、le(strcmp(ch,ch1)!=0);(2)显示所学生信息void Display_All(Student *S) /定义显示函数 if(S0.Total0)for(i=1;iname;Sort_S_name(S);/调用学生姓名按从小到大的冒泡排序函数 while(low=low;i-) /因为姓名有可能是相同的,所以继续在low-mid区间进行顺序查找if(strcmp(name,Si.S_name)=0)cout0) low=mid+1; else high=mid-1; if(j!=1)/判断是否查到学生信息 (4) 按学号为关键字进行查询(折半查找)void searh_S_n
13、umber(Student *S)/查询函数以学号为关键字进行查询(折半查找) cinnumber;/输入要查找的学生学号Sort_S_number(S);/调用学生学号按从小到大的冒泡排序函数 if(strcmp(number,S1.S_number)=0)/如果要查找的和链表中的第一个相同就直接输入j=1;/判断是否查找到Cout0) low=mid+1; /要查找的学号大于 MID的学号else high=mid-1; /要查找的学会小于mid的学号 if(j!=1)/判断是否查找到 (5)按宿舍号为关键字查找void searh_D_number(Student *S)/查询函数以宿舍
14、号为关键字进行查询(折半查找) cinnumber;/输入要查找的宿舍号Sort_D_number(S);/调用学生学号按从小到大的冒泡排序函数while(low=low;i-)/在low-mid区间进行顺序查找if(strcmp(number,Si.D_number)=0)cout0) low=mid+1; else high=mid-1; if(j!=1)/判断是否查找到 (6)按学号直接插入排序void Sort_S_number(Student *S)本算法是利用监视哨对num1进行直接插入排序for(i=2;iSj.D_number) SiSj; /将Si和Sj的信息进行交换(8)按
15、学生姓名进行冒泡排序void Sort_S_name(Student *S)/按姓名排序(冒泡法)for(i=1;i0)SiSj; /将Si和Sj的信息进行交换2.其他函数的实现(1)主函数void main()load();/调用登录函数 Menu();/调用主菜单函数(2)登录函数void load()/登录函数/本函数是把登录密码变为“*”system(color 2);/控制台字体颜色为绿色coutn1;coutnumber;/要删除的学生学号for(i=1;iTotal;i+)j=i+1; Si Sj;/交换Si和Sj的信息S0.Total-;/链表长度减少1 (4)全部删除S0.Total=0;/将链表长度置为0(5)修改信息Void exchange2() int flag=0; /用来判断表中是否存在所要修改的学生的信息cinnumber;/要修