河南工程学院计算机学院
《C语言程序设计》课程设计报告
题目:酒店房间及工作人员管理系统
专业: 计算机科学与技术
班级: 2141
姓名: 魏佳琦
教师: 黄治国
完成时间: 2022 年 3 月 7 日
成 绩
1、考勤(10分)
5次考勤,每次到勤2分
2、工作态度(10分)
工作踏实,不怕困难;勤于思考,积极探索疑难问题;积极动手,勤于实践
3、技术(60分)
工作量饱满(10分)
系统需求的分析正确、完整/模块划分合理/算法设计正确和流程图清晰/代码实现了算法功能/测试数据设计合理,测试步骤正确,测试结果分析正确(30分)
能够积极探索解决疑难问题的途径(10分)
有独立完成或协作精神(10分)
4、报告(20分)
排版整齐(5分)
内容完整,叙述清晰(5分)
代码有适当的注释,缩进整齐(5分)
内容符合实际情况(5分)
总分
等级
1.课程设计目标
目标是在学生学习了C语言程序设计的基本知识、基本理论的基础上,通过综合课程设计,培养学生的动手能力,培养学生学习新知识的能力,提高学生分析问题和解决问题的综合能力,培养学生的团队合作精神,为今后从事专业工作打下必要的基础。
知识目标:
(1)掌握模块化程序设计的方法;
(2)进一步学习和掌握C语言中的文件操作函数及其应用;
(3)学习和掌握C语言中的库函数及其应用。
能力培养目标:
(1)能正确分析现实生活中的问题,并抽象成数学模型,进行模块分析和编程;
(2)在程序调试过程中,能根据运行环境给出的错误提示,正确解决程序中的语法错误;
(3)在程序调试过程中,能根据运行结果,运用相应的手段,正确地找出并解决程序中的逻辑错误;
(4)在课程设计过程中,适当进行小组分工,培养团队谐调和团队合作的能力;
(5)提交课程设计成果报告,培养专业文档书写的能力。
2.分析与设计
当今时代是飞速发展的信息时代,在各行各业中离不开信息处理,这正是计 算机被广泛应用于信息系统的环境。 计算机的最到好处的于利用它能够进行信息 管理,使用计算机进行信息控制, 不仅提高了工作效率, 而且大大的提高了其安 全性。
尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的开发密切相关, 系统的开发是系统管理的前提。 本系统就是为了管理好酒店房间信息和员工信息而设计的。 数据处理手工操作,工作量大,出错率高,出错后不易更改,造成了时间上的浪费。
基于这个问题,我认为有必要建立一个酒店管理系统,使酒店管理信息管理 工作规范化、系统化、程序化,避免房间分配和员工管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改实际情况。
1.1题目需求分析
程序的用途:为酒店管理者提供更方便的酒店管理体系。
能够解决住房管理,以及住房日志的长期保存。
程序要处理的数据有房间的数据,以及员工的数据。
每种数据的处理要求能够长期保存,并且实时更改。
程序的开发平台和运行环境:windows
周一(3.1日)完成:
需求分析;
设计分工;
开发环境搭建;
绘制功能模块图。
周二(3.2日)完成:
用户界面布局设计;
各模块算法设计。
周三(3.3日)完成:
用户界面的实现;
模块的功能实现;
各模块功能的黑盒测试。
周四(3.4日)完成:
系统功能的集成测试。
周五(3.5日)完成:
撰写课程设计报告。
1.2总体设计
首先要初始化一个系统对象,这个系统一个复合类,其余还有其他一个房间类和一个员工类
,而信息存储采用链表结构。
信息存储于:D:hotel_contral_system文件夹中
//房间
class room{
private:
bool exist;//是否存在
bool live;//是否有人入住
int room_ID;//房间号
std::string name;//入住顾客姓名
std::string identity_card_number;//入住顾客的身份证
}
//工作人员
class worker{
private:
bool exist;//是否存在
int work_ID;//工号
std::string identity_card_number;//员工身份证
std::string name;//姓名
std::string department;//部门
int age;//年龄
std::string sex;//性别
std::string entry_date;//入职日期
}
//系统
class my_system{
private:
worker *workerlist;//链表结构存储信息
room *roomlist;
int num_worker, num_room;
}
1.3详细设计
3.程序清单
#include
#include
#include
#include
#define kong cout<<endl;
#define debug cout<<"Bug is not here!"<<endl;
#define gang cout<<"----------"<<endl;
using namespace std;
bool re_pan(){
std::cout<<"确定执行该操作吗?(y/n)"<<std::endl;
char c;
cin>>c;
if(c == 'y') return true;
else return false;
}
//房间
class room{
private:
bool exist;
bool live;
int room_ID;
std::string name;
std::string identity_card_number;
public:
room(int room_id):room_ID(room_id),live(false){ //待改进
name = "";
identity_card_number = "";
std::cout<<"已登记房间号为"<<room_id<<"的房间。"<<std::endl;
}
void rooms(int room_id){ //替代构造函数
exist = true;
room_ID = room_id;
live= false;
std::cout<<"已登记房间号为"<<room_id<<"的房间。"<<std::endl;
}
room(){
live = false;
room_ID = 0;
name = "";
identity_card_number = "";
}
bool get_exist(){
return exist;
}
bool get_live(){
return live;
}
int get_room_id(){
return room_ID;
}
string get_name(){
return name;
}
string get_identity_card_number(){
return identity_card_number;
}
void kaobei(bool l, int r, string n, string i){
live = l;
room_ID = r;
name = n;
identity_card_number = i;
}
void live_in(){
if(live) {
std::cout<<"对不起,房间"<<room_ID<<"已经有顾客入住!"<<std::endl;
kong;
return;
}
std::cout<<"正在办理入住手续,准备登记"<<std::endl;
std::cout<<"请输入顾客的姓名:";
cin>>name;
getchar();
std::cout<<"请输入顾客的身份证号码:";
std::getline(std::cin, identity_card_number);
std::cout<<"登记成功!"<<std::endl;
live = true;
kong;
}
void live_out(){
if(!live){
std::cout<<"对不起,房间"<<room_ID<<"无人居住!"<<std::endl;
return;
}
live = false;
std::cout<<"已为顾客办好离住手续!"<<std::endl;
kong;
}
void show(){
kong
// cout<<"-----该房间的情况如下-----"<<endl;
cout<<"房间号:"<<room_ID<<endl;
cout<<"居住情况:";
if(live) {
cout<<"已住人!"<<endl;
cout<<"住户姓名:"<<name<<endl;
cout<<"住户身份证:"<<identity_card_number<<endl;
}
else cout<<"空!"<<endl;
kong
}
void print_txt(){
cout<<live<<endl;
cout<<room_ID<<endl;
cout<<name<<endl;
cout<<identity_card_number<<endl;
}
};
//工作人员
class worker{
private:
bool exist;
int work_ID;
std::string identity_card_number;
std::string name;
std::string department;
int age;
std::string sex;
std::string entry_date;
public:
worker(){};
worker(int worker_id,std::string _identity_card_number,std::string _name,std::string _department,int _age,std::string _sex,std::string _entry_date):
work_ID(worker_id),
identity_card_number(_identity_card_number),
name(_name),
department(_department),
age(_age),
sex(_sex),
entry_date(_entry_date)
{
std::cout<<"已经为该员工办理好入职手续!"<<std::endl;
}
void add_worker(int id){
exist = true;
work_ID = id;
getchar();
cout<<"请输入新员工姓名:";
cin>>name;
getchar();
cout<<"请输入新员工身份证号:";
cin>>identity_card_number;
getchar();
cout<<"请输入新员工的部门:";
cin>>department;
getchar();
cout<<"请输入新员工的年龄:";
cin>>age;
getchar();
cout<<"请输入新员工的性别:";
cin>>sex;
getchar();
cout<<"请输入入职日期:";
cin>>entry_date;
std::cout<<"已经为该员工办理好入职手续!"<<std::endl;
}
void change_department(){
cout<<"请修改员工的新部门:";
cin>>department;
cout<<"修改成功!"<<endl;
}
void delet_worker(){
exist = false;
std::cout<<"已经为该员工办理好离职手续!"<<std::endl;
cout<<"退出程序后回永久删除员工信息,在此之前依旧可以查看该员工信息"<<endl;
}
bool get_exist(){
return exist;
}
int get_worker_id(){
return work_ID;
}
void show(){
std::cout<<"--------员工信息如下--------"<<std::endl;
std::cout<<"姓名:"<<name<<std::endl;
cout<<"性别:"<<sex<<endl;
cout<<"年龄:"<<age<<endl;
cout<<"部门:"<<department<<endl;
cout<<"工号:"<<work_ID<<endl;
cout<<"身份证号:"<<identity_card_number<<endl;
}
void print_txt(){
std::cout<<name<<std::endl;
cout<<sex<<endl;
cout<<age<<endl;
cout<<department<<endl;
cout<<work_ID<<endl;
cout<<identity_card_number<<endl;
}
void input_(int work_ID1, string identity_card_number1, string name1, string department1, int age1, string sex1, string entry_date1){
work_ID = work_ID1;
identity_card_number = identity_card_number1;
name = name1;
department = department1;
age = age1;
sex = sex1;
entry_date = entry_date1;
}
};
class my_system{
private:
worker *workerlist;
room *roomlist;
int num_worker, num_room;
public:
int get_num_worker(){
return num_worker;
}
int get_num_room(){
return num_room;
}
worker *get_workerlist(){
return workerlist;
}
room *get_roomlist(){
return roomlist;
}
my_system(){
cout<<"欢迎使用Rejacky酒店管理系统!"<<endl;
cout<<"系统声明:"<<endl;
cout<<"本系统可用于酒店工作人员管理以及入住用户管理,并将历史信息记录入日志之中!"<<endl;
cout<<endl;
}
friend void start(my_system &);
//入住
void live_in(int room_id){
for(int i = 0;i < num_room;i++)
if(roomlist[i].get_room_id() == room_id){
roomlist[i].live_in();
return;
}
cout<<"不存在该房间!"<<endl;
}
//退房
void live_out(int room_id){
for(int i = 0;i < num_room;i++)
if(roomlist[i].get_room_id() == room_id){
roomlist[i].live_out();
break;
}
}
//增加一个房间
void add_room(int room_id){
room * new_list = new room[num_room + 1];
for(int i = 0;i < num_room;i++) new_list[i] = roomlist[i];
delete[] roomlist;
roomlist = new_list;
for(int i = 0;i < num_room;i++){
if(roomlist[i].get_room_id() == room_id){
cout<<"已存在该房间!"<<endl;
return;
}
}
num_room++;
roomlist[num_room - 1].rooms(room_id);
cout<<"操作完成!!n"<<endl;
}
//展示空房
void show_all_empty_rooms(){
int flag = 0;
for(int i = 0;i < num_room;i++){
if(!roomlist[i].get_live()){
cout<<(roomlist+i)->get_room_id()<<" ";
flag++;
}
if(flag == 4) {
kong;
flag = 0;
}
}
kong
}
//展示所有房间
void show_all_room(){
for(int i = 0;i < num_room;i++) {
(roomlist+i)->show();
}
}
//查询某个房间
void show_room(int room_id){
for(int i = 0;i < num_room;i++)
if(roomlist[i].get_room_id() == room_id)
{
roomlist[i].show();
break;
}
}
//员工入职
void add_worker(int id){
for(int i = 0;i < num_worker;i++)
if(workerlist[i].get_worker_id() == id){
cout<<"已存在该员工工号!"<<endl;
return;
}
worker * new_list = new worker[num_worker + 1];
for(int i = 0;i < num_worker;i++) new_list[i] = workerlist[i];
delete[] workerlist;
workerlist = new_list;
num_worker++;
workerlist[num_worker-1].add_worker(id);
}
//员工离职
void delete_worker(int worker_id){
for(int i = 0;i < num_worker;i++)
if(workerlist[i].get_worker_id() == worker_id){
workerlist[i].delet_worker();
break;
}
}
//查询某员工
void show_worker(int worker_id){
for(int i = 0;i < num_worker;i++)
if(workerlist[i].get_worker_id() == worker_id){
workerlist[i].show();
return;
}
cout<<"不存在该员工工号!"<<endl;
}
//查询所有员工
void show_all_wroker(){
if(num_worker == 0){
cout<<"暂时还没有员工哦~"<<endl;
return;
}
for(int i = 0;i < num_worker;i++) workerlist[i].show();
}
//更改员工部门
void change_worker_department(int worker_id){
for(int i = 0;i < num_worker;i++)
if(workerlist[i].get_worker_id() == worker_id){
workerlist[i].change_department();
break;
}
}
};
//初始化系统
void start(my_system &cur){
cout<<"系统正在初始化!"<<endl;
if(freopen("D:\hotel_contral_system\last_live.txt", "r", stdin) != NULL){
cin>>cur.num_room;
int num_room = cur.num_room;
if(num_room == 0){
cout<<"初始化完毕!"<<endl;
fclose(stdin);
freopen("CON","r",stdin);
return;
}
cur.roomlist = new room[num_room];
getchar();
for(int i = 0;i < num_room;i++){
bool live;
int room_ID;
std::string name;
std::string identity_card_number;
cin>>live>>room_ID;
getchar();
getline(cin,name);
getline(cin,identity_card_number);
cur.roomlist[i].kaobei(live, room_ID, name, identity_card_number);
}
}
else cur.num_room = 0;
fclose(stdin);
if(freopen("D:\hotel_contral_system\last_work.txt", "r", stdin) != NULL){
cin>>cur.num_worker;
int num_worker = cur.num_worker;
cur.workerlist = new worker[num_worker];
string identity_card_number;
string name;
string department;
int age;
string sex;
string entry_date;
getchar();
for(int i = 0;i < num_worker;i++){
getline(cin, name);
getline(cin, sex);
cin>>age;
getchar();
getline(cin, department);
int work_id;
cin>>work_id;
getchar();
getline(cin, identity_card_number);
cur.workerlist[i].input_(work_id, identity_card_number, name, department, age, sex, entry_date);
}
}
else cur.num_worker = 0;
fclose(stdin);
freopen("CON","r",stdin);
cout<<"初始化完毕!"<<endl;
}
//退出系统,保存信息
void quit(my_system cur){
kong
cout<<"正在退出系统,保存信息中。。。"<<endl;
freopen("D:\hotel_contral_system\last_work.txt", "w", stdout);
worker* head = cur.get_workerlist();
int num_worker = cur.get_num_worker();
int real_num = 0;
for(int i = 0;i < num_worker;i++)
if((head+i)->get_exist())
real_num++;
cout<<real_num<<endl;
for(int i = 0;i < num_worker;i++)
if((head+i)->get_exist())
(head+i)->print_txt();
fclose(stdout);
freopen("D:\hotel_contral_system\last_live.txt", "w", stdout);
int num_room = cur.get_num_room();
cout<<num_room<<endl;
room *headd = cur.get_roomlist();
for(int i = 0;i < num_room;i++)
if((headd+i)->get_exist())
(headd+i)->print_txt();
fclose(stdout);
freopen("CON","w",stdout);
cout<<"已退出!n"<<endl;
}
//创建系统对象
my_system ht;
//保存居住信息
void live_history(int n, int id){
freopen("D:\hotel_contral_system\live_history.txt","a",stdout);
time_t nowtime;
struct tm* p;
time(&nowtime);
p = localtime(&nowtime);
kong gang
printf("%d年%02d月%02d日%02d:%02d:%02dn",p->tm_year,p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
if(n == 1){
cout<<"入住登记"<<endl;
ht.show_room(id);
}
if(n == 2){
cout<<"退房登记"<<endl;
ht.show_room(id);
}
if(n == 6){
cout<<"新房登记"<<endl;
ht.show_room(id);
}
fclose(stdout);
freopen("CON","w",stdout);
}
//保存员工操作历史
void worker_history(int n, int id){
freopen("D:\hotel_contral_system\work_history.txt","a",stdout);
time_t nowtime;
struct tm* p;
time(&nowtime);
p = localtime(&nowtime);
printf("%04d %02d %02d %02d:%02d:%02dn",p->tm_year,p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
kong gang
if(n == 1){
cout<<"员工离职"<<endl;
ht.show_worker(id);
}
if(n == 2){
cout<<"员工入职"<<endl;
ht.show_worker(id);
}
if(n == 3){
cout<<"员工调动"<<endl;
ht.show_worker(id);
}
if(n == 4){
kong
cout<<"变更更为:"<<endl;
ht.show_worker(id);
}
fclose(stdout);
freopen("CON","w",stdout);
}
int main(){
//初始化系统信息
start(ht);
// fclose(stdin);
int n;
a:while(true){
kong gang
cout<<"1:客房管理"<<endl;
cout<<"2:员工管理"<<endl;
cout<<"3:退出系统"<<endl;
cout<<"请输入您要进行的操作:";
cin>>n;
if(re_pan());
else continue;
if(n == 1){
kong gang
cout<<"正在切换客房管理页面。。。"<<endl;
cout<<"切换成功!n"<<endl;
while(true){
int nn;
kong gang
cout<<"1:入住登记"<<endl;
cout<<"2:退房登记"<<endl;
cout<<"3:空房查询"<<endl;
cout<<"4:房间号查询"<<endl;
cout<<"5:查询所有房间"<<endl;
cout<<"6:房间登记"<<endl;
cout<<"7:返回上一步"<<endl;
kong
cout<<"请输入要进行的操作:";
cin>>n;
if(re_pan());
else continue;
if( n== 1){
kong gang
cout<<"请输入要入住的房间号:";
cin>>nn;
live_history(n,nn);
ht.live_in(nn);
}
else if(n == 2){
kong gang
cout<<"输入要退房的房间号:";
cin>>nn;
live_history(n,nn);
ht.live_out(nn);
}
else if(n == 3){
kong gang
cout<<"空余空房如下:"<<endl;
ht.show_all_empty_rooms();
}
else if(n == 4){
kong gang
cout<<"请输入要查询的房间号:";
cin>>nn;
ht.show_room(nn);
}
else if(n == 5){
kong gang
ht.show_all_room();
}
else if(n == 6){
kong gang
cout<<"输入新房房间号:";
cin>>nn;
ht.add_room(nn);
live_history(n, nn);
}
else if(n == 7) goto a;
else cout<<"输入有误!请重新输入!"<<endl;
}
}
else if(n == 2){
cout<<"n";
gang
cout<<"正在切换员工管理页面。。。"<<endl;
cout<<"切换成功!n"<<endl;
while(1){
kong gang
cout<<"1:员工离职办理"<<endl;
cout<<"2:员工入职办理"<<endl;
cout<<"3:员工部门修改"<<endl;
cout<<"4:员工信息查询"<<endl;
cout<<"5:所有员工信息"<<endl;
cout<<"6:返回上一步"<<endl;
kong
cout<<"请输入:";
cin>>n;
if(re_pan());
else continue;
if(n == 1){
kong gang
int id;
cout<<"输入要离职的员工工号:";
cin>>id;
worker_history(n,id);
ht.delete_worker(id);
}
else if(n == 2){
kong gang
int id;
cout<<"输入新员工工号:";
cin>>id;
ht.add_worker(id);
worker_history(n,id);
}
else if(n == 3){
kong gang
int id;
cout<<"输入要调动部门的员工工号:";
cin>>id;
worker_history(n,id);
ht.change_worker_department(id);
worker_history(n+1,id);
}
else if(n == 4){
kong gang
int id;
cout<<"输入要查询的员工工号:";
cin>>id;
ht.show_worker(id);
}
else if(n == 5){
kong gang
ht.show_all_wroker();
}
else if(n == 6) goto a;
else cout<<"输入有误!请重新输入!"<<endl;
}
}
else if(n == 3) {
quit(ht);
break;
}
else cout<<"输入有误!请重新输入!"<<endl;
}
system("pause");
return 0;
}
4.测试
测试环境:visual studio code
4.1测试数据
第一组:
某员工:
工号:1
姓名:饶xx
年龄:30
部门:人事部
身份证号:360425202211021451
入职日期:2022/5/22
某房间:
房间号:101
入住顾客名:魏xx
身份证号:360425202212022459
第二组:
某员工:
工号:999999999999999
姓名:饶xx
年龄:30
部门:人事部
身份证号:360425202211021451
某房间:
房间号:1
入住顾客名:魏xx
身份证号:360425202212022459
第三组:
某员工:
工号:1
姓名:饶xx
年龄:30
部门:人事部
身份证号:360425202211021451
某房间:
房间号:9999999999999999999
入住顾客名:魏xx
身份证号:360425202212022459
4.2测试结果分析
第一组完全通过测试。
历史记录如下:
第二组死循环,因为在存储员工工号数据时用的int类型,当数值巨大时无法准确存储
第二组死循环,因为在存储房间号数据时用的int类型,当数值巨大时无法准确存储
改进方法:换成string类型,但是会更改很多函数
5.总结
用c++强大的库函数以及面向对象设计,可以很有逻辑的完成一系列的想法,但是细节问题会非常的多,主要是一个数据问题以及指针问题,而这些需要根据编译器给的提示以及在网上查找资料才可以完美解决。
5.1收获
独立完成一个程序不是一件简单的事情,需要足够的耐心和细心,学会查找资料也是一件很重要的事情,总之我学到了很多,也了解了很多的学习方法。个人的能力终究是有限的
5.2不足与改进之处
一些数据类型和类的设计应该在完成之前有足够的数据支撑,否则就容易犯下一些数据过于简单,难以应付更多数据或者比较奇怪的数据,导致程序死循环。
查看全文