C语言程序设计 客房管理系统源码和报告.docx
《C语言程序设计 客房管理系统源码和报告.docx》由会员分享,可在线阅读,更多相关《C语言程序设计 客房管理系统源码和报告.docx(15页珍藏版)》请在冰豆网上搜索。
C语言程序设计客房管理系统源码和报告
《C语言程序设计》综合实验报告
1、需求分析
编写一个客房管理系统,提供键盘式菜单实现功能选择,功能包括:
用户登记、统计、查询和用户信息修改。
软件平台:
CODEBLOCKS
二、整体设计
整个客房管理系统被设计为用户登记模块、统计模块、查询模块和修改模块。
数据以TXT格式存储,支持保存信息。
3、
详细设计
(1)用户登记模块
通过函数readfile读取txt文件信息到room数组,提示用户选择想要入住的房间号,判断是否已经被占用,若占用,重新选择房间号,若没有占用,提示输入登记信息,把数据存入Room数组中,通过savefile添加信息到txt。
(2)统计模块
读取txt信息到结构体数组room,提示用户选择统计方式,设置计数器,顺序遍历Room数组,
1、计数器记录数组数,即总客房数
2、判断每一个数组中的结构体的时间是否和需要查询的日期相同,若相同,计数器加一
(3)查询模块
调用readfile函数,将信息读入room结构体数组中,提示用户选择查询方式,通过基本查找算法查找Room数组。
可以按房间号、价格、房间标记、用户姓名、居民身份证查询。
每一个查询函数内部结构如下:
(4)修改模块
调用readfile函数,读取信息到room结构体数组,提示用户输入需要修改的房间号,采用基本查找算法在数组中找到要修改的数据,提示用户重新更改房间信息,最后将结构体数组重新写入文件保存。
4、源代码
#include
#include
#include
#defineM80
//客户结构体
typedefstructclient
{
charname[12];//姓名
intsex;//性别
intage;//年龄
charid[20];//身份证号
intyear;//入住时间
intmonth;
intdate;
}CLIENT;
//客房结构体
structHotel
{
introomid;
inttel;//用户的话
intprice;//价格
intsign;//默认标记为空房间
CLIENTclient_list;//客户信息
}room[M];
voidMenu();//目录界面
voiddengji(structHotelroom[]);
voidsavefile(structHotelroom[],inti);
intreadfile(structHotelroom[]);
voidtongji(structHotelroom[]);
voidchaxun(structHotelroom[]);
voidprintmessage(structHotelroom[],intn);
voidxiugai(structHotelroom[]);
//主函数
intmain()
{
intn;
charreply;
Menu();
do{
printf("请输入选项对应的数字:
\n");
scanf("%d",&n);
while(n!
=1&&n!
=2&&n!
=3&&n!
=4)
{
printf("请输入各选项对应的数字!
\n");
scanf("%d",&n);
}
switch(n)
{
case1:
dengji(room);
break;
case2:
tongji(room);
break;
case3:
chaxun(room);
break;
case4:
xiugai(room);
break;
}
printf("是否还要进入其它选项?
(回复Y或y继续)\n");
scanf("%c",&reply);
}while(reply=='y'||reply=='Y');
return0;
}
//系统目录
voidMenu()
{
printf("************************客房管理系统***************************\n");
printf("\t\t\t1————登记\n");
printf("\t\t\t2————统计\n");
printf("\t\t\t3————查询\n");
printf("\t\t\t4————修改\n");
printf("***************************************************************\n");
}
//登记客户信息
voiddengji(structHotelroom[])
{
intx,j,i,flag;
charanswer;
do
{
i=readfile(room);
do
{
flag=0;
printf("输入您想入住的房间号:
(三位数)\n");
scanf("%3d",&x);
for(j=0;j
{
if(room[j].roomid==x)
{
printf("该房间已经被占用!
\n");
flag=1;
}
}
}while(flag>0);
room[i+1].roomid=x;
printf("请输入您的电话:
(仅支持六位数号码~)\n");
scanf("%d",&room[i+1].tel);
printf("入住价格\n");
scanf("%d",&room[i+1].price);
printf("请输入您的名字\n");
scanf("%s",room[i+1].client_list.name);
printf("性别:
(1表示女,0表示男)\n");
scanf("%d",&room[i+1].client_list.sex);
printf("您的年龄:
\n");
scanf("%d",&room[i+1].client_list.age);
printf("您的id:
\n");
scanf("%s",room[i+1].client_list.id);
printf("请输入入住年月日(格式:
20151111)\n");
scanf("%4d%2d%2d",&room[i+1].client_list.year,&room[i+1].client_list.month,&room[i+1].client_list.date);
savefile(room,i+1);
printf("是否还要继续登记?
(回复Y或y继续)\n");
scanf("%c",&answer);
}while(answer=='Y'||answer=='y');
}
//读取txt中的信息
intreadfile(structHotelroom[])
{
FILE*fp;
inti;
if((fp=fopen("room.txt","r"))==NULL)
{
printf("Failuretoopenscore.txt!
\n");
exit(0);
}
for(i=0;!
feof(fp);i++)
{
fscanf(fp,"%5d",&room[i].roomid);
fscanf(fp,"%6d",&room[i].price);
fscanf(fp,"%15d",&room[i].tel);
fscanf(fp,"%12s",room[i].client_list.name);
fscanf(fp,"%4d",&room[i].client_list.sex);
fscanf(fp,"%6d",&room[i].client_list.age);
fscanf(fp,"%20s",room[i].client_list.id);
fscanf(fp,"%7d",&room[i].client_list.year);
fscanf(fp,"%5d",&room[i].client_list.month);
fscanf(fp,"%5d",&room[i].client_list.date);
}
fclose(fp);
returni;
}
//保存结构体数组信息到文件
voidsavefile(structHotelroom[],inti)
{
FILE*fp;
if((fp=fopen("room.txt","a"))==NULL)
{
printf("Failuretoopenscore.txt!
\n");
exit(0);
}
fprintf(fp,"%5d%6d%15d%12s%4d%6d%20s%7d%5d%5d",
room[i].roomid,
room[i].price,
room[i].tel,
room[i].client_list.name,
room[i].client_list.sex,
room[i].client_list.age,
room[i].client_list.id,
room[i].client_list.year,
room[i].client_list.month,
room[i].client_list.date);
fclose(fp);
}
//统计模块
voidtongji(structHotelroom[])
{
intn,x;
intyear,month,day,j,count=0;
x=readfile(room);
printf("请选择统计方式:
1>统计房客数,2>统计某一天的房客数\n");
scanf("%d",&n);
switch(n)
{
case1:
printf("客房总数为:
%d\n",x);
break;
case2:
printf("请输入具体时间:
\n");
scanf("%d%d%d",&year,&month,&day);
for(j=0;j{
if(room[j].client_list.year==year&&room[j].client_list.month==month&&room[j].client_list.date==day)
{
count++;
}
}
printf("%d年%d月%d号的房客数为%d",year,month,day,count);
}
}
//查询模块
voidchaxun(structHotelroom[])
{
intn,x,roomid,price,j;
charname[12],id[20];
x=readfile(room);
printf("按房间号查询请按1;按价格查询请按2;按用户姓名查询请按3;按身份证号码查询请按4\n");
scanf("%d",&n);
switch(n)
{
case1:
printf("请输入房间号:
\n");
scanf("%d",&roomid);
for(j=0;j{
if(room[j].roomid==roomid)
{
print(room,j);
}
}
break;
case2:
printf("请输入价格:
\n");
scanf("%d",&price);
for(j=0;j{
if(room[j].price==price)
{
print(room,j);
}
}
break;
case3:
printf("请输入客户姓名:
\n");
scanf("%s",name);
for(j=0;j{
if(strcmp(room[j].client_list.name,name)==0)
{
print(room,j);
}
}
break;
case4:
printf("请输入身份证号码:
\n");
scanf("%s",id);
for(j=0;j{
if(strcmp(room[j].client_list.id,id)==0)
{
print(room,j);
}
}
}
}
//打印
voidprint(structHotelroom[],intj)
{
printf("%5d%6d%15d%12s%4d%6d%20s%7d%5d%5d\n",
room[j].roomid,
room[j].price,
room[j].tel,
room[j].client_list.name,
room[j].client_list.sex,
room[j].client_list.age,
room[j].client_list.id,
room[j].client_list.year,
room[j].client_list.month,
room[j].client_list.date);
}
voidprintmessage(structHotelroom[],intn)
{
intj;
for(j=0;j{
printf("%5d%6d%15d%12s%4d%6d%20s%7d%5d%5d\n",
room[j].roomid,
room[j].price,
room[j].tel,
room[j].client_list.name,
room[j].client_list.sex,
room[j].client_list.age,
room[j].client_list.id,
room[j].client_list.year,
room[j].client_list.month,
room[j].client_list.date);
}
}
//修改模块
voidxiugai(structHotelroom[])
{
inti,m,roomid;
m=readfile(room);
printf("请选择房间号:
\n");
scanf("%d",&roomid);
for(i=0;i{
if(room[i].roomid==roomid)
{
printf("请输入您的电话:
\n");
scanf("%d",&room[i].tel);
printf("入住价格\n");
scanf("%d",&room[i].price);
printf("请输入您的名字\n");
scanf("%s",room[i].client_list.name);
printf("性别:
\n");
scanf("%d",&room[i].client_list.sex);
printf("您的年龄:
\n");
scanf("%d",&room[i].client_list.age);
printf("您的id:
\n");
scanf("%s",room[i].client_list.id);
scanf("%4d%2d%2d",&room[i].client_list.year,&room[i].client_list.month,&room[i].client_list.date);
}
}
saveall(room,m);
}
//保存所有信息到txt文件
voidsaveall(structHotelroom[],intm)
{
intj;
FILE*fp;
if((fp=fopen("room.txt","w"))==NULL)
{
printf("Failuretoopenscore.txt!
\n");
exit(0);
}
for(j=0;j{
fprintf(fp,"%5d%6d%15d%12s%4d%6d%20s%7d%5d%5d",
room[j].roomid,
room[j].price,
room[j].tel,
room[j].client_list.name,
Room[j].client_list.sex,
room[j].client_list.age,
room[j].client_list.id,
room[j].client_list.year,
room[j].client_list.month,
room[j].client_list.date);
}
fclose(fp);
}
5、调试与测试
主界面:
1、登记功能测试:
情况1:
客户需要入住的房间号被占用,提示已经被占用,重新选择
情况2:
选择的房间没有被占用,提示用户输入登记信息,登记完成后系统后台执行保存,弹出窗口询问是否继续登记下一个顾客
2、统计功能测试:
情况1:
选择统计客房总数,系统返回总客房数
情况2:
选择按日期统计,系统返回具体某天的客房总数
3、查询功能测试:
情况1:
按房间号查询
情况2:
按价格查询
情况3:
按用户名查询
情况4:
按身份证号查询
4、修改功能测试:
输入需要修改的房间后,系统提示用户重新写入房间信息
6、总结
本程序可通过键盘选择目录对应的功能,提供登记、查询、统计、修改四大功能。
优点:
客户信息通过txt文件保存,在下次运行程序时仍然能读取保存的信息。
不足:
功能尚不完善,没有添加退房功能;用户操作界面需要美化,提高可操作性;可以加入清屏功能,以便在用户在选择相关功能以后,不再显示菜单目录。
个人心得:
这是本学期第一次用C语言编写一个系统,实现比较完整的功能。
1、遇到的部分问题:
程序不能将信息正确从txt文档中读取,出现乱码。
原因:
读取函数和存储函数的读取/存储格式没有对应。
查询功能模块中按日期查询出现错误,只能正确读取最后一组数据的日期
原因:
每组数据之间没有空格符号,导致前一组和后一组数据的日期和房间号牵连到一块,导致读取错误。
更改读取和存储函数的格式。
1、通过实践,体会到了需求分析和结构设计流程等编程准备工作的重要性:
一个大的程序,不可能通过大脑的构思,一步就能完成,要想减少程序编写过程中遇到的思路错误,必须要在此之前构思好,清楚该实现什么功能,这个功能怎么实现,需要一些什么途径。
2、分而治之、信息隐藏的思想对于大型程序来说尤为重要,不但能减少程序中重复的代码,还能使程序结构和功能更加清晰,可读性更强。
3、关键地方要加以注释,以便日后能够读懂函数的程序的功能。