C++ C 客房管理系统含源代码文档格式.docx
《C++ C 客房管理系统含源代码文档格式.docx》由会员分享,可在线阅读,更多相关《C++ C 客房管理系统含源代码文档格式.docx(43页珍藏版)》请在冰豆网上搜索。
在程序中需要浏览客户的信息,应提供显示、统计、查询、修改等操作;
另外还应提供键盘式选择菜单实现功能选择。
2.2开发环境
系统开发平台:
中文windowsxp
系统开发工具:
MicrosoftVisualC++6.0。
系统开发语言:
C++
3详细设计
按照需求分析所得,客房信息系统有以下几个功能模块:
1.新建两个类;
分别为Customer和Room,其中Customer类中包含住客姓名、身份证号、年龄、入住日期等相关信息,Room类包含房间号,类型,价格等相关信息。
2.录入客房信息;
先判断是否已存在客房信息,如果已存在,则提示选择是否再次添加;
若不存在,则添加客房信息。
3.住客登记模块;
页面首先显示目前剩余客房信息,后提示客户选择入住房号,登记相关客户信息,登记入住成功。
4.修改客房信息;
读取保存的客房信息数据,根据客房编号查找所需修改的客房信息,然后根据具体所需,修改成员参数。
5.退房结算模块;
页面首先显示目前已住客房信息,后提示客户选择退房房号,确认退房后,解除客户与客房关联,并提示需要缴纳房费金额,退房成功。
6.查询客房函数;
分按编号、类型、客户姓名查找客房信息,同时可以查看当日所有客房、已住客房、剩余客房信息,这样可以更具有人性化来选择所剩余的客房,从而进行日常安排。
7.删除客房信息模块;
从保存中的文件中读取信息,删除需要删除的信息,完善现在的客房运作。
8.退出系统函数;
在退出系统的同时,进行文件保存,方便日后再次读取客房信息。
根据需求分析,可以对这个系统的设计分为以下几个模块:
3.1类的设计
根据需求分析,有客房类和客户类。
(1)客户类
客户类中的主要成员有:
name为客户姓名,id为客户身份证号码,
age为年龄,roomnum为入住房号。
开始初始化。
具体如下:
stringname;
//姓名
stringid;
//身份证号
stringsex;
//性别
intage;
//年龄
introomnum;
//入住房号
stringruzhum;
//入住日期
stringruzhut;
//入住时间
stringlidianm;
//离店日期
stringlidiant;
//离店时间
intstaytime;
//入住天数
(2)客房类
客房类中的主要成员有:
num是客房编号,type是客房类型,price是客房价格,具体如下:
intnum;
//房号
intprice;
//价格
stringtype;
//类型
intrenshu;
//入住人数
intyajin;
//客房押金
3.2主函数设计:
主界面中显示客房管理系统的全部信息,客房信息的录入,客人入住登记,客房信息的修改,客人退房结算,查询(包括按房间号,按房间类型,按客户姓名查询,同时还有输出所有空房信息,所有客房信息,已住客房信息),删除客房信息。
最开始先读入客房、住客文件中的信息,然后通过switch函数调用其它函数实现其它功能。
[流程图]:
显示各功能选项
酒店客房管理系统如图1所示。
3.3客房录入函数设计
调用该函数模块时,先利用for循环查找是否已经有客房信息,如果已有客房信息,提示是否再次添加,然后依次录入房型、价格等信息。
最后通过if,elseif函数实现继续添加客房的功能。
如图2所示。
3.4入住登记模块设计
入住登记时,先显示当日剩余未住客房情况,供客户选择,后通过cin、cout提示用户,读入客户信息,与客房信息相关联。
如图3所示。
3.5客房信息修改模块设计
提示根据编号寻找到客房并输出该客房内容,然后询问用户是否要修改客房信息,修改界面如图4所示。
图4修改客房信息的分界面
3.6退房结算模块设计
一个好的客房管理系统,必然要有退房结算功能。
该功能通过显示已住客房信息,提示客户输入入住的客房号,搜索客房号,找到房号后,会显示应该收取的房费金额,确认退房后,该客房号信息重新初始化,达到退房目的。
如图5所示:
3.7查询模块设计
分别实现按房间号、按姓名,和按房间类型查询客房信息的功能,还可实现输出所有客房信息、空房信息、已住房信息的功能。
如图6所示。
3.8客房信息删除模块设计
提示根据编号寻找到客房并输出该客房内容,然后询问用户是否要删除客房信息
通过IF语句,如果该客房下仍有住客,提示是否仍要删除客房、住客信息。
,删除界面如图7所示。
图7删除客房信息的界面
3.9保存文件和读入文件功能模块设计
为了方便之后进行维护,应该具备保存客户和客房信息的功能,所以进行该模块设计。
在主函数模块中,开始先读入客房、客户信息文件中的信息,分门别类的存进数组中,再进行增加、查找、修改等,后在选择主界面中退出系统选项时,保存已经存入数组的信息。
关键代码如下:
voidwrite(Room*room,Customer*customer)//保存房间信息
{ofstreamStr("
客房信息.txt"
ios_base:
:
trunc);
ofstreamC("
客户信息.txt"
if(!
Str||!
C)
{cout<
<
"
文件存入失败!
;
return}
for(inti=0;
i<
30;
i++)
{if(room[i].num!
=0)
{Str<
room[i].num<
\t"
room[i].type<
room[i].price<
room[i].renshu<
room[i].yajin<
endl;
}}
for(intj=0;
j<
j++)
{if(customer[j].roomnum!
=0)
{C<
customer[j].roomnum<
customer[j].name<
customer[j].id<
customer[j].sex
customer[j].age<
customer[j].ruzhum<
customer[j].ruzhut
<
customer[j].lidianm<
customer[j].lidiant<
customer[j].staytime<
}
Str.close();
C.close();
4所遇到的问题和分析解决
1、在最初开始,我先把客房信息和客户信息设置成结构体,但是后来发现,结构体数组初始化有点麻烦,需要用到for循环,于是用了类,然后构造函数初始化客房类和客户类里的相关信息。
然后在保存文件函数和读入文件函数模块,我运用了read和write函数直接读取文件和存入文件。
但是在存入的时候导致了一系列问题,在保存文件里出现了很多“烫”字,之后上网查了很多信息,但是一直没查到解决的方案,一直调试都没有成功。
最后,我不得已用了<
>
>
两个读取符,一个一个把数组中的字符(串)存入文件中。
在存入文件的时候,存入的时候字符与字符之间没有间隔,导致读取的时候,出现一整片读取错误的状况。
后来,修改了存入文件中,用‘\t’设置字符跳格之后,读取文件成功。
2、在客房录入函数模块中,我设置了客房录入从房间号300开始。
但是这样子,遇到了一些问题。
比如,虽然在第一次的时候,能正确录入。
但是当再次录入的时候,也依旧从房间号300开始录入,相当于前面录入的客房信息已经被抹掉了。
经过我从网上查询后,运用了static函数。
因为static函数有这样的作用,平时无static定义的变量的含义是由程序自动控制变量的生存周期,通常指的就是变量在进入其作用域的时候被分配,离开其作用域的时候被释放;
而static不一样,变量在程序初始化时被分配,直到程序退出前才被释放;
也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期。
所以我在客房录入函数模块中,运用了static函数定义房间号number变量,使其成为静态局部变量。
这样就可以在每次退出系统后,都记录之前最后一次录入的房间号了。
3、在程序编译时常常会出现各种或多或少的错误提示,其原因往往是程序代码出现了一些细节上的简单错误,或是分号缺失,或是大括号不对应,或是未定义变量等各种常见错误。
这些错误虽不是致命性的严重失误但却影响了程序的编译和连接,最终仍不能使程序正常执行。
为了能够消除这些错误,必须不断地、反复地修改程序代码,并且不断的调试运行。
5系统特色及关键技术
本系统在设计之初,有很多可圈可点的想法点子,让系统有一定的特色。
但在实际操作过程中,却出现各种各样的问题,包括时间问题,个人水平问题等等,导致有些功能不能得以实现。
故在系统完成后,我审阅了程序,没有很大的特色。
但是小特色还是有以下几点的。
1、在房间录入函数模块,如果之前已经录入了房间,会有提示说之前已经录入客房信息,是否再次录入。
这是比较人性化的一方面。
这个主要是在录入客房信息时,运用了for函数循环查找是否之前已经录入了客房信息,然后用if语句在已经录入和未录入之间选择,组成了以上的可以提示信息的功能。
2、在住客入住登记模块,在开始的界面,会首先提示当日剩余的客房信息,包括类型、价格等等,以便供客户更好的选择房间。
这里没有用到多大的技术,主要是在该函数模块里面,调用了剩余客房函数模块,使其先显示剩余客房信息,让客户有更好的选择权。
cout<
今日本酒店剩余空房如下:
for(inti=0;
{
if(room[i].renshu==0&
&
room[i].num!
cout<
房间号码:
房间类型:
房间价格:
p++;
3、在退房结算模块,在提示客户确认需要退掉的房间后,还会自动显示当前应该缴纳的房费。
这一功能主要通过调用该客户的信息以及入住的天数,房间的价格等,进行一个四则运算后得出来的。
关键代码如下。
房客信息如下:
客户姓名:
客户身份证号码:
endl<
客户共入住:
天,共需交费:
n<
元整。
确定要退掉客房?
(Y/N)"
6结论
(一)系统完成情况
本次课程设计,大体上完成了老师对客房管理系统的要求。
该系统能简单实现对客栈的住宿情况进行管理。
客房包括以下信息:
房号、房型、单价(每床)、已住人数;
客户包括以下信息:
住客姓名、性别、年龄、身份、身份证号码,房号,床号,入住日期、入住时间、离店日期、离店时间。
并且我把这些信息应存放在两个文件中,分别是客房信息文件、客户信息文件。
在系统退出后,可以以TXT的形式保存客房和客户信息。
同时,在登陆系统的时候,可以读入已经保存的客房和客户信息。
这样可以避免每次登陆和退出系统时信息的丢失。
本系统具有以下的功能:
1.具有建立数据文件(客房信息文件、住客信息文件)功能;
6.具有多种统计功能(要求有一定的实用性)
(如某客房当前有那些空床、某住客应付多少费用等)
7、在系统界面,比如客房录入、入住登记等界面,都有比较人性化的功能,能显示已经录入或者该房是否已经入住等等提示。
(二)未能完成和有待改进之处
由于本人的技术水平问题和时间问题,本系统有不少不足之处。
比如没有排序功能。
虽然在登记入住过程中,能显示剩余客房的情况,但是只能按照房间号来排序,没有能进行房间类型或者房间价格来排序,这是不足的地方。
还有,没能统计当天到底一共入住了多少个客房,只能显示所有的已住客房数。
这也是不足之处。
(三)课程设计期间的收获
通过此次课程设计,我更加理解和懂得运用结构化程序设计的思想和方法,初步掌握开发一个小型实用系统的基本方法,学会调试一个较长程序的的基本方法,学会利用流程图表示算法,进一步掌握和提高利用C++语言进行程序设计的能力。
在课程设计中遇到了许多的调试不出结果出乎意料的问题。
在调试的过程中,得到了许多以后可以避免错误的经验。
也得到了很多没有接触过的知识。
这些都使我获益匪浅。
最大的收获是,编写程序时一定要有信心和勇气,要相信自己一定可以把这个程序编写出来。
分析问题做出算法,想好思路,在心里有个大致的框架,然后按部就班的记下自己想到的每一点内容,把写下的东西认真整理,查缺补漏,把一些细节的地方补上,就这样一个貌似很难的程序就写出来了(其实编程并不难,关键是要投入,要钻到里面去)。
下一步就是读程序了,读程序时一定要小心仔细,一条语句、一条语句的读,看是否能输出自己想要输出的结果,如果发现错误要马上改过来,再接着向下读,直到把程序调试的完美无缺为至。
附:
源代码:
#include<
iostream>
string>
fstream>
usingnamespacestd;
/*问题描述:
至少包括以下信息:
这些信息应存放在两个文件中,分别是客房信息文件、住客信息文件。
房型"
可取值1-3,分别表示单人间、双人间、通铺(可以住很多人的房间)
功能要求:
(如某客房当前有那些空床、某住客应付多少费用、某天住店总人数和总收入等)
说明:
(1)功能各方面越完善越好
(2)自定义的数据结构可以使用数组,链表,树等,可以使用多种数据结构来存放数据,然后在其上使用不同的排序算法。
(3)若用数组,必须动态分配空间(文本文件中最好有一行来表示数组应该有多大,这样便于动态分配空间)
*/
//*************************************************类定义
classCustomer//住客信息类
public:
stringname;
Customer()
{
name="
无"
id="
0"
sex="
age=-1;
roomnum=0;
ruzhum="
ruzhut="
lidianm="
lidiant="
staytime=0;
};
~Customer(){};
};
classRoom//客房类
intnum;
Room()
num=0;
price=0;
type=50;
renshu=0;
yajin=0;
~Room(){};
//**************************************************************************************客房信息录入功能
voidroom_luru(Room*room);
voidroom_luru2(Room*room);
voidroom_luru(Room*room)//无房,添房函数
if(room[0].num==0)
intsize;
staticintNumber=300;
cout<
目前暂无房间信息,请添加!
请输入要添加的房间数:
cin>
size;
for(inti=0;
{
room[i].num=Number++;
cout<
room[i].num;
房间类型:
cin>
room[i].type;
房间价格:
room[i].price;
};
客房信息录入成功!
}
else
stringP;
客房信息已有,是否还要添加房间?
P;
if(P=="
Y"
)
room_luru2(room);
elseif(P=="
N"
已取消房间添加."
elsecout<
此操作非法!
system("
pause"
);
cls"
//****************************************************************************
voidroom_luru2(Room*room)//有房,添加房间函数
staticintNumber=300;
stringP;
do{
//intNumber=300;
if(room[i].num==0)
{
room[i].num=Number++;
cout<
cin>
房间添加成功,是否继续添加?
(Y/N):
break;
}
elseNumber++;
}while(P=="
if(P=="
已取消添加。
elsecout<
//*************************************************************************************入住登记功能
voidcheck_in(Room*room,Customer*customer);
voidcheck_in(Room*room,Customer*customer)
intp=0;
stringb;
if(room[i].renshu==0&
co