实验三 停车场模拟管理程序的设计与实现.docx
《实验三 停车场模拟管理程序的设计与实现.docx》由会员分享,可在线阅读,更多相关《实验三 停车场模拟管理程序的设计与实现.docx(13页珍藏版)》请在冰豆网上搜索。
![实验三 停车场模拟管理程序的设计与实现.docx](https://file1.bdocx.com/fileroot1/2023-1/23/91ea0ab8-f801-41bb-b299-228fefbc4422/91ea0ab8-f801-41bb-b299-228fefbc44221.gif)
实验三停车场模拟管理程序的设计与实现
数据结构实验报告
题目:
停车场模拟管理程序的设计与实现
学院数学与计算机学院
学科门类学科必修
专业电气信息类计算机类
学号
姓名
指导教师
实验三停车场模拟管理程序的设计与实现
一.问题描述
设停车场只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进去;当停车场内某辆车开出大门时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出停车场为它让路,待该辆车开出大门,为它让路的车辆再按原次序进入停车场。
在这里设汽车不能从便道上开走,设计一个停车场管理程序。
二.数据结构设计
1为了便于区分每辆车并了解每辆车当前所处位置,需要记录汽车的牌照号码和汽车的当前状态,所以为汽车定义个新的类型CAR,具体定义如下:
typedefstruct
{
stringnum;
charstate;
}CAR;//定义每辆车的牌号
2,由于车位是一个狭长的通道,所以不允许两辆车同时出入车位,当有车到来要停车位时也要顺次停放,当某辆车要离开时,比它后到的车要先暂时离开停车位,而且越后到的车就越先离开停车位,显然和栈的“后进先出”吻合,所以可以使用一个栈来描述停车位。
由于停车位只能停放有限的几辆车,而且为了便于停车场管理,要为没一个车位分配一个固定的编号,不妨设为1,2,3,4和5,分别表示停车位的1车位,2车位等,针对这种情况使用一个顺序栈比较方便具体定义如下
typedefstruct
{
CAR*stack[MAX+1];
inttop;
}STOPPING;//用栈定义,构造停车场
3当停车场的停车位上都已经停满了汽车,又有新的汽车到来时要把它调度到便道上,便道上的车辆要按照进入便道的先后顺序存放在便道上,为便道上的每一个位置也分配一个固定的编号,当有车从停车位上离开后,便道上的第一辆汽车就立即进入停车位上的某个车位,由于问题描述中限制了便道上的汽车不能从便道上开走,即便道上的汽车只有在停车位上停放过才能离开停车场,这样越早进入便道的汽车就越早有停车位,而且每次进入停车位的汽车都是出于便道“最前面”的汽车,这和队列的“先进先出”特点吻合,所以,这里使用一个队列描述便道。
typedefstructcar
{
CAR*data;
structcar*next;
}QueueNode;//用队列结点定义,构造停车场外的单个等候车辆
typedefstructNode
{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;//用队列定义,构造停车场外的等候便道
4.当某辆车要离开停车场的时候,比他后进停车位的车要为它让路,而且当它离开后让路的车还要按照原来的停放次序进入停车位的某个位置,为了完成这项功能,再定义一个辅助栈,停车位中让路的车依次“压入”辅助栈,待提出开走请求后的车开走后,再从辅助栈的栈顶依次“弹出”到停车位。
三.功能(函数)设计
本程序从总体上分四个功能模块,分别为程序功能介绍和操作提示模块,汽车进入停车场的管理模块,汽车离开停车位的管理模块和查看停车场状态的查询模块。
具体功能如下:
1.程序功能介绍和操作提示模块:
此模块给出程序欢迎界面,介绍本程序的功能,并给出程序功能所对应的键盘操作的提示,具体屏幕显示如下:
2.汽车进入停车位的管理模块:
此模块用来登记停车场的汽车车牌号和对汽车的调度过程。
并修改该车的状态。
其中,调度过程要以屏幕信息的相识反馈给用户来指导用户对车辆调度。
3.汽车离开停车位的管理模块:
此模块用来为提出离开停车场的车辆做调度处理,并修改相关车辆的状态。
其中,调度过程要以屏幕信息的形式反馈给用户来指导用户对车辆的调度,当有车离开停车场后应该立刻检查便道上是否有车,则立即让便道上的第一汽车进入停车位。
4.查看停车场停车状态的查询模块:
此模块用来在屏幕上显示停车位和便道上各位置的状态。
四.界面设计
本程序的界面力求简洁友好,每一步需要用户操作的提示以及每一次用户操作产生的调度过程都以中文的形式显示在屏幕上,使用户对要做什么和已经做了什么一目了然。
文字表述精炼,准确,具体设计可参阅功能设计中的相关部分。
5.编码实现
//停车场.cpp:
定义控制台应用程序的入口点。
#include"stdafx.h"
#include"stdafx.h"
#include
#include
usingnamespacestd;
#defineMAX5//停车场车位数
typedefstruct
{
stringnum;
charstate;
}CAR;//定义每辆车的牌号
typedefstruct
{
CAR*stack[MAX+1];
inttop;
}STOPPING;//用栈定义,构造停车场
typedefstructcar
{
CAR*data;
structcar*next;
}QueueNode;//用队列结点定义,构造停车场外的单个等候车辆
typedefstructNode
{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;//用队列定义,构造停车场外的等候便道
voidInitStack(STOPPING*s)//堆栈初始化
{
s->top=0;
s->stack[s->top]=NULL;
}
intInitQueue(LinkQueueCar*Q)//队列初始化
{
Q->head=newQueueNode;
if(Q->head!
=NULL)
{
Q->head->next=NULL;
Q->rear=Q->head;
return1;
}
elsereturn-1;
}
voidPRINT(CAR*p,introom)//输出离开停车场的车辆情况
{
cout<<"离开车辆的车牌号为:
";
cout<num<cout<<"车辆"<num<<"已离开!
"<deletep;
}
intArrival(STOPPING*E,LinkQueueCar*W)
{
CAR*p;
QueueNode*t;
p=newCAR;
cout<<"********************************************************************"<cout<";
cin>>p->num;
if(E->top{
E->top++;
cout<num<<"的汽车在车场"<top<<"号停车位.";
cout<"<E->stack[E->top]=p;
return1;
}
else//如果车位已满,则停靠在便道上
{
cout<<"*********************************************************************"<cout<有车位时进入车场"<t=newQueueNode;
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
return1;
}
}
voidLeave(STOPPING*E,STOPPING*Temp,LinkQueueCar*W)
{
introom;
CAR*p,*t;
QueueNode*q;
if(E->top>0)
{
while
(1)
{
cout<<"*********************************************************************"<cout<top<<"/:
";
cin>>room;
if(room>=1&&room<=E->top)break;
}
while(E->top>room)//从停车场堆栈向中转堆栈移动车辆,直到要离开车辆的位置停止
{
Temp->top++;
cout<<"牌照为"<stack[E->top]->num<<"暂时离开车位"<Temp->stack[Temp->top]=E->stack[E->top];
E->stack[E->top]=NULL;
E->top--;
}
p=E->stack[E->top];
E->stack[E->top]=NULL;
E->top--;
PRINT(p,room);
while(Temp->top>=1)//将中转堆栈中的车辆移回停车场堆栈
{
E->top++;
E->stack[E->top]=Temp->stack[Temp->top];
cout<<"牌照为"<stack[Temp->top]->num<<"车回到"<top<<"号车位"<Temp->stack[Temp->top]=NULL;
Temp->top--;
}
if((W->head!
=W->rear)&&E->top{
q=W->head->next;
t=q->data;
E->top++;
cout<num<<"的车进入车场第";
cout<top<<"车位."<W->head->next=q->next;
if(q==W->rear)W->rear=W->head;
E->stack[E->top]=t;
deleteq;
}
elsecout<}
elsecout<}
voidList(STOPPING,LinkQueueCar);/*查看停车场内车辆情况及便道上车辆情况的函数声明*/
voidmain()
{
STOPPINGE,Temp;//初始栈,中转栈
LinkQueueCarWait;//便道队列
inta;
InitStack(&E);
InitStack(&Temp);
InitQueue(&Wait);//初始化
while
(1)
{
cout<<"※※※※※※※※※欢迎光临停车场!
※※※※※※※※※"<cout<<""<cout<<"车辆到达登记请按1"<cout<<"车辆离开登记请按2"<cout<<"车辆停靠查询请按3"<cout<<"退出系统请按4"<while
(1)
{
cout<<"请输入您需要的操作!
"<cin>>a;
if(a>=1&&a<=4)break;
elsecout<1~4.";
}
switch(a)
{
case1:
Arrival(&E,&Wait);break;//调用入停车场函数
case2:
Leave(&E,&Temp,&Wait);break;//调用出停车场函数
case3:
List(E,Wait);break;//调用查看函数
case4:
exit(0);
default:
break;
}
}
}
voidList1(STOPPING*S)//查看停车场内车辆情况的函数定义
{
inti;
if(S->top>0)
{
cout<<"********************************************************************"<cout<"<cout<for(i=1;i<=S->top;i++)
{
cout<
cout<<""<stack[i]->num<}
}
elsecout<cout<<"********************************************************************"<}
voidList2(LinkQueueCar*W)//查看便道上停靠车辆情况的函数定义
{
QueueNode*p;
p=W->head->next;
if(W->head!
=W->rear)
{
cout<<"********************************************************************"<cout<"<while(p!
=NULL)
{
cout<";
cout<data->num<p=p->next;
}
}
elsecout<cout<<"********************************************************************"<}
voidList(STOPPINGS,LinkQueueCarW)//车辆列表显示函数
{
intflag,tag;
flag=1;
while(flag)
{
cout<<"********************************************************************"<cout<<"车辆停靠查询开始:
"<cout<"<cout<<"1.车场列表"<while
(1)
{
cin>>tag;
if(tag>=1||tag<=3)break;
elsecout<cout<<"请选择1~3:
";
}
switch(tag)
{
case1:
List1(&S);
cout<<"车辆停靠查询结束!
"<case2:
List2(&W);
cout<<"车辆停靠查询结束!
"<case3:
flag=0;break;
default:
break;
}
}
cout<<"********************************************************************"<}
六.运行与测试
对于测试用的设计注重所定义的数据结构的边界以及各种数据结构共存的可能性。
例如:
1.连续有7辆车到来,牌照号分别为JF001,JF002,JF003,JF004,JF005,JF006,JF007,前5辆车应该进如停车位1~5车位,第6辆和第7辆应停到便道的1和2位置上。
2.1中的情况发生后,让牌照号为JF003的汽车从停车场开走,应显示JF005和JF004的让路动作和JF006从便道到停车位上的动作。
3.随时检查停车位和便道的状态,不应该出现停车位有空位而便道上还有车的情况。
4.其他正常操作的一般情况。
5.程序的容错性的测试,当按键输入错误时,是否有错误提示给用户,指导用户正确操作,并作出相应处理,保证程序的正常运行。
七.实验小结
通过本次实验我能够基本掌握栈和队列的基础知识,在对停车场的编写过程中了解了数据结构的应用,也在上机实践和对程序调试的同时提高了自己解决问题的能力。
在这段时间的上机实践中,我学会了很多,了解了如何编写算法,数据结构的基本知识等,可以说这次上机让我对课堂所学的知识有了更好的理解。
深刻的体会到了栈的“后进先出”及队列的“先进先出”的特点。
这次实验我受益匪浅,从开始的58个错误,到最后能调试成功,我深刻的体会到学好数据结构的重要性,和实验和理论的差距,我会继续努力学好这门课程,利用课余时间上机实现程序的编写和设计。