/*停车场管理*/
#include<iostream.h>
#include<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc()等 */
#include<limits.h> /* INT_MAX等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<stdlib.h> /* atoi() */
#include<io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */
#include<process.h> /* exit() */
/* 函数结果状态代码 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
#define MAX 2 /*停车场容量*/
#define price 0.05 /*停车场内的收费标准*/
#define cost 0.02 /*车停在便道时的收费标准*/
typedef struct time
{ /*时间*/
int hour;
int min;
}Time;
typedef struct node //车的信息
{
char num[10]; //车牌号
Time reach; //车到达时间
Time leave; //车离开时间
float cost1; //待停车费
float cost2; //停车费
float carstyle; //车型
}CarNode; //
typedef struct NODE
{ /* 停车场*/
CarNode *stack[MAX+1];
int top; //top是栈顶或者说停车场内车辆的数量
}SeqStackCar;
//-----单链队列——队列的存储结构-----
typedef struct car
{
CarNode *data; //数据
struct car *next;//指针
}QueueNode;
typedef struct Node
{
QueueNode *head; //队头指针
QueueNode *rear; //队尾指针
}LinkQueueCar;
//模拟通道
/*------------------------------------------------------------------------------*/
//函数声明
void InitStack(SeqStackCar *); //初始化栈
int InitQueue(LinkQueueCar *); //初始化便道
int Arrival(SeqStackCar *,LinkQueueCar *); //车辆到达
void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); //车辆离开
void List(SeqStackCar,LinkQueueCar); //输出车辆信息
void EnQueue(LinkQueueCar *w,CarNode x); //车辆进便道
void left(LinkQueueCar *w); //车辆从便道开走
CarNode DeQueue(LinkQueueCar *w); //出便道
/*------------------------------------------------------------------------------*/
void main()
{
SeqStackCar Enter,Temp;
LinkQueueCar Wait;
int ch,tag,f;
/*ch是输入的指令,表示1. 到达2. 离开3. 清单4. 退出
tag 是输入的指令,表示要从停车场离开,还是便道离开 1.停车场2.便道3.返回*/
InitStack(&Enter); /*车站的栈*/
InitStack(&Temp); /*道路的临时栈*/
InitQueue(&Wait); /*通道*/
while(1)
{
cout<<"+++++++++++++++++++++++++++++++停车场管理系统+++++++++++++++++++++++++++++++\n";
cout<<"|-------------------实现基本内容:本停车场按先到先入原则--------------------|\n";
cout<<"|---------------------------实现入车出车计费功能----------------------------|\n";
cout<<"|-------------------完成选做内容2,3,4:分车型收费,便道出车和收费------------|\n\n\n\n";
cout<<"\n 1. 到达";
cout<<" 2. 离开";
cout<<" 3. 清单";
cout<<" 4. 退出\n"; /*打印出业务指令提示*/
while(1)
{
cin>>ch; /*输入一个指令,1. 到达2. 离开3. 清单4. 退出*/
if(ch>=1&&ch<=4) break;
else cout<<"\n 错误!! 请选择:1--4";
}
switch(ch)
{
case 1:Arrival(&Enter,&Wait);break; /*有车辆到达就执行arival函数 */
case 2:
{ /*车辆离开,从停车场或便道,执行case 2 */
f=1;
while(f)
{
cout<<"\n 选择车辆离开地点:";
cout<<"\n 1.停车场\n 2.便道\n 3.返回\n";
while(1)
{
cin>>tag; /*输入指令,指明是从哪个地方开走的 */
if(tag>=1||tag<=3) break;
else cout<<"\n 错误 \n 1.停车场\n 2.便道\n 3.返回:";
}
switch(tag)
{
case 1:Leave(&Enter,&Temp,&Wait);break;//从停车场开走
case 2:left(&Wait);break;//从便道开走,如果输入的是这两个,就接下继续输入开走的车
case 3:f=0;break;//操作结束
default: break;
}
}//end while(flag)
}
break;//end case2
case 3:List(Enter,Wait);break; /*打印出清单*/
case 4:exit(0); /*退出*/
default: break;
} //switch
}// while
}
void InitStack(SeqStackCar *s) /*初始化栈*/
{
int i;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[i]=NULL;
}
//-------------------------------------------------------------------------------//
int InitQueue(LinkQueueCar *Q) /*初始化便道*/
{
Q->head=(QueueNode *)malloc(sizeof(QueueNode));
if(Q->head!=NULL)
{
Q->head->next=NULL;
Q->rear=Q->head;
return(1);
}
else return(-1);
}
//-------------------------------------------------------------------------------//
void PRINT(CarNode *p,int room) /*输出要离开车的信息*/
{
int A1,A2,B1,B2;
float S,m;
cout<<"\n输入离开时间:/**:**/";
cin>>p->leave.hour;
cin>>p->leave.min;
cout<<"\n离开车的车号为:";
cin>>p->num;
cout<<"\n车辆到达时间为"<<p->reach.hour<<":"<<p->reach.min<<endl;
cout<<"离开时间为:"<<p->leave.hour<<":"<<p->leave.min;
A1=p->reach.hour;
A2=p->reach.min;
B1=p->leave.hour;
B2=p->leave.min;
S=p->carstyle;
p->cost2=((B1-A1)*60+(B2-A2))*price*S; //停车场费用存在cost2里面
m=p->cost1;
cout<<"\n停车场内费用为:"<<p->cost2;
cout<<"\n总费用位:"<<m+p->cost2;
free(p);
}
int Arrival(SeqStackCar *Enter,LinkQueueCar *W) /*车辆到达*/
{ int m;
CarNode *p;
QueueNode *t;
p=(CarNode *)malloc(sizeof(CarNode));
t=(QueueNode *)malloc(sizeof(QueueNode));
cout<<"\n输入车号(such as:1234):";
cin>>p->num;
cout<<"选择车型\n";
cout<<"1.客车: 1.5*\n 2.十轮卡车 3*\n 3.小汽车 1*\n";
cin>>m; //输入选择的车类型1.客车 2.十轮卡车 3.小汽车
switch(m)
{ case(1):p->carstyle=1.5;break;
case(2):p->carstyle=3.0;break;
case(3):p->carstyle=1.0;break;
default:break;
}
if(Enter->top<MAX) /*如果停车场未满,车进入*/
{
p->cost1=0;
Enter->top++;
cout<<"\n第"<<Enter->top<<"位置.";
cout<<"\n输入到达时间:/**:**/";
cin>>p->reach.hour>>p->reach.min;
Enter->stack[Enter->top]=p;//Enter是一个结构体对象的指针所以用->top是它的成员变量
return(1);
}
else /*如果停车场满了,进入便道*/
{
cout<<"\n便道中等待!";
cout<<"\n输入进入时间:/**:**/";
t->data=p;
cin>>t->data->reach.hour>>t->data->reach.min;
/*队列中插入元素*/
t->next=NULL;
W->rear->next=t;
W->rear=t;
return(1);
}
}
//------------------------------------------------------------------------------//
//向链队列中插入一个元素x
void EnQueue(LinkQueueCar *w,CarNode x)
{
int i,n;
QueueNode *p;
p=(QueueNode *)malloc(sizeof(QueueNode));
p->data=(CarNode *)malloc(sizeof(CarNode));
if(p==NULL)
{
cout<<"内存空间分配失败!\n";
exit(1);
}
//把x的值赋给新结点的值域,把新结点的指针域置空
p->data->reach.hour=x.reach.hour;
p->data->reach.min=x.reach.min;
p->data->carstyle=x.carstyle;
n=strlen(x.num);
for(i=1;i<=n;i++)
p->data->num[i-1]=x.num[i-1];
p->data->num[i-1]='\0';
p->next=NULL;
if(w->rear==NULL) //若链队为空,则新结点即是队首结点又是队尾结点
w->head=w->rear=p;
else //若链队非空,则依次修改队尾结点的指针域和队尾指针,使之指向新的队尾结点
w->rear=w->rear->next=p;
}
//从队列中删除队首元素,并返回原队首元素
CarNode DeQueue(LinkQueueCar *w)
{
int i,n;
QueueNode *p;
CarNode temp;
if(w->head==NULL) //若链队为空则停止运行
{
cout<<"\n 队列为空,无法删除! \n";
exit(1);
}
temp.reach.hour=w->head->next->data->reach.hour;
temp.reach.min=w->head->next->data->reach.min;
n=strlen(w->head->next->data->num);
for(i=1;i<=n;i++)
temp.num[i-1]=w->head->next->data->num[i-1];
temp.num[i-1]='\0';
temp.carstyle=w->head->next->data->carstyle;
temp.leave.hour=temp.reach.hour;
temp.leave.min=temp.reach.min;
p=w->head; //暂存队头指针以便回收队尾结点
w->head=p->next; //使队首指针指向下一个结点
if(w->head==NULL) //若删除后链队为空,则需同时使队尾指针为空
w->rear=NULL;
free(p); //回收原队首结点
return temp; //返回被删除的队首元素值
}
//------------------------------------------------------------------------------//
void left(LinkQueueCar *w) //车辆离开便道
{
int len=0;
int i,loca,Hou