资源描述
华中科技大学计算机科学和技术学院
《C语言程序设计》课程设计
试验汇报
题目: 宾馆住宿信息管理系统
宾馆管理住宿系统
一试验目标:
1、深入掌握和利用C语言进行程设计能力;
2、 深入了解和利用结构化程设计思想和方法;
3、 初步掌握开发一个小型实用系统基础方法;
4、 学会调试一个较长程序基础方法;
5、 学会利用步骤图或N-S图表示算法;
6、 掌握书写程设计开发文档能力(书写课程设计汇报);
二试验要求:
1、只能使用C语言,源程序要有合适注释,使程序轻易阅读。
2、要有用户界面。要求最少采取简易菜单;激励采取文本菜单界面甚至采取图形菜单界面。
3、必需使用结构和十字交叉链表等数据结构。
4、使用文件保留数据。
5、最少输出一份报表(屏幕输出即可),激励自行增加新功效。
功效要求(宾馆住宿信息管理系统):
对宾馆全部客房住宿信息进行管理,关键包含客房基础信息、用户住宿信息。
包含功效:客房基础信息录入。许可对已经录入数据重新进行编辑、修改,多种基础数据插入、删除,基于多种数据查询、统计计算。
宾馆住宿信息其它方面统计(自行确定)。
三试验内容:
程序概况
本程序采取文本菜单界面,程序数据结构采取三个方向十字链表来处理。含有对客房基础信息,用户信息新建、修改、插入、删除、查找、查看、统计、保留、载入等功效。程序虽简单,但含有完整功效。
程序模块示意图
1) 主程序步骤图开始
功效选择菜单
判定选择
保留数据
结束
新建
插入
修改
删除
保留
统计
查找
浏览
载入
获取按键
2)关键数据结构图
程序数据结构采取三个方向十字链表来处理。
程序具体介绍
关键数据结构:
typedef struct kehuxinxi{
char name[20];/*用户姓名*/
char id[20];/*用户ID*/
char sex; /*性别*/
char telephone[20];/*电话*/
char room[10];/*房间号*/
char time[12];/*入住时间*/
float yingshou;/*应付费用*/
float shishou;/*实际费用*/
char shouyinyuan[20];/*收银员*/
struct kehuxinxi * next;
}kehu,* Pkehu;
用户信息包含用户姓名,ID,性别,房间号,入住时间,应付费用,实际费用,收银员资料。
typedef struct kefangxinxi{
char num[10];/*房间号*/
char zhonglei;/*类别*/
int times;/*入住次数*/
float jiage;/*价格*/
struct kefangxinxi * next;
Pkehu Record;
}fangjian,* Pfangjian;
客房信息里包含房间号,房间类别,入住次数,房间价格资料。
typedef struct kefangzhonglei{
char zhonglei;/*类别*/
int shuliang;/*房间数*/
Pfangjian first;
struct kefangzhonglei * next;
}fangjianzhonglei ,* Pfangjianzhonglei;
房间种类包含房间类别和房间数目资料。
各函数功效介绍(为方便阅读了解程序,函数名用汉语拼音替换)
int xiangdaohejiemian(int function,Pfangjianzhonglei * pRST);
绘制功效选择界面
int Collect(int (* Comp)(void *,void *),int num);
根据Comp规则搜集前num个信息
int jiyushijian(void *,void *);
根据次数规则
int jiyujiage(void *,void *);
根据价格规则
int huodecaidan(char * * szTitles,int num);
获取菜单
int huodekefangzhonglei(FILE * pf,Pfangjianzhonglei sub_tree);
获取一整个类型,客房种类
int huodekefang(FILE * pf,Pfangjian room);
获取一个房间信息
int huodekehu(FILE * pf,Pkehu custom);
获取一个用户信息
int xierukefangxinxi(FILE * pf,Pfangjian room);
写入客房信息
int xierukehuxinxi(FILE * pf,Pkehu custom);
写入用户信息
int huodenkefang(Pfangjianzhonglei sub_tree,int num_room);
获取num_room个房间
int xiugaikehuxinxi(Pkehu pCu);
修改用户信息
int xiugaikefangxinxi(Pfangjian pRF);
修改房间信息
int Collect(int (* Comp)(void *,void *),int num);
根据Comp规则搜集前num个信息
int jiyushijian(void *,void *);
根据次数规则
int jiyujiage(void *,void *);
根据价格规则
int Display(void);
int Get_Info(char * * szTitles,char * * buffer,int num);
int zhanxiankehu(Pkehu pCu);
int zhanxiankefang(Pfangjian pRF);
显示客房用户信息
int huodekehuxinxi(Pkehu pCu);
获取用户信息
int sousuokefangzhonglei(Pfangjianzhonglei pRST);
搜索一个类型客房种类
int sousuokefangxinxi(Pfangjianzhonglei pRST);
搜索一个客房
int sousuokehu(Pfangjianzhonglei pRST);
搜索一个用户
int tianjiazhonglei(Pfangjianzhonglei pRST);
插入客房种类
int tianjiakefang(Pfangjianzhonglei pRST);
插入一个客房
int tianjiakehu(Pfangjianzhonglei pRST);
插入一个用户
int shanchuzhonglei(Pfangjianzhonglei * pRST);
删除客房种类
int shanchukefang(Pfangjianzhonglei * pRST);
删除客房信息
int shanchukehu(Pfangjianzhonglei * pRST);
删除用户信息
int xiugaikefangzhonglei(Pfangjianzhonglei pRST);/
修改客房种类
int xiugaikehu(Pfangjianzhonglei pRST);
修改用户信息
int huodekefangxinxi(Pfangjian pRF);
取得客房信息
/*Qsort*/
void Qsort(void * * array,int low,int high,int (*Comp)(void * ,void * ));
快速排序法排序
四运行结果
1开始功效选择菜单
2新建功效界面
3插入功效界面
4修改功效界面
5删除功效界面
6查找功效界面
7查看功效界面
具体设计:(源程序清单见附录):
五心得体会
经过这次实训,增加了我学习软件技术爱好,即使在编写修改代码工程中花费了不少时间甚至有放弃想法,但最终看到程序运行,那种喜悦兴奋之情无法用文字描述。
1. 编写课程设计是理论结合实际一次很好结合,即使写得作业仅仅只能当做一项作业没有实际使用价值,但还是从中学到了不少,真正地体会到完成一项任务艰辛和付出以后收获愉快。
2. 编写程序时应该使程序易于了解尽可能使用通用变量名和通俗注释。
3. 即使很多东西刚开始时全部不懂,但只要坚持下去学,慢慢地就会熟悉。
4. 程序应该分多个文件装,要有条理性。
5. 写程序运行时会出现很多bug,要耐心调试,编程需要耐心和细心。把程序完整地调试好后,对自己性格培养也是一个提升。
6. 当自己处理不了时要向她人请教,虚心学习她人方法。这次完成作业向同学们请教了很多问题,得到了同学帮助,在此真心地表示感谢。
参考文件
《Turbo C 使用大全》第一册、第二册 徐金梧等编译 北京科海培训中心
《C语言课程设计》 曹计昌 卢萍 李开 编著
《C程序设计》谭浩强 著
附录
源程序清单
#ifndef DEF
#define DEF
#define BUFSIZE 20
#define MAX_ROOM 100
#define TEXT_CY 20
#include<math.h>
#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define NAME 20
#define MAX_ID 20
#define NUM 10
#define TELE 20
#define TIME 12
typedef struct kehuxinxi{
char name[20];/*用户姓名*/
char id[20];/*用户ID*/
char sex; /*性别*/
char telephone[20];/*电话*/
char room[10];/*房间号*/
char time[12];/*入住时间*/
float yingshou;/*应付费用*/
float shishou;/*实际费用*/
char shouyinyuan[20];/*收银员*/
struct kehuxinxi * next;
}kehu,* Pkehu;
typedef struct kefangxinxi{
char num[10];/*房间号*/
char zhonglei;/*类别*/
int times;/*入住次数*/
float jiage;/*价格*/
struct kefangxinxi * next;
Pkehu Record;
}fangjian,* Pfangjian;
typedef struct kefangzhonglei{
char zhonglei;/*类别*/
int shuliang;/*房间数*/
Pfangjian first;
struct kefangzhonglei * next;
}fangjianzhonglei ,* Pfangjianzhonglei;
typedef struct{
fangjian ** Buffer;
int Bufsize;/*缓冲区大小*/
}Buf;
typedef struct{
int left;
int top;
int right;
int bottom;
}Rect;/*矩形区域,一个好东西*/
/*Guide*/
int xiangdaohejiemian(int function,Pfangjianzhonglei * pRST);
/*tools*/
int Collect(int (* Comp)(void *,void *),int num);/*根据Comp规则搜集前num个信息*/
int jiyushijian(void *,void *);/*根据次数规则*/
int jiyujiage(void *,void *);/*根据价格规则*/
int huodecaidan(char * * szTitles,int num);
/*fun_fun*/
int huodekefangzhonglei(FILE * pf,Pfangjianzhonglei sub_tree);/*获取一整个类型*/
int huodekefang(FILE * pf,Pfangjian room);/*获取一个房间*/
int huodekehu(FILE * pf,Pkehu custom);/*获取一个用户*/
int xierukefang(FILE * pf,Pfangjianzhonglei sub_tree);
int xierukefangxinxi(FILE * pf,Pfangjian room);
int xierukehuxinxi(FILE * pf,Pkehu custom);
int huodenkefang(Pfangjianzhonglei sub_tree,int num_room);/*获取num_room个房间*/
int xiugaikehuxinxi(Pkehu pCu);/*修改用户信息*/
int xiugaikefangxinxi(Pfangjian pRF);/*修改房间信息*/
int Collect(int (* Comp)(void *,void *),int num);/*根据Comp规则搜集前num个信息*/
int jiyushijian(void *,void *);/*根据次数规则*/
int jiyujiage(void *,void *);/*根据价格规则*/
int Display(void);
int Get_Info(char * * szTitles,char * * buffer,int num);
int zhanxiankehu(Pkehu pCu);
int zhanxiankefang(Pfangjian pRF);
int huodekehuxinxi(Pkehu pCu);
int sousuokefangzhonglei(Pfangjianzhonglei pRST);/*搜索一个类型*/
int sousuokefangxinxi(Pfangjianzhonglei pRST);/*搜一个房间*/
int sousuokehu(Pfangjianzhonglei pRST);/*搜一个用户*/
int tianjiazhonglei(Pfangjianzhonglei pRST);/*插入*/
int tianjiakefang(Pfangjianzhonglei pRST);
int tianjiakehu(Pfangjianzhonglei pRST);
int shanchuzhonglei(Pfangjianzhonglei * pRST);/*删除*/
int shanchukefang(Pfangjianzhonglei * pRST);
int shanchukehu(Pfangjianzhonglei * pRST);
int xiugaikefangzhonglei(Pfangjianzhonglei pRST);/*修改*/
int xiugaikehu(Pfangjianzhonglei pRST);
int huodekefangxinxi(Pfangjian pRF);
int Buf_Clear(void);
int Buf_Fill_Tree(Pfangjianzhonglei pRST_temp);
/*Qsort*/
void Qsort(void * * array,int low,int high,int (*Comp)(void * ,void * ));
/*快速排序法排序,基于比较*/
Buf Buf_Room;
/*调试信息*/
#define DEBUG
#define DEBUG2
#define DEBUG3(x)
DEBUG
#endif
int Buf_Clear(void)
{
Buf_Room.Bufsize=0;
return 0;
}
int Buf_Fill_Tree(Pfangjianzhonglei pHead)
{
Pfangjian pRoom;
for(pRoom=pHead->first;pRoom;pRoom=pRoom->next)
Buf_Room.Buffer[Buf_Room.Bufsize++]=pRoom;
return 0;
}
int huodekefangzhonglei(FILE * pf,Pfangjianzhonglei sub_tree)
{
if(!feof(pf))
fread(sub_tree,sizeof(fangjianzhonglei),1,pf);
if(!feof(pf))
return 1;
else
return 0;
}
int huodekefang(FILE * pf,Pfangjian room)
{
if(!feof(pf))
fread(room,sizeof(fangjian),1,pf);
if(!feof(pf))
return 1;
else
return 0;
}
int huodekehu(FILE * pf,Pkehu custom)
{
if(!feof(pf))
fread(custom,sizeof(custom),1,pf);
if(!feof(pf))
return 1;
else
return 0;
}
int xierukefang(FILE * pf,Pfangjianzhonglei sub_tree)
{
return fwrite(sub_tree,sizeof(fangjianzhonglei),1,pf);
}
int xierukefangxinxi(FILE * pf,Pfangjian room)
{
return fwrite(room,sizeof(fangjian),1,pf);
}
int xierukehuxinxi(FILE * pf,Pkehu custom)
{
return fwrite(custom,sizeof(kehu),1,pf);
}
int tianjiazhonglei(Pfangjianzhonglei pRST)
{
char * szTitles="How many Rooms?";
int i,num;
Pfangjianzhonglei pRST2;
for(i=0;pRST;pRST=pRST->next,i++)
pRST2=pRST;
pRST2->next=(Pfangjianzhonglei)malloc(sizeof(fangjianzhonglei));
pRST=pRST2->next;
printf("%s",szTitles);
scanf("%d",&num);
huodenkefang(pRST,num);
pRST->zhonglei=i+'0';
pRST->next=NULL;
return 0;
}
#define IR_X 100
#define IR_Y 100
#define IR_CX 100
#define IR_C 20
int tianjiakefang(Pfangjianzhonglei pRST)
{
const char * szRoom="What is the type?";
char Buf[BUFSIZE];
int num,i;
Pfangjianzhonglei pRST2;
Pfangjian pRF;
Buf[0]='\0';
printf("%s",szRoom);
scanf("%d",&num);
for(i=1,pRST2=pRST;i<num&&pRST2;pRST2=pRST2->next,i++)
;
if(!pRST2)
return 0;
pRF=pRST2->first;
pRST2->shuliang++;
while(pRF->next)
pRF=pRF->next;
pRF->next=(Pfangjian)malloc(sizeof(fangjian));
pRF=pRF->next;
huodekefangxinxi(pRF);
pRF->next=NULL;
return 0;
}
#define IC_Y 160
#define IC_Y2 220
int tianjiakehu(Pfangjianzhonglei pRST)
{
const char * szTree="What is the type?";
const char * szRoom="Which room";
const char * szName="The name";
char Room[BUFSIZE];
int type,i;
Pfangjianzhonglei pRST2;
Pfangjian pRF;
Pkehu pCu;
printf("%s",szTree);
scanf("%d",&type);
printf("%s",szRoom);
scanf("%s",Room);
for(i=1,pRST2=pRST;pRST2->zhonglei!=type+'0';pRST2=pRST2->next,i++)
;
if(!pRST2)
return 0;
pRF=pRST2->first;
while(!strcmp(pRF->num,Room)&&pRF)
pRF=pRF->next;
if(!pRF)
return 0;
pCu=pRF->Record;
while(pCu->next)
pCu=pCu->next;
pCu->next=(Pkehu)malloc(sizeof(kehu));
pCu=pCu->next;
pCu->next=NULL;
pRF->times++;
huodekehuxinxi(pCu);
return 0;
}
int sousuokefangzhonglei(Pfangjianzhonglei pRST)
{
const char * szTree="Which type?";
const char * szError="Can't find the Type";
char Buf[BUFSIZE];
int type;
Buf[0]='\0';
printf("%s",szTree);
scanf("%d",&type);
while(pRST){
if(pRST->zhonglei==type+'0'){
Buf_Clear();
Buf_Fill_Tree(pRST);
Display();
return 1;
}
pRST=pRST->next;
}
getch();
return 0;
}
int sousuokefangxinxi(Pfangjianzhonglei pRST)
{
const char * szTree="Which type?";
const char * szRoom="Please input the doorplate";
const char * szError[]={"Can't find the Type",
"Can't find the Room"};
char Buf2[BUFSIZE];
int type,room;
Pfangjian pRF;
printf("%s",szTree);
scanf("%d",&type);
printf("%s",szRoom);
scanf("%d",&room);
while(pRST){
if(pRST->zhonglei==type+'0'){
pRF=pRST->first;
while(pRF){
if(!strcmp(pRF->num,Buf2)){
zhanxiankefang(pRF);
return 1;
}/*if*/
pRF=pRF->next;
}/*while*/
printf("%s\n",szError[1]);
return 0;
}/*if*/
pRST=pRST->next;
}/*while*/
printf("%s\n",szError[0]);
getch();
return 0;
}
int sousuokehu(Pfangjianzhonglei pRST)
{
const char * szName="The name?";
const char * szError="Can't find the one";
char Buf[BUFSIZE];
Pfangjian pRF;
Pkehu pCu;
Buf[0]='\0';
printf("%s",szName);
scanf("%s",Buf);
while(pRST){
pRF=pRST->first;
while(pRF){
pCu=pRF->Record;
while(pCu){
if(!strcmp(pCu->name,Buf)){
zhanxiankehu(pCu);
return 0;
}
else pCu=pCu->next;
}
pRF=pRF->next;
}/*while*/
pRST=pRST->next;
}/*while*/
printf("%s",szName);
getch();
return 0;
}
int shanchuzhonglei(Pfangjianzhonglei * pRST)
{
const char * szTree="Which type?";
const char * szError="Can't find the Type";
char Buf[BUFSIZE];
Pfangjianzhonglei pRST2,pRST3;
int type;
Buf[0]='\0';
printf("%s",szTree);
scanf("%d",&type);
pRST2=(*pRST);
if(pRST2->zhonglei==type+'0'){
(*pRST)=pRST2->next;
free(pRST2);
return 0;
}/*改变头指针*/
pRST3=pRST2->next;
while(pRST3){
if(pRST3->zhonglei==type+'0'){
pRST2->next=pRST3->next;
free(pRST3);/*删去pRST3*/
return 1;
}
}
printf("%s",szError);
getch();
return 0;
}
int shanchukefang(Pfangjianzhonglei * pRST_head)
{
const char * szTree="Which type?";
const char * szRoom="Please input the doorplate";
const char * szError[]={"Can't find the Type",
"Can't find the Room"};
char Buf[BUFSIZE];
Pfangjian pRF,pRF2;
Pfangjianzhonglei pRST;
int type;
pRST=(*pRST_head);
Buf[0]='\0';
printf("%s",szTree);
scanf("%d",&type);
printf("%s",szRoom);
scanf("%s",Buf);
while(pRST){
if(pRST->zhonglei==type+'0'){
pRF=pRST->first;
if(!strcmp(pRF->num,Buf)){
pRST->first=pRF->next;
pRST->shuliang--;
free(pRF);
return 0;
}
pRF2=pRF;
pRF=pRF->next;
while(pRF){
if(!strcmp(pRF->num,Buf)){
pRF2->next=pRF->next;
free(pRF);
pRST->shuliang--;
return 1;
}/*if*/
pRF2=pRF;
pRF=pRF->next;
}/*while*/
printf("%s",szError[1]);
return 0;
}/*if*/
pRST=pRST->next;
}/*while*/
printf("%s",szError[0]);
getch();
return 0;
}
int shanchukehu(Pfangjianzhonglei * pRST_head)
{
const char * szName="The name?";
const char * szError="Can't find the one";
char Buf[BUFSIZE];
Pfangjian pRF;
Pkehu pCu,pCu2;
Pfangjianzhonglei pRST;
pRST=(*pRST_head);
Buf[0]='\0';
printf("%s",szName);
scanf("%s",Buf);
while(pRST){
pRF=pRST->first;
while(pRF){
pCu=pRF->Record;
if(!strcmp(pCu->name,Buf)){
pRF->Record=pCu->next;
free(pCu);
return 0;
}
pCu2=pCu;
pCu=pCu->next;
while(pCu){
if(!strcmp(pCu->name,Buf)){
pCu2->next=pCu->next;
free(pCu);
return 0;
}/*if*/
pCu2=pCu;
pCu=pCu->next;
}
pRF=pRF->next;
}/*while*/
pRST=pRST->next;
}/*while*/
getch();
return 0;
}
int xiugaikefangzhonglei(Pfangjianzhonglei pRST)
{
const char * szTree="Which type?";
const char * szRoom="Please input the doorplate";
const char * szError[]={"Can't find the Type",
"Can't find the Room"};
char Buf[BUFSIZE];
Pfangjian pRF;
int type;
Buf[0]='\0';
printf("%s",szTree);
scanf("%d",&type);
printf("%s",szRoom);
scanf("%s",Buf);
while(pRST){
if(pRST->zhonglei==type+'0'){
pRF=pRST->first;
while(pRF){
if(!strcmp(pRF->num,Buf)){
xiugaikefangxinxi(pRF);
return 1;
}/*if*
展开阅读全文