停车场管理系统Word下载.docx
《停车场管理系统Word下载.docx》由会员分享,可在线阅读,更多相关《停车场管理系统Word下载.docx(26页珍藏版)》请在冰豆网上搜索。
并要检测车辆的数目是否超过规定的最大容量,给出相关提示信息。
(2)单个车辆入站。
当系统正常投入运行后,会有零散的车辆进进出出,因此,设计一个函数实现单个车辆入站。
(3)车站内信息实时显示。
车站内信息包括两个部分:
停车场内停放的车辆以及在外面通道上等停的车辆。
(4)车辆出站。
当停车场内车辆出站后,检查通道上是否有车等停,如果有,则要把排在最前面的车调入停车场内。
2.设计要求:
1).设计正确,方案合理。
2).界面友好,使用方便。
3).程序精炼,结构清晰。
4).设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。
5).实际操作过程中遇到的问题及解决方法:
设计总结及心得体会。
6).上机演示。
二、进度安排
目录
1系统需求分析1
1.1设计思想1
1.2实现方法1
2总体设计2
2.1总体设计图2
2.2模块流程图3
2.2.1:
车辆成批入站3
2.2.2:
车站内信息显示4
3详细设计5
3.1采用结构体定义的相关数据类型5
3.2功能函数设计6
4系统测试及其结果11
4.1程序调试中的问题11
4.2结果截图13
4.2.1:
case1:
车辆成批入站13
4.2.2:
case3:
车辆出站15
5心得体会16
6附录18
6.1源程序代码18
1系统需求分析
1.1设计思想
此停车场管理系统是在一个狭长的通道上的,而且只有一个大门可以供车辆进出,并且要实现停车场内某辆车要离开时,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场的功能,就可以设计两个堆栈,其中一个堆栈用来模拟停车场,另一个堆栈用来模拟临时停车场,该临时停车场用来存放当有车辆离开时,原来停车场内为其让路的车辆。
至于当停车场已满时,需要停放车辆的通道可以用一个循环队列来实现。
当停车场内开走一辆车时,通道上便有一辆车进入停车场,此时只需要改变通道上车辆结点的连接方式就可以了,使通道上第一辆车进入停车场这个堆栈,并且使通道上原来的第二辆车成为通道上的第一辆车,此时只需将模拟通道的循环队列的头结点连到原来的第二辆车上就可以了。
这个程序的关键是车辆的进站和出站操作,以及车场和通道之间的相互关系。
由于车站是一个很窄的、一边开口的车道,先进后出,类似数据结构中的栈结构,故车场用栈这种数据结构来描述。
外面的狭长的通道,先进先出,故可用队列结构来描述。
考虑到车场和通道在整个程序中都要用到。
故把这两个变量定义成全局变量。
本程序中的数据对象是汽车,可以认为车牌号是每个元素的关键项,不能重复,和现实中一样,另外加了车主姓名这一数据项,为表简洁,其他相关信息如入场时间,车的类型,收取费率等,都不再考虑,具体应用的时候可以方便地修改得到。
1.2实现方法
对于此停车场管理系统的实现,就是用两个堆栈来分别模拟停车场以及停车场内车辆为其它车辆让路时退出停车的临时停放地点。
至于通道上车辆的停放则用一个循环队列来实现,此时,通道上车辆的离开或者进入停车场只需改变此循环队列上的结点而已。
2总体设计
2.1总体设计图
图2.1功能模块图
运行程序到系统界面,接着系统界面就会出现让你能选择的功能:
【1】车辆成批入站
【2】单个车辆入站
【3】车辆出站
【4】车站内信息实时显示
【5】相关功能设定
【0】退出本系统
2.2模块流程图
车辆成批入站
图2.2车辆成批入站流程图
车站内信息显示
图2.3停车场内信息显示流程图
3详细设计
3.1采用结构体定义的相关数据类型
前面提到,要用到栈和队列的操作。
这里,由于一个车场的最大容量是一定的,且车场最多执行的操作是插入和删除操作,所以用顺序储存结构可以带来更大益处。
为了防止队列中出现“假溢出”现象,这里采用了循环队列。
在模拟汽车这个对象时,进行了简化处理,只取得最核心的两个数据项:
车牌号和车主姓名。
具体数据结构定义如下:
首先定义maxsize为20:
#definemaxsize20
第二个再定义汽车的信息:
车牌号num[10]和车主姓名name[10]:
typedefstructcar{
charnum[10];
charname[10];
}Car;
第三个定义汽车场的结构,在这里我把它看成是一个栈,在这里定义栈的容量等信息:
typedefstruct{
Cardata[maxsize];
intn;
//栈容量设定
inttop;
}Stack;
//顺序栈用来存放汽车场内的车辆信息
第四个定义通道的结构,在这里我把它看成是一个循环队列,在这里定义队列胡容量等信息:
//队列容量设定
intnum;
//当前通道上的车辆数
intfront,rear;
}Queue;
//循环队列用来存放通道内的车辆信息
3.2功能函数设计
(1)车辆成批入站voidInitCarpark(void)//车辆成批入站
此函数也可以作为初始化车场的函数,因为一个车场刚开始投入运行的时候会有很多的车进来,这也是设计此函数最重要的一个原因。
每行输入一个汽车信息,最后结束的时候输入“##”即可。
汽车信息中前面表示汽车的车牌号,后面表示车主姓名,中间用空格隔开。
当输入汽车的数目超过规定的最大容量的时候(如果开始不设置最大容量,默认值为系统申请的最大值maxsize=20),自动检测条件,给出相关提示信息。
程序如下:
voidInitCarpark(void)//车辆成批入站
{charnum[8],*pnum,name[10],*pname;
Carpcar;
pnum=num;
pname=name;
printf("
\n\n请输入车子的信息(包括车牌号和车主姓名(两者之间用空格隔开))(以'
##'
这个符号结束):
\n"
);
scanf("
%s%s"
pnum,pname);
while(strcmp(pnum,"
#"
)!
=0)
{strcpy(pcar.num,pnum);
strcpy(pcar.name,pname);
if(Push(SCar,pcar)==-1)
{printf("
\n车站已满!
车辆已经入通道!
if(InsertQueue(QCar,pcar)==-1)
\n通道已满,进入通道失败!
!
}
这批汽车已经成功进入停车场\n"
getch();
carmenu();
(2)单个车辆入站voidInsertCar(void)//单个车辆入站
当系统正常投入运行后,会有零散的车辆进进出出,如还用成批输入方式的话,将会带来一定的麻烦。
此函数具有函数InitCarpark()几乎所有的功能,程序跟InitCarpark()这个差不多,同样先输入,然后再判断停车场是否满了,通道是否满了,最后执行结果,程序如下:
voidInsertCar(void)//单个车辆入站
{charnum[10],*pnum,name[10],*pname;
\n\n请输入车子的信息(包括车牌号和车主姓名(两者之间用空格隔开)):
strcpy(pcar.num,pnum);
{printf("
(3)车辆内信息显示函数voidShowCar(void)//车站内信息显示
如果车场本身是空的,没有汽车,那么也就不存在查看汽车信息了。
故本函数一开始进行合理性检查,如果条件不成立,拒绝执行显示信息操作,给出出错的信息后返回到主界面。
前面提到,车站内信息包括两部分:
车场内停放的车辆,在外面通道上等停的车辆。
因为通道上也不一定有车,程序输出车场内的所有汽车信息后,自动进行判断通道上是否有车辆。
如果有车辆的话,继续输出停在通道上的车子信息。
voidShowCar(void)//车站内信息显示
{inti,front,rear;
if(SCar->
top==-1)
\n\n这停车场是空的!
\n\n目前停车场的车有:
\n---车牌号-----------车主姓名\n"
for(i=0;
i<
SCar->
top+1;
i++)
%-13s"
SCar->
data[i].num);
%18s\n"
data[i].name);
if(QCar->
rear!
=QCar->
front)//通道内有车辆
{front=QCar->
front;
rear=QCar->
rear;
\n通道信息:
\n---车牌号--------------车主姓名\n"
while(front!
=rear)
QCar->
data[front].num);
data[front].name);
front=(front+1)%QCar->
n;
}
(4)车辆出站函数voidExitCar(void)//车辆出站
同上,首先进行和利息你给检查。
这里的检查包括两个部分:
车场非空且输入的车牌号在车场中。
如果一切条件满足,则执行推车操作。
最后,检查通道上是否有车辆等待。
如果通道不为空,程序会自动把排在通道最前面的车调入车场内。
其中,退车的算法过程如下:
1前面检测条件满足时,执行如下操作:
由于车场很窄,当一辆车要出场时,排在它后面的车辆需要先出场,等要退出的车开走后,刚才为它让道的那些车再按原次序进入车场。
不难看出,这里需要创建一个临时栈,用于保存让道车辆的信息。
2在前面的合理性检查中,已经定位到出场车辆所在位置,从栈顶开始,到所在位置前一个结束,车场内执行出栈操作,临时栈结构执行入栈操作。
3在当前位置执行出栈操作,即可实现指定的车辆出场。
4