数据结构课程设计之宿舍管理系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

##大学
数据结构课程设计报告题目:宿舍管理查询软件
院(系):
学生姓名:
班级:学号:
起迄日期: 2011.6.20--2011.7.1
指导教师:
2010—2011年度第 2 学期
一、需求分析
1.问题描述:
程序设计要求:为宿舍管理人员编写一个宿舍管理查询软件
(1)采用交互工作方式
(2)建立数据文件,数据文件按关键字(姓名、学号、放号)进行排序(冒泡、选择、插入排序等任选一种)
(3) 查询菜单:(用二分查找实现以下操作)
①按姓名查询
②按学号查询
③按放号查询
(4)打印任一查询结果(可以连续操作)
程序分析:
(1)程序采用交互工作方式,也就是说要有一个人性化的操作界面。

将每一种操作赋给一个数字,通过输入不同的数字来实现不同的操作。

这样使人一看就能明白如何实现不同的操作。

全部使用提示选择方式,只需要输入你要使用方式的代号即可。

(2)本系统无数据信息,在使用的时候首先创建一个数据文件,开发一个录入数据的功能,使得所需要的数据存储到软件中,并暂时存在内存中,以便使用。

(3)录入和修改函数:建立相应的函数,在主函数中得到调用,以便于对学生信息的增加和修改。

(4)查询:以不同的关键字分别使用二分查找实现。

(5)为了使用方便和安全,增加了密码登录、密码锁定、退出、删除、全部删除、修改、存储为文本文档信息等功能。

2.基本功能
(1)录入学生信息
(2)显示学生信息(分别按学号、宿舍号、姓名进行排序后显示并在磁盘上以“.txt”格式保存显示的信息)
(3)查询学生信息(分别按学号、宿舍号、姓名进行查询并显示)
(4)修改学生信息(可进行单个删除、全部删除和修改学生信息)
(5)存储学生信息(存储到磁盘上,保存为“.txt”格式)
(6)锁定管理系统(进入密码登录界面,以确保安全)
(7)退出管理系统
3.输入输出
各种功能之间的选择采用了数字提示方式,只需要根据提示进行选择相应的数字,在录入学生信息功能中姓名为长度30以内的任意字符,学生学号和宿舍号控制住15个数字以内。

二、概要设计
1.设计思路:
所有的程序从主函数void main()开始,首先调用了load()函数进行密码登录,然后调用Menu()主菜单函数。

然后在Menu()函数中又依次增加了各种功能,然后通过switch语句分别选择录入、显示、查询、修改、存储、锁定、退出功能。

①选择录入功能时调用Add()录入信息函数;②选择显示功能时,首先调用showhead()表头显示函数,然后分别调用Sort_S_number(Student S[M]),Sort_D_number(Student S[M]),Sort_S_name(Student S[M])函数根据学生学号、学生宿舍号、学生姓名关键字进行冒泡或者直接插入排序方法排序,然后显示;
③选择查询功能时,首先调用searchheader(),表头显示函数,然后分别调用searh_S_number(Student S[M]);searh_D_number(Student S[M]);
searh_S_name(Student S[M]);以学生学号、学生宿舍号、学生姓名为关键字进行查找,然后调用Display_All(Student S[M]);显示函数;④选择修改功能,在通过switch语句进行选择删除、全部删除、修改功能;⑤存储功能进行磁盘文本文档信息存储;⑥锁定功能调用load()登录函数进行锁定;⑦退出功能。

大体框架设计以后,然后依次对每个功能进行详细的设计。

2.数据结构设计:
逻辑结构:线性
存储结构:链式
//----------线性表的静态单链表表示存储结构------------
//定义一个存储学生相关信息的结构体
#define M 100 //链表的最大长度
typedef struct
{
char S_name[31]; //学生姓名
char S_number[16]; //学生学号
char S_sex[15];//学生性别
char D_number[15]; //学生所在寝室的宿舍号
int Total; //学生总数
}Student,St[M];
这种描述方法避免了“指针”类型的使用,在上述描述的链表中,数组的一个分量表示一个结点,同时用游标(总数Total)代替指针指示结点在数组中的相对位置。

数组的第零分量可以看成头结点,其指针域指示链表的第一个结点。

定义程序中用到的抽象数据类型:
ADT List{
数据对象:D={a
i | a
i
∈ElemSet,i=1,2,3……,n,n≥0}
数据关系:R1={<a
i-1,a
i
>| a
i-1
,a
i
∈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已存在。

操作结果:按照学生宿舍号查找指定的某元素。

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 search(Student *S)
④修改学生信息 void Exchange(Student *S)
⑤存储学生信息
⑥锁定管理系统 void load()
⑦退出管理系统
(2)函数原型
Void main();//主函数
void Add(Student S[M]);//声明录入学生信息函数
void Display_All(Student S[M]); //声明显示函数
void Exchangehead();//声明修改学生信息表头函数(删除和修改)
void Clear();//声明清屏函数
void load();//声明登录函数(密码登录和密码锁定)
void Menu();//声明主菜单函数
void searchheader();//声明查询表头函数
void showhead();//声明显示方式表头函数
void Sort_S_number(Student S[M]);//声明学生学号按从小到大的排
序函数(冒泡法/直接插入法)
void Sort_D_number(Student S[M]);//声明排序函数按照宿舍号从小
到大排序(冒泡法/直接插入法)
void Sort_S_name(Student S[M]);//按姓名排序(冒泡法/直接插入法)
void searh_S_number(Student S[M]);//声明查询函数以学号为关键字
进行查询(折半查找)
void searh_D_number(Student S[M]);//声明查询函数以宿舍号为关键
字进行查询(折半查找)
void searh_S_name(Student S[M]);//查询函数以姓名为关键字进行查
询(折半查找)
(3)关系图
(见详细设计)
三、详细设计
1.所有用到的数据结构的基本操作实现
(1)录入学生信息
void Add(Student *S) //定义录入函数
{
do
{cout<<"请输入第"<<S[0].Total+1<<"个学生的信息\n\n";
cin>>S[S[0].Total+1].S_number;//输入学生学号
cin>>S[S[0].Total+1].S_name;//输入学生姓名
cin>>S[S[0].Total+1].S_sex;//输入学生性别
cin>>S[S[0].Total+1].D_number;//输入学生宿舍号
S[0].Total++;//每增加一个学生信息,总数++
cout<<"按数字“0”退出,任意键继续录入"<<endl;
cin>>ch;
}while(strcmp(ch,ch1)!=0);
}
(2)显示所学生信息
void Display_All(Student *S) //定义显示函数
{ if(S[0].Total>0){
for(i=1;i<=S[0].Total;i++)
cout<<S[i].S_name<<S[i].S_number<<S[i].S_sex<<S[i].D_number<<endl;} else
Cout<<"无任何学生信息"<<endl;
}
(3)按姓名查找(折半查找)
void searh_S_name(Student *S)//查询函数以姓名为关键字进行查询(折半查找)
{
cout<<"请输入你要查找学生的姓名:";
cin>>name;
Sort_S_name(S);//调用学生姓名按从小到大的冒泡排序函数
while(low<=high)
{ mid=(low+high)/2;
if(strcmp(name,S[mid].S_name)==0) //如果中间值和要查找的值匹配
{ int i=mid;j=1;
for(i=mid+1;i<=high;i++)
//因为姓名有可能是相同的,所以继续在mid—high区间进行顺序查找
{ if(strcmp(name,S[i].S_name)==0)
{
cout<<S[i].S_name<<S[i].S_number<<endl;
cout<<S[i].S_sex<<S[i].D_number<<endl;
}
for(i=mid-1;i>=low;i--)
//因为姓名有可能是相同的,所以继续在low-mid区间进行顺序查找
{if(strcmp(name,S[i].S_name)==0)
{cout<<S[i].S_name<<S[i].S_number<<endl;
cout<<S[i].S_sex<<S[i].D_number<<endl;
}
break;
}
else
if (strcmp(name,S[mid].S_name)>0)
low=mid+1;
else
high=mid-1;
}
if(j!=1)//判断是否查到学生信息
}
(4)按学号为关键字进行查询(折半查找)
void searh_S_number(Student *S)//查询函数以学号为关键字进行查询(折半查找)
{ c in>>number;//输入要查找的学生学号
Sort_S_number(S);//调用学生学号按从小到大的冒泡排序函数
if(strcmp(number,S[1].S_number)==0)
//如果要查找的和链表中的第一个相同就直接输入
{j=1;//判断是否查找到
Cout<<endl;}
else
if(strcmp(number,S[(S[0].Total)].S_number)==0)
//如果要查找的和链表中的最后一个信息相同就直接输出
{j=1;//判断是否查找到
Cout<<endl;}
else
{
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(number,S[mid].S_number)==0)
{//要查找的学号和链表中间值相同
int i=mid;
j=1;//判断是否查找到
break;
}
else
if (strcmp(number,S[mid].S_number)>0)
low=mid+1; //要查找的学号大于MID的学号
else
high=mid-1; //要查找的学会小于mid的学号}
}
if(j!=1)//判断是否查找到
}
(5)按宿舍号为关键字查找
void searh_D_number(Student *S)//查询函数以宿舍号为关键字进行查询(折半查找)
{ cin>>number;//输入要查找的宿舍号
Sort_D_number(S);//调用学生学号按从小到大的冒泡排序函数
while(low<=high)
{ mid=(low+high)/2;
if(strcmp(number,S[mid].D_number)==0)
{//要查找的宿舍号和mid的信息相同
j=1;//判断是否查找到
for(i=mid+1;i<=high;i++)
{//宿舍号有可能相同,所以在查到一个所需的信息后仍需要继续查找,所以在剩下mid--high的区间里继续查找
if(strcmp(number,S[i].D_number)==0)
Cout<<endl;
}
for(i=mid-1;i>=low;i--)
{//在low--mid区间进行顺序查找
if(strcmp(number,S[i].D_number)==0)
{cout<<endl;}
break; }
Else if (strcmp(number,S[mid].D_number)>0)
low=mid+1;
else high=mid-1; }
if(j!=1)//判断是否查找到
} }
(6)按学号直接插入排序
void Sort_S_number(Student *S)
{∥本算法是利用监视哨对num1进行直接插入排序
for(i=2;i<=n;i++) ∥假定第一个记录有序
{ strcpy(num1,S[i].S_number);∥将待排序记录放进监视哨
strcpy(num2,S[i].D_number);
strcpy(name,S[i].S_name);
j=i-1;
∥从后向前查找插入位置,将大于待排序记录向后移动
while (R[0].key< S[j].key)
{ strcpy(S[j+1].S_name,S[j].S_name);
strcpy(S[j+1].S_number,S[j].S_number);
strcpy(S[j+1].D_number,S[j].D_number);
j--; ∥记录后移
}∥while
strcpy(S[j+1].S_name,name);
strcpy(S[j+1].S_number,num1);
strcpy(S[j+1].D_number,num2); ∥将待排序记录放到合适位置
} }
(7)按宿舍号冒泡排序
void Sort_D_number(Student *S)//排序函数按照宿舍号从小到大排序(冒泡法) {
for(i=1;i<=S[0].Total;i++)
for(j=i;j<=S[0].Total;j++)
if(S[i].D_number>S[j].D_number)
{
S[i]↔S[j]; //将S[i]和S[j]的信息进行交换
}
}
(8)按学生姓名进行冒泡排序
void Sort_S_name(Student *S)//按姓名排序(冒泡法)
{for(i=1;i<=S[0].Total;i++)
for(j=i;j<=S[0].Total;j++)
if(strcmp(S[i].S_name,S[j].S_name)>0)
{
S[i]↔S[j]; //将S[i]和S[j]的信息进行交换


2.其他函数的实现
(1)主函数
void main()
{
load();//调用登录函数
Menu();//调用主菜单函数
}
(2)登录函数
void load()//登录函数
{//本函数是把登录密码变为“*”
system("color 2");//控制台字体颜色为绿色
cout<<" 帐号:";cin>>n1;
cout<<" 密码:";
char a[40],b[10]={"200907161"};//初始化原密码
for(i=0;;i++)
{
a[i]=getch();//输入一个字符,不在屏幕回显,并将输入的字符赋给a[i]
if(a[i]!='\r')//如果没遇到回车符则在屏幕显示“*”
Cout<<"*";//在屏幕上显示“*”
else
{
a[i]='\0'; //遇到回车符则结束输入
if(strcmp(a,b)==0&&n1==200907161)
{//进行帐号和密码匹对
cout<<"\n\n 登录成功。

\n"<<endl;
}
else
{
cout<<"\n\n 用户名或密码错误。

\n"<<endl;
goto loop;//返回继续输入用户名和密码
}
break;
}
}
}
(3)单个删除学生信息(因学生的学号是唯一的,所以通过学号删除比较可靠)
Void exchange1()
{int flag=0; //用来判断表中是否存在所要删除的学生的信息
cin>>number;//要删除的学生学号
for(i=1;i<=S[0].Total;i++)
if(strcmp(S[i].S_number,number)==0)
flag=i;
if(!flag)
{
cout<<"\n你所要删除的学生在表中不存在!\n"<<endl;
}
else
{
for(i=flag;i<=S->Total;i++)
{
j=i+1;
S[i]↔ S[j];//交换S[i]和S[j]的信息
}
S[0].Total--;//链表长度减少1
}
}
(4)全部删除
S[0].Total=0;//将链表长度置为0
(5)修改信息
Void exchange2()
{ int flag=0; //用来判断表中是否存在所要修改的学生的信息cin>>number;//要修改的学生学号
for(i=1;i<=S[0].Total;i++)
if(strcmp(S[i].S_number,number)==0)
flag=i;
if(!flag)
cout<<"\n你所要修改的学生在表中不存在!\n"<<endl;
else
{ cin>>S[flag].S_number;//修改后的学号
cin>>S[flag].S_name;//修改后的姓名
cin>>S[flag].S_sex;//修改后的性别
cin>>S[flag].D_number;//修改后的学号
}
}
3.
录入函数
插入排序
4.函数之间的调用关系图
四、调试分析
1.实际完成的情况说明
完成密码登陆、录入学生信息、显示学生信息(分别按学号、宿舍号、姓名排序后显示)、查询学生信息(按学号、宿舍号、姓名查找)、修改学生信息(单个删除、全部删除、修改信息)、存储学生信息、锁定管理系统、退出管理系统等功能。

2.程序的性能分析
1.void Sort_D_number(Student *S)//按照宿舍号从小到大排序(冒泡法) 时间复杂度T(n)=O(n²),空间复杂度S(n)=O(1),稳定(只进行元素间的顺序移动)。

2.void Sort_S_name(Student *S)//按姓名排序(冒泡法)
时间复杂度T(n)=O(n²),空间复杂度S(n)=O(1),稳定(元素间的顺序移动)。

3.void Sort_S_number(Student *S) //按照学号从小到大排序(冒泡法) 时间复杂度T(n)=O(n²),空间复杂度S(n)=O(1),稳定(元素间的顺序移动)。

4.void Sort_S_number(Student *S) //直接插入法按照学号从小到大排序时间复杂度T(n)=O(n²),空间复杂度S(n)=O(1),稳定(元素间的顺序移动)3.上机过程中出现的问题及其解决方案
(1)首先在登录函数时使得密码变为“*”时,使用getch()函数时,输入密码时并不是一个一个的显示*,而是等全部输完后一起显示*。

为了解决此问题上网查询了很多资料,原来getch并不是标准的C++库函数,根据提示,加入了回车符的判断,使得密码以*显示出来。

(2)调用显示函数不显示以录入的学生信息,通过同学的帮忙和自己的调试以后发现,在调用函数的时候把链表的总数S[0].Total重新初始化为0,使得每次调用的时候链表中的信息全部删除。

后来在Menu()函数中使用了loop环,使其避免了调用S[0].Total初始化为0。

(3)修改函数一开始为独立的函数,而这样的话又重新出现了显示函数把链
表初始化为0的错误,而且使用loop环过多,使得独立函数和Menu()函数中的loop不能统一起来,无法使得程序连续操作,所以将修改函数在Menu()中使用switch语句调用。

4.程序中可以改进的地方说明
(1)本程的显示函数有待改进,当按宿舍号进行排序时,如果宿舍号相同的,显示的时候不能在按其他的次关键字进行排序。

(2)本程序密码和帐号有待改进,进行帐号和密码的修改。

(3)本程序的宿舍录入管理中还和现实有差距,没有对宿舍人员的限制,还需要进一步判断宿舍中是否注满人。

5.程序中可以扩充的功能及设计实现假想
(1)现在的宿舍管理软件宿舍可以无限制住人,应该进行限制,并且可以当录入信息时,如果入住的宿舍住满可以提供其他宿舍选择。

(2)修改学生信息时也应该进行宿舍提供信息,当学生搬出宿舍或者换宿舍时,软件中应该有相应的记录。

五、测试结果
1.登录测试
(合法数据)
(非法数据)
2.录入学生信息
3.按学号大小显示
4.按宿舍号大小显示
5.按学生姓名排序显示
6.按学生查找(冯帅)
查找(风)
7.按学号查找(200907161)
8.按宿舍查找(427)
查找(428)
9.当个删除
10.修改函数
11.存储信息
12.锁定系统
13.全部删除
14.全部删除后再显示
六、用户手册
1.录入学生信息
2.修改学生信息
七、体会与自我评价
在刚拿到课题的时候,浏览了很多的题目,感觉哪个都不知道怎么下手,本来想选一个通讯录的软件制作,因为感觉比较实用,但是晚了一步,被别的同学“抢”走了,然后选择了这个宿舍管理查询软件。

刚拿到这个课题,虽然这个课题的要求挺少看着也挺简单,可真不知道怎么下手。

后来仔细想了想,写了写提纲,然后在网上搜集了相关的资料,看了看别人的软件如何
实现的,比较了几个类似的程序,然后心里有了点头绪。

然后按网上的程序的步骤,一点点添加自己的东西。

首先确立了程序的界面框架,在纸上把节目设计出来,将基本的功能写上。

然后一点一点用程序语言写出来。

开始的时候把功能列出来以后感觉挺容易的了,把就是相当于写几个小程序合并起来吗,写单独功能的程序很简单,可是把界面和所有的功能联系起来就出问题了,不是这里显示不正确就是那里出现了问题。

印象很深的问题就是显示函数,一个显示函数很快就写出来了,而且也没有错误,可是当放进整个程序的时候就是不显示正确的结果,后来经过一上午的调试终于搞定了,原来就是定义的时候把链表的长度始终初始化为0了,所以不管怎么显示都是没有任何信息的。

调试了整整一上午,可是晚上又出问题了,是在查询函数上。

当录入信息后,在没有进行查询功能时可以显示所有的信息,可是当进行查询功能后,再次进行显示时又出来“无任何信息”,虽然吸取了上次的错误,可是还是经过了艰难的调试过程才发现,每次进行查询功能后,返回主菜单时,因为我在主菜单的开头就“S[0].Total=0”初始化了链表长度,所以每次返回主菜单时都使得链表的长度初始化为0,所以显示才有错误。

所以,为了解决这个问题,我在主菜单中利用了loop环,直接跳回初始化下边的菜单函数,而这么做却是程序显得复杂了,本来有些函数是独立,而现在却成了主菜单的一部分,失去了简洁感。

经过这次的课程设计,更加了解了数据结构,有了更新的认识。

其实从这次实验中认识到,我距离高手还很远,编程有很多的乐趣也有很多的技巧性和知识性。

我将在从以后的日子里继续认真的学习知识,积累经验,让自己的编程能力提高。

源代码
#include<iostream>
#include<conio.h>
#include<fstream>
#include<iomanip>
using namespace std;
#include<string.h>
#define M 100
//定义一个存储学生相关信息的结构体
typedef struct
{
char S_name[31]; //学生姓名
char S_number[16]; //学生学号
char S_sex[15];//学生性别
char D_number[15]; //学生所在寝室的宿舍号
int Total; //学生总数
}Student,St;
void Add(Student S[M]);//声明录入学生信息函数
void Clear();//声明清屏函数
void load();//声明登录函数
void Menu();//声明主菜单函数
void searchheader();//声明查询函数
void Display_All(Student S[M]); //声明显示函数
void Sort_S_number(Student S[M]);//声明学生学号按从小到大的冒泡排序函数
void showhead();//声明显示方式表头函数
void Sort_D_number(Student S[M]);//声明排序函数按照宿舍号从小到大排序(冒泡法)
void Sort_S_name(Student S[M]);//按姓名排序(冒泡法)
void searh_S_number(Student S[M]);//声明查询函数以学号为关键字进行查询(折半查找) void searh_D_number(Student S[M]);//声明查询函数以宿舍号为关键字进行查询(折半查找) void searh_S_name(Student S[M]);//查询函数以姓名为关键字进行查询(折半查找)
void Exchangehead();//定义修改学生信息表头函数
//********************************主函数开始**********************************************
void main()
{
load();//调用登录函数
Menu();//调用主菜单函数
}
//*******************************主函数结束*********************************************
void Menu()//主菜单函数
{
Student S[M]; S[0].Total=0;
int choice;
loop1: cout<<"\t◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎\n"<<endl;
cout<< " 欢迎使用宿舍管理系统\n "<<endl;
cout<<"\t◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎\n\n"<<endl;
cout<< " ◎◎◎◎◎◎◎◎◎主菜单◎◎◎◎◎◎◎◎◎\n "<<endl;
cout<<" ①录入学生信息\n"<<endl;
cout<<" ②显示学生信息\n"<<endl;
cout<<" ③查询学生信息\n"<<endl;
cout<<" ④修改学生信息\n"<<endl;
cout<<" ⑤存储学生信息\n"<<endl;
cout<<" ⑥锁定管理系统\n"<<endl;
cout<<" ⑦退出管理系统\n"<<endl;
cout<<"\t◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎\n"<<endl;
cout<<" 请选择:";
cin>>choice;
system("cls");//清屏函数;
switch(choice)
{
case 1://录入学生信息
{
Add( S);//调用录入学生信息函数
system("cls");//清屏函数
goto loop1;
}
case 2://显示学生信息
{
int choice2;
loop2: showhead();
cin>>choice2;
if(choice2==1)
{
Sort_S_number(S);//调用按学号大小冒泡排序函数
system("cls");//清屏函数
cout<<" 按学号大小显示信息"<<endl;
Display_All(S) ;//调用显示学生信息函数
//*****************学生信息按学号大小保存文件开始******************************************************
int i;
ofstream output("宿舍学生信息按学号大小记录.txt");//初始化输出流对象
output<<"\n\n"<<endl;
output<<"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|"<<endl;
output<<"|学号大小显示信息|"<<endl;
output<<"| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄|"<<endl;
output<<"|学生姓名|学生学号|学生性别|宿舍号|"<<endl;
for(i=1;i<=S[0].Total;i++)
{
output<<"| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄|"<<endl;
output<<"|"<<setw(10)<<S[i].S_name<<"|"<<setw(14)<<S[i].S_number<<"|"<<setw(10)<<S[i].S_sex<<"|"<<setw(8)<<S[i].D_number<<"|"<<endl;
}
output<<"  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄"<<endl;
//*****************学生信息按学号大小保存文件结束******************************************************
Clear();
goto loop2;
system("cls");//清屏函数
}
else if(choice2==2)
{
Sort_D_number(S);//调用按宿舍号大小冒泡排序函数
system("cls");//清屏函数
cout<<" 按宿舍大小显示信息"<<endl;
Display_All(S) ;//调用显示学生信息函数
//*****************学生信息按宿舍大小保存文件开始******************************************************
ofstream output("宿舍学生信息按宿舍大小大小记录.txt");//初始化输出流对象
int i;
output<<"\n\n"<<endl;
output<<"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|"<<endl;
output<<"|宿舍大小显示信息|"<<endl;
output<<"| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄|"<<endl;
output<<"|学生姓名|学生学号|学生性别|宿舍号|"<<endl;
for(i=1;i<=S[0].Total;i++)
{
output<<"| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄
 ̄|"<<endl;
output<<"|"<<setw(10)<<S[i].S_name<<"|"<<setw(14)<<S[i].S_number<<"|"<<setw(10)<<S[i].S_sex<<"|"<<setw(8)<<S[i].D_number<<"|"<<endl;
}
output<<"  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄"<<endl;
//*****************学生信息按宿舍号大小保存文件结束******************************************************
Clear();
goto loop2;
system("cls");//清屏函数
}
else if(choice2==3)
{
Sort_S_name(S);//按姓名排序(冒泡法)
system("cls");//清屏函数
cout<<" 按姓名先后显示信息"<<endl;
Display_All(S) ;//调用显示学生信息函数
//*****************学生信息按姓名先后保存文件开始******************************************************
ofstream output("宿舍学生信息按姓名先后小记录.txt");//初始化输出流对象
int i;
output<<"\n\n"<<endl;
output<<"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|"<<endl;
output<<"|按姓名先后显示信息|"<<endl;
output<<"| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄|"<<endl;
output<<"|学生姓名|学生学号|学生性别|宿舍号|"<<endl;
for(i=1;i<=S[0].Total;i++)
{
output<<"| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄|"<<endl;
output<<"|"<<setw(10)<<S[i].S_name<<"|"<<setw(14)<<S[i].S_number<<"|"<<setw(10)<<S[i].S_sex<<"|"<<setw(8)<<S[i].D_number<<"|"<<endl;
}
output<<"  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄"<<endl;
//*****************学生信息按姓名先后保存文件结束
******************************************************
Clear();
goto loop2;
Clear();
}
else if(choice2==4)
{
system("cls");//清屏函数
goto loop1;
}
else
{
cout<<"输入错误,请重新输入。

"<<endl;
Clear();
goto loop2;
}
}
case 3://查询学生信息
{
int choice3;
loop3: searchheader();//调用查询表头函数
cin>>choice3;
if(choice3==1)//按姓名查询
{
system("cls");//清屏函数
searh_S_name(S);//查询函数以姓名为关键字进行查询(折半查找)
Clear();
goto loop3;
}
else
if(choice3==2)//按学号查询
{
system("cls");//清屏函数
searh_S_number(S);//调用查询函数以学号为关键字进行查询(折半查找)
Clear();
goto loop3;
}
else
if(choice3==3)//按宿舍号查询
{
system("cls");//清屏函数
searh_D_number(S);//调用查询函数以宿舍号为关键字进行查询(折半查找)
Clear();
goto loop3;
}
else
if(choice3==4)//返回上级菜单
{
system("cls");//清屏函数
goto loop1;
}
else //输入错误
{
cout<<"选择错误,请重新输入。

"<<endl;
Clear();
goto loop3;
}
}
case 4: //修改学生信息
{
loop4: Exchangehead();//调用修改学生信息表头函数
int choice1;
cin>>choice1;
if(choice1==1)//单个删除
{
int i,j;
int flag=0; //用来判断表中是否存在所要删除的学生的信息
char number[20];
cout<<"请输入你要删除学生的学号:";
cin>>number;
for(i=1;i<=S[0].Total;i++)
if(strcmp(S[i].S_number,number)==0)
flag=i;
if(!flag)
{
cout<<"\n你所要删除的学生在表中不存在!\n"<<endl;
Clear();
goto loop4;
}
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);
strcpy(S[i].D_number,S[j].D_number);
}
S[0].Total--;
cout<<"删除成功!\n"<<endl;
Clear();
goto loop4;
}
}
else if(choice1==2)//全部删除
{
S[0].Total=0;
cout<<"删除成功。

"<<endl;
Clear();
goto loop4;
}
else
if(choice1==3)//修改信息
{
system("cls");//清屏函数
int i;
int flag=0; //用来判断表中是否存在所要修改的学生的信息
char number[20];
cout<<"请输入你要修改的学生的学号:";
cin>>number;
for(i=1;i<=S[0].Total;i++)
if(strcmp(S[i].S_number,number)==0)
flag=i;
if(!flag)
{
cout<<"\n你所要修改的学生在表中不存在!\n"<<endl;
Clear();
goto loop4;
}
else
{
cout<<"\n\n"<<endl;
cout<<"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|"<<endl; cout<<"|修改前的学生信息|"<<endl; cout<<"| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄|"<<endl; cout<<"|学生姓名|学生学号|学生性别|宿舍号|"<<endl;
cout<<"| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄|"<<endl;
cout<<"|"<<setw(10)<<S[flag].S_name<<"|"<<setw(14)<<S[flag].S_number<<"|"<<setw(10)<<S[flag].S_sex<<"|"<<setw(8)<<S[flag].D_number<<"|"<<endl;
cout<<"  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄"<<endl;
cout<<" *************** 学生信息修改*****************\n";
cout<<" 学号:";
cin>>S[flag].S_number;
cout<<" 姓名:";
cin>>S[flag].S_name;
cout<<" 性别(男/女):";
cin>>S[flag].S_sex;
cout<<" 宿舍号:";
cin>>S[flag].D_number;
cout<<"\n";
cout<<"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|"<<endl;
cout<<"|修改后的学生信息|"<<endl;
cout<<"| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄|"<<endl;
cout<<"|学生姓名|学生学号|学生性别|宿舍号|"<<endl;
cout<<"| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄|"<<endl;
cout<<"|"<<setw(10)<<S[flag].S_name<<"|"<<setw(14)<<S[flag].S_number<<"|"<<setw(10)<<S[flag].S_sex<<"|"<<setw(8)<<S[flag].D_number<<"|"<<endl;
cout<<"  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄"<<endl;
Clear();
goto loop4;
}
}
else
if(choice1==4)//返回上级菜单
{
system("cls");//清屏函数
goto loop1;
}
else//输入错误
{
cout<<"选择错误,请重新选择。

"<<endl;
Clear();
goto loop4;
}
}
case 5://存储学生信息
{
ofstream output("宿舍全体学生信息.txt");//初始化输出流对象
int i;
output<<"\n\n"<<endl;
output<<"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|"<<endl;
output<<"|宿舍全体学生信息|"<<endl;
output<<"| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄|"<<endl;
output<<"|学生姓名|学生学号|学生性别|宿舍号|"<<endl;
for(i=1;i<=S[0].Total;i++)
{
output<<"| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄|"<<endl;
output<<"|"<<setw(10)<<S[i].S_name<<"|"<<setw(14)<<S[i].S_number<<"|"<<setw(10)<<S[i].S_sex<<"|"<<setw(8)<<S[i].D_number<<"|"<<endl;
}
output<<"  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄"<<endl;
cout<<"存储成功。

"<<endl;
Clear();
goto loop1;
}
case 6:system("cls");//锁定管理系统
load();
goto loop1;
case 7://退出管理系统
break;
default:
cout<<" 输入错误,请重新选择。

"<<endl;
Clear();
goto loop1;
}
}
void showhead()//定义显示方式表头函数
{
cout<<"\t◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎\n"<<endl;
cout<< " 欢迎使用宿舍管理系统\n "<<endl;
cout<<"\t◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎◎\n\n"<<endl;。

相关文档
最新文档