资源描述
可编辑版
《C语言程序设计》综合实验报告
一、 需求分析
编写一个客房管理系统,提供键盘式菜单实现功能选择,功能包括:用户登记、统计、查询和用户信息修改。
软件平台:CODEBLOCKS
二、整体设计
整个客房管理系统被设计为用户登记模块、统计模块、查询模块和修改模块。数据以TXT格式存储,支持保存信息。
三、 详细设计
客房管理系统
三 查询模块
二 统计模块
四 修改模块
一 登记模块
〔1用户登记模块
通过函数readfile读取txt文件信息到room数组,提示用户选择想要入住的房间号,判断是否已经被占用,若占用,重新选择房间号,若没有占用,提示输入登记信息,把数据存入Room数组中,通过savefile添加信息到txt。
调用readfile函数读取txt信息
读取用户输入的的房间号
判断房间是否被占用
是
否
提示用户输入登记信息
调用savefile函数存储登记信息
〔2统计模块
读取txt信息到结构体数组room,提示用户选择统计方式,设置计数器,顺序遍历Room数组,
1、 计数器记录数组数,即总客房数
2、 判断每一个数组中的结构体的时间是否和需要查询的日期相同,若相同,计数器加一
调用readfile函数,读取信息
选择统计方式
2、按时间统计
1、统计总客房数
〔3查询模块
读取信息
调用readfile函数,将信息读入room结构体数组中,提示用户选择查询方式,通过基本查找算法查找Room数组。可以按房间号、价格、房间标记、用户姓名、居民身份证查询。
选择统计方式
按价格查询
按身份证号查询
按姓名查询
按房间号查询
每一个查询函数内部结构如下:
遍历每一个结构体j
判断是否和要查询的信息相同
是
调用打印函数,打印j结构体信息
〔4修改模块
调用readfile函数,读取信息到room结构体数组,提示用户输入需要修改的房间号,采用基本查找算法在数组中找到要修改的数据,提示用户重新更改房间信息,最后将结构体数组重新写入文件保存。
调用readfile〔读取文件函数
输入需要查询的房间号
遍历每一个结构体j
判断是否是用户需要修改的房间号
修改结构体j
调用saveall函数,保存结构体数组
四、 源代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 80
//客户结构体
typedef struct client
{
char name[12]; //姓名
int sex; //性别
int age; //年龄
char id[20]; //身份证号
int year; //入住时间
int month;
int date;
}CLIENT;
//客房结构体
struct Hotel
{
int roomid;
int tel; //用户的话
int price; //价格
int sign; //默认标记为空房间
CLIENT client_list; //客户信息
}room[M];
void Menu<>; //目录界面
void dengji<struct Hotel room[]>;
void savefile<struct Hotel room[],int i>;
int readfile<struct Hotel room[]>;
void tongji<struct Hotel room[]>;
void chaxun<struct Hotel room[]>;
void printmessage<struct Hotel room[],int n>;
void xiugai<struct Hotel room[]>;
//主函数
int main<>
{
int n;
char reply;
Menu<>;
do{
printf<"请输入选项对应的数字:\n">;
scanf<"%d",&n>;
while<n!=1&&n!=2&&n!=3&&n!=4>
{
printf<"请输入各选项对应的数字!\n">;
scanf<"%d",&n>;
}
switch <n>
{
case 1:
dengji<room>;
break;
case 2:
tongji<room>;
break;
case 3:
chaxun<room>;
break;
case 4:
xiugai<room>;
break;
}
printf<"是否还要进入其它选项?〔回复Y或y继续\n">;
scanf<" %c",&reply>;
}while <reply=='y'||reply=='Y'>;
return 0;
}
//系统目录
void Menu<>
{
printf<"************************客房管理系统***************************\n">;
printf< "\t\t\t 1————登记\n" >;
printf< "\t\t\t 2————统计\n" >;
printf< "\t\t\t 3————查询\n" >;
printf< "\t\t\t 4————修改\n" >;
printf<"***************************************************************\n">;
}
//登记客户信息
void dengji<struct Hotel room[]>
{
int x,j,i,flag;
char answer;
do
{
i=readfile<room>;
do
{
flag=0;
printf<"输入您想入住的房间号:〔三位数\n">;
scanf<"%3d",&x>;
for<j=0;j<i;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< "请输入入住年月日〔格式:2015 11 11\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中的信息
int readfile<struct Hotel room[]>
{
FILE *fp;
int i;
if<<fp=fopen<"room.txt","r">>==NULL>
{
printf<"Failure to open score.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>;
return i;
}
//保存结构体数组信息到文件
void savefile<struct Hotel room[],int i>
{
FILE *fp;
if<<fp = fopen<"room.txt","a">>==NULL>
{
printf<"Failure to open score.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>;
}
//统计模块
void tongji<struct Hotel room[]>
{
int n,x;
int year,month,day,j,count=0;
x=readfile<room>;
printf<"请选择统计方式:1>统计房客数,2>统计某一天的房客数\n">;
scanf<"%d",&n>;
switch <n>
{
case 1:
printf<"客房总数为:%d\n",x>;
break;
case 2:
printf<"请输入具体时间:\n">;
scanf<"%d%d%d",&year,&month,&day>;
for<j=0;j<x;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>;
}
}
//查询模块
void chaxun<struct Hotel room[]>
{
int n,x,roomid,price,j;
char name[12],id[20];
x=readfile<room>;
printf<"按房间号查询请按1;按价格查询请按2;按用户姓名查询请按3;按身份证号码查询请按4\n">;
scanf<"%d",&n>;
switch<n>
{
case 1:
printf<"请输入房间号:\n">;
scanf<"%d",&roomid>;
for<j=0;j<x;j++>
{
if<room[j].roomid==roomid>
{
print<room,j>;
}
}
break;
case 2:
printf<"请输入价格:\n">;
scanf<"%d",&price>;
for<j=0;j<x;j++>
{
if<room[j].price==price>
{
print<room,j>;
}
}
break;
case 3:
printf<"请输入客户姓名:\n">;
scanf<"%s",name>;
for<j=0;j<x;j++>
{
if<strcmp<room[j].client_list.name,name>==0>
{
print<room,j>;
}
}
break;
case 4:
printf<"请输入身份证号码:\n">;
scanf<"%s",id>;
for<j=0;j<x;j++>
{
if<strcmp<room[j].client_list.id,id>==0>
{
print<room,j>;
}
}
}
}
//打印
void print<struct Hotel room[],int 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>;
}
void printmessage<struct Hotel room[],int n>
{
int j;
for<j=0;j<n;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>;
}
}
//修改模块
void xiugai<struct Hotel room[]>
{
int i, m, roomid;
m = readfile<room>;
printf<"请选择房间号:\n">;
scanf<"%d",&roomid>;
for<i=0;i<m;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>;
printf< "请输入入住年月日〔格式:20150101">;
scanf<"%4d%2d%2d",&room[i].client_list.year,&room[i].client_list.month,&room[i].client_list.date>;
}
}
saveall<room,m>;
}
//保存所有信息到txt文件
void saveall<struct Hotel room[],int m>
{
int j;
FILE *fp;
if<<fp = fopen<"room.txt","w">>==NULL>
{
printf<"Failure to open score.txt!\n">;
exit<0>;
}
for<j=0;j<m;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>;
}
五、 调试与测试
主界面:
1、登记功能测试:
情况1:客户需要入住的房间号被占用,提示已经被占用,重新选择
情况2:选择的房间没有被占用,提示用户输入登记信息,登记完成后系统后台执行保存,弹出窗口询问是否继续登记下一个顾客
17 / 17
2、 统计功能测试:
情况1:选择统计客房总数,系统返回总客房数
情况2:选择按日期统计,系统返回具体某天的客房总数
3、 查询功能测试:
情况1:按房间号查询
情况2:按价格查询
情况3:按用户名查询
情况4:按身份证号查询
4、修改功能测试:输入需要修改的房间后,系统提示用户重新写入房间信息
六、 总结
本程序可通过键盘选择目录对应的功能,提供登记、查询、统计、修改四大功能。
优点:客户信息通过txt文件保存,在下次运行程序时仍然能读取保存的信息。
不足:功能尚不完善,没有添加退房功能;用户操作界面需要美化,提高可操作性;可以加入清屏功能,以便在用户在选择相关功能以后,不再显示菜单目录。
个人心得:
这是本学期第一次用C语言编写一个系统,实现比较完整的功能。
1、 遇到的部分问题:
程序不能将信息正确从txt文档中读取,出现乱码。
原因:读取函数和存储函数的读取/存储格式没有对应。
查询功能模块中按日期查询出现错误,只能正确读取最后一组数据的日期
原因:每组数据之间没有空格符号,导致前一组和后一组数据的日期和房间号牵连到一块,导致读取错误。更改读取和存储函数的格式。
1、 通过实践,体会到了需求分析和结构设计流程等编程准备工作的重要性:一个大的程序,不可能通过大脑的构思,一步就能完成,要想减少程序编写过程中遇到的思路错误,必须要在此之前构思好,清楚该实现什么功能,这个功能怎么实现,需要一些什么途径。
2、 分而治之、信息隐藏的思想对于大型程序来说尤为重要,不但能减少程序中重复的代码,还能使程序结构和功能更加清晰,可读性更强。
3、 关键地方要加以注释,以便日后能够读懂函数的程序的功能。
展开阅读全文