C语言课程设计机房机位预约模拟系统.docx
《C语言课程设计机房机位预约模拟系统.docx》由会员分享,可在线阅读,更多相关《C语言课程设计机房机位预约模拟系统.docx(20页珍藏版)》请在冰豆网上搜索。
C语言课程设计机房机位预约模拟系统
机房机位预约模拟
一.题目要求
20台机器,从早八点到晚八点,每两个小时一个时间段.
需要实现的功能:
(1)查询,根据输入的时间,输出机位信息.
(2)机位预定,根据输入的日期和时间段查询是否有空机位,若有则预约,若无则提供最近空机时间段.另:
若用户要求在非空时间上机,则将用户信息插入该时间段的等待列表.
(3)退出预定,根据输入的时间,撤消该时间的预定.
(4)查询是否有等待信息,若有则按顺序显示联系方式,若无则显示提示信息.
二.需求分析
根据题目要求,在程序中应实现查询,机位预定,插入等待列表,退出预定,查询等待信息等功能。
还应提供键盘式选择菜单实现功能选择。
而等待信息放在文件里,所以在相关的模块应提供文件的输入、输出操作。
三.总体设计
根据上面的需求分析,将这个系统的设计分为下面4个模块:
4.详细设计
1.预处理命令及函数声明
#include
#include
#include
#defineN20
#defineT(time-8)/2
intsum[6]={0};
intcomputer[6][20]={{1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,0,0,1,1,1},
{1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,0},
{1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1}};/*该数组表示假设某天某人查询时机房各个时间段机位数情况*/
voidMenu();
voidSituation();
voidBook();
voidCancel();
voidSearchWaiting();
voidExit();
voiddetail(inttime);
voidprintf_one(inti);
structwaitlist
{
charnumber[3];
chartelephonenumber[12];
}wait[N];
2.主函数
主函数一般设计得比较简洁,只提供输入,处理和输出部分的函数调用。
其中各功能模块用菜单方式选择。
其流程图如图所示:
结束
2./*主函数*/
voidmain()
{
Menu();/*当前状态函数*/
}
voidMenu()/*主界面*/
{
intn,w;
do
{
puts("\t\t****************COMPUTERBOOKSYSTERM*******************\n");
puts("\t\t*************************MENU***************************\n");
puts("\t\t\t1.Searchthecurrentsituation");/*查询某时间段机位状态*/
puts("\t\t\t2.Bookthevacantcomputer");/*预定空机位*/
puts("\t\t\t3.Cancelbooking");/*取消预订*/
puts("\t\t\t4.Searchwaiting");/*查询等待信息*/
puts("\t\t\t5.Exit");/*退出*/
puts("\t\t********************************************************\n");
printf("Chooseyournumber(1-5):
[]\b\b");
scanf("%d",&n);
if(n<1||n>5)
{w=1;getchar();}
else
w=0;
}while(w==1);
switch(n)
{
case1:
Situation();break;
case2:
Book();break;
case3:
Cancel();break;
case4:
SearchWaiting();break;
case5:
Exit(0);break;
}
}
3.状态查询函数
流程图
调用detail函数
返回主菜单
/*查询模块*/
/*查询当前状态*/
voidSituation()
{
inttime;
printf("Inputtimebetween(8-20):
");
scanf("%d",&time);
if(time<8||time>20)
{printf("\tWrongtime!
\n");
printf("Pleaseinputtimebetween(8-20):
");
scanf("%d",&time);
}
detail(time);/*函数调用*/
getchar();
Menu();
}
4.预定模块函数
流程图
N
执行一个循环,进入后面的时间段
Y
打开文本文件waitlist.txt,输入预定机位号和联系方式,追加一个结构体成员。
返回主菜单
程序:
/*预定模块*/
voidBook()
{inttime,i=0,x,y;
FILE*fp;
charc;
printf("Inputtimeyouwanttobookbetween(8-20):
");
scanf("%d",&time);
if(time<8||time>20)
{
printf("\tWrongtime!
\n");
printf("\tInputtimeyouwanttobookbetween(8-20):
");
scanf("%d",&time);
}
detail(time);/*函数调用*/
if(sum[T]>0)
{if((fp=fopen("waitlist.txt","a"))==NULL)
{
printf("\nCannotopenfile!
\n");
exit(0);
}
printf("\n\tPleaseInputthenumberyouwanttobookandleaveyourtelephonenumber!
:
\n");
scanf("%s%s",wait[i].number,wait[i].telephonenumber);
for(i=0;i<1;i++)
fwrite(&wait[i],sizeof(structwaitlist),1,fp);
fclose(fp);/*向文本文档添加一个结构体单元*/
printf("\tInputthenumberyouwanttobookagain!
\n");
scanf("%d",&x);
sum[T]--;/*预定后该时间段空机位数减1*/
computer[T][x]=1;/*预定后该机状态变为1*/
printf("\tBooksucceed!
\n");
getchar();
Menu();
}
else
{
printf("Thereisnovacantcomputeratthattime!
\n");
for(i=T+1;i<6;i++)
{time=9+2*i;
detail(time);/*函数调用*/
if(sum[T]>0)
printf("\tThelatestfreetimeis%d,%d\n",2*i+8,2*i+10);break;
}
printf("\tDoyouwanttowait?
:
y/n?
");
scanf("%s",&c);
getchar();
if(c=='Y'||c=='y')
{
if((fp=fopen("waitlist.txt","r"))==NULL)
{
printf("\nCannotopenfile!
\n");
exit(0);
}
else
{printf("waitlist:
numbertelephonenumber\n");
for(i=0;!
feof(fp);i++)
{
fscanf(fp,"%s%s",&wait[i].number,&wait[i].telephonenumber);
}
fclose(fp);
}
for(i=0;i<10;i++)
{printf_one(i);}
printf("\n\tPleaseInputthenumberyouwanttobookandleaveyourtelephonenumber!
:
\n");
if((fp=fopen("waitlist.txt","a"))==NULL)
{
printf("\nCannotopenfile!
\n");
exit(0);
}
scanf("%s%s",wait[i].number,wait[i].telephonenumber);
for(i=0;i<1;i++)
fwrite(&wait[i],sizeof(structwaitlist),1,fp);
fclose(fp);/*若等待,就用文件的方式列出当时的等待列表并提示输入你的等待序号和联系方式*/
printf("Inputthenumberofthecomputeragain!
\n");
scanf("%d",&y);
sum[T]--;
computer[T][y]=1;
printf("\tOk,pleasewaitourphone!
\n");
Menu();
}
elseMenu();
}
}
5,取消预订模块函数
流程图
调用detail函数
/*取消预订模块*/
voidCancel()
{
inttime,number;
printf("Inputtimeyouhavebookedbetween(8-20):
");
scanf("%d",&time);
if(time<8||time>20)
{
printf("\tWrongtime!
\n");
printf("\tInputtimeyouhavebookedbetween(8-20):
");
scanf("%d",&time);
}
else
{printf("\tInputnumberyouhavebooked:
");
scanf("%d",&number);}
detail(time);
sum[T]++;/*预定后该时间段空机位数加1*/
computer[T][number]=0;/*预定后该机状态变为0*/
printf("\tCancelsucceed!
\n");
getchar();
Menu();
}
6查询等待信息模块
流程图
返回主菜单
/*查询等待信息模块*/
voidSearchWaiting()
{
inttime,i;
FILE*fp;
printf("\tInputtimeyouwanttosearchbetween(8-20):
");
scanf("%d",&time);
if(time<8||time>20)
{
printf("\tWrongtime!
\n");
printf("\tInputtimeyouwanttosearchbetween(8-20):
");
scanf("%d",&time);
}
else
;
if((fp=fopen("waitlist.txt","r"))==NULL)
{
printf("\nCannotopenfile!
\n");
exit(0);
}
else
{printf("waitlist:
numbertelephonenumber\n");
for(i=0;!
feof(fp);i++)
{
fscanf(fp,"%s%s",&wait[i].number,&wait[i].telephonenumber);
}
fclose(fp);
}
for(i=0;i<10;i++)
{printf_one(i);}
Menu();
}
7.公共函数
程序
voiddetail(inttime)/*此函数功能是实现查找每个时间段空机位总数和空机位号*/
{
inti,j=0,k,s=0;
intv[30];
for(i=0;i<20;i++)
{if(computer[T][i]==0)
{s++;
v[j++]=i;
}
}
sum[T]=s;
printf("\tCurrentvacantcomputers:
%d\n",sum[T]);
for(k=0;kprintf("\tThevacantcomputersare:
%d\n",v[k]);
}
voidprintf_one(inti)/*此函数功能是实现输出等待列表到屏幕*/
{
printf("\t\t%s%s\n",wait[i].number,wait[i].telephonenumber);
}
8运行界面
1,选1.,进入查询当前状态
2选2,进入预定函数
3.选4.进入查询当前状态函数
4.选3.取消预订
5.选2.当某时间段没有空机位时,进入下一个时间段的查询和预定
6.选5.退出界面