基于C语言实现的旅馆信息管理系统

Begone

发布日期: 2019-05-08 17:15:14 浏览量: 1586
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1.程序实践概述

1.1 题目名称

  • 旅馆信息管理

1.2 开发环境

  • 基于Windows 10操作系统的Microsoft Visual Studio 2017

2.问题分析

2.1 功能说明

  • 查看旅店各房间信息:列举每个房间的房间号、房间类型、入住人数和房间价格

  • 查看某一房间信息:显示指定房间的旅客的信息,包括姓名、身份证号、性别和入住时间

  • 查看旅客信息:显示在旅馆的旅客总数;列举在旅馆的所有旅客的信息,包括姓名、性别、身份证号、房间号、入住时间

  • 查看某一旅客信息:查看指定旅客的信息,包括姓名、性别、身份证号、房间号、入住时间

  • 旅客入住:录入旅客的身份证号、姓名、性别等信息,程序将获取当前时间作为入住时间。将旅客的信息保存到链表和文件

  • 旅客换房:通过身份证号识别旅客,结算旅客已产生的房费,修改有关的旅客和房间信息

  • 旅客退房:程序获取当前时间作为退房时间,并结合入住时间结算房费。将旅客信息从程序的链表中删除,更改相关房间的信息,将旅客信息添加到旅客历史信息的文档中

  • 保存信息并退出程序:将旅客信息、房间信息、旅客与房间关系的信息从链表覆盖保存到文件,然后退出程序

  • 更换主题:更改命令行的颜色主题,程序会将主题信息自动保存到文档

2.2 解决方案

  • 从文件读取相关信息,将相关信息储存到文件,从而实现旅馆信息管理的基本功能

  • 三个链表,分别存储旅客和房间的相关信息,以及这二者关系的信息。用一个枚举类型定义房间的类型

  • 用操作链表的方式实现旅客的入住,换房和退房三种行为

  • 程序开始时将文件中的信息读到链表中,修改信息后将链表中的信息保存到文件中。

3.方案设计

3.1 模块结构

  • 头文件Structs.h: 用于列举整个程序的头文件、结构体定义和函数声明等信息

  • mainbody.c:显示主菜单,初始化链表,加载命令行的颜色主题等操作

  • Guest.c:从文件中读取旅客信息到链表;将存储旅客信息的链表中的信息保存到文件;查看旅客信息等

  • Hotel.c:从文件中读取房间信息到链表;将存储房间信息的链表中的信息保存到文件;查看房间信息等

  • Guests.c:用于实现旅客入住、旅客换房、旅客退房等功能

  • Guest.txt:用于存储旅客信息,包括姓名、性别、身份证号

  • Hotel.txt:用于存储房间信息,包括房间号、房间类型和房间价格

  • GuestAndRoom.txt:用于存储旅客与房间关系的信息,包括房间号、身份证号、入住时间

  • GuestHistoryInfo.txt:用于存储旅客的历史信息,在旅客退房时可显示旅客曾经入住的次数

  • Theme.txt:用于存储命令行的颜色主题信息

3.2 数据结构

旅馆信息管理程序中,主要的数据结构是三个链表:

  • Rooms链表存储房间信息,包括房间号、房间类型、入住人数和房间价格

  • Guests链表存储旅客信息,包括姓名、性别、身份证号

  • GuestAndRoom链表存储旅客与房间关系的信息,包括身份证号、旅客入住的房间号、入住时间和退房时间

3.3 总体流程

总体流程大致如图所示,更多细节未在图中展示。

3.4 关键算法

核心功能是实现旅客的入住、换房和退房,涉及到新增、修改和删除链表中的节点。

文件输入输出信息是本程序的重要功能,程序开始和结束时,程序中的链表会和文件交换信息。

计算入住时间和退房时间的时间差属于创新功能,但实现相对较为复杂。旅客入住时会使用time()函数获取时间,将时间存储为字符串。旅客退房时,通过字符串处理,将入住时间放入tm结构体中,使用mktime()函数和difftime()函数计算退房时间与入住时间的差。

3.5 界面设计

整体界面在Windows控制台上。打开程序后的菜单如图:

查看旅店信息

查看某一房间信息

查看旅客信息

4.调试记录

在IDE进行代码分析,没有错误和警告后,开始编译。由于程序开始运行时就会读取文件中的数据,当项目的文件夹内没有相应文件时,出现如下报错。

按项目要求,添加样例文本文档后程序成功显示菜单。

程序在读取文件中的字符串时遇到如下调试信息:

在读取存放数据表格的文件时需要先跳过表头的中文。查询variable was corrupted 的原因是内存越界,后将读取这段中文的临时字符数组设置得更大一些,问题解决。

cur是0xCDCDCDCD的原因是前面的代码将cur设置为了垃圾指针。此处的cur指针原本用于遍历链表,检查前面代码发现错将cur分配到了一个新的内存地址。将cur指向链表首个节点后问题解决。

在文件中已有数据的情况下,程序未能读取到旅客信息。检查代码时发现,在读取文件时,弄错了feof函数的返回值真假。feof(fp)在fp指向文件末尾时返回真,在fp指向文件中间时返回假。

进行旅客入住操作时,弹出调试信息“引发了异常,读取访问权限错误。”多次检查代码后发现,在将数据输出到文件的过程中使用了遍历链表后的地址不明确的链表指针,将指针换为记录数据的普通变量以输出,问题解决。

存储旅客入住时间时,使用了ctime()函数,调试时发现程序显示的入住时间不正常。查询资料后发现ctime()函数的返回值末尾有换行符,使用strncpy()去除换行符后,屏幕不会输出换行,但字符串末尾出现“屯屯屯……”,表明有未赋值的字符被输出。查询资料后确认,strncpy并不会给目标字符串的末尾添加’\0’,手动为字符串末尾添加’\0’后,问题解决。

在使用difftime()函数时,返回的时间差是0,查询MSDN后发现difftime()函数执行错误将导致返回值为0。difftime()函数执行错误的具体原因是,程序记录的年份是从1900年开始的,因此存入tm结构体的年份要在真实年份的基础上减去1900。

5.创新说明

结构体定义时没有使用typedef,尽量减少结构体名称数量。每次使用链表时写struct关键字,也能使得代码可读性更强。

全局定义了printline()函数用于命令行换行,便于调用。

精细地调整格式化输入输出,使得程序能以整齐的列表形式清晰地显示各项数据。

查看某一旅客或某一房间信息时,如果旅馆中没有该房间或旅客,会显示提示信息,给予使用者反馈。

旅客入住时,会显示可用房间的信息,并标注可用房间中是否已有人入住。针对即将入住旅客的身份进行识别,判断该旅客是否已经入住。针对旅客即将入住的房间,判断该房间是否能够容纳该旅客。

旅客退房时,使用difftime()、mktime()等函数自动计算旅客从入住到退房的天数,而不用手动输入。旅馆管理人员若想给予旅客折扣,可输入折扣率,使程序直接计算出最终的房费。

旅客换房时,考虑到房间号是否输入错误,新换的房间是否已满等细节,确保程序不会因为使用者的误操作出现异常。在换房前,展示旅客的信息以及房间是否可用的详细信息。

6.体会与建议

与以往学习C语言时写单个文件的小程序不同,此次程序设计需要完成一个项目。完成项目需要编写多个头文件和源文件,谨慎地对项目和解决方案进行配置,甚至要注意版本控制,及时保存现有的代码。

整个项目的代码量比较大,共1300余行,也涵盖了C语言程序设计课程的许多知识,重要的知识点包括指针、结构体、链表、内存动态分配、枚举类型、文件操作等。

平常编程时难以纠正的惯性思维也在项目开发的过程中暴露出来。比如局部数组初始化时应当赋空值,字符串之间不能直接用“==”比较而必须用strcmp()函数,数组申请的空间需要足够大,空指针需要及时用free()处理等。也复习到了strncpy()用完后需要手动添加‘\0’等印象不深刻的知识点。

开发此次项目也自学了更多C语言的知识,比如用于记录时间的结构体tm以及<time.h>中的其他函数,学会了在MSDN文档中查询资料等技能;收获颇丰,相当程度上提升了编程能力,了解了项目开发的基本流程。

上传的附件 cloud_download 基于C语言实现的旅馆信息管理系统.7z ( 393.70kb, 39次下载 )
error_outline 下载需要9点积分

发送私信

我也许不完美,但我一直在做自己

13
文章数
31
评论数
最近文章
eject