#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
typedef struct set{
int h,m,k;
char a;//车位号
char b[10];//车牌号
struct set *next;
}ST;
time_t timer;
struct tm *tblock;
ST ha1,hb1,hc1,*ha=&ha1,*hb=&hb1,*hc=&hc1;
float s=0;
#define LEN sizeof(ST)
void menu(void);
int creat(void);
int list(ST *head);
void list2(ST *head);
void list3(ST *head);//fun4 case1
int list4(ST *head);//fun4 case2
int select1(void);//选择车型
int select2(void);
int select3(void);
int select4(void);
void loadfile(void);
void fun2(void);
void fun3(void);
void fun4(void);
void search(void);
void savefile(void);
int search2(char c[],ST *head);
ST *insert(ST *head);
ST *del(ST *head);
int main(){
int select;
ha->k=hb->k=hc->k=1;
ha->h=hb->h=hc->h=0;
ha->next=hb->next=hc->next=NULL;
ha->a='A';hb->a='B';hc->a='C';
while(1){
menu();
scanf("%d",&select);
switch(select){
case 1:creat();break;
case 2:fun2();break;
case 3:fun3();break;
case 4:fun4();break;
case 0:printf("\n\t谢谢使用!再见\n");
exit(1);
default:printf("\n\t按键错误请重新选择!\n");}
}
return 0;}
void menu(void){
printf("\n");
printf("\t---------------------------\n");
printf("\t* *\n");
printf("\t* 欢迎使用停车场管理系统 *\n");
printf("\t* *\n");
printf("\t---------------------------\n");
printf("\n");
printf("\t请选择你要管理的内容:\n\n");
printf("\t1.停车管理\n");
printf("\t2.收费管理\n");
printf("\t3.按不同条件进行查询操作\n");
printf("\t4.按不同条件进行统计工作\n");
printf("\t0.退出系统\n");
printf("\t请选择按键(0-4):");
}
ST *insert(ST *head){
ST *p0,*p1,*p2,*p;
int t=head->a-'A',m;
switch(t){
case 0:m=20;break;
case 1:m=15;break;
default:m=10;}
timer = time(NULL);
tblock = localtime(&timer);
p1=head;
if(p1->k==0){
printf("\t没有车位!\n");return head;}
else{
p0=(ST*)malloc(LEN);
p0->a=p1->a;
printf("\t请输入车牌号:(如鲁AH1284)");
gets(p0->b);
p0->h=tblock->tm_hour;
p0->m=tblock->tm_min;
if(head->h==0){
head=p0;
p0->k=1;
p0->next=NULL;}
else{int f[22],i;
for(i=1;i<=m;i++)
f[i]=1;
p=head;
while(p!=NULL){
if(p->h!=0)f[p->k]=0;
p=p->next;}
for(i=1;i<m;i++)
if(f[i])break;
p0->k=i;
while((i>p1->k)&&(p1->next!=NULL)){
p2=p1;
p1=p1->next;}
if(i<p1->k)
{if(head==p1)head=p0;
else p2->next=p0;
p0->next=p1;}
else
{p1->next=p0;
p0->next=NULL;}
p=head;
while(p->next!=NULL)
p=p->next;
if(p->k==m){
p=(ST*)malloc(LEN);
p->a=p1->a;
p->k=0;
p->h=-1;
p1=head;
head=p;
p->next=p1;}
}
}
return head;}
int creat(void){
int h;
timer = time(NULL);
tblock = localtime(&timer);
h=tblock->tm_hour;
if(h<6||h>=22)
{printf("\t营业时间:6:00-22:00,此时不营业\n");
return 0;}
switch(select1()){
case 1:ha=insert(ha);break;
case 2:hb=insert(hb);break;
case 3:hc=insert(hc);break;
case 4:break;
default:printf("\n\t按键错误请重新选择!\n");}
return 0;}
int list(ST *head){
ST *p;
if(head->h==0){
printf("\t%c区无车!\n",head->a);return 0;}
else{
printf("\n\t%c区停放汽车信息如下:\n",head->a);
printf("\t车位号 \t\t 车牌号\t\t停车时间\n");
p=head;
while(p!=NULL){
if(p->k!=0)
printf("\t%c%02d\t\t%9s%20d:%02d\n",p->a,p->k,p->b,p->h,p->m);
p=p->next;}}
}
void list2(ST *head){
int f[22];
int i,t=head->a-'A',m,s;
for(i=1;i<=20;i++)
f[i]=1;ST *p;
p=head;
while(p!=NULL){
if(p->h!=0)f[p->k]=0;
p=p->next;}
switch(t){
case 0:m=20;break;
case 1:m=15;break;
default:m=10;}
printf("\t%c区空位:\n\t",head->a);
for(i=1,s=0;i<=m;i++)
if(f[i]){
printf("\t%c%02d ",head->a,i);
if((++s)%5==0)printf("\n\t");
}
if(s==0)printf("无空位\n");
else printf("\n");
}
void list3(ST *head){
int f[22];
int i,t=head->a-'A',m,s;
for(i=1;i<=20;i++)
f[i]=0;ST *p;
p=head;
while(p!=NULL){
if(p->h!=0)f[p->k]=1;
p=p->next;}
switch(t){
case 0:m=20;break;
case 1:m=15;break;
default:m=10;}
printf("\t%c区当前停车数量:",head->a);
for(i=1,s=0;i<=m;i++)
if(f[i])s++;
printf("%d\n",s);
}
int list4(ST *head){
int h,m,t=head->a-'A',sum=0;
ST *p;
timer = time(NULL);
tblock = localtime(&timer);
if(head->h==0){
printf("\t%c区无车!\n",head->a);return 0;}
else{p=head;
printf("\t%c区停车时间超过5小时的汽车:\n",head->a);
printf("\t车位号 \t\t 车牌号\t\t停车时间\n");
while(p!=NULL){
if(p->k!=0){
h=tblock->tm_hour;
m=tblock->tm_min;
h-=p->h;
if(h>0){h-=1;m+=60;}
m-=p->m;
if(m>=60){h+=1;m-=60;}
if(h>5||(h==5&&m!=0)){
printf("\t%c%02d\t\t%9s%20d:%02d\n",p->a,p->k,p->b,h,m);
sum++;}
}
p=p->next;}
}printf("\t数量为:%d\n",sum);
}
ST *del(ST *head){
ST *p1,*p2;
char c[10];
float cost;
int h,m,t=head->a-'A',fee,f;
timer = time(NULL);
tblock = localtime(&timer);
if(head->h==0){
printf("\n\t%c区无车\n",head->a);
return head;}
printf("\t请输入车牌号:");
gets(c);
h=tblock->tm_hour;
m=tblock->tm_min;
p1=head;
while((strcmp(c,p1->b)!=0)&&(p1->next!=NULL)){
p2=p1;p1=p1->next;}
f=strcmp(c,p1->b);
if(f==0){
printf("\t停车时间从%02d:%02d到%02d:%02d,",p1->h,p1->m,h,m);
h-=p1->h;
if(h>0){h-=1;m+=60;}
m-=p1->m;
if(m>=60){h+=1;m-=60;}
printf("共%d小时%d分钟\n",h,m);
if(p1==head){
if(p1->next!=NULL)
head=p1->next;
else head->h=0;}
else {p2->next=p1->next;free(p1);}
if(head->h==-1)
{p1=head;
p2=p1->next;
head=p2;
free(p1);}
switch(t){
case 0:fee=3;break;
case 1:fee=4;break;
default:fee=5;}
printf("\t停车费每小时%d元\n",fee);
if(m==0)cost=fee*h;
else if(m>0&&m<=30)cost=fee*(h+0.5);
else cost=fee*(h+1);
s+=cost;
printf("\t停车费共%.1f元\n",cost);
}
else printf("\n\t%c区无此车\n",head->a);
return head;}
int select1(void){
int select;
printf("\t请输入车型:\n");
printf("\t1.轿车\n");
printf("\t2.中型客车或货车\n");
printf("\t3.大型客车或货车\n");
printf("\t4.返回\n");
printf("\t请选择按键(1-4):");
scanf("%d",&select);
getchar();
return select;
}
int select2(void){
int select;
printf("\t请输入管理内容:\n");
printf("\t1.收费\n");
printf("\t2.统计车费\n");
printf("\t3.返回\n");
printf("\t请选择按键(1-3):");
scanf("%d",&select);
getchar();
return select;
}
int select3(void){
int select;
printf("\t1.今天不再进车,并统计\n");
printf("\t2.返回\n");
printf("\t请选择按键(1-2):");
scanf("%d",&select);
getchar();
return select;
}
int select4(void){
int select;
printf("\t1.分别输出A区、B区、C区当前所停放汽车的信息\n");
printf("\t2.到当前时间为止A区、B区、C区停车超过5小时的汽车数量及信息\n");
printf("\t3.输入一个日期(年 月),统计该月停车场的收费金额\n");
printf("\t4.返回\n");
printf("\t请选择按键(1-4):");
scanf("%d",&select);
getchar();
return select;
}
int search2(char c[],ST *head){
int f;ST *p=head;
while(p!=NULL){
f=strcmp(c,p->b);
if(f==0){
printf("\t%c%02d\n",p->a,p->k);
return 1;}
else p=p->next;}
return 0;
}
void search(void){
char c[10];int f,t=0;
printf("\t请输入车牌号:");
gets(c);
switch(1){
case 1:if(f=search2(c,ha))break;
case 2:if(f=search2(c,hb))break;
case 3:if(f=search2(c,hc))break;
else printf("\t停车场无该车\n");
break;
default:printf("\n\t按键错误请重新选择!\n");}
}
void fun2(void){
switch(select2()){
case 1:switch(select1()){
case 1:ha=del(ha);break;
case 2:hb=del(hb);break;
case 3:hc=del(hc);break;
case 4:break;
default:printf("\n\t按键错误请重新选择!\n");}
break;
case 2:switch(select3()){
case 1:savefile();break;
case 2:break;
default:printf("\n\t按键错误请重新选择!\n");}
break;
savefile();
case 3:break;
default:printf("\n\t按键错误请重新选择!\n");}
}
void fun3(void){
int select;
printf("\t请输入查询内容:\n");
printf("\t1.分别输出A区、B区、C区当前停放汽车的信息\n");
printf("\t2.分别输出A区、B区、C区当前空闲的车位号\n");
printf("\t3.输入车牌号,输出该车所停放的车位号\n");
printf("\t4.返回上一步\n");
printf("\t请选择按键(1-3):");
scanf("%d",&select);
getchar();
switch(select){
case 1:list(ha);
list(hb);
list(hc);
break;
case 2:list2(ha);
list2(hb);
list2(hc);break;
case 3:search();break;
case 4:break;
default:printf("\n\t按键错误请重新选择!\n");}
}
void fun4(void){
switch(select4()){
case 1:list3(ha);
list3(hb);
list3(hc);
break;
case 2:list4(ha);
list4(hb);
list4(hc);
break;
case 3:loadfile();
case 4:break;
default:printf("\n\t按键错误请重新选择!\n");}
}
void savefile(void){
timer = time(NULL);
tblock = localtime(&timer);
int year,month,day;FILE *fp;
year=tblock->tm_year+1900;
month=tblock->tm_mon;
day=tblock->tm_mday;
if ((fp=fopen("fee.dat","a+"))==NULL)
{printf("Can't open file!\n");exit(0);}
fprintf(fp,"%d年%d月%d日,%.1f元\n",year,month+1,day,s);
fclose(fp);
}
void loadfile(void){
FILE *fp;
int tyear,tmonth,year,month,day;
float m=0,a;
printf("\t请输入年月:(如2016 7)");
scanf("%d%d",&tyear,&tmonth);
if((fp=fopen("fee.dat","r+"))==NULL){
printf("can't open file!\n");exit(0);}
while(1){
if(fscanf(fp,"%d年%d月%d日,%f元\n",&year,&month,&day,&a)!=EOF)
{if(tyear==year&&tmonth==month)m+=a;}
else break;}
printf("\t该月停车场收费金额为:%.1f元",m);
fclose(fp);
}