1、 目 录 一、设计题目 1 二、设计目的 1 三、设计分析 1 四、总体设计 1 五、详细设计 3 六、程序调试 7 七、结论 8 一、设计题目 简单的宾馆客房管理系统设计 二、设计目的 1. 运用已学过的知识进行一个简单的应用程序的开发。 2. 基本掌握设计课题的基本步骤和方法。 3. 掌握应用系统开发中的需求分析与数据库设计方法。 4. 基本掌握应用系统开发中设计文档的编制。 三、设计分析 本系统是在vc6.0的环境下进行开发的。系统按功能将分为四个模块,分别为查询模块,修改模块,删除模块,添加模块四部分。 以上功能将通过为四个
2、函数实现,其中查询函数拟可以实现按姓名查询和按房间号码查询。修改函数拟可以实现全部选项的修改并且选择一项后都会列出以前这项的存储信息。删除函数将实现了后一个结构体数组的数据来覆盖前一个结构体数组数据以达到删除的效果。添加函数拟实现分别列出已住房间的详细信息和未住房间的详细信息以供用户选择。 四、总体设计 (1)用户登录时将会选择y或n,y表示用户第一次使用此系统,这时我们需要将结构体数组数组的内容初始化,如果选择n则表示用户不是第一次使用该系统可以继续进行上一次的操作。 (2)数据载入管理:系统的数据载入将是由文件写入定义的结构体数组数组里,这样方便了管理者维护和查询数据。 (3)可
3、视化界面:为了方便管理者使用系统,系统的大多数界面将是采用汉英双字幕显示并且界面将简单明了的显示出各选项。 (4)查询函数:查询函数中将提供按姓名查询和按房间号码查询两种方法以方便用户查询。 (5)删除函数:在此函数中系统将利用后一个结构体数组的数据来覆盖前一个结构体数组数据以达到删除的效果,并同时改变此时房间的容纳量。 (6)修改函数:首先从指定文件写入基本数据到指定的结构体数组,然后请用户输入想修改的房间号码,然后会列出修改的全部选项以供用户选择,并且选择一选项后都会列出以前这项的存储信息以方便用户修改。 (7)添加函数:在添加函数里系统将会分别列出已住房间的详细信息和未住房间的详
4、细信息以供用户方便的选择。在此函数中系统中添加了一些容错代码防止用户由于疏忽而导致的输入错误,比如判断用户输入的数据是否在系统容许的范围内,系统的系统功能结构图如图1所示。 查询模块 修改模块 添加模块 删除模块 客房管理系统 按姓名查询 按房间号码查询 修改用户信息 添加新用户 删除用户信息 图1 系统功能结构图 2. 结构体设计 结构体中一共包含住户个人信息、客房基本信息这两部分。现在列举出了本系统比较重要的结构体数组的详细结构,包括字段名、数据类型以及它的说明,是否可以为空等。具体设计如下: 如表
5、1所示,该表用于记录本系统用到住户个人结构体数组里分量的基本信息,包括的分量项目有name、sex、age、id_card、year、month、date。 表1住户个人结构体分量信息表 字段名 数据类型 长度 说明 Name Char 20 姓名 sex int 4 性别 age Int 4 年龄 Id_card Char 20 身份证号 year Int 4 年 month Int 4 月 date Int 4 日 如表2所示,该表用于记录本系统用到的客房结构体数组里分量的基本信息,包括的分量项目有room_id
6、tel、price、sign。 表2客房结构体分量信息表 字段名 数据类型 长度 说明 Room_id Char 20 姓名 tel int 4 性别 price Int 4 年龄 sign Char 20 身份证号 五、详细设计 1.查询模块 本系统分两种方式来完成查询功能即按姓名查询和按房间号码查询。在如图2所示界面中显示两种查询方式及信息,接收用户输入选项后进入相应查询界面。 图 2查询函数功能图 当用户选择1后进入按房间号码查询界面如图3所示。 图 3按号码查询界面
7、 当用户选择2后进入按姓名查询界面如图4所示。 图4按姓名查询界面 按房间号码查询首先从指定文件写入基本数据,为了防止用户错误操作我们设置了容错系统比如有1-50个房间供查询而用户输入的数据不在此范围内编写了do{ if(n<1||n>N) { a=1; printf("\n输入错误!!!\n\t请再一次输入:(1-%d),Room[ ]\b\b",N); } else a=0; }while(a==1); 这段代码来防止用户的错误。 按姓名查询时首先从指定文件写入基本数据,我们利用strcmp这个
8、函数来比较用户查询的姓名与结构体数组中的姓名是否一样,当一样时会跳出循环这时i的值就是我们要查找的姓名所在结构体数组的标号。 2.删除模块 在此函数中我们利用后一个结构体数组的数据来覆盖前一个结构体数组数据以达到删除的效果。如图5所示。 图 5删除函数效果图 3.修改模块 首先从指定文件写入基本数据然后请用户输入想修改的房间号码然后会列出修改的全部选项并且每一项都会列出以前这项的存储信息以方便用户修改,其中选项包括房间号码、电话号码、价格、标记、姓名、性别、年龄、身份证号码、年、月、日。如图6所示。 图6修改函数功能
9、图 当你选择修改的选项后系统会列出以前此项的存储信息和“修改成功”的字样如图7所示。 图7修改函数选项修改功能图 4.添加模块 在添加函数里系统会分别列出已住房间的详细信息和未住房间的详细信息以供用户方便的选择,如图8所示。 图 8分别显示功能图 在用户选择房间时添加函数会让用户输入姓名,性别,年龄,身份证号等个人信息。如图9所示。 图 9添加函数功能图 六、程序调试 1.不熟悉fprintf函数所导致的
10、问题 fprintf(fp,"%d %d %d %d %s %d %d %s %d %d %d",sum[i].room_ID,sum[i].tel,sum[i].price,sum[i].sign,sum[i].Client_list.name,sum[i].Client_list.sex,sum[i].Client_list.age,sum[i].Client_list.ID_card,sum[i].Client_list.year,sum[i].Client_list.month,sum[i].Client_list.date); 在括号中的第一项要指出文件的位置,但在编程时由于对
11、函数的不熟悉而造成了遗漏此项,耽误了很多时间。
2.在查询函数中遇到了文件写入出错的问题
在从文件向指定结构体数组里写入数据时一开始是用以下代码:
if((fp=fopen("file.txt","w"))==NULL)
{printf("\nCan not open the file!!!\n");exit(0);}
for(i=0;i 12、是整个系统比较适合小型的宾馆客房使用。没有过多的其他附加功能,只是简单的将如何添加、删除、修改,查询功能实现,然后在此基础上进行了递阶性的开发,比如将查询功能方式扩展成按姓名查询和按房间号码查询两种。修改函数中将修改部分逐一展开方便用户选择性修改,使修改的目的性增强,添加函数中实现了已住房间信息和未住房间信息分开显示的功能删除函数中利用了后一个结构体数组数据覆盖前一结构体数组数据的方法。为了更好的展现该系统,考虑用户的使用的方便以及网络因素,系统采用的是单一的页面反复使用,更好的实现了系统的连接性。
开发过程中,由于是开发者自身的设计和编写,所以在某些功能上可能与实际的需求有出入,主要是在是 13、技术上和需求分析上问题。因此该系统还是有尚需要改进的部分,主要有按姓名查询和删除功能编辑的不是很完善与现实有冲突。
附录(程序源代码):
#include 14、 Hotel{
int room_ID;
int tel;
int price;
int sign;
struct Client Client_list;
}sum[N];
main()
{
int i;
char c;
FILE *fp;
void menu();
void enter();
void search();
void modify();
void leave();
printf("\n\n\n\n\t-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*- 15、");
printf("\n\n\n\t\tWelcome to the systerm of hotel management!!!\n\t\t\t(欢迎来到酒店客房管理系统)\n\n\n");
printf("\t-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-\n\n\n");
printf("\t\t你想新建文件吗?:(y/n)\tI choose [ ]\b\b");
scanf("%c",&c);
if(c=='y')
{
for(i=0;i 16、m[i].room_ID=i+1;
sum[i].tel=800+i;
sum[i].price=80;
sum[i].sign=0;
}
if((fp=fopen("d:\\ff.txt","w"))==NULL)
{
printf("\nCan not open the file!!!\n");
exit(0);
}
fprintf(fp,"房间号码 电话号码 价格 标记 姓名 性别 年龄 身份证号码 年 月 日\n");
for(i=0;i 17、d %d %s %d %d %s %d %d %d\n",sum[i].room_ID,sum[i].tel,sum[i].price,sum[i].sign,sum[i].Client_list.name,sum[i].Client_list.sex,sum[i].Client_list.age,sum[i].Client_list.ID_card,sum[i].Client_list.year,sum[i].Client_list.month,sum[i].Client_list.date);
fclose(fp);
}
else
{
if((fp=fop 18、en("d:\\ff.txt","r"))==NULL)
{
printf("\nCan not open the file!!!\n");exit(0);
}
for(i=0;i 19、Client_list.ID_card,&sum[i].Client_list.year,&sum[i].Client_list.month,&sum[i].Client_list.date);
for(i=0;i 20、n\n");
printf("\t\t\t 1.New customer (添加新用户)\n\n");
printf("\t\t\t 2.Search room (查询房间信息)\n\n");
printf("\t\t\t 3.Modify customer(修改用户信息)\n\n");
printf("\t\t\t 4.Leave (离开删除)\n\n");
printf("\t\t\t 5.Exit (退出程序)\n\n\n");
printf("\t**************************** 21、\n\n");
printf("You choose number(1-5)[ ]\b\b");
scanf("%d",&n);
if(n<1||n>5)
{
a=1;
printf("\nWrong number!!!\n\nPrint any key to continue ...\n");
getch();
}
else
a=0;
}while(a==1);
switch(n)
{
case 1:enter();break;
case 2 22、search();break;
case 3:modify();break;
case 4:leave();break;
case 5:exit(0);break;
}
}
void enter()
{
FILE *fp;
char z[100];
char x[100];
char q[100];
char w[100];
char r[100];
char g[100];
char j[100];
char k[100];
char l[100];
char m[100];
char v[100];
char 23、 buffer[1000];
char c;
int u;
int i;
int t;
int e;
do{
if(fp=fopen("d:\\ff.txt","r"))
{
fscanf(fp,"%s %s %s %s %s %s %s %s %s %s %s",z,x,q,w,r,g,j,k,l,m,v);
printf("%s %s %s %s %s %s %s %s %s %s %s\n", z,x,q,w,r,g,j,k,l,m,v);
for(u=0;u 24、ts(buffer,100,fp);
fscanf(fp,"%d %d %d %d %s %d %d %s %d %d %d",&sum[u].room_ID,&sum[u].tel,&sum[u].price,&sum[u].sign,sum[u].Client_list.name,&sum[u].Client_list.sex,&sum[u].Client_list.age,sum[u].Client_list.ID_card,&sum[u].Client_list.year,&sum[u].Client_list.month,&sum[u].Client_list.date); 25、
printf(" %d %d %d %d %s %d %d %s %d %d %d\n",sum[u].room_ID,sum[u].tel,sum[u].price,sum[u].sign,sum[u].Client_list.name,sum[u].Client_list.sex,sum[u].Client_list.age,sum[u].Client_list.ID_card,sum[u].Client_list.year,sum[u].Client_list.month,sum[u].Client_list.date);
} 26、
}
else
printf("can not open the file.....");
printf("\n已经住人房间的基本信息\n");
printf("\n以下是未住人房间的基本信息\n");
fscanf(fp,"%s %s %s %s %s %s %s %s %s %s %s",z,x,q,w,r,g,j,k,l,m,v);
printf("%s %s %s %s %s %s %s %s %s %s %s\n", z,x,q,w,r,g,j,k,l,m,v);
for(u=nownumber;u 27、 fgets(buffer,100,fp);
fscanf(fp,"%d %d %d %d %s %d %d %s %d %d %d",&sum[u].room_ID,&sum[u].tel,&sum[u].price,&sum[u].sign,sum[u].Client_list.name,&sum[u].Client_list.sex,&sum[u].Client_list.age,sum[u].Client_list.ID_card,&sum[u].Client_list.year,&sum[u].Client_list.month,&sum[u].Client_list.da 28、te);
printf(" %d %d %d %d %s %d %d %s %d %d %d\n",sum[u].room_ID,sum[u].tel,sum[u].price,sum[u].sign,sum[u].Client_list.name,sum[u].Client_list.sex,sum[u].Client_list.age,sum[u].Client_list.ID_card,sum[u].Client_list.year,sum[u].Client_list.month,sum[u].Client_list.date);
29、 }
printf("\n\nWhich room are you going to rent:(%d-%d)Room[ ]\b\b",nownumber+1,N);
scanf("%d",&e);
if(e>=1&&e<=N)
{
e--;
if(sum[e].sign==0)
{
printf("\n 请输入姓名:");
scanf("%s",sum[e].Client_list.name);
printf("\n\t请输入性别:(1 stands for F,2 stands for M)");
30、
scanf("\n\t%d",&sum[e].Client_list.sex);
printf("\n\t请输入年龄:");
scanf("%d",&sum[e].Client_list.age);
printf("\n\t请输入身份证号:");
scanf("%s",sum[e].Client_list.ID_card);
printf("\n\t入住日期(year month date--For example:2009 7 24):");
scanf("%d%d%d",&sum[e].Client_list.yea 31、r,&sum[e].Client_list.month,&sum[e].Client_list.date);
printf("\nThis is the data you just input:\n");
printf("\n 姓名 性别 年龄 身份证号码 年/月/日 \n");
printf(" %s\t%d\t%d\t%s",sum[e].Client_list.name,sum[e].Client_list.sex,sum[e].Client_list.age,sum[e].Client 32、list.ID_card);
printf("\t%d.%d.%d",sum[e].Client_list.year,sum[e].Client_list.month,sum[e].Client_list.date);
printf("\n\tSave?(y/n):");
getchar();c=getchar();
if(c=='y')
{sum[e].sign=1;
nownumber++;
left--;
if((fp=fopen("file.txt","w"))==NULL)
{printf(" 33、\nCan not open the file!!!\n");exit(0); }
for(i=0;i 34、t_list.month,sum[i].Client_list.date);
printf("\n Successful O(∩_∩)O~!\n");
printf(" 你房间的电话号码是:%d\n\t 电话号码是:%d\n\t 价格:%d",sum[e].room_ID,sum
[e].tel,sum[e].price);
fclose(fp 35、);
}
}
else printf("\n Sorry!这个房间已经住人!!!\n\n");
}
else
printf("\n Wrong number!!!\n");
printf("\n\n\t\t\t\t再一次输入吗?(y/n):");
getchar();
c=getchar();
if(c=='y') t=1;
else t=0;
}while(t);
printf("Print any key to continue ...\n");
getch();
men 36、u();
}
void search()
{
char z[100];
char x[100];
char q[100];
char w[100];
char r[100];
char g[100];
char j[100];
char k[100];
char l[100];
char m[100];
char v[100];
char name[20];
int u;
char buffer[1000];
FILE *fp;
int o,i,a;
char c;
printf("\t\t1.按房间号码查询\ 37、n\t\t2.按姓名查询\n");
printf("请选择查询的方式:[ ]\b\b");
scanf("%d",&i);
switch(i)
{
case 1:
if(fp=fopen("d:\\ff.txt","r"))
{
int u;
fscanf(fp,"%s %s %s %s %s %s %s %s %s %s %s",z,x,q,w,r,g,j,k,l,m,v);
for(u=0;u 38、d %s %d %d %s %d %d %d",&sum[u].room_ID,&sum[u].tel,&sum[u].price,&sum[u].sign,sum[u].Client_list.name,&sum[u].Client_list.sex,&sum[u].Client_list.age,sum[u].Client_list.ID_card,&sum[u].Client_list.year,&sum[u].Client_list.month,&sum[u].Client_list.date);
}
}
else
printf("can not 39、 open the file.....");
for(u=0;u 40、se
{
printf("房间号码 %d:\n\t姓名:%s\n\t性别:%d (1 stand for 女,2 stand for 男)\n\t年龄:%d\n\t身份证号:%s\n\t入住时间:%d.%d.%d\n",o,sum[u].Client_list.name,sum[u].Client_list.sex,sum[u].Client_list.age,sum[u].Client_list.ID_card,sum[u].Client_list.year,sum[u].Client_list.month,sum[u].Client_list.date);
p 41、rintf("This room's telephone number:%d\n\t\t\tprice:%d\n\t",sum[u].tel,sum[u].price);
if(sum[u].sign)
printf("\n已经被占用!!!\n\n");
else
{
printf("\n\t空房间!\t你准备预定吗?(y/n)[ ]\b\b");
getchar();
c=getchar();
printf("\n");
if(c=='y')
enter();
}
fclose(f 42、p);
printf("Print any key to continue ...\n");
getch();
menu();
}
case 2:
printf("请输入要查询的姓名:name[ ]\b\b\b\b");
scanf("%s",name);
if(fp=fopen("d:\\ff.txt","r"))
{
fscanf(fp,"%s %s %s %s %s %s %s %s %s %s %s",z,x,q,w,r,g,j,k,l,m,v);
for(u=0; 43、u 44、m[u].Client_list.date);
}
}
else
printf("can not open the file.....");
for(i=0;i 45、s\n\t性别:%d (1 stand for 女,2 stand for 男)\n\t年龄:%d\n\t身份证号:%s\n\t入住时间:%d.%d.%d\n",sum[i].room_ID,sum[i].Client_list.name,sum[i].Client_list.sex,sum[i].Client_list.age,sum[i].Client_list.ID_card,sum[i].Client_list.year,sum[i].Client_list.month,sum[i].Client_list.date);
printf("This room's te 46、lephone number:%d\n\t\t\tprice:%d\n\t",sum[i].tel,sum[i].price);
if(sum[i].sign)
printf("\n已经被占用!!!\n\n");
else
{
printf("\n\t空房间!\t你准备预定吗?(y/n)[ ]\b\b");
getchar();
c=getchar();
printf("\n");
if(c=='y')
enter();
}
fclose(fp);
printf( 47、"Print any key to continue ...\n");
getch();
menu();
}
}
}
void modify()
{
char z[100];
char x[100];
char q[100];
char w[100];
char r[100];
char g[100];
char j[100];
char k[100];
char l[100];
char m[100];
char v[100];
int u;
char buffer[1000];
FILE 48、 *fp;
int i,n,t,a;
char c;
printf("请输入你准备修改的房间号码:(1-%d)Room[ ]\b\b",N);
scanf("%d",&n);
n--;
if(fp=fopen("d:\\ff.txt","r"))
{
int u;
fscanf(fp,"%s %s %s %s %s %s %s %s %s %s %s",z,x,q,w,r,g,j,k,l,m,v);
printf("%s %s %s %s %s %s %s %s %s %s %s\n", z,x,q,w,r,g,j,k,l,m,v);
49、for(u=0;u 50、ist.month,&sum[u].Client_list.date);
printf(" %d %d %d %d %s %d %d %s %d %d %d\n",sum[u].room_ID,sum[u].tel,sum[u].price,sum[u].sign,sum[u].Client_list.name,sum[u].Client_list.sex,sum[u].Client_list.age,sum[u].Client_list.ID_card,sum[u].Client_list.year,sum[u].Client_list.mo






