#include #include #include #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