资源描述
课程设计宾馆管理系统C语言版
44
2020年4月19日
文档仅供参考,不当之处,请联系改正。
中 原 工 学 院
软件职业技术学院
一级实践环节报告
课题名称: 宾馆客房管理系统
专 业: NET软件
班 级: NET104
学 号: 36
学生姓名: 李新辉
指导教师: 罗菁
年 月 日
一、题目
宾馆客房管理系统
二、流程分析
宾 馆 客 房 管 理 系 统
客房登记
客户查询
房间查询
退房结算
房间数
选择类型
订金
客户基本信息登记
客房号查询
姓名查询
空房间查询
查询所有客户
查询所有房间
房间号
确定
退房日期
结算
三、源代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>//将字符转化为小写字母函数
#define Z 50 //宾馆的房间数
#define AY 800
#define BY 600
#define CY 300
#define AJ 15
#define BJ 20
#define CJ (Z-AJ-BJ)
struct hotle
{
unsigned int num;
char dj; //各种等级类型
unsigned int money;
int fk;//判断房间的空闲状况0为空,为有人
}room[Z];
struct date
{
int month;
int day;
};
struct people
{
char name[20];
char ID[15];
unsigned int num0;//房间号
unsigned int money0;//客人交的订金
struct date ru;
struct date chu;
}kehu[Z];
void saveroom();
void loadroom();
void printroom();
void save(int s);
void save1(int s);
int loadn();
void saven(int n);
void savekehu2(int t,int m);
///////录入宾馆房间信息//////////////
void luru()
{
int a0,b0,c0;
a0=b0=c0=0;
int i;
for(i=0;i<AJ;i++)
{
room[i].num=((a0++)+601);
room[i].dj ='A';
room[i].money =AY;
room[i].fk=0;
}
for(i=AJ;i<(BJ+AJ);i++)
{
room[i].num=((b0++)+501);
room[i].dj ='B';
room[i].money =BY;
room[i].fk=0;
}
for(i=(AJ+BJ);i<Z;i++)
{
room[i].num=((c0++)+401);
room[i].dj ='C';
room[i].money =CY;
room[i].fk=0;
}
saveroom();
}
void saveroom()//储存房间信息
{
FILE *fp;
fp=fopen("my hotle.text","wb");
for(int i=0;i<Z;i++)//
{
if(fwrite(&room[i],sizeof(struct hotle),1,fp)!=1)
{printf("文件写入失败\n");break;}
}
fclose(fp);
}
void loadroom()
{
FILE *fp;
int i;
if((fp=fopen("my hotle.text","rb"))==NULL)
{printf("打开文件失败\n");return;}
for(i=0;i<Z;i++)
{
if(fread(&room[i],sizeof(struct hotle),1,fp)!=1)
{printf("读取文件失败\n");break;}
}
printf("读取成功!\n");
fclose(fp);
}
void printroom()/////输出各个房间的信息//////////
{
//loadroom();
printf("客房号 客房等级 客房价格 客房空闲(为空)\n");
for(int i=0;i<Z;i++)
{
printf("%-18d%-12c%-18d%-15d\n",room[i].num,room[i].dj,room[i].money,room[i].fk);
}
}
///////////////输出各类型空房间的信息///////////////
void printkong(char ch)
{
loadroom();
int i;
switch(ch)
{
case 'a':
{
printf("A类(豪华套房)空房间信息 客房号 客房价格 \n");
for(i=0;i<AJ;i++)
{
if(room[i].fk==0)
{
printf("\t\t\t%11d%15d\n",room[i].num,room[i].money);
}
}
break;
}
case 'b':
{
printf("B类(中档套房)空房间信息 客房号 客房价格 \n");
for(i=AJ;i<(AJ+BJ);i++)
{
if(room[i].fk==0)
{
printf("\t\t\t%11d%15d\n",room[i].num,room[i].money);
}
}
break;
}
case 'c':
{
printf("C类(单人公寓)空房间信息 客房号 客房价格 \n");
for(i=(AJ+BJ);i<Z;i++)
{
if(room[i].fk==0)
{
printf("\t\t\t%11d%15d\n",room[i].num,room[i].money);
}
}
break;
}
}
}
//////////////////选房间号////////////////////
unsigned int panduan(unsigned int num1,char ch)
{
int temp;//记录房间号
int i;
loadroom();
for(i=0;i<Z;i++)
{ if(room[i].num==num1&&(tolower(room[i].dj))==ch)
return temp=i;
}
printf("请检查您选择的房间号是否有误!\n");
return (Z+2);
}
/////////订房登记//////////
int n;//已订的房间数
void dengji()
{
int s;//每次所订的房间数
n=loadn();//读取每次文件中已订房间数的值
int flag=0;///真假判断
char ch;//用来选取房间等级
unsigned int money1;//预付金额
FILE *fp;
unsigned int t;//
printf("请输入您要订的房间数\n");
scanf("%d",&s);
do
{ getchar();//接收输入中的回车
printf("请选择您所订房间的类型 A(豪华套房) B(中档套房) C(单人公寓)\n");
ch=getchar();
}
while(!(tolower(ch)=='a'||tolower(ch)=='b'||tolower(ch)=='c'));
for(int i=0;i<s;i++)
{
//loadroom();
switch(tolower(ch))
{
case 'a':
{
unsigned int num1;///选择的房间号;
printkong(tolower(ch));
printf("请您正确选择以上房间号:\n");
do
{
scanf("%d",&num1);
t=panduan(num1,tolower(ch));
if(t!=0&&room[t].fk!=0)
{
printf("此房间已经被订,请重新选择\n");
flag=1;
}
else if(t>Z)
{flag=1;}
else
{
flag=0;
}
}
while(flag);//当选择房间错误或者所选房间有人时重新输入。
room[t].fk=1;
saveroom();//存取房间信息;
kehu[i].num0=num1;
do
{
printf("请交付订金(不得低于房价的倍)\n");
scanf("%d",&money1);
}
while(money1<(2*room[t].money));//预付的订金不得低于房间价格的两倍
kehu[i].money0=money1;
break;
}
case 'b':
{
unsigned int num1;///选择的房间号;
printkong(tolower(ch));
printf("请您正确选择以上房间号:\n");
do
{
scanf("%d",&num1);
t=panduan(num1,tolower(ch));
if(t!=0&&room[t].fk!=0)
{
printf("此房间已经被订,请重新选择\n");
flag=1;
}
else if(t>Z)
{flag=1;}
else
{
flag=0;
}
}
while(flag);//当选择房间错误或者所选房间有人时重新输入。
room[t].fk=1;
saveroom();//存取房间信息;
kehu[i].num0=num1;
do
{
printf("请交付订金(不得低于房价的倍)\n");
scanf("%d",&money1);
}
while(money1<(2*room[t].money));//预付的订金不得低于房间价格的两倍
kehu[i].money0=money1;
break;
}
case 'c':
{
unsigned int num1;///选择的房间号;
printkong(tolower(ch));
printf("请您正确选择以上房间号:\n");
do
{
scanf("%d",&num1);
t=panduan(num1,tolower(ch));
if(t!=0&&room[t].fk!=0)
{
printf("此房间已经被订,请重新选择\n");
flag=1;
}
else if(t>Z)
{flag=1;}
else
{
flag=0;
}
}
while(flag);//当选择房间错误或者所选房间有人时重新输入。
room[t].fk=1;
saveroom();//存取房间信息;
kehu[i].num0=num1;
do
{
printf("请交付订金(不得低于房价的倍)\n");
scanf("%d",&money1);
}
while(money1<(2*room[t].money));//预付的订金不得低于房间价格的两倍
kehu[i].money0=money1;
break;
}
//saveroom();
}
printf("请输入客户的姓名\n");
getchar();//接收
gets(kehu[i].name);
printf("请输入客户的身份证号");
gets(kehu[i].ID);
printf("请输入入住日期(月、日)\n");
scanf("%d%d",&kehu[i].ru.month,&kehu[i].ru.day);
printf("订房成功,欢迎您的光临\n");
}
if((fp=fopen("kehuxinxi.text","rb"))==NULL)
{save1(s);}
else
{save(s);}
n=n+s;//n为以订房间的人数。
saven(n);
}
//////////存取已订房间人数n的值////////
void saven(int n)
{
FILE *fp;
fp=fopen("n.text","w");
fprintf(fp,"%5d",n);
fclose(fp);
}
//////////读取n的值/////////
int loadn()
{
int m;
FILE *fp;
if((fp=fopen("n.text","r"))==NULL)
return 0;
else
{
fscanf(fp,"%d",&m);
return m;
}
}
////存取客户信息(追加)/////
void save(int s)
{
FILE *fp;
int i,m;
m=loadn();
if((fp=fopen("kehuxinxi.text","ab"))==NULL)
{
printf("打开文件失败\n");
return;
}
for(i=0;i<s;i++)
{
fwrite(&kehu[i],sizeof(people),1,fp);
}
fclose(fp);
}
////////存取(当文件为空时)/////////
void save1(int s)
{
FILE *fp;
fp=fopen("kehuxinxi.text","wb");
for(int i=0;i<s;i++)
{
fwrite(&kehu[i],sizeof(people),1,fp);
}
fclose(fp);
}
////////////////////////读取客户信息文件/////////////////
void loadkehu()
{
int m,i;
m=loadn();
FILE *fp;
if((fp=fopen("kehuxinxi.text","rb"))==NULL)
{
printf("打开文件失败或者客户信息为空\n");
return;
}
for(i=0;i<m;i++)
{
if(fread(&kehu[i],sizeof(people),1,fp)!=1)
{
printf("读取文件失败/n");
return;
}
}
}
/////////////////////////////// 输出客户信息/////////////////////////////
void printkehu()
{
loadkehu();
int m,i;
m=loadn();//读取现在总共有多少个客人
printf("客房号 客户姓名 ID 入住日期 预付金额\n");
for(i=0;i<m;i++)
{
printf("%-3d\t\t%-3s \t%-3s\t\t %5d月%2d日\t\t%-d\n",kehu[i].num0,kehu[i].name,kehu[i].ID,kehu[i].ru.month,kehu[i].ru.day,kehu[i].money0);
}
}
///////////////////////////输出一个客户信息//////////////
void printkehu2(int i)//i是客户的下标
{
printf("客房号 客户姓名 ID 入住日期 预付金额\n");
printf("%3d\t\t%3s\t%-3s\t\t%-5d 月%-2d 日\t\t%d\n",kehu[i].num0,kehu[i].name,kehu[i].ID,kehu[i].ru.month,kehu[i].ru.day,kehu[i].money0);
}
////////////////////////查询客户信息////////////////
void chaxun()
{
int k;
unsigned int numk;//查询的客房号
int flag;//判断作用
char namek[20];//查询的客户姓名
loadkehu();
printf("1.客房号查询 2.客户姓名查询 \n");
do
{
printf("请选择: ");
scanf("%d",&k);
}
while(!(k==1||k==2));
switch(k)
{
case 1:
{
flag=1;////
int i;
printf("请输入您要查询的客房号: ");
scanf("%d",&numk);
for(i=0;i<Z;i++)
{
if(kehu[i].num0==numk)
{
flag=0;
break;
}
}
if(flag==1)//没查到时取初值
{
printf("没有找到您要查询的客户\n");
return;
}
printkehu2(i);
break;
}
case 2:
{
flag=1;////
int i;
printf("请输入您要查询的客户姓名: ");
getchar();//接收
scanf("%s",namek);
for(i=0;i<Z;i++)
{
if(strcmp(kehu[i].name,namek)==0)
{
flag=0;
break;
}
}
if(flag==1)//没查到时取初值
{
printf("没有找到您要查询的客户\n");
return;
}
printkehu2(i);
break;
}
}
}
//////////////////////////////////////////////////
//////////时间(一年的第几天)///////////
int shijian(int month,int day)
{
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int s=0;
for(int i=0;i<month-1;i++)
{
s=s+a[i];
}
s=s+day;
return s;
}
/////////////////////////退房结算/////////////////////////////
void tuifang()
{
int i,m,t1,t2,s1,s2,s;
int flag=0;
unsigned int money9;
char ch;
m=loadn();///客人总数
getchar();//接收
printf("请输入您要退的客房号\n");
unsigned int num9;//退的房间号
scanf("%d",&num9);
loadkehu();//读取客户信息
loadroom();//读取房间信息
for(i=0;i<m;i++)
{
if(kehu[i].num0==num9)
{
t1=i;//记住客户的位置
flag=1;//证明有这个客户
break;
}
}
for(i=0;i<Z;i++)
{
if(room[i].num==num9)
{
t2=i;//记住房间的位置
}
}
if(flag)
{
printf(" 客房号 客户姓名 (请检查是否正确!)\n ");
printf("%5d\t%15s\n",kehu[t1].num0,kehu[t1].name);
}
else
{
printf("您的客房号输入有误\n");
return;
}
do
{
getchar();//接收
printf("确认退房请按Y否则请按N(不分大小写)\n");
ch=getchar();
}
while(!(tolower(ch)=='y'||tolower(ch)=='n'));
if(tolower(ch)=='y') //退房时
{
printf("请您输入客户的退房日期(月、日)");
scanf("%d%d",&kehu[t1].chu.month,&kehu[t1].chu.day);
s1=shijian(kehu[t1].ru.month,kehu[t1].ru.day);//入住的时间
s2=shijian(kehu[t1].chu.month,kehu[t1].chu.day);//退房时间
s=s2-s1;//住了多少天;
money9=s*room[t2].money;
printf("应收取的人民币为:%d 元\n",money9);
if((kehu[t1].money0-money9)>=0)
{
printf("应找您人民币%d 元\n",(kehu[t1].money0-money9));
}
else
{
printf("您的预付金额不足,请您再交取人民币 %d 元!\n",(money9-kehu[t1].money0));
}
room[t2].fk=0;
saveroom();
m=m-1;
savekehu2(t1,m);
saven(m);//存储剩余已订房的客户总数
printf("欢迎您下次光临!\n");
}
else
{
return;
}
}
////////////////客户退房后存储///////////////////
void savekehu2(int t,int m)//t为退房客户的下标,m为剩余订房客户的人数
{
FILE *fp;
if((fp=fopen("kehuxinxi.text","wb"))==NULL)
{
return;
}
for(t;t<m;t++)
{
kehu[t].num0=kehu[t+1].num0;
strcpy(kehu[t].name,kehu[t+1].name);
strcpy(kehu[t].ID,kehu[t+1].ID);
kehu[t].money0=kehu[t+1].money0;
kehu[t].ru.month=kehu[t+1].ru.month;
kehu[t].ru.day=kehu[t+1].ru.day;
}
for(int i=0;i<m;i++)
{
if(fwrite(&kehu[i],sizeof(people),1,fp)!=1)
{
printf("存取失败\n");break;
}
}
fclose(fp);
}
void mulu()//首页提示信息
{
printf("1. 客人入住登记\n");
printf("2. 客户信息查询\n");
printf("3. 查询房间信息\n");
printf("4. 退房结算\n");
printf("0. 退出\n");
}
void main()
{
//luru();///重新录入房间信息
//printkong('b');
//getchar();
//return;
char ch[50]={"* * * * * welcome to * * * * *"};
printf("********************************************************************\n\n");
printf(" %s\n\n",ch);
printf(" * * * 欢迎您进入宾馆管理系统* * *\n\n");
printf("********************************************************************\n\n\n");
mulu();
for(;;)
{
char ch2;
int c,k;
do
{
printf("请正确选择序号: ");
scanf("%d",&c);
}
while(!(c==1||c==2||c==3||c==4||c==5||c==0));
switch(c)
{
case 1:
{
dengji();
printf("按确定键返回主菜单\n");
getchar();
getchar();
break;
}
case 2:
{
printf("1.选择性查询\n2.查询所有客户信息\n");
do
{
printf("请选择: ");
scanf("%d",&k);
}
while(!(k==1||k==2));
switch(k)
{
case 1:
{
chaxun();
break;
}
case 2:
{
printkehu();
break;
}
}
printf("按确定键返回主菜单\n");
getchar();
getchar();
break;
}
case 3:
{
printf("1.查询空房\n2.查询所有房间信息\n");
do
{
printf("请选择: ");
scanf("%d",&k);
}
while(!(k==1||k==2));
switch(k)
{
case 1:
{
do
{ getchar();//接收输入中的回车
printf("请选择您所查询空房间的类型 A(豪华套房) B(中档套房) C(单人公寓)\n");
ch2=getchar();
}
while(!(tolower(ch2)=='a'||tolower(ch2)=='b'||tolower(ch2)=='c'));
printkong(tolower(ch2));
break;
}
case 2:
{
loadroom();
printroom();
break;
}
}
printf("按确定键返回主菜单\n");
getchar();
getchar();
break;
}
case 4:
{
tuifang();
printf("按确定键返回主菜单\n");
getchar();
getchar();
break;
}
case 0:
{
return;
}
}
system("cls");
mulu();
}
}
四、执行结果截图
五、个人感想
经过这次课题的实践
展开阅读全文