资源描述
面向对象程序设计II
课程设计指导书
题目: 宾馆管理系统
学院: 计算机科学与工程学院
专业: 软件工程
班级: 133301
学号: 20233503 20233490 20233482
姓名:王帅 刘俊 甘雨
指导老师: 韩旭明
设计日期:2023.6.24-2023.6.30
一、课程设计的目的
1) 学习综合运用C高级语言课程和其他先修课程的知识,提高分析和解决实际问题的的能力,进一步巩固、加深和拓宽所学的知识;进一步加强结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解。
2) 全面系统的学习面向对象程序设计的基本概念、基本语法和编程方法;独立完毕有一定工作量的程序设计任务,同时强调好的程序设计风格。
3) 掌握程序设计中的常用算法和C语言的编程技巧和上机调试程序的方法。
4) 在参与一系列子项目的实践过程中,提高如何综合运用所学知识解决实际问题的能力,以及获得相关项目管理和团队合作等众多方面的具体经验。
二、 课程设计的任务
按照如下规定,运用C++语言,编写一套可用的较为完善的宾馆住宿管理系统软件(两人分模块合作)
1) 对宾馆基本信息【房间数量、房间类别(标间、单间、套房)、收费标准等】在适当范围内自行规定。
2) 可以实现预定登记、入住登记、退房结算等功能;房间状态(空房、入住、预定)可以以一定方式直观地表现。
3) 可以录入住宿人员信息、计算客户消费总额并生成账单,账单信息存入到磁盘文献当中去。
4) 可以相对灵活地查询房间状态、入住情况、空房情况、预订情况等内容。
5) 可以产生各类报表,如房间信息、入住信息、消费表单等在磁盘文献当中可以查看它们的信息。
三、系统设计方案
3.1系统具体描述
3.1.1系统设计背景
随着人民生活水平的提高,旅游出行的人越来越多,宾馆的客流量不断增长,普通的手写登记太过复杂经常出现信息丢失,也不适合现在的节约型社会的发展,宾馆在正常运营中需要对客房资源、顾客信息、退房信息等进行管理,运用客房管理系统及时了解各个环节中信息的变更,有助于提高管理的效率。 本项目作为c++课程设计的训练项目提出,目的是为了提高同学们系统的开发,则提高大家的实践能力。所以开发一个符合自身宾馆实际情况的工作平台是十分必要的。
3.1.2系统设计具体信息
系统使用对象设定为百康宾馆。百康酒店是一家乡镇中小型宾馆,三层建筑,拥有各类房间共20间。其中一层均为单人间,共9间,房号101-109;二层为均双人间,共6间,房号201-206;三层均为豪华套房,共5间,房号301-305。
各类房间均设有电视、橱柜、内网电话、风扇、暖气等基础设施,24小时热水供应,可淋浴。
一层前台处设有便捷商店,当时结算,不计入住宿账单。可通过内网电话购买,免费送至房间。
A、收费标准:有按天计费和按小时计费两种收费标准。
按天计费,标准为单人间 170元/天,双人间280元/天,豪华套房500元/天。
按小时计费,标准为单人间20元/小时,双人间30元/小时,豪华套房50元/小时。
B、计时标准:按天计费时,从0时至次日0时计一天,不满一天按一天计算;按小时计费时,不满一小时按一小时计费。(特殊情形的优惠政策不在本设计考虑范围之内)
C、定金标准:入住定金按(预计入住时间*其单日房费+500元)收取,退房时充作房费和房屋设施折损费(抵偿损坏的房内设施),多退少补。预定定金(按预计订房时间*相应房间按天计算住宿价格*40%)收取,若届时不入住且不续订,则不再退还;若届时入住,充作入住定金,多退少补。电话预定无需缴纳定金,但不保证届时有空房间。
注:定金数额可在以上标准数额之上,退房结算时多退少补。
退房时,室内设施经确认无损坏情况,则不收取房屋设施折损费。
3.2功能模块划分
3.2.1功能模块描述
根据任务内容规定及宾馆相关情况等信息,百康宾馆住宿管理系统需要实现查询功能(涉及客房总体使用情况查询、已入住客房查询、已预订客房查询、闲置房间信息查询等查询方式),订房登记,入住登记,退房结算等四大基本功能。系统应实现对各类信息的灵活查找,客户信息的录入、保存与调用,自动结算并生成账单等操作。
为了简化前台人员操作并提高其工作效率,还应实现开始前初始化询问,订房或入住登记时自动显示当前闲置房间,入住前询问是否已预订,输入错误信息时进行提醒等人性化功能。
由以上分析,将系统重要分为以下四大功能模块,如图3.1所示:
1) 客房查询:涉及查询客房总体使用情况、查询当前闲置房间信息、查询已入住房间信息、查询已预定房间信息等查询功能;
2) 订房登记:涉及显示当前闲置房间信息、登记预定信息等功能;
3) 入住登记:涉及显示当前房间总体使用情况、询问是否预定过房间、登记入住人信息等功能;
4) 退房结算:涉及选择结算方式、输入结算时间、计算住宿费用等功能。
百康宾馆住宿管理系
订房登记
入住登记
客房查询
退房结算
客房总体信息查询
已预订房间信息查询
已入住房间信息查询
闲置房间信息查询
图3.1功能模块结构图
3.2.2输入项
以下输入项均为键盘输入:
num——房间号 ,int
kongxian——房间是否空闲 ,int
name[20]——名字定义, char name[20]
ID[20]——身份证号(18位阿拉伯数字),char ID[20]
lianxifangshi[15]——联系方式(11位阿拉伯数字), char lianxifangshi[15]
yajin——押金, int
yudingriqi——预定日期(日期均为8位阿拉伯数字,格式为年月日), long
ruzhushijian——入住日期 ,long
tianshu——预计天数, int
jiezhiriqi——截止日期 ,long
p——是否初始化(0或1), int
chose——选择主菜单(1,2,3,4或5), int
t——计费方式(1或2), int
i——子菜单选择(1,2,3,4或5)(不同模块也许定义不同), int
a——是否预定过房间(在ruzhudengji()定义的),int
3.2.3输出项
房间号, int
房间类型 , char leixing[10]
价格(元/天), int
价格(元/小时) ,int
是否空闲 ,int
客人姓名,char name[20]
身份证,char ID[20]
联系方式 ,charlianxifangshi[15]
押金(元), int
预定日期 ,long
入住时间 ,long
预计天数, int
截止日期, long
四、系统实现与测试
4.1主菜单模块实现
4.1.1主菜单流程图
图4.1主菜单流程图
4.1.2主菜单代码
void Menu_Display()
{
system("cls");
cout<<"\t\t###########################################"<<endl;
cout<<"\t\t# @欢迎使用百康宾馆管理系统@ #"<<endl;
cout<<"\t\t# 请输入您所需要的功能: #"<<endl;
cout<<"\t\t# 1.客房查询 2.订房登记 #"<<endl;
cout<<"\t\t# 3.入住登记 4.退 房 #"<<endl;
cout<<"\t\t# 5. 退 出 #"<<endl;
cout<<"\t\t# 感 * 谢 * 您 * 的 * 使 * 用 #"<<endl;
cout<<"\t\t###########################################"<<endl;
}
void chushihua()
{
int i[3]={1,0,1},k=0;
for(;k<20;k++)
{
hotel[k].num=i[0]*100+i[1]*10+i[2];
strcpy(hotel[k].ID,"0");
hotel[k].jiezhiriqi=0;
hotel[k].kongxian=0;
strcpy(hotel[k].lianxifangshi,"0");
strcpy(hotel[k].name,"0");
hotel[k].ruzhushijian=0;
hotel[k].tianshu=0;
hotel[k].yudingriqi=0;
switch(i[0])
{
case 1:{hotel[k].jiage=17020;strcpy(hotel[k].leixing,"单人间");break;}
case 2:{hotel[k].jiage=28030;strcpy(hotel[k].leixing,"双人间");break;}
case 3:{hotel[k].jiage=50050;strcpy(hotel[k].leixing,"套房");break;}
}
if(k==8)
i[0]++,i[2]=0;
if(k==14)
i[0]++,i[2]=0;
i[2]++;
}
fstream xieru("宾馆房间信息.txt",ios::out);
xieru<<"房间号 类型 价格 是否空闲 姓名 身份证号 联系方式 押金 预定日期 入住时间 天数 截止日期 "<<endl;
for(int x=0;x<20;x++)
{
xieru<<hotel[x].num<<' '<<hotel[x].leixing<<' '<<hotel[x].jiage<<' '<<hotel[x].kongxian<<' '<<hotel[x].name
<<' '<<hotel[x].ID<<' '<<hotel[x].lianxifangshi<<' '<<hotel[x].yajin<<' '<<hotel[x].yudingriqi<<' '<<hotel[x].ruzhushijian
<<' '<<hotel[x].tianshu<<' '<<hotel[x].jiezhiriqi<<endl;
}
xieru.close();
}
void main()
{
int p=0;
cout<<"是否要初始化房间信息?";
cout<<"(是请输入1,否请输入0)"<<endl;
cin>>p;
if(p==1)
chushihua();
int chose;
Menu_Display();
cout<<"请输入选项:";
cin>>chose;
while(chose!=0)
{
switch(chose)//用switch语句判断选择菜单的功能
{
case 1:search_message();break; //客房查询
case 2:dingfangdengji();break;//订房间
case 3:ruzhudengji();break;//入住房间
case 4:tuifang();break;//退房
case 5:exit(0);
default:cout<<"输入错误,请重新输入"<<endl; //提醒错误命令
}
cout<<"\t\t###########################################"<<endl;
cout<<"\t\t# @欢迎使用百康宾馆管理系统@ #"<<endl;
cout<<"\t\t# 请输入您所需要的功能: #"<<endl;
cout<<"\t\t# 1.客房查询 2.订房登记 #"<<endl;
cout<<"\t\t# 3.入住登记 4.退 房 #"<<endl;
cout<<"\t\t# 5. 退 出 #"<<endl;
cout<<"\t\t# 感 * 谢 * 您 * 的 * 使 * 用 #"<<endl;
cout<<"\t\t###########################################"<<endl;
cout<<"请输入选项:";
cin>>chose;
while(chose==0)
{
cout<<"输入错误,按任意键退出程序:"<<endl;
exit(0);
}
}
}
4.1.3主菜单模块测试
主菜单界面中显示客房管理系统的功能选项模块如图4.2所示:
图4.2主菜单
4.2入住登记模块实现
4.2.1入住登记流程图
图4.3入住登记流程图
4.2.2入住登记代码
void ruzhudengji()
{
int a,b=0;
string name;
ifstream liulan("宾馆房间信息.txt",ios::in); //定义输入文献流对象,以输入方式打开磁盘文献旅信
if(!liulan) //判断文献是否打开成功
{
cerr<<"文献不能读."<<endl;return;
}
else
liulan.seekg(117,ios::beg);//在输入文献开头以参照位置为基础移动若干字节(beg=begin)
int i=0; //存放空闲房间的号码
cout<<"房间号 类型 价格(元/天) 价格(元/小时) 空闲 "<<endl;
while (i<20)
{
liulan>>hotel[i].num>>hotel[i].leixing>>hotel[i].jiage>>hotel[i].kongxian>>hotel[i].name
>>hotel[i].ID>>hotel[i].lianxifangshi>>hotel[i].yajin>>hotel[i].yudingriqi>>hotel[i].ruzhushijian
>>hotel[i].tianshu>>hotel[i].jiezhiriqi;
cout<<setw(4)<<hotel[i].num<<setw(8)<<hotel[i].leixing<<setw(9)<<hotel[i].jiage/100<<setw(14)<<hotel[i].jiage%100<<setw(13)
<<hotel[i].kongxian; //输出所有房间信息
i++,cout<<endl;
}
liulan.close(); //关闭文献
cout<<"(注:0表达空房间、1表达房间已入住、2表达房间已预订)"<<endl;
cout<<"是否预订过房间?"<<endl;
cout<<"是,请输入1,否,请输入2"<<endl;
cin>>a;
if(a==1)
{
cout<<"请输入房间号:"<<endl;
cin>>b;
for(i=0;i<20;i++)
if(hotel[i].num==b)
{
if(hotel[i].yudingriqi!=0)
{
cout<<"请输入入住日期:";
cin>>hotel[i].ruzhushijian;
cout<<"请输入截止日期:";
cin>>hotel[i].jiezhiriqi;
hotel[i].yudingriqi=0;
}
else
{
cout<<"该房没有被预订过"<<endl;
system("pause");
}
}
}
else
{
cout<<"空房间有:"<<endl;
for(int k=0;k<20;k++)
{
if(hotel[k].kongxian==0)
cout<<hotel[k].num<<" ";
}
cout<<endl;
cout<<"请输入房间号:";
cin>>b;
for(i=0;i<20;i++)
if(hotel[i].num==b)
{
cout<<"请依次输入以下信息并加以核对 (日期格式:年月日 例如 19920503 )"<<endl;
cout<<"姓 名:";
cin>>hotel[i].name;
cout<<"身份证号:";
cin>>hotel[i].ID;
cout<<"联系方式:";
cin>>hotel[i].lianxifangshi;
cout<<"押金:";
cin>>hotel[i].yajin;
cout<<"天 数:";
cin>>hotel[i].tianshu;
cout<<"入住日期:";
cin>>hotel[i].ruzhushijian;
hotel[i].kongxian=2;
}
}
ofstream xieru("宾馆房间信息.txt",ios::out); //写回文献
xieru<<"房间号 类型 价格 是否空闲 姓名 身份证号 联系方式 押金 预定日期 入住时间 天数 截止日期 "<<endl;
for(i=0;i<20;i++)
xieru<<hotel[i].num<<' '<<hotel[i].leixing<<' '<<hotel[i].jiage<<' '<<hotel[i].kongxian<<' '<<hotel[i].name
<<' '<<hotel[i].ID<<' '<<hotel[i].lianxifangshi<<' '<<hotel[i].yajin<<' '<<hotel[i].yudingriqi<<' '<<hotel[i].ruzhushijian
<<' '<<hotel[i].tianshu<<' '<<hotel[i].jiezhiriqi<<endl;
xieru.close();
cout<<"登记成功"<<endl;
}4.2.3入住登记模块测
入住登记界面显示了房间使用情况以及提醒以前是否预订过房间如图4.4所示:
图4.4入住登记界面
假如客人预定过房间,则选择“1”,然后输入预订房间号如图4.5所示。输入入住日期和截止日期则“登记成功”如图4.6所示。
图4.5选择订过房间入住登记界面
图4.6订过房间入住登记界面
未预订过房间则选择“2” 则会显示出目前的空房间信息如图4.7所示,根据系统提醒输入客人的信息则“登记成功”如图4.8所示。
图4.7选择未订过房间入住登记界面
图4.8选择未订过房间入住登记输入信息界面
4.3退房结算模块实现
4.3.1退房结算流程图
图4.9 退房结算流程图
4.3.2退房结算代码
void tuifang()
{
int a,b;
ifstream fin("宾馆房间信息.txt",ios::in);
cout<<"请输入房号:";
cin>>a;
int c=0,i=0;
fin.seekg(117,ios::beg);//在输入文献开头以参照位置为基础移动若干字节(beg=begin)
while(i<20)
{
fin>>hotel[i].num>>hotel[i].leixing>>hotel[i].jiage>>hotel[i].kongxian>>hotel[i].name
>>hotel[i].ID>>hotel[i].lianxifangshi>>hotel[i].yajin>>hotel[i].yudingriqi>>hotel[i].ruzhushijian
>>hotel[i].tianshu>>hotel[i].jiezhiriqi;
if(hotel[i].num==a) //查询客人房间
b=i;
i++;
}
fin.close();
cout<<"房间信息为:"<<endl;
cout<<" 姓名: 押金(元): 入住时间: "<<endl;
cout<<setw(6)<<hotel[b].name<<setw(8)<<hotel[b].yajin<<setw(20)<<hotel[b].ruzhushijian<<endl;
cout<<"(注:日期输入格式 年月日 例如 20230231 )"<<endl;
cout<<"请输结算入日期:";
int d;
cin>>d;
hotel[b].jiezhiriqi=d;
int fei;
cout<<"按小时/天数计费(小时输入1,天数输入2):";
int t;
cin>>t;
if(t==2)
fei=hotel[b].yajin-((hotel[b].jiezhiriqi-hotel[b].ruzhushijian)*(hotel[b].jiage/100)); //结算函数,押金—(结算时间-入住时间)*价格
else
fei=hotel[b].yajin-((hotel[b].jiezhiriqi-hotel[b].ruzhushijian)*(hotel[b].jiage%100)); //按小时计算
if(fei<0)
{
fei=-fei;
cout<<"应付费用为:"<<fei<<"元"<<endl;
}
else
{
cout<<"总消费金额为:"<<hotel[b].yajin-fei<<"元"<<endl;
cout<<"押金足够 应返还给您:"<<fei<<"元"<<endl;
}
fstream jsxx("结算信息.txt",ios::out);
jsxx<<"消费信息为:"<<endl;
jsxx<<"姓名:"<<hotel[b].name<<endl<<"押金(元):"<<hotel[b].yajin<<endl<<"入住时间:"<<hotel[b].ruzhushijian<<endl<<"结算时间:"<<d<<endl;
if(t==2)
jsxx<<"计费方式:按天数计费"<<endl;
else
jsxx<<"计费方式:按小时计费"<<endl;
jsxx<<"总消费金额为:"<<hotel[b].yajin-fei<<"元"<<endl;
jsxx<<"押金足够 应返还给您:"<<fei<<"元"<<endl;
jsxx.close();
hotel[b].kongxian=0; //房间结算后初始化房间信息
strcpy(hotel[b].name,"0");
strcpy(hotel[b].ID,"0");
strcpy(hotel[b].lianxifangshi,"0");
hotel[b].yudingriqi=0;
hotel[b].ruzhushijian=0;
hotel[b].jiezhiriqi=0;
hotel[b].yajin=0;
hotel[b].tianshu=0;
hotel[b].jiezhiriqi=0;
fstream xieru("宾馆房间信息.txt",ios::out);//生成文献
xieru<<"房间号 类型 价格 是否空闲 姓名 身份证号 联系方式 押金 预定日期 入住时间 天数 截止日期 "<<endl;
for(i=0;i<20;i++)
{
xieru<<hotel[i].num<<' '<<hotel[i].leixing<<' '<<hotel[i].jiage<<' '<<hotel[i].kongxian<<' '<<hotel[i].name
<<' '<<hotel[i].ID<<' '<<hotel[i].lianxifangshi<<' '<<hotel[i].yajin<<' '<<hotel[i].yudingriqi<<' '<<hotel[i].ruzhushijian
<<' '<<hotel[i].tianshu<<' '<<hotel[i].jiezhiriqi<<endl;
}
xieru.close();
system("pause");
}
4.3.3退房结算模块测试
选择退房功能输入房间号则会显示出客人的基本信息如图4.10所示;根据系统提醒输入结算日期并选择结算方式则“结算结束”如图4.11和图4.12所示。账单信息存入到磁盘文献当中去,如图4.13所示。
图4.10退房结算输入结算房间号后界面图
图4.11退房结算输入日期界面
图4.12退房结算完毕界面
图4.13退房结算信息文献
五、附录:程序代码
#include<iostream>
#include<iomanip> //输出流控制
#include<string>
#include<fstream> //输入输出文献流
using namespace std;
void search_message();
void dingfangdengji();
void ruzhudengji();
void tuifang();
void all_message();
void empty_message();
void ruzhixinxi();
void dingfangxinxi();
struct hotel //定义结构体
{
int num;
char leixing[10];
int jiage;
int kongxian;
char name[20];
char ID[20];
char lianxifangshi[15];
int yajin;
long yudingriqi;
long ruzhushijian;
int tianshu;
long jiezhiriqi;
}
hotel[20];
void Menu_Display()
{
system("cls");
cout<<"\t\t###########################################"<<endl;
cout<<"\t\t# @欢迎使用百康宾馆管理系统@ #"<<endl;
cout<<"\t\t# 请输入您所需要的功能: #"<<endl;
cout<<"\t\t# 1.客房查询 2.订房登记 #"<<endl;
cout<<"\t\t# 3.入住登记 4.退 房 #"<<endl;
cout<<"\t\t# 5. 退 出 #"<<endl;
cout<<"\t\t# 感 * 谢 * 您 * 的 * 使 * 用 #"<<endl;
cout<<"\t\t###########################################"<<endl;
}
void chushihua()
{
int i[3]={1,0,1},k=0;
for(;k<20;k++)
{
hotel[k].num=i[0]*100+i[1]*10+i[2];
strcpy(hotel[k].ID,"0");
hotel[k].jiezhiriqi=0;
hotel[k].kongxian=0;
strcpy(hotel[k].lianxifangshi,"0");
strcpy(hotel[k].name,"0");
hotel[k].ruzhushijian=0;
hotel[k].tianshu=0;
hotel[k].yudingriqi=0;
switch(i[0])
{
case 1:{hotel[k].jiage=17020;strcpy(hotel[k].leixing,"单人间");break;}
case 2:{hotel[k].jiage=28030;strcpy(hotel[k].leixing,"双人间");break;}
case 3:{hotel[k].jiage=50050;strcpy(hotel[k].leixing,"套房");break;}
}
if(k==8)
i[0]++,i[2]=0;
if(k==14)
i[0]++,i[2]=0;
i[2]++;
}
fstream xieru("宾馆房间信息.txt",ios::out);
xieru<<"房间号 类型 价格 是否空闲 姓名 身份证
展开阅读全文