You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ps7mzffvt/C语言课程设计.c

276 lines
6.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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("waitlistnumber 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);
}