4.3.2 便道车辆管理算法
1、便道的车辆管理采用了队列的数据结构对车辆信息进行处理和保存。该数据结构采用的是链式存储,通过对每一个节点的遍历访问获取到相应的车辆信息进行修改和更新,从而实现对便道车辆的模拟管理。
2、和停车场管理的算法相似,在队列遍历的过程中也是通过标志自增产生的不同数值来对车辆信息进行区分的,不同的数值代表着不同的车辆信息含义,在完成一个车辆信息循环之后(车辆信息可以参照3.2.1逻辑结构设计),该标志会重置。
3、系统通过判断用户输入的车牌号是否有效和是否重复来判断车辆是否可以停靠在便道上。如果车牌号不合法,或者便道中已经存在该车牌号的车辆时,那么系统会自动退出。反之,则会将用户输入的车牌号登记,并更新便道车辆信息。
4、车辆在离开便道的时候,用户需要输入离开的车辆的车牌号,由系统搜索便道内是否存在该车辆,如果存在则会将该变到车位上的车辆信息全部初始化。然后系统会询问用户是否要将离开的车辆进入停车场停靠(1代表是,0代表否),
选择是系统会将停车场的空位自动分配给当前的离开车辆,并更新停车场的车辆信息。反之,系统会提示用户是否要继续将便道的车辆离开,当用户输入合法的车牌号时,系统将会继续执行便道车辆离开的操作,否则系统会返回主菜单。
5、车辆在进站登记的时候,系统会自动优先分配车辆信息被全部初始化的停车空位。因为在车辆登记的时候,系统会首先判断停车场内是否存在被完全初始化
的停车位置,如果存在则将该车辆的信息更新到被初始化的停车位上,然后返回主菜单。
6、便道车辆管理主要设计源码:
void LoadInput(dat *Q) //车辆到达便道
{
int e;
int i;
int j = 0;
int isReach = FALSE; //车到达与否
int isLeave = FALSE; //车离开与否
int leaveTime = 0; //即尚未离开
int cost = 0; //停车费用
int isEmpty = TRUE; //车位是否为空
printf("\n--车辆到达登记--\n");
printf("\n请输入车牌号:(车牌号重复时自动退出)\n");
scanf("%d",&e);
isReach = TRUE;
if(QSearch(Q,0) && !QSearch(Q,e)) //车牌号为0时,停车位空出,优先将进入停车场的车辆放置于此
{
if((*Q).front != (*Q).rear) //队列不为空时
{
DAT *p = (*Q).front -> next;
while(p != NULL)
{
j++;
//printf("\n--%d--\n",j);
//printf("\n--p = %d--\n",p->data);
if(j == 4)
{
time(&rawtime);
p -> data = rawtime;
timeinfo = localtime (&rawtime);
printf("到达时间: %s",asctime(timeinfo));
}
else if(j == 6)
{
if(p -> data != NULL)
{
rawtime = p -> data;
timeinfo = localtime (&rawtime);
printf("离开时间: %s",asctime(timeinfo));
}
else
printf("离开时间: 空\n");
}
else if(j == 7)
{
p -> data = 0;
printf("在便道停留时间:%d秒\n",p -> data);
}
else if(j == 8)
{
p -> data = FALSE;
if(p -> data == FALSE)
printf("停车位是否为空: 否\n");
else
printf("停车位是否为空: 是\n");
j = 0;
break;
}
else if(j == 1 || j == 2 || j == 3 || j == 5)
{
if(j == 1)
{
while(p -> data != 0)
{
for(i = 0;i < 8;i++)
{
p = p -> next;
//printf("\n--p = %d--\n",p->data);
}
j = 1;
}
if(p -> data == 0)
{
p -> data = e;
printf("\n车牌号: %d\n",p -> data);
}
}
if(j == 2)printf("便道车位: %d\n",p -> data);
if(j == 3)
{
p -> data = TRUE;
if(p -> data == FALSE)
printf("到达: 否\n");
else
printf("到达: 是\n");
}
if(j == 5)
{
p -> data = FALSE;
if(p -> data == FALSE)
printf("离开: 否\n");
else
printf("离开: 是\n");
}
}
p = p -> next;
}
}
}
else{
while(e != 0 && !QSearch(Q,e))
{
lLocation++;
time(&rawtime); //获取当前时间<秒>(case 1 即为到达时间)
isEmpty = FALSE;
EnQueue(Q,e);
EnQueue(Q,lLocation);
EnQueue(Q,isReach);
EnQueue(Q,rawtime);
EnQueue(Q,isLeave);
EnQueue(Q,leaveTime);
EnQueue(Q,cost);
EnQueue(Q,isEmpty);
printf("\n--车牌号%d登记成功--\n",e);
printf("\n请输入车牌号:\n");
scanf("%d",&e);
}
printf("\n--车牌号已存在,无法登记--\n");
QueueTraverse(Q); //遍历输出
}
}
void LoadToStop(SqStack *S,int tempCarNumber) //车辆从便道转入停车场
{
int e;
int i;
int j = 0;
int isReach = FALSE; //车到达与否
int isLeave = FALSE; //车离开与否
int leaveTime = 0; //即尚未离开
int cost = 0; //停车费用
int isEmpty = TRUE; //车位是否为空
int *p = NULL;
isReach = TRUE;
e = tempCarNumber;
if(Search(S,0) && !Search(S,e)) //车牌号为0时,停车位空出,优先将进入停车场的车辆放置于此
{
if((*S).top != (*S).base) //栈不为空时
{
for(p= (*S).base;p <= (*S).top-1;p++)
{
j++;
//printf("\n--%d--\n",j);
if(j == 4)
{
time(&rawtime);
*p = rawtime;
timeinfo = localtime (&rawtime);
printf("到达时间: %s",asctime(timeinfo));
}
else if(j == 6)
{
if(*p != NULL)
{
rawtime = *p;
timeinfo = localtime (&rawtime);
printf("离开时间: %s",asctime(timeinfo));
}
else
printf("离开时间: 空\n");
}
else if(j == 7)
{
*p = 0;
printf("停车费用:%d元\n",*p);
}
else if(j == 8)
{
*p = FALSE;
if(*p == FALSE)
printf("停车位是否为空: 否\n");
else
printf("停车位是否为空: 是\n");
j = 0;
break;
}
else if(j == 1 || j == 2 || j == 3 || j == 5)
{
if(j == 1)
{
while(*p != 0 && p <= (*S).top-1)
{
for(i = 0;i < 8;i++)
p++;
j = 1;
}
if(*p == 0)
{
*p = e;
printf("\n车牌号: %d\n",*p);
}
}
if(j == 2)printf("停车位: %d\n",*p);
if(j == 3)
{
*p = TRUE;
if(*p == FALSE)
printf("到达: 否\n");
else
printf("到达: 是\n");
}
if(j == 5)
{
*p = FALSE;
if(*p == FALSE)
printf("离开: 否\n");
else
printf("离开: 是\n");
}
}
}
}
printf("\n停车场的车辆信息已更新:\n");
StackTraverse(S); //遍历输出
printf("\n-----------------------------\n");
}
else{
if(e != 0 && !Search(S,e))
{
sLocation++;
time(&rawtime); //获取当前时间<秒>(case 1 即为到达时间)
isEmpty = FALSE;
Push(S,e);
Push(S,sLocation);
Push(S,isReach);
Push(S,rawtime);
Push(S,isLeave);
Push(S,leaveTime);
Push(S,cost);
Push(S,isEmpty);
printf("\n--车牌号%d成功转入停车场--\n",e);
}
printf("\n停车场的车辆信息已更新:\n");
StackTraverse(S); //遍历输出
printf("\n-----------------------------\n");
}
}
void LoadLeave(dat *Q,SqStack *S) //车辆离开便道
{
int tempCarNumber;
int flag;
int e;
int i;
int j = 0;
int isEmpty = TRUE; //车位是否为空
int cost = 0;
int time1,time2; //用于记录离开和到达的时间(中间变量)
printf("\n--车辆离开登记(车牌号不存在时自动退出)--\n");
printf("\n请输入已经离开的车牌号:\n");
scanf("%d",&e);
while(e != 0 && QSearch(Q,e))
{
tempCarNumber = e;
printf("\n离开的车辆的信息如下:\n");
printf("-----------------------------------\n");
if((*Q).front != (*Q).rear) //队列不为空时
{
DAT *p = (*Q).front -> next;
while(p != NULL)
{
j++;
//printf("\n--j = %d--\n",j);
//printf("\n--p = %d--\n",p -> data);
if(j == 4)
{
if(p -> data != NULL)
{
rawtime = p -> data;
timeinfo = localtime (&rawtime);
printf("到达时间: %s",asctime(timeinfo));
time1 = rawtime;
p -> data = 0; //车辆离开后时间重置
}
else
printf("到达时间: 空\n");
}
else if(j == 6)
{
time(&rawtime); //获取当前时间<秒>(case 1 即为到达时间)
timeinfo = localtime (&rawtime);
printf("离开时间: %s",asctime(timeinfo));
time2 = rawtime;
p -> data = 0;
}
else if(j == 7)
{
cost = time2 - time1;
printf("在便道停留时间: %d秒\n",cost);
cost = 0;
}
else if(j == 8)
{
p -> data = TRUE;
printf("停车位是否为空: 是\n");
printf("-----------------------------------\n");
j = 0;
break;
}
else if(j == 1 || j == 2 || j == 3 || j == 5)
{
if(j == 1)
{
while(p -> data != e)
{
for(i = 0;i < 8;i++)
{
p++;
}
j = 1;
}
if(p -> data == e)
{
printf("车牌号: %d\n",p -> data);
p -> data = 0;
}
}
else if(j == 2)printf("便道车位: %d\n",p -> data);
else if(j == 3)
{
if(p -> data == FALSE)
printf("到达: 否\n");
else
printf("到达:是\n");
p -> data = FALSE;
}
if(j == 5)
{
p -> data = TRUE;
if(p -> data == FALSE)
printf("离开: 否\n");
else
printf("离开:是\n");
p -> data = FALSE;
}
}
p = p -> next;
}
}
printf("\n离开便道的该车辆是否要进入停车场(1/0)?\n");
scanf("%d",&flag);
if(flag == 1)
LoadToStop(S,tempCarNumber);
printf("\n如果还有车辆需要离开便道的话:\n");
printf("\n请输入已经离开的车牌号:\n");
scanf("%d",&e);
}
printf("\n--查无此车牌号--\n");
}