Enter->top++;
printf("该车辆在停车场的位置是:
%d\n",Enter->top);
printf("请输入该车辆到达的时间:
到达时刻");
scanf("%d",到达时刻);
Enter->stack[Enter->top]=p;
return(TRUE);
}
else/*车场已满,车进便道*/{
printf("\n\t\t\t停车场已满该车辆需在便道上等待!
");
}
2.4)车辆离开
应用voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)及if-else语句记录离开车辆的信息。
voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W){
introom;
CarNode*p,*t;
QueueNode*q;
/*判断车场内是否有车*/
if(Enter->top>0)/*有车*/
{
printf("停车场里停放的车辆总数:
%d",Enter->top);
printf("请输入要离开车辆的车号:
");
scanf("%d",&room);
2.5)显示车场和便道里的车辆信息
定义两个队列List1和List2分别显示车场和便道里的车辆信息,由voidList(SeqStackCar*S,LinkQueueCar*W)和switch-case相关语句控制显示。
voidList1(SeqStackCar*S)/*列表显示车场信息*/
{
inti;
if(S->top>0)/*判断车站内是否有车*/
{
printf("车场:
");
printf("位置到达时间车牌号\n");
for(i=1;i<=S->top;i++)
{
printf("所在位置");
printf("车辆到达时间");
printf("车牌号");
}
}
else
printf("车场里没有车");
}
voidList2(LinkQueueCar*W)/*列表显示便道信息*/
{
QueueNode*p;
p=W->front->next;
if(W->front!
=W->rear)/*判断通道上是否有车*/{
printf("等待车辆的号码为:
");
else
printf("便道里没有车.");
}
voidList(SeqStackCar*S,LinkQueueCar*W){
intflag,tag;
flag=1;
while(flag){
printf("请选择1|2|3:
");
printf("1.车场2.便道3.返回");
while
(1){
scanf("%d",&tag);
if(tag>=1||tag<=3)break;
elseprintf("请选择1|2|3:
");
}
switch(tag){
case1:
显示车场信息;break;
case2:
显示便道信息;break;
case3:
flag=0;break;
default:
break;
}
}
}
3.函数的调用关系图
4.调试分析
a、调试中遇到的问题及对问题的解决方法
(1)一开始在在调试程序时遇到了内存错误,最终通过网上查资料找到了出错的原因:
在建立对头指针和队尾指针时没有对指针进行初始化,即没有为指针动态分配空间。
(2)Leave函数中一句if(room>=1&&room<=Enter->top)break;出错,导致实现的功能与设想的有出入,无法得到正确的结果。
后来重新考虑后将其删去,对Leave函数进行些许改动,解决了此问题。
(3)题目要求用‘A’表示车辆到达,‘D’表示车辆离开,‘E’表示输入结束。
但在编写程序时按照自己的想法用‘1’表示车辆到达,‘2’表示车辆离开,‘3表示输入结束。
在根据任务书调试程序时发现了该问题并修改成符合程序要求的字母。
(4)开始定义函数时比较混乱,后来在网上搜索和查阅相关书籍,对相关函数有了明确的定义。
5.测试结果
(1)系统界面
(2)车辆到达:
输入A可记录车辆到达信息:
(3)车库容量为2,到达的车数多余2时车场满,后来车辆便道等待:
(4)车辆离开并计费:
输入D完成车辆离开的相关操作:
(5)车场里车辆信息:
(6)便道里车辆信息:
(7)退出系统:
6.源程序(带注释)
//tccgl.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include
#include
#include
#defineMAX10/*车库容量*/
#defineprice1/*每车每时刻费用*/
typedefstructnode
{intnum;
intreachtime;
intleavetime;
}CarNode;/*车辆信息结点*/
typedefstructNODE
{CarNode*stack[MAX+1];
inttop;
}SeqStackCar;/*模拟车站*/
typedefstructcar
{CarNode*data;
structcar*next;
}QueueNode;
typedefstructNode
{QueueNode*head;
QueueNode*rear;
}LinkQueueCar;/*模拟通道*/
/*---------------------------------------------------------------------------*//*函数声明部分*/
voidInitStack(SeqStackCar*);/*初始化栈*/
intInitQueue(LinkQueueCar*);/*初始化便道*/
intArrival(SeqStackCar*,LinkQueueCar*);/*车辆到达*/
voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);/*车辆离开*/
voidList(SeqStackCar,LinkQueueCar);/*显示存车信息*/
voidPRINT(CarNode*p);
/*---------------------------------------------------------------------------*/voidoption()
{inti;
charchoice;
for(i=1;i<=80;i++)
printf("\004");
printf("\n\n\n\n");
printf("----------------------------\n");
printf("|停车场管理系统|\n");
printf("----------------------------\n");
printf("\n\n\n\n");
for(i=1;i<=80;i++)
printf("\004");
printf("设计者:
周兵\n");
printf("班级:
计算机08—5");
printf("\n********************************************************************************");
printf("\n\n\n是否进入该系统\n(y/n)");
choice=getchar();
if(choice=='N'||choice=='n')
exit(0);
}
voidmain()
{SeqStackCarEnter,Temp;
LinkQueueCarWait;
intch;
option();
InitStack(&Enter);/*初始化车站*/
InitStack(&Temp);/*初始化让路的临时栈*/
InitQueue(&Wait);/*初始化通道*/
while
(1){printf("\n********************************************************************************");
printf("\n\n\t\t\t1.新的车辆到达请选择1");
printf("\n\n\t\t\t2.场内车辆离开请选择2");
printf("\n\n\t\t\t3.查询车辆信息请选择3");
printf("\n\n\t\t\t4.选择退出程序请选择4");
printf("\n\n\t\t\t现在请选择以上信息:
");
while
(1)
{scanf("%d",&ch);
printf("\n");
if(ch>=1&&ch<=4)break;
else
printf("\n\t\t\t错误!
请再次做出选择!
\n\n\t\t\t");
}
switch(ch)
{case1:
Arrival(&Enter,&Wait);break;/*车辆到达*/
case2:
Leave(&Enter,&Temp,&Wait);break;/*车辆离开*/
case3:
List(Enter,Wait);break;/*列表打印信息*/
case4:
exit(0);/*退出主程序*/
default:
break;}
}
}
/*------------------------------------------------------------------------------*/
voidInitStack(SeqStackCar*s)/*初始化栈*/
{inti;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[s->top]=NULL;
}
intInitQueue(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);
}
voidPRINT(CarNode*p)/*打印出站车的信息*/
{intA1,A2;
printf("\n********************************************************************************");
printf("\n\t\t\t请输入离开时间:
");
scanf("%d",&(p->leavetime));
printf("\n\t\t\t离开车辆的车牌号:
%d",p->num);
printf("\n\n\t\t\t离开车辆到达时间:
%d",p->reachtime);
printf("\n\n\t\t\t离开车辆离开时间:
%d",p->leavetime);
A1=p->reachtime;
A2=p->leavetime;
printf("\n\n\t\t\t停车场管理费用:
%d",(A2-A1)*price);
free(p);
}
intArrival(SeqStackCar*Enter,LinkQueueCar*W)/*车辆到达*/
{CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
printf("\t\t\t请输入到达车辆车牌号:
");
scanf("%d",&(p->num));
if(Enter->top{Enter->top++;
printf("\n\t\t\t该车辆在停车场的位置是:
%d\n",Enter->top);
printf("\n\t\t\t请输入该车辆到达的时间:
");
scanf("%d",&(p->reachtime));
Enter->stack[Enter->top]=p;
return
(1);
}
else/*车场已满,车进便道*/
{printf("\n\t\t\t停车场已满该车辆需在便道上等待!
");
t=(QueueNode*)malloc(sizeof(QueueNode));
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
return
(1);
}
}
voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)/*车辆离开*/
{introom;
CarNode*p,*t;
QueueNode*q;
/*判断车场内是否有车*/
printf("\n********************************************************************************");
if(Enter->top>0)/*有车*/
{while
(1)/*输入离开车辆的信息*/
{printf("\t\t\t停车场里停放的车辆总数:
%d",Enter->top);
printf("\n\n\t\t\t请输入要离开车辆的位置:
");
scanf("%d",&room);
if(room>=1&&room<=Enter->top)
break;
}
while(Enter->top>room)/*车辆离开*/
{Temp->top++;
Temp->stack[Temp->top]=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
}
p=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
while(Temp->top>=1)
{Enter->top++;
Enter->stack[Enter->top]=Temp->stack[Temp->top];
Temp->stack[Temp->top]=NULL;
Temp->top--;
}
PRINT(p);
/*判断通道上是否有车及车站是否已满*/
if((W->head!
=W->rear)&&Enter->top{q=W->head->next;
t=q->data;
Enter->top++;
printf("\n\n\t\t\t便道的%d号车进入车场第%d位置.",t->num,Enter->top);
printf("\n\n\t\t\t请输入现在的时间:
");
scanf("%d",&(t->reachtime));
W->head->next=q->next;
if(q==W->rear)
W->rear=W->head;
Enter->stack[Enter->top]=t;
free(q);
}
else
printf("\n\n\t\t\t便道里没有车.\n");
}
else
printf("\n\n\t\t\t车场里没有车.");/*没车*/
}
voidList1(SeqStackCar*S)/*列表显示车场信息*/
{inti;
if(S->top>0)/*判断车站内是否有车*/
{printf("\n\t\t\t车场:
");
printf("\n\n\t\t\t位置到达时间车牌号\n");
for(i=1;i<=S->top;i++)
{printf("%26d",i);
printf("%6d",S->stack[i]->reachtime);
printf("%10d",S->stack[i]->num);
printf("\n");
}
}
else
printf("\n\t\t\t车场里没有车");
}
voidList2(LinkQueueCar*W)/*列表显示便道信息*/
{QueueNode*p;
p=W->head->next;
if(W->head!
=W->rear)/*判断通道上是否有车*/
{printf("\n\t\t\t等待车辆的号码为:
");
while(p!
=NULL)
{printf("%-10d",p->data->num);
p=p->next;
}
}
printf("\n");}
voidList(SeqStackCarS,LinkQueueCarW)
{intflag,tag;
flag=1;
while(flag)
{
printf("\n\n\t\t\t1.车场\n\n\t\t\t2.便道\n\n\t\t\t3.返回\n\n\t\t\t");
printf("现在请选择以上信息");
while
(1)
{scanf("