资源描述
C语言专业课程设计报告客房标准管理系统
报告正文
一、题目要求
客户信息包括身份证号、姓名、性别、年龄、房间号。试设计一客房管理系统,使之能提供以下功能:
(1) 系统以菜单方式工作
(2) 客户信息录入功能(客户信息用文件保存)
(3) 客户信息统计功能
(4) 客户信息查询功能,查询方式
(5) 客户信息修改功能(可选项)
[提示]
建立客户信息结构体,结构体成员包括身份证号、姓名、性别、年龄、房间号
二、需求分析
根据题目要求,要求对客户信息进行输入、输出等操作;在程序中需要浏览客户的信息,应提供显示、统计、查询、修改等操作;另外还应提供键盘式选择菜单实现功能选择。
三、总体设计
根据需求分析,可以对这个系统的设计分为以下几个模块:
客户信息管理系统
数据输入
数据统计
数据查询
数据修改
数据删除
系统功能模块图
四、详细设计
1、主函数部分:
主函数一般设计得比较简洁,只提供输入,处理和输出部分的函数调用。其中各功能模块用菜单方式选择。
[流程图]:
显示各功能选项
根据 n的值调用各功能模块函数
N
Y
输入n ,判断n 是否是0-5
主函数流程图
main() /**主函数**/
{
printf("\n\n\n\t\t~~~~~~~~~~~~~~~~酒店管理系统~~~~~~~~~~~~~~~~~");
printf("\n\n\n\t\t\tPress any key to continue.....");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t\t---By黄李\n");
getch();
menu();
}
void regist() /**注册函数**/
{
int n,m,i,j;
printf("\tHow many new customs?\t");scanf("%d",&n);
printf("\tHow many rooms they want? ");scanf("%d",&m);
for(i=r;i<r+m;i++)
{
{puts("\n\tRoom_ID:\t");scanf("%d",&room[i].room_ID);
puts("\n\tTel:\t");scanf("%s",room[i].tel);
puts("\n\tPrice:\t");scanf("%d",&room[i].price);
room[i].sign=1;
}
for(j=p;j<p+n;j++)
{
puts("\n\tName:\t");scanf("%s",room[i].client_list[j].name);
puts("\n\tSex(1 for men || 0 for women):\t");scanf("%d",&room[i].client_list[j].sex);
puts("\n\tAge:\t");scanf("%d",&room[i].client_list[j].age);
puts("\n\tID_card:\t");scanf("%s",room[i].client_list[j].ID_card);
puts("\n\tYear:\t");scanf("%d",&room[i].client_list[j].year);
puts("\n\tMonth:\t");scanf("%d",&room[i].client_list[j].month);
puts("\n\tDate:\t");scanf("%d",&room[i].client_list[j].date);
}
}
r=r+m;
p=p+n;
save();
menu();
}
void menu() /*****菜单函数*****/
{int n,w;
do
{
puts("\n\n\n\t***************************MENU*****************************\n\n");
puts("\t\t\t ||(1).Regist ||\n");
puts("\t\t\t ||(2).Statistics||\n");
puts("\t\t\t ||(3).Search ||\n");
puts("\t\t\t ||(4).Modify ||\n");
puts("\t\t\t ||(5).Exit ||\n");
puts("\n\t***********************************************************\n");
printf("\t\tPlease choice you number(1-5)");
scanf("%d",&n);
if(n<1||n>5) w=1,getchar();
else w=0;
}while(w==1);
switch(n)
{
case 1:regist();break;
case 2:stat();break;
case 3:search();break;
case 4:modify();break;
case 5:exit(0);
}
}
注:menu函数能提供菜单方式选择功能,可以根据用户需要进入到所想要的操作模块中,此外把menu函数独立出来,可以方便随时对它进行调用,容易返回到系统界面。
并用结构体来存放客户信息:
struct client
{
char name[20];
int sex;
int age;
char ID_card[20]; /*居民身份证*/
int year;
int month;
int date; /*住店时间*/
};
struct hotel
{
int room_ID; /*房间号*/
char tel[15];
int price; /*住房单价*/
int sign;
struct client client_list[M]; /*实现两个结构体的嵌套*/
}room[N];
int r=0;p=0; /*r,p为全局变量*/
void menu();
void search_one();
void search_day();
void modify();
void modify_one();
void load_room();
void modify_day();
void modify_s(int j,int i);
void save();
void search();
void stat_u();
void stat_o();
void regist();
void stat();
2、各功能模块函数部分:
(1)输入模块
[需求分析] 对信息进行输入。
[流程图]:
输入用户要输入客户记录的个数n
i从0到n-1调用输入函数input(i)
i!=0
保存调用函数save( n)
Y
输入模块流程图
程序
void regist() /**注册函数**/
{
int n,m,i,j;
printf("\tHow many new customs?\t");scanf("%d",&n);
printf("\tHow many rooms they want? ");scanf("%d",&m);
for(i=r;i<r+m;i++)
{
{puts("\n\tRoom_ID:\t");scanf("%d",&room[i].room_ID);
puts("\n\tTel:\t");scanf("%s",room[i].tel);
puts("\n\tPrice:\t");scanf("%d",&room[i].price);
room[i].sign=1;
}
for(j=p;j<p+n;j++)
{
puts("\n\tName:\t");scanf("%s",room[i].client_list[j].name);
puts("\n\tSex(1 for men || 0 for women):\t");scanf("%d",&room[i].client_list[j].sex);
puts("\n\tAge:\t");scanf("%d",&room[i].client_list[j].age);
puts("\n\tID_card:\t");scanf("%s",room[i].client_list[j].ID_card);
puts("\n\tYear:\t");scanf("%d",&room[i].client_list[j].year);
puts("\n\tMonth:\t");scanf("%d",&room[i].client_list[j].month);
puts("\n\tDate:\t");scanf("%d",&room[i].client_list[j].date);
}
}
r=r+m;
p=p+n;
save();
menu();
}
(2)统计模块
[需求分析] 该模块的功能是显示所有客户记录信息。
显示客户记录(10个一屏)
:
按任意键显示下一屏
按任意键返回主菜单
统计模块流程图
程序
void stat() /***统计函数***/
{
int n,m;
do
{
puts("\t\t*********************MENU************************\n");
puts("\t\t\t\t1).Statistics one month\n");
puts("\t\t\t\t2).Statistics using room\n");
puts("\t\t\t\t3).MENU()");
puts("\t\t**************************************************\n");
printf("\t\tPlease choice your number(1-3):[ ]\b\b");
scanf("%d",&n);
if(n<1&&n>3)
{m=1;
getchar();
}
else m=0;
}while(m==1);
switch(n)
{case 1:stat_o();break;
case 2:stat_u();break;
case 3:menu();
}
}
void stat_o() /*******统计人数******/
{
int j,i,n,l;
int s=0;
puts("Please input the month you want to statistics:");scanf("%d",&n);
load_room();
for(i=0;i<r;i++)
for(j=0;j<p;j++)
if(room[i].client_list[j].month==n) s=s+1;
printf("There are %d customer this month",s);
puts("\n\nWhat you want to do?\n");
puts("1).Statistics again\t2).back\n");
scanf("%d",&l);
switch(l)
{case 1:stat_o();break;
case 2:stat();
}
}
void stat_u() /******统计使用中的房间*****/
{int j,l,s=0;
load_room();
for(j=0;j<p;j++)
{ if(room[j].sign==1) s+=1;}
printf("There are %d rooms in use",s);
puts("\n\nWhat you want to do?\n");
puts("1).Statistics again\t2).back\n");
scanf("%d",&l);
switch(l)
{case 1:stat_u();break;
case 2:stat();
}
}
printf_p(int i,int j) /******显示个人信息******/
{
printf("name:");puts(room[i].client_list[j].name);
printf("\nsex:%d\n",room[i].client_list[j].sex);
printf("\nage:%d\n",room[i].client_list[j].age);
puts("\nID_card:");printf("%s",room[i].client_list[j].ID_card);
printf("\nyear:%d\n",room[i].client_list[j].year);
printf("\nmonth:%d\n",room[i].client_list[j].month);
printf("\ndate:%d\n",room[i].client_list[j].date);
printf("\nRoom_ID:%d\n",room[i].room_ID);
printf("\nTel:%s\n",room[i].tel);
printf("\nPrice:%d\n",room[i].price);
}
(3)查找模块
是否找到客户记录
输入一整型数值
提示没有找到
Y
N
查找模块
1,2,还是3
按身份证查找调用Search1()
按房间号查找,调用Search2()
searc
返回主菜单
3
2
1
查找模块流程图
程序:
void search() /********查找函数********/
{
int n,m;
do
{
puts("\n\n\t\t*********************MENU************************\n");
puts("\t\t1).Search someone had erev lived here\n");
puts("\t\t2).Search someday \n");
puts("\t\t3).MENU()");
puts("\t\t************************************************\n");
printf("\t\tPlease choice your number(1-3):[ ]\b\b");
scanf("%d",&n);
if(n<1&&n>3)
{m=1;
getchar();
}
else m=0;
}while(m==1);
switch(n)
{case 1:search_one();break;
case 2:search_day();break;
case 3:menu();
}
}
void search_one() /*****查找个人*****/
{int i,j,w=0,l,m,n;
char s[20];
printf("Please input the name\n");
scanf("%s",s);
load_room();
for(i=0;i<r;i++)
for(j=0;j<p;j++)
if(strcmp(room[i].client_list[j].name,s)==0) w=1,m=i,n=j;
if(w==1)
printf_p(m,n);
else printf("\nThere is no record here\n");
puts("What do you want to do?\n");
puts("1).search again\t2).back\n");
scanf("%d",&l);
switch(l)
{case 1:search_one();break;
case 2:search();
}
}
void search_day() /*******查询某日的使用情况*******/
{
int i,j,l,m,n,a,b,c,w=0;
printf("\nPlease input the day you want to search");
printf("\nYear:"); scanf("%d",&a);
printf("\nMonth:"); scanf("%d",&b);
printf("\nDate:"); scanf("%d",&c);
load_room();
for(i=0;i<p;i++)
for(j=0;j<r;j++)
if((room[i].client_list[j].date==c)&&(room[i].client_list[j].month==b)&&(room[i].client_list[j].year==a)) w=1,m=i,n=j,printf_p(m,n);
if(w==0)
printf("NO record this day\n");
puts("What you want to do?\n");
puts("1).search again\t2).back\n");
scanf("%d",&l);
switch(l)
{case 1:search_day();break;
case 2:search();
}
}
(4)修改模块
[需求分析] 该模块的功能是插入客户记录信息并且不能覆盖原有客户信息。
[流程图]
插入模块
调用加载函数
让用户输入要插入的客户信息个数
调用整条信息输入函数
用户作出选择,输入1or2
1还是2
2返回主菜单
1 浏览全部
修改模块流程图
程序:
void modify() /***** 修改函数 ******/
{
int n,m;
do
{
puts("\t\t*********************MENU************************\n");
puts("\t\t\t\t1).modify one people\n");
puts("\t\t\t\t2).modify one day\n");
puts("\t\t\t\t3).MENU()");
puts("\t\t**************************************************\n");
printf("\t\tPlease choice your number(1-3):[ ]\b\b");
scanf("%d",&n);
if(n<1&&n>3)
{m=1;
getchar();
}
else m=0;
}while(m==1);
switch(n)
{case 1:modify_one();break;
case 2:modify_day();break;
case 3:menu();
}
}
void modify_one() /*****修改个人信息*****/
{
int i,j,m,n,w=0,l;
char s[20];
puts("\t\tPlease input the name");
scanf("%s",s);
load_room();
for(i=0;i<r;i++)
for(j=0;j<p;j++)
if(strcmp(room[i].client_list[j].name,s)==0) w=1,m=i,n=j;
if(w==1)
printf_p(m,n);
else printf("\nThere is no record here\n");
modify_s(m,n);
save();
puts("What you want to do?\n");
puts("1).Modify again\t2).back\n");
scanf("%d",&l);
switch(l)
{case 1:modify_one();break;
case 2:modify();
}
}
void modify_s(int i,int j) /*********修改执行项*********/
{
int a,q;
char s[20],b[15];
printf("\nChoice the title you want to modify\n");
puts("1).Name 2).sex 3).age 4)ID_card 5).year 6).month 7).date 8).room_ID 9)tel 10).price\ 11).modify none\n");
printf("Please choice your number(1-10):[ ]\b\b");
scanf("%d",&q);
switch(q)
{
case 1: printf("Please input new name\n");scanf("%s",s);
strcpy(room[i].client_list[j].name,s);break;
case 2: printf("Please input new sex\n");
scanf("%d",&a);room[i].client_list[j].sex=a;break;
case 3: printf("Please input the new age\n");
scanf("%d",&a);room[i].client_list[j].age=a;break;
case 4: printf("Please input new ID_card\n");
scanf("%s",s);strcpy(room[i].client_list[j].ID_card,s);break;
case5: printf("Please input new year\n");
scanf("%d",&a);room[i].client_list[j].year=a;break;
case6: printf("Please input the new month\n"); scanf("%d",&a);room[i].client_list[j].month=a;break;
case7: printf("Please input the new date\n");
scanf("%d",&a);room[i].client_list[j].date=a;break;
case8: printf("Please input the new room_ID\n");
scanf("%d",&a);room[i].room_ID=a;break;
case9: printf("Please input the new tel\n"); scanf("%s",b);strcpy(room[i].tel,b);break;
case 10: printf("Please input the new price\n");
scanf("%d",&a);room[i].price=a;break;
case 11 : modify();
}
}
void modify_day() /*******修改某日信息******/
{
int i,j,l,a,b,c,w=0,m,n;
puts("\t\tPlease input the date");
puts("\nYear:");scanf("%d",&a);
puts("\nMonth:");scanf("%d",&b);
puts("\nDate:");scanf("%d",&c);
load_room();
for(i=0;i<p;i++)
for(j=0;j<r;j++)
if((room[i].client_list[j].date==c)&&(room[i].client_list[j].month==b)&&(room[i].client_list[j].year==a)) w=1,m=i,n=j;
if(w==1)
printf_p(m,n);
else printf("NO record this day\n");
modify_s(m,n);
save();
puts("What you want to do?\n");
puts("1).modify again\t2).back\n");
scanf("%d",&l);
switch(l)
{case 1:modify_day();break;
case 2:menu();
}
}
3、公共函数部分:
(1)保存函数 save()
void save() /********保存函数********/
{
FILE*fp;
int i,j;
if((fp=fopen("","w"))==NULL)
{
printf("\nCannot open file\n");
return NULL;
}
for(i=0;i<r;i++)
for(j=0;j<p;j++)
fprintf(fp,"%d,%s,%d,%d,%s,%d,%d,%s,%d,%d,%d",room[i].room_ID,room[i].tel,room[i].price,room[i].sign,room[i].client_list[j].name,room[i].client_list[j].sex,room[i].client_list[j].age,room[i].client_list[j].ID_card,room[i].client_list[j].year,room[i].client_list[j].month,room[i].client_list[j].date);
fclose(fp);
return 1;
}
(2)加载函数 load_room()
[说明]:该函数可以用来加载所有记录,并且可以返回所有记录的个数。
void load_room() /******加载函数******/
{
FILE *fp;
struct hotel room[N];
int i,j;
if((fp=fopen("","r"))==NULL)
{
printf("\nCannot open file\n");
return 0;
}
for(i=0;!feof(fp);i++)
for(j=0;!feof(fp);j++)
fscanf(fp,"%d,%s,%d,%d,%s,%d,%d,%s,%d,%d,%d",&room[i].room_ID,room[i].tel,&room[i].price,&room[i].sign,room[i].client_list[j].name,&room[i].client_list[j].sex,&room[i].client_list[j].age,room[i].client_list[j].ID_card,&room[i].client_list[j].year,&room[i].client_list[j].month,&room[i].client_list[j].date);
fclose(fp);
r=i;
p=j; }
(3)一个任务结束时的选择浏览还是返回的函数printf_back()
void printf_back()
{int k,w;
void browse();
printf("\n\n\tSuccessful^-^.\n\n");
printf("What do you want to do?\n\n\t1).Browse all now\t2).Back: [ ]\b\b");
scanf("%d",&w);
if(w==1)browse();
else menu();}
(4)修改整条数据记录函数modify_data(int i,int n)
void printf_face();modify_data(int i,int n)
{int c,w1;
do
{puts("\nmodify by=>\n\n 1).number 2).name 3).cancel and back");
printf("Which you needed?:[ ]\b\b");
scanf("%d",&c);
if(c>3||c<1)
{puts("\nChoice error!please again!");getchar();}
}
while(c>3||c<1);
do
{switch(c)
{case 1:no_input(i,n);break;
case 2:printf("name:");scanf("%s",staff[i].name);break;
case 3:menu();break;}
puts("\nNow:\n");
printf_one(i);
printf("\nAre you sure?\n\n\t1).sure 2).no and remodify 3).back without save in this time [ ]\b\b");
scanf("%d",&w1);
if(w1==1)save(n);
}
while(w1==2);
return(w1);
}
展开阅读全文