|
|
#include<stdio.h>
|
|
|
#include<stdlib.h>
|
|
|
#include<string.h>
|
|
|
#define N 20 /*宏定义:20台电脑*/
|
|
|
#define T ((time-8)/2) /*宏定义:将time转化为时间段*/
|
|
|
int sum[6]={20,20,20,20,20,20}; /*初始状态*/
|
|
|
int computer[6][20]={
|
|
|
{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,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,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,1,1,1,1},
|
|
|
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}}; /*初始状态:均为空置电脑*/
|
|
|
void Menu(); /*主界面函数*/
|
|
|
void Situation(); /*时间查询函数*/
|
|
|
void Book(); /*预定函数*/
|
|
|
void Cancel(); /*取消预订函数*/
|
|
|
void SearchWaiting(); /*查看等待信息函数*/
|
|
|
void detail(int time); /*公共函数*/
|
|
|
void prione(int i); /*实现输出等待列表到屏幕函数*/
|
|
|
struct waitlist /*结构体实现等待列表函数*/
|
|
|
{
|
|
|
char number[3]; /*预定机号*/
|
|
|
char telephonenumber[11]; /*预定手机号*/
|
|
|
} wait[N];
|
|
|
void printone(int i); /*实现输出等待列表到屏幕*/
|
|
|
int main()
|
|
|
{
|
|
|
Menu(); /*当前状态函数*/
|
|
|
}
|
|
|
void Menu() /*主界面*/
|
|
|
{
|
|
|
int n,w;
|
|
|
do
|
|
|
{
|
|
|
puts("\t\t****************机房机位预约系统*********************\n");
|
|
|
puts("\t\t********************菜单*****************************\n");
|
|
|
puts("\t\t\t |1.查询某时间段机位状态|"); /*查询某时间段机位状态*/
|
|
|
puts("\t\t\t |2.预定空机位\t\t|"); /*预定空机位*/
|
|
|
puts("\t\t\t |3.取消预订 \t\t|"); /*取消预订*/
|
|
|
puts("\t\t\t |4.查询等待信息 \t|"); /*查询等待信息*/
|
|
|
puts("\t\t\t |5.退出 \t\t|\n"); /*退出*/
|
|
|
puts("\t\t*****************************************************\n");
|
|
|
printf("选择菜单号(1-5):");
|
|
|
scanf("%d",&n);
|
|
|
if(n<1||n>5)
|
|
|
{w=1;printf("菜单号输入错误,请重新输入\n");getchar();}
|
|
|
else
|
|
|
w=0;
|
|
|
}while(w==1);
|
|
|
switch(n)
|
|
|
{
|
|
|
case 1:Situation();break;
|
|
|
case 2:Book();break;
|
|
|
case 3:Cancel();break;
|
|
|
case 4:SearchWaiting();break;
|
|
|
case 5:exit(0);break;
|
|
|
}
|
|
|
getchar();
|
|
|
}
|
|
|
/*时间查询*/
|
|
|
void Situation()
|
|
|
{
|
|
|
int time;
|
|
|
printf("请输入在 (8-20)范围内的时间:");
|
|
|
scanf("%d",&time);
|
|
|
if(time<8||time>20)
|
|
|
{printf("\t时间输入错误!\n");
|
|
|
printf("请输入在 (8-20)范围内的时间:");
|
|
|
scanf("%d",&time);
|
|
|
}
|
|
|
detail(time); /*调用detail函数,输出空置机位*/
|
|
|
getchar();
|
|
|
Menu();
|
|
|
}
|
|
|
/*预定函数*/
|
|
|
void Book()
|
|
|
{
|
|
|
int time,i=0,x,y;
|
|
|
FILE *fp; /*调用文件指针*/
|
|
|
char c;
|
|
|
printf("在(8-20)时间范围内输入你想要预定的时间:");
|
|
|
scanf("%d",&time);
|
|
|
if(time<8||time>20)
|
|
|
{
|
|
|
printf("\t时间输入错误!\n");
|
|
|
printf("\t在(8-20)时间范围内输入你想要预定的时间:");
|
|
|
scanf("%d",&time);
|
|
|
}
|
|
|
detail(time); /*函数调用,导出空目前置电脑*/
|
|
|
if(sum[T]>0) /*该时段存在未被预定电脑号*/
|
|
|
{ if((fp=fopen("waitlist.txt","a"))==NULL) /*打开文件*/
|
|
|
{
|
|
|
printf("\n无法打开文件!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
printf("\n\t请输入你想要预定的机号,并且留下你的电话号码:\n");
|
|
|
scanf("%s %s",wait[i].number,wait[i].telephonenumber); /*录入预定信息*/
|
|
|
//for(i=0;i<1;i++)
|
|
|
fwrite(&wait[i],sizeof(struct waitlist),1,fp); /*向文本文档添加一个结构体单元*/
|
|
|
fclose(fp); /*关闭文件*/
|
|
|
printf("请再次输入预定电脑的机号!\n");
|
|
|
scanf("%d",&x);
|
|
|
sum[T]--; /*预定后该时间段空机位数减1*/
|
|
|
computer[T][x]=0; /*预定后该机状态变为0*/
|
|
|
printf("\t预订成功!\n");
|
|
|
getchar();
|
|
|
Menu();
|
|
|
}
|
|
|
else /*该时段不存在未被预定电脑号*/
|
|
|
{
|
|
|
printf("在这个时间段内无未预定的电脑!\n");
|
|
|
for(i=T+1;i<6;i++) /*寻找下一个时段未被预定的电脑号*/
|
|
|
{ time=9+2*i;
|
|
|
detail(time); /*函数调用*/
|
|
|
if(sum[T]>0) /*若有符合条件电脑,则提供最优解决方案*/
|
|
|
printf("\t最近的空闲时间是 %d,%d\n",2*i+8,2*i+10);break;
|
|
|
}
|
|
|
if(sum[T]>0)
|
|
|
{
|
|
|
printf("\t你想要预定吗?:y/n?");
|
|
|
scanf("%s",&c);
|
|
|
getchar();
|
|
|
if(c=='Y'||c=='y') /*判断是否需要预定*/
|
|
|
{
|
|
|
if((fp=fopen("waitlist.txt","r"))==NULL)
|
|
|
{
|
|
|
printf("\n无法打开文件!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
printf("waitlist:number telephonenumber\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++)
|
|
|
{ prione(i);} /*输出各时间段的等待列表*/
|
|
|
printf("\n\t请输入您想预定的机号,并留下您的联系方式:\n");
|
|
|
if((fp=fopen("waitlist.txt","a"))==NULL)
|
|
|
{
|
|
|
printf("\n无法打开文件!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
scanf("%s %s",wait[i].number,wait[i].telephonenumber); /*录入预定信息*/
|
|
|
for(i=0;i<1;i++)
|
|
|
fwrite(&wait[i],sizeof(struct waitlist),1,fp);
|
|
|
fclose(fp);
|
|
|
printf("请再次输入预定电脑的机号!\n");
|
|
|
scanf("%d",&y);
|
|
|
sum[T]--;
|
|
|
computer[T][y]=0;
|
|
|
printf("\t预定成功,请等待通知!\n");
|
|
|
}
|
|
|
}
|
|
|
for(i=T+1;i<6;i++) /*寻找下一个时段未被预定的电脑号*/
|
|
|
{ time=9+2*i;
|
|
|
detail(time); /*函数调用*/
|
|
|
if(sum[T]>0) break;
|
|
|
else printf("很抱歉,已无未预定的电脑"); /*若无符合条件电脑,则显示提示信息*/
|
|
|
}
|
|
|
Menu();
|
|
|
}
|
|
|
//else Menu();
|
|
|
}
|
|
|
/*取消预订*/
|
|
|
void Cancel()
|
|
|
{
|
|
|
int time,number,i;
|
|
|
printf("在(8-20)时间范围内输入你已经预定的时间:");
|
|
|
scanf("%d",&time);
|
|
|
if(time<8||time>20)
|
|
|
{
|
|
|
printf("\t输入时间错误!\n");
|
|
|
printf("\t在(8-20)时间范围内输入你已经预定的时间:");
|
|
|
scanf("%d",&time);
|
|
|
}
|
|
|
else
|
|
|
{printf("\t输入你已预定的机号 :");
|
|
|
scanf("%d",&number);}
|
|
|
sum[T]++; /*取消预定后该时间段空机位数加1*/
|
|
|
computer[T][number]=1; /*取消预定后该机状态变为1*/
|
|
|
//detail(time);
|
|
|
FILE *fp;
|
|
|
if((fp=fopen("waitlist.txt","r"))==NULL) /*打开文件*/
|
|
|
{
|
|
|
printf("\nCannot open file!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
for(i=0;!feof(fp);i++)
|
|
|
{
|
|
|
fscanf(fp,"%s %s",&wait[i].number,&wait[i].telephonenumber);
|
|
|
}
|
|
|
fclose(fp);
|
|
|
}
|
|
|
for(i=0;i<10;i++)
|
|
|
{
|
|
|
char str[3];
|
|
|
itoa(number,str,10); /*调用itoa函数,实现数据存入*/
|
|
|
//printf("\n %s" ,&wait[i].number) ;
|
|
|
//printf("\n %s" ,&str) ;
|
|
|
if (strcmp(wait[i].number,str)==0 ) /*判断要取消的机号是否与已录入的机号相同*/
|
|
|
{
|
|
|
wait[i]=wait[i+1];
|
|
|
printf("取消等待%s %s",&wait[i-1].number,&wait[i-1].telephonenumber);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
fp=fopen("waitlist.txt","w");
|
|
|
for(i=0;i<1;i++)
|
|
|
fwrite(&wait[i],sizeof(struct waitlist),1,fp); /*重新写入预定信息*/
|
|
|
fclose(fp);
|
|
|
printf("\t取消成功!\n");
|
|
|
getchar();
|
|
|
Menu();
|
|
|
}
|
|
|
/*查看等待信息*/
|
|
|
void SearchWaiting()
|
|
|
{
|
|
|
int time,i;
|
|
|
FILE *fp;
|
|
|
printf("\t在(8-20)之间输入您要搜索的时间:");
|
|
|
scanf("%d",&time);
|
|
|
if(time<8||time>20)
|
|
|
{
|
|
|
printf("\t时间输入错误!\n");
|
|
|
printf("\t在(8-20)之间输入您要搜索的时间:");
|
|
|
scanf("%d",&time);
|
|
|
}
|
|
|
else
|
|
|
;
|
|
|
if((fp=fopen("waitlist.txt","r"))==NULL) /*打开文件*/
|
|
|
{
|
|
|
printf("\nCannot open file!\n");
|
|
|
exit(0);
|
|
|
}
|
|
|
else
|
|
|
{ printf("在该时段已列入等待列表的电脑:\t机号\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++)
|
|
|
{ prione(i);}
|
|
|
Menu();
|
|
|
}
|
|
|
/*公共函数*/
|
|
|
void detail(int time) /*实现查找每个时间段空机位总数和空机位号*/
|
|
|
{
|
|
|
int i,j=0,k,s=0;
|
|
|
int v[30];
|
|
|
for(i=0;i<20;i++)
|
|
|
{
|
|
|
if(computer[T][i]==1)
|
|
|
{ s++; /*s为空置电脑总数*/
|
|
|
v[j++]=i; /*空置电脑位号*/
|
|
|
}
|
|
|
}
|
|
|
sum[T]=s;
|
|
|
printf("\t目前空置的电脑有%d台\n",sum[T]);
|
|
|
for(k=0;k<j;k++)
|
|
|
printf("\t空置的电脑是:%d\n",v[k]);
|
|
|
}
|
|
|
void prione(int i) /*实现输出等待列表*/
|
|
|
{
|
|
|
printf("\t\t\t\t %s\n",wait[i].number);
|
|
|
}
|
|
|
|