1、停车场管理系统哈尔滨理工大学课程设计(数据结构)题 目 停车场管理系统 班 级 学 号 姓 名 指导教师 系主任: 2013年03月08日一、设计内容与设计要求1设计内容:问题描述设停车场只是一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出,还有一个等停的的狭长通道。汽车在停车场内按车辆的先后顺序依次排列,若车站内已停满汽车,则后来的汽车只能在门外的通道上等停,一旦停车场内有车开走,则排在通道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车站为它让路,待该车辆开出大门,为它让路的车辆再按原来次序进入车场。在这里假设汽车不能从便道上开
2、走,试设计这样一个停车场模拟管理程序。基本功能(1) 车辆成批入站。当一个停车场刚开始投入运行的时候,会有很多车进来,因此,要设计一个函数来实现车辆批量进站。并要检测车辆的数目是否超过规定的最大容量,给出相关提示信息。(2)单个车辆入站。当系统正常投入运行后,会有零散的车辆进进出出,因此,设计一个函数实现单个车辆入站。(3)车站内信息实时显示。车站内信息包括两个部分:停车场内停放的车辆以及在外面通道上等停的车辆。(4)车辆出站。当停车场内车辆出站后,检查通道上是否有车等停,如果有,则要把排在最前面的车调入停车场内。2设计要求:1)设计正确,方案合理。2)界面友好,使用方便。3)程序精炼,结构清
3、晰。4)设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。5)实际操作过程中遇到的问题及解决方法:设计总结及心得体会。6)上机演示。二、进度安排目 录1 系统需求分析 11.1设计思想 11.2实现方法 12 总体设计 22.1总体设计图 22.2模块流程图 32.2.1:车辆成批入站 32.2.2:车站内信息显示 43 详细设计 53.1 采用结构体定义的相关数据类型 53.2 功能函数设计 64 系统测试及其结果 114.1 程序调试中的问题 114.2 结果截图 134.2.1:case1:车辆成批入站 134.2.2:case3:车辆出站 155 心得体会
4、166 附录 186.1源程序代码 181 系统需求分析1.1设计思想此停车场管理系统是在一个狭长的通道上的,而且只有一个大门可以供车辆进出,并且要实现停车场内某辆车要离开时,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场的功能,就可以设计两个堆栈,其中一个堆栈用来模拟停车场,另一个堆栈用来模拟临时停车场,该临时停车场用来存放当有车辆离开时,原来停车场内为其让路的车辆。至于当停车场已满时,需要停放车辆的通道可以用一个循环队列来实现。当停车场内开走一辆车时,通道上便有一辆车进入停车场,此时只需要改变通道上车辆结点的连接方式就可以了,使通道上第一辆车进
5、入停车场这个堆栈,并且使通道上原来的第二辆车成为通道上的第一辆车,此时只需将模拟通道的循环队列的头结点连到原来的第二辆车上就可以了。这个程序的关键是车辆的进站和出站操作,以及车场和通道之间的相互关系。由于车站是一个很窄的、一边开口的车道,先进后出,类似数据结构中的栈结构,故车场用栈这种数据结构来描述。外面的狭长的通道,先进先出,故可用队列结构来描述。考虑到车场和通道在整个程序中都要用到。故把这两个变量定义成全局变量。本程序中的数据对象是汽车,可以认为车牌号是每个元素的关键项,不能重复,和现实中一样,另外加了车主姓名这一数据项,为表简洁,其他相关信息如入场时间,车的类型,收取费率等,都不再考虑,
6、具体应用的时候可以方便地修改得到。1.2实现方法对于此停车场管理系统的实现,就是用两个堆栈来分别模拟停车场以及停车场内车辆为其它车辆让路时退出停车的临时停放地点。至于通道上车辆的停放则用一个循环队列来实现,此时,通道上车辆的离开或者进入停车场只需改变此循环队列上的结点而已。2 总体设计2.1总体设计图图2.1 功能模块图 运行程序到系统界面,接着系统界面就会出现让你能选择的功能:【1】车辆成批入站【2】单个车辆入站【3】车辆出站【4】车站内信息实时显示【5】相关功能设定【0】退出本系统2.2模块流程图2.2.1:车辆成批入站图2.2车辆成批入站流程图2.2.2:车站内信息显示图2.3停车场内信
7、息显示流程图3 详细设计3.1 采用结构体定义的相关数据类型前面提到,要用到栈和队列的操作。这里,由于一个车场的最大容量是一定的,且车场最多执行的操作是插入和删除操作,所以用顺序储存结构可以带来更大益处。为了防止队列中出现“假溢出”现象,这里采用了循环队列。在模拟汽车这个对象时,进行了简化处理,只取得最核心的两个数据项:车牌号和车主姓名。具体数据结构定义如下:首先定义maxsize为20:#define maxsize 20第二个再定义汽车的信息:车牌号num10和车主姓名name10:typedef struct carchar num10;char name10;Car;第三个定义汽车场的
8、结构,在这里我把它看成是一个栈,在这里定义栈的容量等信息:typedef struct Car datamaxsize; int n;/栈容量设定 int top;Stack;/顺序栈 用来存放汽车场内的车辆信息第四个定义通道的结构,在这里我把它看成是一个循环队列,在这里定义队列胡容量等信息:typedef struct Car datamaxsize; int n;/队列容量设定 int num;/当前通道上的车辆数 int front,rear;Queue;/循环队列 用来存放通道内的车辆信息3.2 功能函数设计(1)车辆成批入站void InitCarpark(void)/车辆成批入站此
9、函数也可以作为初始化车场的函数,因为一个车场刚开始投入运行的时候会有很多的车进来,这也是设计此函数最重要的一个原因。每行输入一个汽车信息,最后结束的时候输入“# #”即可。汽车信息中前面表示汽车的车牌号,后面表示车主姓名,中间用空格隔开。当输入汽车的数目超过规定的最大容量的时候(如果开始不设置最大容量,默认值为系统申请的最大值maxsize=20),自动检测条件,给出相关提示信息。程序如下:void InitCarpark(void)/车辆成批入站 char num8,*pnum,name10,*pname;Car pcar;pnum=num;pname=name;printf(nn请输入车子
10、的信息(包括车牌号和车主姓名(两者之间用空格隔开)(以# #这个符号结束):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车站已满!车辆已经入通道!n);if(InsertQueue(QCar,pcar)=-1)printf(n通道已满,进入通道失败!n);scanf(%s%s,pnum,pname);printf(这批汽车已经成功进入停车场n);getch();carmenu();(2
11、)单个车辆入站void InsertCar(void)/单个车辆入站当系统正常投入运行后,会有零散的车辆进进出出,如还用成批输入方式的话,将会带来一定的麻烦。此函数具有函数InitCarpark()几乎所有的功能,程序跟InitCarpark()这个差不多,同样先输入,然后再判断停车场是否满了,通道是否满了,最后执行结果,程序如下:void InsertCar(void)/单个车辆入站 char num10,*pnum,name10,*pname;Car pcar;pnum=num;pname=name;printf(nn请输入车子的信息(包括车牌号和车主姓名(两者之间用空格隔开):n);sc
12、anf(%s%s,pnum,pname);strcpy(pcar.num,pnum);strcpy(pcar.name,pname);if(Push(SCar,pcar)=-1)printf(n车站已满!车辆已经入通道!n);if(InsertQueue(QCar,pcar)=-1)printf(n通道已满,进入通道失败!n);getch();(3)车辆内信息显示函数void ShowCar(void)/车站内信息显示如果车场本身是空的,没有汽车,那么也就不存在查看汽车信息了。故本函数一开始进行合理性检查,如果条件不成立,拒绝执行显示信息操作,给出出错的信息后返回到主界面。前面提到,车站内信息
13、包括两部分:车场内停放的车辆,在外面通道上等停的车辆。因为通道上也不一定有车,程序输出车场内的所有汽车信息后,自动进行判断通道上是否有车辆。如果有车辆的话,继续输出停在通道上的车子信息。程序如下:void ShowCar(void)/车站内信息显示 int i,front,rear;if(SCar-top=-1) printf(nn这停车场是空的!n);getch();carmenu();printf(nn目前停车场的车有:n-车牌号-车主姓名n);for(i=0;itop+1;i+) printf( %-13s,SCar-datai.num);printf(%18sn,SCar-datai.
14、name);if(QCar-rear!=QCar-front)/通道内有车辆front=QCar-front;rear=QCar-rear;printf(n通道信息:n-车牌号-车主姓名n);while(front!=rear) printf( %-13s,QCar-datafront.num);printf(%18sn,QCar-datafront.name);front=(front+1)%QCar-n; (4)车辆出站函数void ExitCar(void)/车辆出站同上,首先进行和利息你给检查。这里的检查包括两个部分:车场非空且输入的车牌号在车场中。如果一切条件满足,则执行推车操作。最后,检查通道上是否有车辆等待。如果通道不为空,程序会自动把排在通道最前面的车调入车场内。其中,退车的算法过程如下:1 前面检测条件满足时,执行如下操作:由于车场很窄,当一辆车要出场时,排在它后面的车辆需要先出场,等要退出的车开走后,刚才为它让道的那些车再按原次序进入车场。不难看出,这里需要创建一个临时栈,用于保存让道车辆的信息。2 在前面的合理性检查中,已经定位到出场车辆所在位置,从栈顶开始,到所在位置前一个结束,车场内执行出栈操作,临时栈结构执行入栈操作。3 在当前位置执行出栈操作,即可实现指定的车辆出场。4
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1