哈尔滨理工大学
软件学院
课程设计报告
课程设计 C++课程设计
题 目 宾馆信息管理系统
班 级
学 生
学 号
指导教师
1. 管理系统的功能说明
a) 密码登录验证访问 。
b) 浏览宾馆内部各房间信息 。
c) 添加新房间(支持重复添加)。
d) 修改已存在的房间信息(支持重复修改) 。
e) 查询房间数据(按房间号、容量)(支持重复查询)。
f) 添加自定义对结果排序显示功能。
g) 退出系统及一些基本的用户友好的程序设计功能(各种错误处理)。
2. 存储数据的描述
在类定义中有以下成员:
实现上述功能的成员函数接口
public:
Hotel();
virtual ~Hotel();
Hotel(int n,int v,int l,int p,int u):RoomNum(n),Capacity(v),Level(l),Price(p),used(u) {}
void Look_through();
void Reset_room(int x);
void Show_room();
friend void menu();
friend void quit();
friend void Init_room();
friend Hotel Add_room();
friend void Query(int n,int total);
私有数据表示:
private:
int RoomNum; 房间号
int Capacity; 房间容量
char Level; 房间等级
int Price; 房间价格
int used; 是否预定
static int total; 静态常量用来跟踪总房间数目信息
3. 概要设计说明书
在该宾馆信息管理系统的设计中,根据功能要求抽象出类成员函数,并采用对象数组存储房间,用一个Hotel类封装起来。通过友元函数访问私有数据从而实现信息管理系统的功能。
在运行过程中
string password(string co) 实现了加密函数实现密码登陆。void Hotel::Look_through()支持单个房间浏览,Hotel Add_room()实现了新房间的重复添加功能,void Hotel::Reset_room(int x) 实现了房间信息连续重置功能,void Query(int n,int total)函数实现了支持重复查询房间并允许自定义房间号和价格排序显示的功能,void quit() 退出系统登录功能。并在每一步都给出了较为有好的用户提示,运行中整体逻辑清晰,并实现了对错误输入的重新处理。用户只需按着运行提示即可。
4. 源程序
Main.cpp
#include <iostream>
#include<algorithm>
#include<string>
#include<set>
#include"Hotel.h"
#include<windows.h>
using namespace std;
static int total=13;
int main()
{
cout<<"\n Welcome to information management system !\n ";
cout<<"************ ************\n\n login: ____\b\b\b\b";
string str1 ,str2;
while((cin>>str1).get())
{
cout<<"Password: ";
getline(cin,str2);
if(str1=="cbam"&&str2==password("c bam"))
{
break;
}
else
cout<<"Password error!! please login again\nlogin: ";
}
cout<<"\nLogin success!\n\n…………………………自动转入下页……";
Sleep(3000);
system("cls");
menu();
while(1)
{
int select;
cin>>select;
if(select==9)
{
menu();
cin>>select;
}
switch(select)
{
case 0:
quit();
return 0;
case 1:
cout<<"房间号 容量 等级 价格 是否预定\n";
for(int i=0; i<total; i++)
hotel[i].Look_through();
cout<<"返回主菜单请单击\"9\"\n";
break;
case 2:
hotel[total++]=Add_room();
break;
case 3:
cout<<"要修改的房间号:__\b";
int num;
cin>>num;
hotel[num-1].Reset_room(num);
break;
case 4:
cout<<"输入您查询房间的方式(房间号\"1\" or 容量\"2\"\n";
int way;
cin>>way;
Query(way,total);
break;
default:
cout<<"请重新在菜单中选择\n";
break;
}
}
return 0;
}
Hotel.h
#ifndef HOTEL_H
#define HOTEL_H
#include<iostream>
#include<vector>
using namespace std;
//存储临时对象以便操作
struct HOTEL_
{
int num,vo,p;
char l;
int u;
HOTEL_(int n=0,int v=0,int pp=0,char ll='a',int uu=0)//构造函数
{
num=n;
vo=v;
p=pp;
l=ll;
u=uu;
} // 重载<运算符
bool friend operator <(HOTEL_ a,HOTEL_ b)
{
return a.p<b.p;
}
};
//一个宾馆房间类
class Hotel
{
public:
Hotel();
virtual ~Hotel();
Hotel(int n,int v,int l,int p,int u):RoomNum(n),Capacity(v),Level(l),Price(p),used(u) {}
void Look_through();
void Reset_room(int x);
void Show_room();
friend void menu();
friend void quit();
friend void Init_room();
friend Hotel Add_room();
friend void Query(int n,int total);
private:
int RoomNum;
int Capacity;
char Level;
int Price;
int used;
static int total;
};
#endif // HOTEL_H
Hotel::Hotel()
{
//ctor
}
Hotel::~Hotel()
{
//dtor
}
//主菜单
void menu()
{
cout<<"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"<<endl;
cout<<"\n---欢迎访问宾馆信息内部管理系统---\n";
cout<<"\n\n -----1-访问房间信息---\n";
cout<<"\n -----2-增加新房间-----\n";
cout<<"\n -----3-修改房间数据---\n";
cout<<"\n -----4-查询房间数据---\n";
cout<<"\n -----0-退出此系统-----\n";
cout<<"\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n";
}
//加密函数,生成密码
string password(string co)
{
for(int i=0; i<co.size(); i++)
{
if(co[i]!=' ')
co[i]=25+'a'*2-co[i];
}
reverse(co.begin(),co.end());
return co;
}
void Hotel::Look_through()
{
// 访问某房间信息
cout<<" "<<RoomNum<<" "<<Capacity<<" "<<Level
<<" "<<Price<<" "<<used<<endl;
}
//实现添加功能
Hotel Add_room()
{
cout<<"输入新房间信息:\n\n";
int n,v,p,u;
char l;
cout<<"房间号:__\b\b ";
cin>>n;
cout<<"房间容量:__\b\b ";
cin>>v;
cout<<"房间等级:__\b";
cin>>l;
cout<<"房间价格:__\b\b ";
cin>>p;
cout<<"设定预订情况:__\b\b ";
cin>>u;
Hotel x;
x=Hotel(n,v,l,p,u);
cout<<"\n新房间信息已添加完毕~!返回菜单请按 \"9\""<<endl;
return x;
}
//实现修改功能
void Hotel::Reset_room(int x)
{
cout<<"请输入需要修改的房间信息:\n";
cout<<"----1-房间容量----"<<endl;
cout<<"----2-房间价格----\n"
<<"----3-房间等级----\n"
<<"----4-是否已定----\n";
int a;
while(cin>>a)//循环支持重复修改
{
switch(a)
{
case 1:
int cnt;
cout<<"容量修改为:__\b";
cin>>cnt;
Capacity=cnt;
break;
case 2:
int price;
cout<<"价格修改为:__\b";
cin>>price;
Price=price;
break;
case 3:
char level;
cout<<"房间等级修改为:__\b";
cin>>level;
level=level;
break;
case 4:
int booked;
cout<<"预定情况修改为:__\b";
cin>>booked;
used=booked;
break;
}
cout<<"\n此房间信息修改完毕,继续修改请按\"1\",返回菜单请按 \"9\""<<endl;
cin>>a;
if(a==9) //返回菜单直接return ;
{
menu();
return ;
}
cout<<"请输入需要修改的房间信息:__\b\b";
}
}
Hotel hotel[53]=
{
Hotel(01,2,'a',300,0),
Hotel(02,4,'a',400,0),
Hotel(03,3,'b',100,0),
Hotel(04,5,'b',200,0),
Hotel(05,4,'c',200,0),
Hotel(06,2,'c',240,0),
Hotel(07,3,'d',130,0),
Hotel(8,1,'d',110,0),
Hotel(9,5,'d',130,0),
Hotel(10,4,'d',430,0),
Hotel(11,4,'d',230,0),
Hotel(12,3,'d',330,0),
Hotel(13,4,'d',730,0)
};
//实现查询功能
void Query(int n,int total)
{
//按房间号查找
if(n==1)
{
while(1)//实现重复查找
{
int flag=1;//标记是否查找成功
cout<<"\n您要查找的房间号:_\b";
int roomNumber;
cin>>roomNumber;
for(int i=0; i<total; i++)
if(hotel[i].RoomNum==roomNumber)
{
flag=0;
cout<<"查找成功!\n\n以下房间满足您的查询要求:\n"<<endl;
cout<<"房间号 容量 等级 价格 是否预定\n";
hotel[i].Show_room();
cout<<"\n是否继续查询房间(Y|N)?_\b ";
char ch;
while(cin>>ch) // 错误处理 支持重复选择直到 选择合理
{
while(cin.get()!='\n') // 吃掉多余缓冲区字符
continue;
if(ch=='Y')
break;
else if(ch=='N')
{
menu();
return ;
}
else
{
cout<<"\nerror ! Bad input;input process continue.\n \n是否继续查询房间(Y|N)?_\b ";
}
}
}
if(flag) //说明查找不存在满足情况
{
cout<<"\n您所要查找的房间不存在!请重新查找 按1 或返回菜单 双击\"9\"\n";
int choose;
cin>>choose;
if(choose==9)
return ;
else
continue;
}
}
}
else if(n==2)//按照房间容量查找
{
loop:
int capacity;
cout<<"\n请输入房间容量:__\b\b";
cin>>capacity;
int flag=1; //标记成功与否
vector<HOTEL_>dict; //将临时对象push容器
for(int i=0; i<total; i++)
{
if(hotel[i].Capacity==capacity)
{
if(flag)//查找成功
{
flag=0;
cout<<"\n(默认房间号递增排序)\n以下房间满足您的查询要求:"<<endl;
cout<<"房间号 容量 等级 价格 是否预定\n";
}
//构造对象
HOTEL_ x= HOTEL_ (hotel[i].RoomNum ,hotel[i].Capacity,hotel[i].Price,hotel[i].Level,hotel[i].used);
dict.push_back(x);
hotel[i].Show_room();//默认房间号升序
}
}
if(flag)//查找不成功
{
cout<<"您所要查找的房间不存在!请重新查找 按1 或返回菜单 双击9"<<endl;
int select;
cin>>select;//重新选择查询
if(select==1)
goto loop;
else
return ;
}
else //查找成功情况下 选择一系列操作
{
cout<<"\n\n按-\"1\" 以价格递增排序,继续查询房间(Y|N)?__\b\b,按-\"9\"返回主菜单\n";
char choose;
while(cin>>choose)
{
while(cin.get()!='\n')
continue;
if(choose=='9')
{
menu();
return ;
}
if(choose=='Y')
goto loop;
else if(choose=='N')
{
menu();
return ;
}
else if(choose == '1')
{
cout<<"\n以下房间满足您的查询要求:\n";
sort(dict.begin(),dict.end()); // 对结果按照价格升序
for(vector<HOTEL_>::iterator it=dict.begin(); it!=dict.end(); it++)
{
cout<<" "<<(*it).num<<" "<<(*it).vo<<" "
<<(*it).l<<" "<<(*it).p<<" "<<(*it).u<<endl;
}
cout<<"是否继续查询房间(Y|N)?__\b"; //此时同样支持 继续查询功能
while(cin>>choose)
{
while(cin.get()!='\n')//错误处理
continue;
if(choose=='Y')
goto loop;
else if(choose =='N')
{
menu();
return ;
}
else
cout<<"请重新选择(Y|N)__\b";
}
}
else
{
//对于以上情况都没有正确选择 同样支持重新选择
cout<<"\n错误!按-\"1\" 以价格递增排序,继续查询房间(Y|N)?__\b\b,按-\"9\"返回主菜单\n";
}
}
}
}
else //对于查询方式选择有误 亦支持重新查询
{
cout<<"查询方式有误!重新输入查询方式!按\"1\" 或返回主菜单 双击\"9\""<<endl;
int select;
cin>>select;
if(select!=1)
return ;
cout<<"输入您查询房间的方式(房间号\"1\" or 容量\"2\")\n";
int way;
cin>>way;
Query(way,total); //重新调用函数
}
cout<<"\n返回主菜单请单击\"9\"\n";
}
void Hotel:: Show_room()
{
//显示房间信息
cout<<" "<<RoomNum<<" "<<Capacity<<" "<<Level
<<" "<<Price<<" "<<used<<endl;
}
void quit()
{
//退出函数
cout<<"对此系统信息的更新完毕!欢迎使用~\n";
return ;
}
5.测试分析
进入宾馆管理系统前,首先就要通过密码登录验证,支持重新验证。验证成功后进入欢迎界面(主菜单)用户按照需求即可进行选择服务类别,并在每次使用后询问是否继续并每次给出返回主菜单的提示,在测试过程中确实出现了多逻辑bug,但由于面向对象的特性,修改起来十分方便高效,已基本可以满足客户。用户完全可以按照傻瓜界面提示进行。文本末附截图。
6.总结报告
《C++程序设计》是计算机专业一门重要的专业基础课。此次课程设计以C++程序设计语言为基础,通过完成此次课程设计题目的构思、编写、调试、运行工作,进一步掌握面向过程和面向对象程序设计的基本方法和编程技巧。巩固了所学的理论知识,并进一步使理论与实际相结合,从而提高了自我分析解决问题的能力。并进一步感受到“程序员的天敌是无尽的需求”。
设计中遇到的错误:
n 在main函数中定义的对象数组,一开始用 引用传递对象数组 不合法。后来直接把对象数组定义到.h文件不用传参数了。后来可能可以用对象指针传递。
n 密码登录的时候 ,一开始对于用户输入用cin读取 这样便不会处理有空格的输入。进而导致密码错误。后改用getline()函数,实现。
n switch语句平时acm很少用,所以有一个case语句少了个break;导致连续执行。
n 对象数组下标从0开始修改房间信息出现错误,后解决。
n 在完成查询功能时思维复杂度提升,有时出现难以维护。
n 用于用户用好的提示语不断更新 等……一系列小的bug。