停车场管理.docx
《停车场管理.docx》由会员分享,可在线阅读,更多相关《停车场管理.docx(18页珍藏版)》请在冰点文库上搜索。
停车场管理
实习二栈、队列和递归算法设计
姓名:
xxx班级:
sss
题目.停车场管理 实习时间:
2012.10.16
一需求分析
【问题描述】
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供
汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向
南排列(大门在最南端),若停车场内已停满n辆汽车,则后来的汽车
只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即
可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出
车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,
每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费
用。
试为停车场编制按上述要求进行管理的模拟程序。
【基本要求】
以栈模拟停车场,以队列模拟车场外的便道。
栈以顺序结构实现,
队列以链表结构实现。
每一组输入数据包括:
汽车“到达”或“离去”信息、汽车牌照号码以
及到达或离去的时刻。
输出信息:
若是车辆到达,则输出汽车在停车场内或便道上的停车
位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费
用(在便道上停留的时间不收费)。
【测试数据】
设n=2,输入数据为:
(’A’,1,5),(’A’,2,10),(’D’,1,15),
(’A’,3,20),(’A’,4,25),(’A’,5,30),(’D’,2,35),(’D’,4,40),
(’E’,0,0)。
其中:
’A’表示到达;’D’表示离去;’E’表示输入结束。
【实现提示】
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来
的汽车,也可用顺序存储结构实现。
输入数据按到达或离去的时刻有序。
栈中每个元素表示一辆汽车,包含两个数据项:
汽车的牌照号码和进入
停车场的时刻。
【选作内容】
(1)两个栈共享空间,思考应开辟数组的空间是多少?
(2)汽车可有不同种类,则它们的占地面积不同,收费标准也不同,
如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3
辆小汽车的占地面积。
(3)停放在便道上的汽车也收费,收费标准比停放在停车场的车低。
二.设计
1.设计思想
(1).储存结构:
以栈模拟停车场,以队列模拟车场外的便道。
栈以顺序结构实现,
队列以链表结构实现。
(2).主要算法基本思想
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来
的汽车,也可用顺序存储结构实现。
输入数据按到达或离去的时刻有序。
栈中每个元素表示一辆汽车,包含两个数据项:
汽车的牌照号码和进入
停车场的时刻。
2.设计表示
(1)函数调用关系图
main->InitStack()->InitStack()->InitQueue()
(2)函数规格接口说明
StatusInitStack(Park&P)//初始化停车场/P为停车场对象
StatusPush(Park&P,CarNodee)//车进入停车场*/P为停车场对象,e为车
StatusPop(Park&P,CarNode&e)//车离开停车场
StatusInitQueue(Shortcut&S)//初始化便道,S为便道对象
StatusEnQueue(Shortcut&S,intnumber,intar_time)//车进入便道
StatusDeQueue(Shortcut&S,CarPtr&w)//车离开便道
StatusArrival(Park&P,Shortcut&S)//对进站车辆的处理
StatusLeave(Park&P,Park&P1,Shortcut&S)//对离站车辆的处理
3.实现注释
每一组输入数据包括:
汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻。
输出信息:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;
若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用
(在便道上停留的时间不收费)。
4.详细设计(主要算法的细化)
StatusInitStack(Park&P)//初始化停车场
P.base=(CarNode*)malloc(SIZE*sizeof(Car1));
if(!
P.base)exit(OVERFLOW);
P.top=P.base;
P.stacksize=0;
returnOK;
}
StatusPush(Park&P,CarNodee){//车进入停车场
*P.top++=e;
++P.stacksize;
returnOK;
}
StatusPop(Park&P,CarNode&e){//车离开停车场
if(P.top==P.base)
printf("停车场为空。
");
else
{
e=*--P.top;
--P.stacksize;
}
returnOK;
}
StatusInitQueue(Shortcut&S){//初始化便道
S.front=S.rear=(CarPtr)malloc(sizeof(Car2));
if(!
S.front||!
S.rear)exit(OVERFLOW);
S.front->next=NULL;
S.length=0;
returnOK;
}
StatusEnQueue(Shortcut&S,intnumber,intar_time){//车进入便道
CarPtrp;
p=(CarPtr)malloc(sizeof(Car2));
if(!
p)exit(OVERFLOW);
p->number=number;
p->ar_time=ar_time;
p->next=NULL;
S.rear->next=p;
S.rear=p;
++S.length;
returnOK;
}
StatusDeQueue(Shortcut&S,CarPtr&w){//车离开便道
if(S.length==0)
printf("通道为空。
");
else
{
w=S.front->next;
S.front->next=S.front->next->next;
--S.length;
}
returnOK;
}
StatusArrival(Park&P,Shortcut&S){//对进站车辆的处理
intnumber,ar_time;
printf("请输入车牌号:
");
scanf("%d",&number);
printf("进场的时刻:
");
scanf("%d",&ar_time);
if(P.stacksize{
CarNodec;
c.number=number;
c.ar_time=ar_time;
Push(P,c);
printf("该车应停在第%d号车道。
\n",P.stacksize);
}
else
{
EnQueue(S,number,ar_time);
printf("停车场已满,请暂时停在便道的第%d个位置。
\n",S.length);
}
returnOK;
}
StatusLeave(Park&P,Park&P1,Shortcut&S){//对离站车辆的处理
intnumber,le_time,flag=1,money,ar_time;
printf("请输入车牌号:
");
scanf("%d",&number);
printf("出场的时刻:
");
scanf("%d",&le_time);
CarNodee,m;
CarPtrw;
while(P.stacksize)
{
Pop(P,e);
if(e.number==number)
{
flag=0;
money=(le_time-e.ar_time)*2;
ar_time=e.ar_time;
break;
}
Push(P1,e);
}
while(P1.stacksize)
{
Pop(P1,e);
Push(P,e);
}
//车从停车场中出
if(flag==0)
{
if(S.length!
=0)
{
DeQueue(S,w);
m.ar_time=le_time;
m.number=w->number;
Push(P,m);
free(w);
printf("车牌号为%d的车已由便道进入停车场\n",m.number);
}
printf("停车费为%d,占用车位数为%d\n",money,P.stacksize);
}
else
{
printf("停车场不存在牌号为%d的车\n",number);
}
returnOK;
}
主函数如下:
voidmain()
{
intm=1;
charflag;//选项
ParkP,Q;
ShortcutS;
InitStack(P);
InitStack(Q);
InitQueue(S);
while(m)
{
printf("\n停车场管理程序\n");
printf("===============================================\n");
printf("**A汽车进车场**\n");
printf("****\n");
printf("**D汽车出车场**\n");
printf("****\n");
printf("**E退出程序**\n");
printf("===============================================\n");
printf("请选择(A,D,E):
");
scanf("%c",&flag);
switch(flag)
{
case'A':
case'a':
Arrival(P,S);break;//车进入停车场
case'D':
case'd':
Leave(P,Q,S);break;//车离开停车场
case'E':
case'e':
m=0;
break;
default:
printf("Inputerror!
\n");
break;
}
while(flag!
='\n')
scanf("%c",&flag);
}
}
三.调试分析
1.调试遇到的主要问题以及解决方案:
1静态调试:
按求解算法和C语言的语法规则进行检查:
语法上出现一些小的问题,但也是程序无法运行,经修改后可以了。
2动态调试:
将设计题给出的路径进行运行,程序可以运行
3.由于此停车场管理系统是分模块设计的,整体看来结构较为清晰,使用方便,易读易懂,本程序的运行,总体上情况良好。
【用户手册】
1.本程序在VC环境下可以运行。
2.根据提示的命令输入需要的服务进行选择。
四.经验体会
一直都知道C语言学的很差,但是最基本的编程还是可以完成的,但是这次实习让我知道我的编程能力是如此之差,它让我深刻意识到我的基本功还不够扎实,以后还要多下功夫。
五.运行结果
设n=2,输入数据为:
(’A’,1,5),(’A’,2,10),(’D’,1,15),
(’A’,3,20),(’A’,4,25),(’A’,5,30),(’D’,2,35),(’D’,4,40),
(’E’,0,0)。
其中:
’A’表示到达;’D’表示离去;’E’表示输入结束。
六.源程序清单
#include
#include
#include
//函数返回状态代码
#defineOK1
#defineERROR0
#defineTRUE1
#defineFALSE0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineSIZE5//停车场位置数
typedefintStatus;
//栈,模拟停车场
typedefstructCar1
{//车
intnumber;//汽车车号
intar_time;//汽车到达时间
}CarNode;
typedefstruct
{//停车场
CarNode*base;//停车场的堆栈底
CarNode*top;//停车场的堆栈顶
intstacksize;
}Park;
//队列,模拟便道
typedefstructCar2
{//车
intnumber;//汽车车号
intar_time;//汽车到达时间
structCar2*next;
}*CarPtr;
typedefstruct
{//便道
CarPtrfront;//便道的队列的对头
CarPtrrear;//便道的队列的队尾
intlength;
}Shortcut;
StatusInitStack(Park&P)
{//初始化停车场
P.base=(CarNode*)malloc(SIZE*sizeof(Car1));
if(!
P.base)exit(OVERFLOW);
P.top=P.base;
P.stacksize=0;
returnOK;
}
StatusPush(Park&P,CarNodee)
{//车进入停车场
*P.top++=e;
++P.stacksize;
returnOK;
}
StatusPop(Park&P,CarNode&e)
{//车离开停车场
if(P.top==P.base)
printf("停车场为空。
");
else
{
e=*--P.top;
--P.stacksize;
}
returnOK;
}
StatusInitQueue(Shortcut&S)
{//初始化便道
S.front=S.rear=(CarPtr)malloc(sizeof(Car2));
if(!
S.front||!
S.rear)exit(OVERFLOW);
S.front->next=NULL;
S.length=0;
returnOK;
}
StatusEnQueue(Shortcut&S,intnumber,intar_time)
{//车进入便道
CarPtrp;
p=(CarPtr)malloc(sizeof(Car2));
if(!
p)exit(OVERFLOW);
p->number=number;
p->ar_time=ar_time;
p->next=NULL;
S.rear->next=p;
S.rear=p;
++S.length;
returnOK;
}
StatusDeQueue(Shortcut&S,CarPtr&w)
{//车离开便道
if(S.length==0)
printf("通道为空。
");
else
{
w=S.front->next;
S.front->next=S.front->next->next;
--S.length;
}
returnOK;
}
StatusArrival(Park&P,Shortcut&S)
{//对进站车辆的处理
intnumber,ar_time;
printf("请输入车牌号:
");
scanf("%d",&number);
printf("进场的时刻:
");
scanf("%d",&ar_time);
if(P.stacksize{
CarNodec;
c.number=number;
c.ar_time=ar_time;
Push(P,c);
printf("该车应停在第%d号车道。
\n",P.stacksize);
}
else
{
EnQueue(S,number,ar_time);
printf("停车场已满,请暂时停在便道的第%d个位置。
\n",S.length);
}
returnOK;
}
StatusLeave(Park&P,Park&P1,Shortcut&S)
{//对离站车辆的处理
intnumber,le_time,flag=1,money,ar_time;
printf("请输入车牌号:
");
scanf("%d",&number);
printf("出场的时刻:
");
scanf("%d",&le_time);
CarNodee,m;
CarPtrw;
while(P.stacksize)
{
Pop(P,e);
if(e.number==number)
{
flag=0;
money=(le_time-e.ar_time)*2;
ar_time=e.ar_time;
break;
}
Push(P1,e);
}
while(P1.stacksize)
{
Pop(P1,e);
Push(P,e);
}
//车从停车场中出
if(flag==0)
{
if(S.length!
=0)
{
DeQueue(S,w);
m.ar_time=le_time;
m.number=w->number;
Push(P,m);
free(w);
printf("车牌号为%d的车已由便道进入停车场\n",m.number);
}
printf("停车费为%d,占用车位数为%d\n",money,P.stacksize);
}
else
{
printf("停车场不存在牌号为%d的车\n",number);
}
returnOK;
}
voidmain()
{
intm=1;
charflag;//选项
ParkP,Q;
ShortcutS;
InitStack(P);
InitStack(Q);
InitQueue(S);
while(m)
{
printf("\n停车场管理程序\n");
printf("===============================================\n");
printf("**A汽车进入停车场**\n");
printf("****\n");
printf("**D汽车离开停车场**\n");
printf("****\n");
printf("**E退出程序**\n");
printf("===============================================\n");
printf("请选择(A,D,E):
");
scanf("%c",&flag);
switch(flag)
{
case'A':
case'a':
Arrival(P,S);break;//车进入停车场
case'D':
case'd':
Leave(P,Q,S);break;//车离开停车场
case'E':
case'e':
m=0;
break;
default:
printf("Inputerror!
\n");
break;
}
while(flag!
='\n')
scanf("%c",&flag);
}
}