旅店登记系统
沈阳航空工业学院
课程设计任务书 电子信息工程学院 电子信息工程专业 84020103班 学号[1**********]56
一、课程设计题目:旅店登记系统
二、课程设计工作自2009年9月7日起至2009年9月11日止
三、课程设计内容:
用C 语言编写程序完成以下任务:
(1)旅店的房间信息保存在file12.txt (由教师提供)中,格式为房间号,价钱,是否住旅客。
(2)新入住旅客住店登记:旅客信息(包括旅客入住的房间号,姓名,旅客身份证号等)保存在person.txt 文件中,入住后file12.txt 文件中的信息相应改变。
(3)旅客退店: 退店后删除该旅客信息,file12.txt 文件中的信息相应改变。
(4)显示空闲房间信息。
。
四、课程设计要求:
程序质量:
1.贯彻结构化程序设计思想。
2.用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。
3.用户界面中的菜单至少应包括“旅客入住”、“旅客退房”、“显示空闲房间信息”、“退出”4项,所有数据的改变都应该在相关文件中有所体现。
4.代码应适当缩进,并给出必要的注释,以增强程序的可读性。 课程设计说明书:
课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下: ● 封面
● 课程设计任务书
● 目录
● 需求分析(分析题目的要求)
● 程序流程图(总体流程图和主要功能模块流程图)
● 核心技术的实现说明及相应程序段
● 个人总结
● 参考资料
● 源程序及适当的注释
指导教师: 学生签名:
五、成绩:
六、教师评语:
目录
一、需求分析 . ........................................................... 1
二、程序流程图 . ....................................................... 3
三、核心技术的实现说明及相应程序段 ............... 7
四、个人总结 ........................................................... 14
五、参考文献 ........................................................... 14
六、源程序 ............................................................... 15
一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为五个模块,其中每一个模块对应一个函数,他们的功能分别是:添加房间数据函数,添加旅客数据函数,更改房间数据函数,删除退店旅客资料数据函数以及显示空闲房间函数。
1、添加房间及旅客数据函数 主要实现程序最初运行时房间及旅客数据的录入以及其后的运行中房间及旅客数据的追加功能;
2、添加旅客数据函数 实现的功能是添加入住旅客的主要信息;
3、更改房间数据函数 实现的功能是旅客入住后更改房间原来的数据;
4、删除退店旅客资料数据函数 在旅客退店后,将入住旅客的资料删除;
5、显示空闲房间函数 实现的是显示空闲中的房间资料;
除上面介绍的功能之外,程序还具有退出功能,可以
在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。
每一个房间的纪录都包含房间号、价格、是否空闲,每一个旅客的记录都包含房间号、姓名、身份证号,在程序当中,将房间信息及旅客信息类型定义为结构体类型,旅客入住信息直接写入file12.txt 文件中,其他函数每次对旅客信息的访问,其数据来源都是file12.txt 文件,可以对旅客的数据进行永久保存,保证每次运行程序都可以采用原来的数据。
二、程序流程图
1、总体结构图
图1程序总体结构
2、 分步图
图2 Step1
图3 Step2
图4 Step3
图5 step4
图Step5
三、核心技术的实现说明及相应程序段
本程序主要由六个自定义函数和一个主函数组成,其
中主函数以菜单的形式调用其他函数来实现要求的所有功能。在这些函数当中,添加数据函数、删除数据函数和排序函数是程序中较为核心的部分,下面分别进行说明。
1、添加数据函数
添加数据分为两种情况,其一是在老师提供的文件
(file12.txt )不存在的情况下,首先由程序创建一个新文件,并将已提供的房间信息写入该文件当中;其二是在文件(file12.txt )已经存在的情况下,此时文件要以读写方式或追加的方式打开,这样才可以保证以前已经存在的数据不丢失。
具体的程序段如下:
step1() //输入房间信息 //需3个房间信息 程序调试中........
{
FILE *fpp,*fph; //定义指针
FILE12 room[M];
PERSON guest[M];
int i;
char ch;
printf("此选项将改变并覆盖原有信息, 是否执行? Y or N....\n");
fflush(stdin);
ch=getch();
if(ch!='y'&&ch!='Y') //判断
return 1;
if((fph=fopen("file12.txt","wb"))==NULL) //判断文件是否存在
{
printf("创建文件失败, 返回上一层\n");
getch();
return 1;
}
if((fpp=fopen("person.txt","wb"))==NULL)
{
printf("创建文件失败, 返回上一层\n");
getch();
return 1;
}
for(i=0;i
{
room[i].roomnum=-1; //改变结构体中的变量的值
room[i].empty=1;
room[i].price=0;
guest[i].roomnum=-1;
}
ch='y';
i=0;
while(ch=='y'|| ch=='Y') //判断括号内的值是否等于一
{
printf("请输入房间号\n");
scanf("%d",&room[i].roomnum);
printf("请输入价格\n");
scanf("%d",&room[i].price);
printf("输入完毕, 是否继续输入 Y or N..\n");
fflush(stdin);
ch=getch();
system("cls"); //清屏
i++;
}
for(i=0;i
{
fwrite(&room[i],sizeof(FILE12),1,fph); //将结构体内的数据写入文件
fwrite(&guest[i],sizeof(PERSON),1,fpp);
}
fclose(fph); //关闭文
件
fclose(fpp);
return 0;
}
2、查询函数:
该函数就是查询指定旅客的信息,当输入指定旅客的编号时,使之与旅店的旅客编号比较,如果相同则输出该旅客的信息,否则该旅客没入住。
具体的程序段如下:
step2() //
查询旅客信息
{
FILE *fp;
PERSON guest[M];
int i;
if((fp=fopen("person.txt","rb"))==NULL)
{
printf("打开文件失败\n");
getch();
return 1;
}
printf("房间号\t姓名\t身份证号\n");
for(i=0;i
{
fread(&guest[i],sizeof(PERSON),1,fp);
if(guest[i].roomnum!=-1)
printf("%d\t%s\t%s\t\t\n",guest[i].roomnum,guest[i].name,guest[i
].zhengjian);
}
fclose(fp);
getch();
return 0;
}
3、删除数据函数
该函数的核心内容是删除算法以及最终对源文件的
更新。该函数执行时,首先调用reads 函数将文件中的旅客所选房间信息读入数组当中,并由用户输入待退的房间号,而后按照该房间号进行查找,如果文件中存在该房间的数据,则采用删除算法删除,否则输出房间中旅客信息不存在的提示信息。对旅客信息的具体删除算法是在结构体数组中实现的,当旅客的信息被找到后,位于数组中该旅客后面的旅客记录依次向前移动一个元素的位置,这些操作完成后,要删除的旅客信息就被后面的数组元素覆盖掉了,也就实现了删除。在数组中删除旅客信息后,还要将更改后的信息重新写回文件当中,以保证数据的一致性。具体程序段如下:
step4()
{
FILE *fph,*fpp;
PERSON guest[M];
FILE12 room[M];
int i,temp;
if((fph=fopen("file12.txt","rb"))==NULL)
{
printf("打开文件失败\n");
getch();
return 1;
}
if((fpp=fopen("person.txt","rb"))==NULL)
{
printf("打开文件失败\n");
getch();
return 1;
}
for(i=0;i
{
fread(&room[i],sizeof(FILE12),1,fph);
fread(&guest[i],sizeof(PERSON),1,fpp);
}
fclose(fpp);
fclose(fph);
printf("请输入旅客的房间号\n");
scanf("%d",&temp);
for(i=0;i
{
if(temp==room[i].roomnum)
{
room[i].empty=1;
printf("房间已空闲\n");
break;
}
else if(i==M-1)
{
printf("查找不到该房间\n");
getch();
return 1;
}
}
for(i=0;i
{
if(temp==guest[i].roomnum)
{
guest[i].roomnum=-1;
printf("旅客信息已成功删除\n");
break;
}
else if(i==M-1)
{
printf("查找不到该旅客\n");
getch();
return 1;
}
}
if((fph=fopen("file12.txt","wb"))==NULL)
{
printf("创建文件失败, 返回上一层\n");
getch();
return 1;
}
if((fpp=fopen("person.txt","wb"))==NULL)
{
printf("创建文件失败, 返回上一层\n");
getch();
return 1;
}
for(i=0;i
{
fwrite(&room[i],sizeof(FILE12),1,fph);
fwrite(&guest[i],sizeof(PERSON),1,fpp);
}
fclose(fph);
fclose(fpp);
getch();
return 0;
}
四、个人总结
经过这一周的C 语言课程设计, 我从中领悟到了很
多。C 语言是一门需要将知识学习扎实并长期积累,灵活的运用到实际操作当中去的学科。而我在平时并没有非常熟练的掌握这些普遍运用的知识点。在这一个星期里,我对C 语言有了更进一步的了解。
通过编辑程序,让我对文件、指针方面的知识巩固并
提高了很多,比起以前对这些知识点的模棱两可,在这次课设后我不仅掌握了更多知识,更从中体会到一种成功之后的喜悦,使我的C 语言不再是纸上谈兵。
五、参考文献
1 谭浩强.C 程序设计.北京:清华大学出版社,2005
2 刘成等.C 语言程序设计实验指导与习题集.北京:中国铁道出版社,2006
六、源程序
#include
#include
#include
#include
#define M 25
typedef struct //定义一个结构体
{
int roomnum; //房间号
int price; //价格
int empty; //是否空闲 是为1 否为0
}FILE12;
typedef struct
{
int roomnum; //房间号
char name[12]; //姓名
char zhengjian[20]; //身份证号
}PERSON;
/********************************************************************************/
step1() //输入房间信息 //需3个房间信息 程序调试中........
{
FILE *fpp,*fph; //定义指针
FILE12 room[M];
PERSON guest[M];
int i;
char ch;
printf("此选项将改变并覆盖原有信息, 是否执行? Y or N....\n");
fflush(stdin);
ch=getch();
if(ch!='y'&&ch!='Y') //判断
return 1;
if((fph=fopen("file12.txt","wb"))==NULL) //判断文件是否存在
{
printf("创建文件失败, 返回上一层\n");
getch();
return 1;
}
if((fpp=fopen("person.txt","wb"))==NULL)
{
printf("创建文件失败, 返回上一层\n");
getch();
return 1;
}
for(i=0;i
{
room[i].roomnum=-1; //改变结构体中的变量的值
room[i].empty=1;
room[i].price=0;
guest[i].roomnum=-1;
}
ch='y';
i=0;
while(ch=='y'|| ch=='Y') //判断括号内的值是否等于一 {
printf("请输入房间号\n");
scanf("%d",&room[i].roomnum);
printf("请输入价格\n");
scanf("%d",&room[i].price);
printf("输入完毕, 是否继续输入 Y or N..\n");
fflush(stdin);
ch=getch();
system("cls"); //清屏 i++;
}
for(i=0;i
{
fwrite(&room[i],sizeof(FILE12),1,fph); //将结构体内的数据写入文件 fwrite(&guest[i],sizeof(PERSON),1,fpp);
}
fclose(fph); //关闭文件 fclose(fpp);
return 0;
}
/********************************************************************************/
step2() //查询旅客信息 {
FILE *fp;
PERSON guest[M];
int i;
if((fp=fopen("person.txt","rb"))==NULL)
{
printf("打开文件失败\n");
getch();
return 1;
}
printf("房间号\t姓名\t身份证号\n");
for(i=0;i
{
fread(&guest[i],sizeof(PERSON),1,fp);
if(guest[i].roomnum!=-1)
printf("%d\t%s\t%s\t\t\n",guest[i].roomnum,guest[i].name,guest[i].zhengjian);
}
fclose(fp);
getch();
return 0;
}
/********************************************************************************/
step3() //旅客登记 {
FILE *fph,*fpp;
PERSON guest[M];
FILE12 room[M];
int i,j;
if((fph=fopen("file12.txt","rb"))==NULL)
{
printf("打开文件失败\n");
getch();
return 1;
}
if((fpp=fopen("person.txt","rb"))==NULL)
{
printf("打开文件失败\n");
getch();
return 1;
}
for(i=0;i
{
fread(&room[i],sizeof(FILE12),1,fph); //读取文件内的数据 fread(&guest[i],sizeof(PERSON),1,fpp);
}
fclose(fpp);
fclose(fph);
for(i=0;i
if(guest[i].roomnum==-1)
break;
printf("请输入空房间号\n");
scanf("%d",&guest[i].roomnum);
for(j=0;j
{
if(guest[i].roomnum==room[j].roomnum)
{
if(room[j].empty==0)
{
printf("此房间已有旅客\n");
guest[i].roomnum=-1;
getch();
return 1;
}
else
{
room[j].empty=0;
break;
}
}
else if(j==M-1)
{
printf("查找不到该房间\n");
getch();
return 1;
}
}
printf("请输入旅客姓名\n");
scanf("%s",&guest[i].name);
printf("请输入身份证号\n");
scanf("%s",&guest[i].zhengjian);
printf("旅客登记完毕\n");
if((fph=fopen("file12.txt","wb"))==NULL)
{
printf("创建文件失败, 返回上一层\n");
getch();
return 1;
}
if((fpp=fopen("person.txt","wb"))==NULL)
{
printf("创建文件失败, 返回上一层\n");
getch();
return 1;
}
for(i=0;i
{
fwrite(&room[i],sizeof(FILE12),1,fph);
fwrite(&guest[i],sizeof(PERSON),1,fpp);
}
fclose(fph);
fclose(fpp);
getch();
return 0;
}
/********************************************************************************/
step4()
{
FILE *fph,*fpp;
PERSON guest[M];
FILE12 room[M];
int i,temp;
if((fph=fopen("file12.txt","rb"))==NULL)
{
printf("打开文件失败\n");
getch();
return 1;
}
if((fpp=fopen("person.txt","rb"))==NULL)
{
printf("打开文件失败\n");
getch();
return 1;
}
for(i=0;i
{
fread(&room[i],sizeof(FILE12),1,fph);
fread(&guest[i],sizeof(PERSON),1,fpp);
}
fclose(fpp);
fclose(fph);
printf("请输入旅客的房间号\n");
scanf("%d",&temp);
for(i=0;i
{
if(temp==room[i].roomnum)
{
room[i].empty=1;
printf("房间已空闲\n");
break;
}
else if(i==M-1)
{
printf("查找不到该房间\n");
getch();
return 1;
}
}
for(i=0;i
{
if(temp==guest[i].roomnum)
{
guest[i].roomnum=-1;
printf("旅客信息已成功删除\n");
break;
}
else if(i==M-1)
{
printf("查找不到该旅客\n");
getch();
return 1;
}
}
if((fph=fopen("file12.txt","wb"))==NULL)
{
printf("创建文件失败, 返回上一层\n");
getch();
return 1;
}
if((fpp=fopen("person.txt","wb"))==NULL)
{
printf("创建文件失败, 返回上一层\n");
getch();
return 1;
}
for(i=0;i
{
fwrite(&room[i],sizeof(FILE12),1,fph);
fwrite(&guest[i],sizeof(PERSON),1,fpp);
}
fclose(fph);
fclose(fpp);
getch();
return 0;
}
/********************************************************************************/
step5() //显示空房间信息 {
FILE *fp;
FILE12 room[M];
int i;
if((fp=fopen("file12.txt","rb"))==NULL)
{
printf("打开文件失败\n");
getch();
return 1;
}
printf("房间号\t价钱\t空闲\n\n");
for(i=0;i
{
fread(&room[i],sizeof(FILE12),1,fp);
if((room[i].empty==1)&&(room[i].roomnum!=-1))
printf("%d\t%d\t空闲\n",room[i].roomnum,room[i].price); else if((room[i].empty==0)&&(room[i].roomnum!=-1))
printf("%d\t%d\t使用中\n",room[i].roomnum,room[i].price); }
fclose(fp);
getch();
return 0;
}
/********************************************************************************/
void main()
{
char menu; //定义菜单 while(1)
{
printf(" 1 房间信息\n");
printf(" 2 旅客信息\n");
printf(" 3 入住登记\n");
printf(" 4 旅客退店\n");
printf(" 5 显示空闲房间\n");
printf(" 0 退出\n");
printf("请选择一项进行操作\n");
printf("\n");
fflush(stdin);
menu=getch();
if(menu=='0')
break;
switch(menu) //建立一个多支函数 {
case '1':step1();break;
case '2':step2();break;
case '3':step3();break;
case '4':step4();break;
case '5':step5();break;
default:system("cls"); printf("输入错误,请重新选择\n");getch(); }
system("cls");
}
}