这是一个预约实验室机位的系统,目前我知道在打开文件的地方有问题,还有一个编译问题,在一个if的地方说有“)”错误。我不知道怎么改。希望大家帮忙看看,谢谢了!
应该还有其他错误,希望大家帮忙看看。多多指教。谢谢了!
程序代码:/*3.14 试验机位预约管理(难度系数:4级)
(1)任务描述
编写程序,模拟计算机实验室中试验机位的预约登记信息管理。
(2)功能要求
>假设实验室有30台机器供学生预约上机使用。假定:可以预约的时间段是早8:00到晚上8点,每个预约时间段为2小时。
周一到周六开放,每次至少提前1个小时或最多一周预约或取消预约。
>每次预约前,显示时间
>根据选择进行预约等级或取消预约登记。
>如果是预约,则输入预约的日期,列出预约日可用机位信息。等待预约,成功,预约信息保留,给出提示。
不预约则退出,提醒没有预约。
>如果是取消预约,则输入预约信息,提示正确取消
>程序可以查看全部已有的预约信息,或查看指定时间段的预约信息,信息列出时阿按约定日期先后排序,
或按预约人身份编号排序,
(3)设计提示
预约等级信息管理至少需要的格式:预约人身份编号,预约时间,预约机器位置,用的时间段。
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>
struct app_info//预约信息
{
int seat;//机位
char date[11];//预约时间
char No_[11];//学号
char time[12];//预约时段
struct app_info*next;//连接
};
//***************************************判断输入***********************************************
int judge_date(char*p)//判断日期是否正确输入
{
int i;
for(i=0;i<10;i++)//共有十位
{
if(i==4||i==7)//其中是‘。’的两位
{
if(*(p+i)=='.')
;
else
return 0;
}
else//其余都是数字
{
if(*(p+i)>='0'&&*(p+i)<='9')
;
else
return 0;
}
}
return 1;//全都验证正确,返回真
}
int judge_time(char*p)//判断时间是否输入正确
{
int i;
for(i=0;i<11;i++)//一共十一个字符
{
if(i==5)//一个‘-’符号
{
if(*(p+i)=='-')
;
else
return 0;
}
else if(i==2||i==7)//一个‘:’符号
{
if(*(p+i)==':')
;
else
return 0;
}
else//其余都为数字
{
if(*(p+i)>='0'&&*(p+i)<='9')
;
else
return 0;
}
}
return 1;//全都验证正确,返回真
}
int isInSevenDay(char*p)//是否在一周之内
{
int i,j,m,n,a[3];
long d;
time_t t;
i=0;j=0;
while(*(p+i)!='\0')
{
a[j]=atoi(p);//转换字符为整形
j++;
n=0;
while(*(p+i)>='0'&&*(p+i)<='9')
{
n++;//行列位数
i++;
}
i=0;
while(*(p+i)!='\0')//将字符串前移n+1位
{
*(p+i)=*(p+i+n+1);
i++;
}
i=0;
}
switch(a[1])//判断月份
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
m=31;
break;
case 4:
case 6:
case 9:
case 11:
m=30;
break;
case 2:
{
if(a[0]%4==0&&a[0]%100!==0||a[0]%400==0)
m=29;
else
m=28;
}
}
t=time(NULL);
d=((a[0]-1972)/4)*366*24*3600+(a[0]-1970-(a[0]-1972)/4)*365*24*3600+a[1]*m*3600+a[2]*3600;//计算输入的时间到1970的秒数
if(d-t<7*24*3600)
return d-t;
else
return 0;
}
int isInOneHour(long c,char*p)//一小时之前
{
if(c+atoi(p)*3600>3600)
return 1;
else
return 0;
}
//***********************************各种输入、输出、插入*************************************
struct app_info* Input(char *p,long e)//输入结构体内容,初始
{
int j;
long dis;
struct app_info*person=NULL;
j=0;
person=(struct app_info*)malloc(sizeof( struct app_info));
memset(person,0,sizeof( struct app_info));
printf("\n请输入您的学号(如:11403070105):");
fflush(stdin);
gets(person->No_);
printf("\n请输入您要预约(取消)的机位(如:1):");
scanf("%d",&person->seat);
while(j==0)
{
printf("\n请输入你要预约(取消)的时间段(如:10:00-12:00):");
gets(person->time);
judge_time(person->time);
if(j==0)
printf("您输入的内容或格式错误!");
if((dis=isInOneHour(e,person->time))==0)
{
printf("您要预约(取消)的不到一个小时,不能预约(取消),请重新输入:");
continue;
}
}
person->next=NULL;
return person;
}
struct app_info*Insert(struct app_info*head,struct app_info*node)//插入链表
{
struct app_info*p;
if(head==NULL)//头为空的时候
head=node;
else
{
if(strcmp(node->date,head->date)>=0)//和头结点相等的时候
{
node->next=head;
head=node;
}
for(p=head;p->next!=NULL;p=p->next)//和头以后的某个相等
if(strcmp(node->date,p->next->date)>=0)
{
node->next=p->next;
p->next=node;
}
if(p->next==NULL)//没有就插到最后
p->next=node;
}
return head;
}
struct app_info* openTheFile(struct app_info*head)//打开文件
{
FILE*app;
struct app_info*node;
if((app=fopen("appointment.txt","rb"))==NULL)
printf("目前还没有预约信息!");
else
{
while(!feof(app))
{
node=(struct app_info*)malloc(sizeof(struct app_info));//申请空间
memset(node,0,sizeof(struct app_info));
fread(node,sizeof(struct app_info),1,app);//读出文件
head=Insert(head,node);//插入链表
}
}
fclose(app);//关闭文件
return head;//返回头部
}
void writeTheFile(struct app_info*p)//写入文件
{
FILE*app;
struct app_info*p1;
app=fopen("appointment.txt","wb");//打开文件
while(p!=NULL)//逐个写入
{
fwrite(p,sizeof(struct app_info),1,app);
p1=p;
p=p->next;
free(p1);//逐个清空链表
}
fclose(app);//关闭文件
}
//****************************************预约机位************************************************
int isSunday(char*p)//是否为星期天
{
int i,j,n,a[3],d;
i=0;j=0;
while(*(p+i)!='\0')
{
a[j]=atoi(p);//转换字符为整形
j++;
n=0;
while(*(p+i)>='0'&&*(p+i)<='9')
{
n++;//行列位数
i++;
}
i=0;
while(*(p+i)!='\0')//将字符串前移n+1位
{
*(p+i)=*(p+i+n+1);
i++;
}
i=0;
}
if(a[1]==1)//计算需求
a[1]=13;
if(a[1]==2)
a[1]=14;
return d=(a[2]+1+2*a[1]+3*(a[1]+1)/5+a[0]+a[0]/4-a[0]/100+a[0]/400)%7-1;
}
void app_()//预约机位
{
char a;
int n,j;
long dis;
time_t t;//取当前时间
struct app_info*person;
struct app_info*head=NULL;
struct app_info*p;
p=head;
n=0;j=0;
person=(struct app_info*)malloc(sizeof(struct app_info));
memset(person,0,sizeof(struct app_info));
printf("您真的要预约吗?y/n");//再次确认
fflush(stdin);
a=getchar();
if(a=='y'||a=='Y')
time(&t);//获得当前时间
printf("现在的时间为:%s",ctime(&t));
while(j==0)//判断输入,直到输入正确
{
printf("\n请输入您要预约的日期(如2015.01.20):");
scanf("%s",person->date);
j=judge_date(person->date);
if(j==0)
printf("您的输入格式或内容有误!");
if(isSunday(person->date)==0)//判断输入,直到输入正确
{
printf("您输入的是星期天!请重新输入。");
continue;
}
if((dis=isInSevenDay(person->date))==0)
{
printf("您输入的时间超过一周,请重新输入!");
continue;
}
}
head=openTheFile(head);//打开文件
for(p=head;p!=NULL;p=p->next)//寻找当日已有的预约
if(person->date==p->date)
printf("\n当日%d号机,在%s已被预约。",p->seat,p->time);
printf("\n其余任选。");
while(n==0)//输入想要预约的信息,并判断
{
person=Input(person->date,dis);
for(p=head;p!=NULL;p=p->next)
{
if(person->date==p->date&&person->seat==p->seat&&person->time==p->time)
printf("已经被预约了,请重新预约!");
else
{
n=1;//改变记号,循环结束
head=Insert(head,person);//插入链表
writeTheFile(head);//写入文件
printf("预约成功!请选择其他操作或退出。");
}
}
}
}
//****************************************取消预约****************************************************
struct app_info* Delete(struct app_info*head,struct app_info*d)//从链表中删除
{
struct app_info*p;
struct app_info*empty;
if(d->date==head->date&&d->seat==head->seat&&d->time==head->time)//如果等于头结点
{
empty=head->next;
head=head->next;
free(empty);
}
for(p=head;p->next!=NULL;p=p->next)//等于头结点以外的
if(d->date==p->next->date&&d->seat==p->next->seat&&d->time==p->next->time)
{
empty=p->next;
p->next=p->next->next;
free(empty);
}
return head;//返回头结点,以便写入文件
}
void Quit_app()//取消预约
{
char ch;
int flag,j;//记号
long dis;
struct app_info*person;
struct app_info*head=NULL;
struct app_info*p;
flag=0;j=0;
person=(struct app_info*)malloc(sizeof(struct app_info));
memset(person,0,sizeof(struct app_info));
head=openTheFile(head);//打开文件
while(flag==0)
{
while(j==0)//判断输入,直到输入正确
{
printf("\n请输入您要取消的日期(如2015.01.20):");
scanf("%s",person->date);
j=judge_date(person->date);
if(j==0)
printf("您的输入格式或内容有误!");
if(isSunday(person->date)==0)//判断输入,直到输入正确
{
printf("您输入的是星期天!请重新输入。");
continue;
}
if((dis=isInSevenDay(person->date))==0)
{
printf("您输入的时间超过一周,请重新输入!");
continue;
}
}
person=Input(person->date,dis);
for(p=head;p!=NULL;p=p->next)
if(person->date==p->date&&person->seat==p->seat&&person->time==p->time)//查询信息
{
printf("您要取消的预约是:\n");
printf("学号:%s\n日期:%s\n机位:%d\n时段:%s\n",p->No_,p->date,p->seat,p->time);
flag=1;
}
else
printf("未查询到,请检查您是否输入了错误的信息?请重新输入。");
}
printf("您真的要取消吗?y/n");//确认是否取消
fflush(stdin);
ch=getchar();
if(ch=='y'||ch=='Y')
{
head=Delete(head,p);
writeTheFile(head);//写入文件
printf("取消预约成功!请选择其他操作或退出。");
}
}
//*************************************查看预约******************************************
void look_allAppoint()//查看所有预约信息
{
char ch;
struct app_info*head=NULL;
struct app_info*p;
printf("您真的要查看所有预约信息吗y/n");
fflush(stdin);
ch=getchar();
if(ch=='y'||ch=='Y')
{
head=openTheFile(head);//打开文件
if(head!=NULL)
for(p=head;p!=NULL;p=p->next)//输出所有
printf("%s%d%s",p->date,p->seat,p->time);
}
}
void look_partAppint()
{
int j;
char ch[12];
struct app_info*head=NULL;
struct app_info*p;
head=openTheFile(head);
while(1)//有错误便于再次输入
{
printf("请输入你想查看预约信息的日期或时段。");
scanf("%s",ch);
if(strlen(ch)==11)//按时间段查询时的判断和输出
{
j=judge_time(ch);
if(j==0)
printf("请检查您是否输入错误格式,如:08:00-10:00,01.01.并重新输入,如不想继续进行,请输入'O'");
else
{
for(p=head;p!=NULL;p=p->next)
if(strcmp(p->time,ch)==0)//匹配
printf("日期:%s\n机位:%d\n时段:%s\n",p->date,p->seat,p->time);
break;
}
}
else if(strlen(ch)==10)//按日期查询时的判断和输出
{
j=judge_date(ch);
if(j==0)
printf("请检查您是否输入错误格式,如:08:00-10:00,01.01.并重新输入,如不想继续进行,请输入'O'");
else
{
printf("\n已有的预约有:\n");
for(p=head;p!=NULL;p=p->next)
if(strcmp(p->date,ch)==0)//匹配
printf("日期:%s\n机位:%d\n时段:%s\n",p->date,p->seat,p->time);
break;
}
}
else//既不是日期也不是时段,提示错误
{
printf("请检查您是否输入错误格式,如:08:00-10:00,01.01.并重新输入,如不想继续进行,请输入'O'");
fflush(stdin);
if(getchar()=='O')
break;
}
}
}
void look_appint()//查看预订信息的方式分配
{
char c;
printf("您想要查看全部预约信息还是指定日期或时间的预约信息?A/P");
fflush(stdin);
c=getchar();
if(c=='A'||c=='a')
look_allAppoint();
else if(c=='P'||c=='p')
look_partAppint();
else
printf("您输入了错误的字母!");
}
//****************************************界面*******************************************
void main()
{
int chioce;
while(1)
{
printf(" 欢迎预约机房位置!");
printf("\n声明:");
printf("\n 1.验室有30台机器供学生预约上机使用。");
printf("\n 2.可以预约的时间段是早8:00到晚上8:00,每个预约时间段为2小时。");
printf("\n 3.时段分为:08:00-10:00,10:00-12:00,12:00-14:00,14:00-16:00,16:00-18:00,18:00-20:00");
printf("\n 4.周一到周六开放,每次至少提前1个小时或最多一周预约或取消预约。");
printf("\n请选择您想要的功能:");
printf("\n ┏━━━━━━━━━━━━━━━━━━━━━┓");
printf("\n ┃ 1.查看已有预约信息。 ┃ ");
printf("\n ┃******************************************┃");
printf("\n ┃ 2.预约机位。 ┃");
printf("\n ┃******************************************┃");
printf("\n ┃ 3.取消预约。 ┃ ");
printf("\n ┗━━━━━━━━━━━━━━━━━━━━━┛");
printf("\n 您选择的是:");
scanf("%d",&chioce);
switch(chioce)
{
case 1:
look_appint();
break;
case 2:
app_();
break;
case 3:
Quit_app();
break;
}
}
}







