基于C语言实现的旅店管理系统

YoungTime

发布日期: 2018-10-31 21:56:27 浏览量: 1093
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

1 需求分析

通过和指导老师交流,了解到本系统中的数据来源于标准输入设备(如键盘)或者来自某文件,操作主要有客人入住、客人续住、客人离开、客人查询。总之,可以实现对旅店系统的住宿管理、客房管理、查询统计。

1.1 住宿管理

客人来住宿时首先需要查找是否有空房,若有,则询问客人需要哪种类型的客房(住房价格,随行人数)。客人决定后需要输入自己的身份证号、姓名、性别、电话号码、入住时长等必要信息。客人如果对客房不满意,可以提出更换房间或是退房。客人住宿时间结束后可以办理退房手续。输入时需要对身份证号以及电话号码进行判断,若符合标准则继续,否则重新输入。

1.2 客房管理

考虑到实际需要,对客房的管理包括对客房的增加、删除、修改、查找空余房间、查找房间的设置等功能。

1.3 查询统计

输入客房编号能够查找到是否有人入住,如果有人入住,则输出客人信息,否则显示空房。输入客人的身份证号能查询到是否此人入住,若入住,输出客人信息,否则输出无人入住。可以查找即将欠费的客房。可以查找指定价格区间与几人间的住房。

2 概要设计

2.1 数据类型的定义

2.1.1 定义客人的元素类型

  1. typedef struct
  2. {
  3. int year;
  4. int mon;
  5. int day;
  6. }ruzhutime;//入住时间的结构体
  7. typedef struct patron//客官信息
  8. {
  9. int guenum;//客人住房编号
  10. char name[20];//客人姓名
  11. char idnum[19];//客人身份证号
  12. char phone[12];//电话号码
  13. char sex[5];//客人性别
  14. ruzhutime time;//入住时间
  15. int timelong;//租房时长
  16. long int s;//标记时间
  17. }parton;

2.1.2 定义客房的元素类型

  1. typedef struct Guest//住房
  2. {
  3. int guenum;//客房编号
  4. int maxnum;//最大入住人数
  5. int shifouruzhu;//是否有人入住
  6. double zujin;//房租
  7. int num;//已入住人数
  8. }Guest;

2.1.3 定义函数返回类型

  1. typedef int Index;//hash地址类型
  2. typedef void Status;//返回类型

2.2 功能模块结构图

根据需求分析,为了满足用户的功能需求,按照软件开发方法学中的模块划分原则,我将本系统主要划分为如下模块:住宿管理、客房管理、查询统计。各模块之间的关系如图所示。

主菜单模块结构图

住宿管理模块结构图

客房管理模块结构图

查询统计模块结构图

为了实现上述功能模块,分别在各个模块物理结构上定义了多个函数,本系统定义的函数和功能如下:

2.2.1 住宿管理部分

  1. Status ruzhu();
  2. 功能:入住操作。
  3. Status tuifang();
  4. 功能:退房操作。
  5. Status xufang();
  6. 功能:续房操作。
  7. Status findprice();
  8. 功能:筛选符合需求的客房。
  9. Status findkefang();
  10. 功能:查找空的客房。

2.2.2 客房管理部分

  1. Status weihu();
  2. 功能:客房信息的维护。
  3. Status InputRoom();
  4. 功能:初始化客房信息。
  5. Status writetotxt();
  6. 功能:将客房信息写入到kefangxinxi.txt文件中。
  7. Status write1totxt();
  8. 功能:将客人信息写入到kerenxinxi.txt文件中。
  9. Status readfromtxt();
  10. 功能:将客房信息从kefangxinxi.txt文件中读出到hash表中。
  11. Status read1fromtxt();
  12. 功能:将客人信息从kerenxinxi.txt读出到hash1表中。
  13. Status kefangxinxi();
  14. 功能:输出客房信息。
  15. Status xiugaikefang();
  16. 功能:修改客房信息。
  17. Status tainjiakefang();
  18. 功能:添加客房。
  19. Status shanchukefang();
  20. 功能:删除客房。
  21. Status zhusuguanli();
  22. 功能:住宿管理菜单。

2.2.3 查询统计模块

  1. Status findkefang();
  2. 功能:查找空的客房。
  3. Status findkeren();
  4. 功能:查找客人。
  5. Status findofroom();
  6. 功能:按照客房查找客人。
  7. Status findofname();
  8. 功能:按照姓名查找客人。
  9. Status kerenxinxi();
  10. 功能:输出客人信息。
  11. Index HashIndex(int num);
  12. 功能:查找numhash函数中的位置(取num的后三//位并返回后三位)。
  13. Status daoqitixing();
  14. 功能:输出即将到期的客人

2.2.4 其他辅助函数

  1. Status writetotxt();
  2. 功能:将客房信息写入到kefangxinxi.txt文件中。
  3. Status write1totxt();
  4. 功能:将客人信息写入到kerenxinxi.txt文件中。
  5. Status readfromtxt();
  6. 功能:将客房信息从kefangxinxi.txt文件中读出到hash表中。
  7. Status read1fromtxt();
  8. 功能:将客人信息从kerenxinxi.txt读出到hash1表中。
  9. Index HashIndex(int num);
  10. 功能:查找numhash函数中的位置(取num的后三位并返回后三位)。

3 运行环境

  • 硬件环境:PC机内存 256M;硬盘40G

  • 软件环境:操作系统:Windows 10

4 开发工具和编程语言

  • 开发环境:DEV C++

  • 编程语言:C语言

5 详细设计

在概要设计的基础上,对每个模块进行内部逻辑处理部分详细设计。下面分别列出各个模块具体实现流程图。

5.1 添加客房信息

首先定义一个哈希表,其表长为1000,每输入一个客房编号num,进行取后三位数操作(以下出现num,凡是不做特殊说明,均认为取后三位),输入的客房信息为-1时结束。具体操作如下图:

5.2 删除客房信息

删除时首先输入需要删除的客房编号num,如果此房间存在则删除此房间,否则输出不存在此房间。具体操作如下图:

5.3 修改客房信息

输入需要修改的客房的编号num,当此客房存在时继续输入修改后的信息,否则输出不存在此房间,具体操作如下图:

5.4 查询客房信息

输入客房编号num不为0,则存在此房间,并输出此房间信息,否则输出查无此房,具体实现如下图:

5.5 客人入住

输入客人入住的编号num,当num不为0,并且入住人数不小于需要入住的人数时,将其信息置为客人信息,操作过程如下:

5.6 客人退房

输入客房编号num,当num不为0时,将客人信息的客房信息换为0,并将客房信息修改为无人入住。具体操作如下:

5.7 客人续房

输入需要续住的客房的编号num,判断其是否有人入住,并输出此房间的信息,以便于客人浏览并确认是否进行续费。若确认续费,则输入续住的天数。将客人的信息进行调整后再保存到文件中。具体实现过程如下图:

5.8 筛选符合条件的客房

首先输入需要查找的客房信息,包括价格区间,同行人数等必要信息,然后查找符合条件的信息并输出,具体过程如下:

5.9 查找客人

查找包括两部分。1.查找指定客房的客人。2. 查找指定姓名的客人。调用如下:

5.10 按照房间号查找客人

输入房间号num,如果房间号里的信息有人入住,则输出此人的信息。否则,输出此房间尚未租出。具体过程如下:

5.11 按照姓名查找

5.12 查询即将到期的客人

遍历所有客人,判断其入住时间是否离到期时间小于三天,若是,则输出此客人,否则不输出。具体过程如下:

5.13 哈希函数

传递一个房间编号(整型变量),返回该数的后三位作为客房的存储地址。具体操作流程如下:

5.14 将信息写入文件

首先以需要打开的方式打开需要打开的文件,将非空信息写入文件,关闭文件。具体流程如下图所示:

5.15 将信息从文件读出

首先以需要打开的方式打开需要打开的文件,将信息读出到哈希表中,关闭文件。具体流程如下图所示:

6 程序编码

根据详细设计的流程图转化为如下代码,下面列出部分代码:

  1. /*住宿管理模块:包括客房预订、入住登记、客人续往、调房登记、退房结账
  2. 客房管理模块:包括客房设置、客房查询、宿费提醒
  3. 查询统计模块:包括预订房查询、住宿查询、退房查询、客房宿费统计
  4. */
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include<string.h>
  8. #include<time.h>
  9. #define MAX 1000//哈希表的表长
  10. typedef int Index;//hash地址类型
  11. typedef void Status;//返回类型
  12. Status weihu();//客房信息的维护
  13. Status InputRoom();//初始化客房信息
  14. Status writetotxt();//将客房信息写入到kefangxinxi.txt文件中
  15. Status write1totxt();//将客人信息写入到kerenxinxi.txt文件中
  16. Status readfromtxt();//将客房信息从kefangxinxi.txt文件中读出到hash表中
  17. Status read1fromtxt();//将客人信息从kerenxinxi.txt读出到hash1表中
  18. Index HashIndex(int num);//查找num在hash函数中的位置(取num的后三位并返回后三位)
  19. Status kefangxinxi();//输出客房信息
  20. Status xiugaikefang();//修改客房信息
  21. Status tainjiakefang();//添加客房
  22. Status shanchukefang();//删除客房
  23. Status zhusuguanli();//住宿管理菜单
  24. Status ruzhu();//入住操作
  25. Status tuifang();//退房操作
  26. Status xufang();//续房操作
  27. Status findprice();// 筛选符合需求的客房
  28. Status findkefang();//查找空的客房
  29. Status findkeren();//查找客人
  30. Status findofroom();//按照客房查找客人
  31. Status findofname();//按照姓名查找客人
  32. Status kerenxinxi();//输出客人信息
  33. Status daoqitixing();//输出即将到期的客人
  34. /*住宿管理模块:包括客房预订、
  35. 入住登记、客人续住、调房登记、退房结账*/
  36. typedef struct
  37. {
  38. int year;
  39. int mon;
  40. int day;
  41. }ruzhutime;//入住时间的结构体
  42. typedef struct patron//客官信息
  43. {
  44. int guenum;//客人住房编号
  45. char name[20];//客人姓名
  46. char idnum[19];//客人身份证号
  47. char phone[12];//电话号码
  48. char sex[5];//客人性别
  49. ruzhutime time;//入住时间
  50. int timelong;//租房时长
  51. long int s;
  52. }parton;
  53. parton hash1[MAX];//定义客人的哈希表
  54. typedef struct Guest//住房
  55. {
  56. int guenum;//客房编号
  57. int maxnum;//最大入住人数
  58. int shifouruzhu;//是否有人入住
  59. double zujin;//房租
  60. int num;//已入住人数
  61. }Guest;
  62. Guest hash[MAX];//定义客房的哈希表
  63. Index HashIndex(int num)//查找num在hash函数中的位置(取num的后三位并返回后三位)
  64. {
  65. return num%MAX;//取后三位
  66. }
  67. Status InputRoom()//初始化房间信息
  68. {
  69. int i;
  70. printf("注意!!!是否继续,此操作会将原客房信息覆盖且无法恢复(Y/N)\n");
  71. char choice;//确认操作
  72. scanf("%*c%c", &choice);
  73. if(choice!='Y'&&choice!='y') return;
  74. Guest room;
  75. printf("请输入房间编号,(编号为-1时结束输入)\n");
  76. while(scanf("%d", &room.guenum),room.guenum!=-1)//输入信息
  77. {
  78. i=room.guenum%1000;
  79. if(hash[i].guenum)//如果已经输入过此房间则重新输入
  80. {
  81. printf("已存在此房间!请重新输入!\n");
  82. continue;
  83. }
  84. printf("请输入最大入住人数\n");
  85. scanf("%d", &room.maxnum);
  86. printf("请输入租金:\n");
  87. scanf("%lf", &room.zujin);
  88. printf("请输入是否有人入住:(1=有;0=没有)\n");
  89. scanf("%d",&room.shifouruzhu);
  90. printf("请输入入住人数:\n");
  91. scanf("%d", &room.num);
  92. hash[i]=room;
  93. printf("请输入房间编号,(编号为-1时结束输入)\n");
  94. }
  95. printf("房间编号 最大入住人数 租金 是否有人 入住人数\n");
  96. for(i=0;i<MAX;i++)//输出操作后的客房信息
  97. if(hash[i].guenum)
  98. printf("%d %d %.2f %d %d\n", hash[i].guenum,hash[i].maxnum,hash[i].zujin,
  99. hash[i].shifouruzhu,hash[i].num);
  100. writetotxt();//将客房信息写入文件
  101. }
  102. Status weihu()//客房信息的维护
  103. {
  104. while(1)
  105. {
  106. printf("************************************\n");
  107. printf("**** 重新输入客房信息请输入 1: ***\n");
  108. printf("**** 修改客房信息请输入 2: ***\n");
  109. printf("**** 添加客房信息请输入 3: ***\n");
  110. printf("**** 删除客房信息请输入 4: ***\n");
  111. printf("**** 返回上一菜单请输入 0: ***\n");
  112. printf("************************************\n");
  113. int n;
  114. printf("请输入您的选择:\n");
  115. if(scanf("%d", &n)!=1)
  116. {
  117. printf("输入错误!\n已退出!\n");
  118. return;
  119. }
  120. switch(n)//对应的选择
  121. {
  122. case 1:InputRoom();break;//初始化客房信息
  123. case 2:xiugaikefang();break;//修改客房信息
  124. case 3:tainjiakefang();break;//添加客房
  125. case 4:shanchukefang();break;//删除客房
  126. case 0:return;//返回上一菜单
  127. }
  128. }
  129. }
  130. Status shanchukefang()//删除客房
  131. {
  132. int i,num;
  133. printf("请输入要删除的客房编号:\n");
  134. if(scanf("%d", &num)!=1)
  135. {
  136. printf("输入错误!\n已退出!\n");
  137. return;
  138. }
  139. i=HashIndex(num);//哈希地址
  140. if(!hash[i].guenum)//如果客房编号为0
  141. {
  142. printf("此客房不存在!\n");
  143. return ;
  144. }
  145. printf("删除不可恢复,是否要删除!Y/N\n");//确认操作
  146. char c;
  147. if(scanf("%*c%c", &c)!=1)
  148. {
  149. printf("输入错误!\n已退出!\n");
  150. return;
  151. }
  152. if(c!='Y'&&c!='y')//取消操作
  153. return;
  154. hash[i].guenum=0;//将客房信息初始化为0
  155. writetotxt();//写入文件
  156. printf("删除成功!\n");
  157. }
  158. Status tainjiakefang()//添加客房信息
  159. {
  160. int i,num;
  161. printf("请输入需要添加的客房编号:\n");
  162. if(scanf("%d", &num)!=1)
  163. {
  164. printf("输入错误!\n已退出!\n");
  165. return;
  166. }
  167. i=HashIndex(num);//哈希地址
  168. if(hash[i].guenum)//房间号不为空
  169. {
  170. printf("此房间已存在!\n");
  171. return;
  172. }
  173. hash[i].guenum=num;
  174. printf("请输入最大入住人数\n");
  175. scanf("%d", &hash[i].maxnum);
  176. printf("请输入租金:\n");
  177. scanf("%lf", &hash[i].zujin);
  178. printf("请输入是否有人入住:(1=有;0=没有)\n");
  179. scanf("%d",&hash[i].shifouruzhu);
  180. printf("请输入入住人数:\n");
  181. scanf("%d", &hash[i].num);
  182. printf("添加成功!\n");
  183. writetotxt();
  184. }
  185. Status xiugaikefang()//修改客房信息
  186. {
  187. printf("请输入需要修改的客房的编号:\n");
  188. int num,i,j;
  189. scanf("%d", &num);
  190. i=HashIndex(num);//哈希地址
  191. if(!hash[i].guenum)//客房编号为空
  192. {
  193. printf("不存在此房间!\n");
  194. return;
  195. }
  196. printf("此房间信息为:\n");//修改客房之前输出此客房信息便于确认
  197. printf("房间编号 最大入住人数 租金 是否有人 入住人数\n");
  198. printf("%d %d %.2f %d %d\n", hash[i].guenum,hash[i].maxnum,hash[i].zujin,
  199. hash[i].shifouruzhu,hash[i].num);
  200. printf("是否要修改 是(Y)否(N)\n");
  201. char c;
  202. scanf("%*c%c", &c);
  203. if(c!='y'&&c!='Y')//确认删除
  204. {
  205. printf("修改取消!\n");
  206. return;
  207. }
  208. printf("请输入最大入住人数\n");
  209. scanf("%d", &hash[i].maxnum);
  210. printf("请输入租金:\n");
  211. scanf("%lf", &hash[i].zujin);
  212. printf("请输入是否有人入住:(1=有;0=没有)\n");
  213. scanf("%d",&hash[i].shifouruzhu);
  214. printf("请输入入住人数:\n");
  215. scanf("%d", &hash[i].num);
  216. printf("修改成功!\n");
  217. printf("修改后的信息为:\n");
  218. printf("此房间信息为:\n");
  219. printf("房间编号 最大入住人数 租金 是否有人 入住人数\n");
  220. printf("%d %d %.2f %d %d\n", hash[i].guenum,hash[i].maxnum,hash[i].zujin,
  221. hash[i].shifouruzhu,hash[i].num);
  222. writetotxt();//将修改后的信息写入文件
  223. }
  224. Status kefangxinxi()//输出客房信息
  225. {
  226. int i;
  227. printf("房间编号 最大入住人数 租金 是否有人 入住人数\n");
  228. for(i=0;i<MAX;i++)
  229. if(hash[i].guenum)//存在客房
  230. printf("%d %d %.2f %d %d\n", hash[i].guenum,hash[i].maxnum,hash[i].zujin,
  231. hash[i].shifouruzhu,hash[i].num);
  232. }
  233. Status search()//查找模块
  234. {
  235. while(1)
  236. {
  237. printf("************************************\n");
  238. printf("**** 查找客房信息请输入 1: ***\n");
  239. printf("**** 查找客人信息请输入 2: ***\n");
  240. printf("**** 浏览所有住房信息请输入 3: ***\n");
  241. printf("**** 浏览所有客人信息请输入 4: ***\n");
  242. printf("**** 筛选客房请输入输入 5: ***\n");
  243. printf("**** 输出快到期的客人请输入 6: ***\n");
  244. printf("**** 返回上一菜单请输入 0: ***\n");
  245. printf("************************************\n");
  246. int n;
  247. printf("请输入您的选择:\n");
  248. if(scanf("%d", &n)!=1)
  249. {
  250. printf("输入错误!\n已退出!\n");
  251. return;
  252. }
  253. switch(n)
  254. {
  255. case 1:findkefang();break;//查找客房
  256. case 2:findkeren();break;//查找客人
  257. case 3:kefangxinxi();break;//客房信息输出
  258. case 4:kerenxinxi();break;//客人信息输出
  259. case 5:findprice();break;//筛选指定的客房
  260. case 6:daoqitixing();break;
  261. case 0:return;//返回上一菜单
  262. }
  263. }
  264. }
  265. Status daoqitixing()
  266. {
  267. int i,j=0;
  268. time_t rawtime;//获取时间标记
  269. printf("即将到期客人信息为:\n");
  270. for(i=0;i<MAX;i++)
  271. if(hash1[i].guenum)
  272. if(hash1[i].s-time(&rawtime)<=hash1[i].timelong*24*60*60)
  273. {
  274. printf("%d %d %.2f %d %d\n", hash[i].guenum,hash[i].maxnum,hash[i].zujin,
  275. hash[i].shifouruzhu,hash[i].num);
  276. j=1;
  277. }
  278. if(!j) printf("不存在快到期的客人!\n");
  279. }
  280. Status findprice()//筛选指定客房
  281. {
  282. printf("请输入指定的价格区间:\n");
  283. printf("请输入最小的价格:\n");
  284. double low;
  285. scanf("%lf", &low);
  286. printf("请输入最大的价格:\n");
  287. double high;
  288. scanf("%lf", &high);
  289. printf("请输入人数:\n");
  290. int s;
  291. scanf("%d",&s);
  292. int i;
  293. printf("房间编号 最大入住人数 租金 是否有人 入住人数\n");
  294. for(i=0;i<MAX;i++)
  295. if(hash[i].zujin>=low&&hash[i].zujin<=high&&hash[i].maxnum>=s)//符合筛选条件
  296. printf("%d %d %.2f %d %d\n", hash[i].guenum,hash[i].maxnum,hash[i].zujin,
  297. hash[i].shifouruzhu,hash[i].num);
  298. }
  299. Status kerenxinxi()//输出客人信息
  300. {
  301. int i,j=0;
  302. for(i=0;i<MAX;i++)
  303. if(hash1[i].guenum)//如果有客人
  304. {
  305. printf("住宿房间号:%d 姓名:%s 身份证号:%s 电话号码: %s 性别: %s \n",hash1[i].guenum,hash1[i].name,
  306. hash1[i].idnum,hash1[i].phone,hash1[i].sex);
  307. j=1;//标记有客人
  308. }
  309. if(!j) printf("无人入住!\n");
  310. }
  311. Status findkeren()//查找客人
  312. {
  313. int i,j=0;
  314. printf("*********************************\n");
  315. printf("**** 按照房间查找请输入 1 ****\n");
  316. printf("**** 按照姓名查找请输入 2 ****\n");
  317. printf("*********************************\n");
  318. printf("请输入您的选择:\n");
  319. int n;
  320. scanf("%d", &n);
  321. switch(n)
  322. {
  323. case 1:findofroom();break;//按房间查找
  324. case 2:findofname();break;//按姓名查找
  325. }
  326. }
  327. Status findofname()//按姓名查找
  328. {
  329. char name[20];
  330. printf("请输入客人姓名:\n");
  331. scanf("%s", name);
  332. int i,j=0;
  333. for(i=0;i<MAX;i++)
  334. if(!strcmp(hash1[i].name,name))//要查找的姓名与客人相同
  335. {
  336. printf("住宿房间号:%d 姓名:%s 身份证号:%s 电话号码: %s 性别: %s \n",hash1[i].guenum,hash1[i].name,
  337. hash1[i].idnum,hash1[i].phone,hash1[i].sex);
  338. j=1;//找到标记
  339. }
  340. if(!j )printf("查无此人!!\n");
  341. }
  342. Status findofroom()//按客房查找
  343. {
  344. int i,num;
  345. printf("请输入房间编号:\n");
  346. scanf("%d", &num);
  347. i=HashIndex(num);//哈希地址
  348. if(!hash1[i].guenum)//房间号不存在
  349. {
  350. printf("无人入住!!\n") ;
  351. return;
  352. }
  353. printf("住宿房间号:%d 姓名:%s 身份证号:%s 电话号码: %s 性别: %s \n",hash1[i].guenum,hash1[i].name,
  354. hash1[i].idnum,hash1[i].phone,hash1[i].sex);
  355. }
  356. Status findkefang()//查找空余客房
  357. {
  358. int i,j=0;
  359. printf("空余客房为:\n");
  360. printf("房间编号 最大入住人数 租金 是否有人 入住人数\n");
  361. for(i=0;i<MAX;i++)
  362. if(!hash[i].shifouruzhu&&hash[i].guenum){
  363. printf("%d %d %.2f %d %d\n", hash[i].guenum,hash[i].maxnum,hash[i].zujin,
  364. hash[i].shifouruzhu,hash[i].num);
  365. j=1;//找到标记
  366. }
  367. if(!j) printf("客房爆满!!!\n");
  368. }
  369. Status zhusuguanli()//住宿管理
  370. {
  371. printf("************************************\n");
  372. printf("***** 入住请输入 1: ****\n");
  373. printf("***** 退房请输入 2: ****\n");
  374. printf("***** 续房请输入 3: ****\n");
  375. printf("***** 退出请输入 0: ****\n");
  376. printf("************************************\n");
  377. int n;
  378. printf("请输入您的选择:\n");
  379. scanf("%d", &n);
  380. switch(n)
  381. {
  382. case 1:ruzhu();break;//入住操作
  383. case 2:tuifang();break;//退房操作
  384. case 3:xufang();break;//续房操作
  385. case 0:return;//返回上一菜单
  386. }
  387. }
  388. Status xufang()//续房操作
  389. {
  390. printf("请输入需要续房的房间号:\n");
  391. int num,i;
  392. if(scanf("%d", &num)!=1)
  393. {
  394. printf("输入错误!\n已退出!\n");
  395. return;
  396. }
  397. i=HashIndex(num);//哈希地址
  398. if(!hash1[i].guenum)//若未租出
  399. {
  400. printf("此房间尚未租出!!\n");
  401. return;
  402. }
  403. printf("住宿房间号:%d 姓名:%s 入住时间:%d年%d月%d日 入住时长:%d天\n",hash1[i].guenum,hash1[i].name,
  404. hash1[i].time.year,hash1[i].time.mon,hash1[i].time.day,hash1[i].timelong);
  405. printf("是否续费? Y/N\n");
  406. char c;
  407. if(scanf("%*c%c", &c)!=1)
  408. {
  409. printf("输入错误!\n已退出!\n");
  410. return;
  411. }
  412. if(c!='y'&&c!='Y') return;//确认操作
  413. printf("请输入续费的天数:\n");
  414. int day;
  415. scanf("%d", &day) ;
  416. hash1[i].timelong+=day;//修改延长后住宿天数
  417. printf("修改后的信息为:\n");
  418. printf("住宿房间号:%d 姓名:%s 入住时间:%d年%d月%d日 入住时长:%d天\n",hash1[i].guenum,hash1[i].name,
  419. hash1[i].time.year,hash1[i].time.mon,hash1[i].time.day,hash1[i].timelong);
  420. write1totxt();//修改后写入文件
  421. printf("续费成功!!\n");
  422. }
  423. Status tuifang()//退房操作
  424. {
  425. printf("请输入将要退房的房间号:\n");
  426. int num,i;
  427. if(scanf("%d", &num)!=1)
  428. {
  429. printf("输入错误!\n已退出!\n");
  430. return;
  431. }
  432. i=HashIndex(num);//哈希地址
  433. if(!hash1[i].guenum)//没有租出
  434. {
  435. printf("此房间没有租出!!\n");
  436. return;
  437. }
  438. hash1[i].guenum=0;//将此客人删除
  439. write1totxt();//操作后的客人信息 写入文件
  440. hash[i].shifouruzhu=0;//客房修改为没有人入住
  441. hash[i].num=0;//入住人数修改为0
  442. writetotxt();//将修改后的 客房信息写入文件
  443. printf("退房成功,欢迎下次光临!!!\n");
  444. }
  445. Status ruzhu()//入住操作
  446. {
  447. findprice();
  448. printf("请输入需要预定的房间编号:\n");
  449. parton keren;
  450. if(scanf("%d", &keren.guenum)!=1)
  451. {
  452. printf("输入错误!\n已退出!\n");
  453. exit(0);
  454. }
  455. int i;
  456. i=HashIndex(keren.guenum);//哈希地址
  457. if(!hash[i].guenum)
  458. {
  459. printf("查无此房!!\n");
  460. return;
  461. }
  462. if(hash[i].shifouruzhu)
  463. {
  464. printf("此房间已经有人!\n");
  465. return;
  466. }
  467. int n;
  468. printf("请输入几人入住:\n");
  469. if(scanf("%d", &n)!=1)
  470. {
  471. printf("输入错误!\n已退出!\n");
  472. return;
  473. }
  474. if(hash[i].maxnum<n)//超过入住人数上限
  475. {
  476. printf("超过人数上限!!\n请重新输入:\n");
  477. return;
  478. }
  479. printf("请输入客人姓名:\n");
  480. scanf("%s", keren.name);
  481. printf("请输入客人身份证号:\n");
  482. scanf("%s", keren.idnum);
  483. printf("请输入客人电话号码:\n");
  484. scanf("%s", keren.phone);
  485. printf("请输入客人性别:\n");
  486. scanf("%s", keren.sex);
  487. printf("请输入入住时间:(年月日),中间用空格隔开\n");
  488. scanf("%d%d%d", &keren.time.year,&keren.time.mon,&keren.time.day);
  489. printf("请输入入住时长:\n");
  490. scanf("%d", &keren.timelong);
  491. time_t rawtime;//获取时间标记
  492. keren.s=time(&rawtime);
  493. hash1[i]=keren;//入住
  494. hash[i].shifouruzhu=1;//客房信息改为有人入住
  495. hash[i].num=n;//入住人数
  496. writetotxt();//写入修改后的客人和客房信息
  497. write1totxt();
  498. }
  499. int main()//主函数
  500. {
  501. int i;
  502. for(i=0;i<MAX;i++)
  503. {
  504. hash[i].guenum=0;
  505. hash1[i].guenum=0;
  506. }
  507. readfromtxt();
  508. read1fromtxt();
  509. while(1)
  510. {
  511. printf("*************************************\n");
  512. printf("**** 欢迎使用住宿管理系统 *****\n\n");
  513. printf("**** 住宿管理请输入 1: *****\n");
  514. printf("**** 客房管理请输入 2: *****\n");
  515. printf("**** 查询统计请输入 3: *****\n");
  516. printf("**** 退出请输入 0: *****\n\n");
  517. printf("*************************************\n");
  518. int choice;
  519. printf("请输入您的选择:\n");
  520. if(scanf("%d",&choice)!=1) //如果输入不非法
  521. {
  522. printf("输入错误!\n已退出!\n");
  523. exit(0);
  524. }
  525. switch(choice)
  526. {
  527. case 1:zhusuguanli();break;//住宿管理模块
  528. case 2: weihu();break;//客房维护模块
  529. case 3:search();break;//查找信息模块
  530. case 0: printf("\n感谢使用本旅店管理系统\n\nhaut,掌握先进科技!\n");
  531. exit(0);//退出
  532. }
  533. }
  534. return 0;
  535. }
  536. Status write1totxt()//将客人信息写入kerenxinxi.txt文件
  537. {
  538. FILE *fp;//定义文件
  539. fp=fopen("kerenxinxi.txt","w");//以写的方式打开
  540. int i;
  541. for(i=0;i<MAX;i++)
  542. if(hash1[i].guenum)
  543. fprintf(fp,"%d %s %s %s %s %d %d %d %d %d\n",hash1[i].guenum,hash1[i].name,hash1[i].idnum,hash1[i].phone,
  544. hash1[i].sex,hash1[i].time.year,hash1[i].time.mon,hash1[i].time.day,hash1[i].timelong,hash1[i].s);
  545. fclose(fp);//关闭文件
  546. }
  547. Status read1fromtxt()//从文件kerenxinxi.txt文件读出客人信息到hash1数组中
  548. {
  549. parton keren;//暂存的客人
  550. FILE *fp;//定义文件指针
  551. fp=fopen("kerenxinxi.txt","r");//以读的方式打开文件
  552. int i;
  553. while(!feof(fp))//不到文件尾
  554. {
  555. fscanf(fp,"%d %s %s %s %s %d %d %d %d %d\n", &keren.guenum,keren.name,keren.idnum,keren.phone,
  556. keren.sex,&keren.time.year,&keren.time.mon,&keren.time.day,&keren.timelong,&keren.s);
  557. i=HashIndex(keren.guenum);//哈希地址
  558. hash1[i]=keren;//赋值
  559. }
  560. fclose(fp);//关闭文件
  561. }
  562. Status readfromtxt()//从文件中读取客房信息
  563. {
  564. Guest room;
  565. FILE *fp;//定义文件
  566. if((fp=fopen("roomxinxi.txt","r"))==NULL)
  567. {
  568. printf("打开文件失败!!!\n");
  569. exit(0);
  570. }//读的方式打开文件
  571. int i;
  572. while(!feof(fp))//不到文件尾
  573. {
  574. fscanf(fp,"%d %d %lf %d %d\n", &room.guenum,&room.maxnum,&room.zujin,
  575. &room.shifouruzhu,&room.num);
  576. i=HashIndex(room.guenum);//哈希地址
  577. hash[i]=room;
  578. }
  579. if(fclose(fp))
  580. {
  581. printf("关闭文件失败!!!\n");
  582. exit(0);
  583. }//关闭文件
  584. }
  585. Status writetotxt()//将客房信息写入文件
  586. {
  587. int i;
  588. FILE *fp;
  589. if((fp=fopen("roomxinxi.txt","w"))==NULL)//读的方式打开文件
  590. {
  591. printf("打开文件失败!!!\n");
  592. exit(0);
  593. }
  594. for(i=0;i<MAX;i++)
  595. if(hash[i].guenum)//有客房
  596. fprintf(fp,"%d %d %lf %d %d\n", hash[i].guenum,hash[i].maxnum,hash[i].zujin,
  597. hash[i].shifouruzhu,hash[i].num);
  598. fclose(fp);//关闭文件
  599. }

7 运行结果

输入1时屏幕显示图

输入的房间编号有人时取消预订

预订时需要填写的信息

退房时输入正确的客房编号即可

续房时的操作图

修改客房信息操作图

添加客房时已存在此客房

添加客房时需要输入的信息及其操作图

删除客房时输入客房非法

删除客房操作及其显示图

查找空余客房时输入1的显示图

按照房间号查找客人操作及其显示图

按照姓名查找客人信息操作及其显示图

所有客房信息浏览图

所有客人信息浏览图

筛选符合条件的客房信息的操作及其显示图

输出将要到期的客人信息及其操作示意图

退出旅店管理系统

8 心得体会

此次数据结构试验是我学习数据结构以来做过的与数据结构有关的最复杂的一个程序,定义了3个结构体、包含22个功能函数,共计617行代码。完成了实验的基本功能与基本要求。根据对数据的分析以及结合所学的知识,发现客房编号的后三位具有唯一性,而且旅馆客房一般具有几百个房间。据此,便联想到了学习过的哈希表存储和查找。所以,本程序主要采用了哈希结构的各个功能。

在实验的过程中,我遇到了很多问题。例如在对客人的结构体定义时便犹豫不决,不能确定用于区分的关键字。但是随着将与客房信息有关的函数渐渐写好,我的心中忽然闪出一个念头,用客房编号区分客人不是很恰当吗?我于是便尝试着写,最后客人的操作也与哈希结构联系起来,有关操作也迎刃而解。又如,在进行哈希表查找的时候,模块化不够强。老师看过之后便提出了问题。因此,我便将哈希查找构造成了一个哈希函数,返回哈希表的地址。这样以来,程序的可读性便增强了,而且更有利于对地址的查找,给程序的修改提供了极大的方便。

值得一提的是查找模块中的时间到期提醒,刚开始由于没有调用本地时间导致判断时间相当复杂。经过查阅百度文档中的C语言怎样调用本地时间,我学到了如何调用系统时间,将问题难度大幅度的降低。

由于此次试验的完成是在将近期末考试的时候,时间有限。我不免有些急功近利的想法。因此,在某些设计方面可能考虑的不够周到,甚至在算法方面有些冗杂,尤其是在容错处理上,并没有经过大量数据的测试。在暑假期间有机会的话,我一定对其算法、数据结构、容错处理、界面设置进行优化和补充。

上传的附件 cloud_download 基于C语言实现的旅店管理系统.7z ( 899.88kb, 68次下载 )
error_outline 下载需要4点积分

发送私信

最合适你的人,是不需要奔跑着去追赶,拼了命去靠近的

5
文章数
9
评论数
eject