#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define TRUE 1
#define PS "lzc"
#define MPS 3
#define MAX 2
float price;
float money;
typedef struct time//时间结构体
{
int year;//年
int mon;//月
int day;//日
int hour;//时
int min;//分
int sec;//秒
}Time;
typedef struct car//车辆信息
{
char user[20];//车主
char num[20];//车牌号
Time *reach;//到达时间
Time *leave;//离开时间
}Car;
typedef struct park//停车场 (栈)
{
Car *stack[MAX];
int top;
}Park;
typedef struct linkcar//便道上的车
{
Car *CAR;
struct linkcar *next;
}LinkCar;
typedef struct linkpark//便道
{
LinkCar *head;
LinkCar *rear;
}LinkPark;
void InitStack(Park *p)//初始化栈
{
p->top=-1;
}
int Empty(Park *p)//判断栈空
{
if(p->top<0)
return (TRUE);
else
return (NULL);
}
Park *Push(Park *p,Car *c)//进栈
{
if(p->top>=MAX)
{
printf("栈满!");
return NULL;
}
else
{
p->top++;
p->stack[p->top]=c;
}
return p;
}
Car *Pop(Park *p)//出栈
{ Car *q=NULL;
if(Empty(p))
{
printf("栈空!\n");
return q;
}
else
{ q=p->stack[p->top];
p->top--;
return (q);
}
}
void InitLinkQueue(LinkPark *p)//链队的初始化
{
p->head=(struct LinkPark *)malloc(sizeof(LinkPark));
p->head->next=NULL;
p->rear=p->head;
}
int LinkQueue_Empty(LinkPark *p)//判断链队是否为空
{
if(p->head==p->rear)
{
return 1;
}
else
return 0;
}
void EnLinkQueue(LinkPark *p,Car *c)//进队(车辆进入便道)
{
LinkCar *q;
q=(struct LinkCar*)malloc(sizeof(LinkCar));
q->next=NULL;
q->CAR=c;
p->rear->next=q;
p->rear=q;
printf("\t\t车辆已进入便道!进入时间为:%d年%d月%d日%d时%d分%d秒\n",q->CAR->reach->year+1900,q->CAR->reach->mon,q->CAR->reach->day,q->CAR->reach->hour,q->CAR->reach->min,q->CAR->reach->sec);
}
LinkCar *DeLinkQueue(LinkPark *p)//出队
{
LinkCar *c;
c=(struct LinkCar*)malloc(sizeof(LinkCar));
if(LinkQueue_Empty(p))
{
printf("\t\t便道上没有车! \n");
return 0;
}
else
{
c=p->head->next;
p->head->next=c->next;
//free(c);
//printf("出队完成");
return c;
}
}
void CheckLink(LinkPark *p)
{
LinkPark *q;
q=p->head;//q暂时保存p的头指针
printf("\t\t\t\t****查看便道车辆****\n");
printf("\n\t\t车主\t\t车牌号\t\t 进入便道时间\n");
while(p->head->next!=NULL)
{
p->head=p->head->next;
printf("\t\t");
printf("%s",p->head->CAR->user);
printf("\t\t");
printf("%s",p->head->CAR->num);
printf("\t\t");
printf("%d/%d/%d %d:%d:%d",p->head->CAR->reach->year+1900,p->head->CAR->reach->mon,p->head->CAR->reach->day,p->head->CAR->reach->hour,p->head->CAR->reach->min,p->head->CAR->reach->sec);
printf("\n");
}
p->head=q;//输出数据后把p的头指针指向原来的空间
}
Time *gettime ()
{
Time *TIME;
time_t t;
struct tm * lt;
TIME=(Time *)malloc(sizeof(Time));
time (&t);//获取Unix时间戳。
lt = localtime (&t);//转为时间结构。localtime把t分解为 tm 结构,并用本地时区表示
// printf ( "%d/%d/%d %d:%d:%d\n",lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果
TIME->year=lt->tm_year;
TIME->mon=lt->tm_mon;
TIME->day=lt->tm_mday;
TIME->hour=lt->tm_hour;
TIME->min=lt->tm_min;
TIME->sec=lt->tm_sec;
return TIME;
}
void Arrival(Park *p,LinkPark *P)
{
char temp;
Car *c;
c=(Car *)malloc(sizeof(Car));
printf("\t\t请登记车辆信息,车主以及车牌号\n");
printf("\t\t车主:");
temp=getchar();
gets(c->user);
printf("\t\t车牌号:");
//temp=getchar();
gets(c->num);
// printf("输入完成");
c->reach=gettime();
if(p->top<(MAX-1))
{
Push(p,c);
printf("\t车辆已进站,进站时间为%d年%d月%d日%d时%d分%d秒\n",c->reach->year+1900,c->reach->mon,c->reach->day,c->reach->hour,c->reach->min,c->reach->sec);
}
else
{ printf("\t\t停车场已满,请进入便道等候!\n");
EnLinkQueue(P,c);
}
}
void Check(Park *p)
{
int i;
i=p->top;
printf("\t\t\t\t****查看停车场****\n");
printf("\n\t\t车主\t\t车牌号\t\t 车辆到达时间\n");
while(i>=0)
{
printf("\t\t");
printf("%s",p->stack[i]->user);
printf("\t\t");
printf("%s",p->stack[i]->num);
printf("\t\t");
printf("%d/%d/%d %d:%d:%d",p->stack[i]->reach->year+1900,p->stack[i]->reach->mon,p->stack[i]->reach->day,p->stack[i]->reach->hour,p->stack[i]->reach->min,p->stack[i]->reach->sec);
printf("\n");
i--;
}
}
void Bill(Car *c)
{
float charge;
float n;
float i;
float StandTime;
StandTime=(float)(c->leave->day-c->reach->day)*24+(float)(c->leave->hour-c->reach->hour)+(float)((c->leave->min-c->reach->min))/60+(float)((c->leave->sec-c->reach->sec))/3600;
money=StandTime*price;
printf("\t\t车辆已离开,停车时长为%f小时\t\t\n",StandTime);
printf("\t\t应收费用%f元:\n",money);
printf("\t\t请结账:");
scanf("%f",&charge);
n=money-charge;
while(n>0)
{
printf("\t\t还要付%f元,请结完账再走!\n",n);
scanf("%f",&i);
n=n-i;
}
printf("\t\t找零%f元",-n);
}
void Leave(Park *p,LinkPark *P)
{
//因为栈是后进先出,所以如果离开的车辆不是最后一辆,则需要把该辆车之后进入的车放入一个临时栈,待该车出栈后,再把临时栈中的车入栈到停车场(原来的栈)
int i;
Park q;
Car *c;
printf("\t\t请输入需要离开的车辆1--%d\n",p->top+1);
scanf("%d",&i);
InitStack(&q);
while(p->top>i-1)
{
Push(&q,Pop(p));
}
p->stack[p->top]->leave=gettime();
Bill(Pop(p));
while(q.top>=0)
{
Push(p,Pop(&q));//将临时栈中的车放回停车场中(原栈)
}
c=DeLinkQueue(P)->CAR;
c->reach=gettime();
printf("\t\t便道中%s的车进入停车场,进入时间为%d年%d月%d日%d时%d分%d秒\n",c->user,c->reach->year+1900,c->reach->mon,c->reach->day,c->reach->hour,c->reach->min,c->reach->sec);
Push(p,c);
}
void login()//密码验证
{
int n=1;
char password[20];
printf("\t\t请输入停车场管理系统登录密码:");
while(n<=MPS)
{
gets(password);
if(strcmp(password,PS)==0)
{
//system("cls");//清屏
printf("\t\t登录成功!\n");
printf("\t\t请输入停车场收费标准(元/小时):");
scanf("%f",&price);
break;
}
else
{
if(n==3)
{
printf("\t\t第%d次登录失败,账户已锁定!!\n",n);
break;
}
printf("\t\t第%d次登录失败,请重新输入:",n);
}
n++;
}
}
void menu()
{ int m=1;
int i;
Park p;
LinkPark P;
InitLinkQueue(&P);
InitStack(&p);
printf("\t\t请选择功能\n");
printf("\t\t1.车辆进入登记\n");
printf("\t\t2.车辆离开登记\n");
printf("\t\t3.查看停车场\n");
printf("\t\t4.查看便道\n");
printf("\t\t0.退出系统\n");
while(m)
{
scanf("%d",&i);
switch(i)
{
case 1:
Arrival(&p,&P);break;
case 2:
Leave(&p,&P);break;
case 3:
Check(&p);break;
case 4:
CheckLink(&P);break;
case 0:
m=0;printf("谢谢使用!\n");break;
}
}
}
int main()
{ system("color 1f");//蓝底
printf("\t\t欢迎使用停车场管理系统\n");
login();
menu();
return 0;
}