《停车场管理系统说明书(共27页).doc》由会员分享,可在线阅读,更多相关《停车场管理系统说明书(共27页).doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上 中 北 大 学课程设计说明书学 院、系:软件学院专 业:软件工程班 级:学 生 姓 名:学 号:设 计 题 目:停车场管理系统 起 迄 日 期: 2016年12月16日2016年12月29日指 导 教 师:日期: 2016年12月29日一 设计目的数据结构课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的:n了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;1. 初步掌握软件开发过程的问题分析、系统设计、程
2、序编码、测试等基本方法和技能;2. 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;3. 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。二 任务概述 2.1、问题描述 设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其
3、开出停车场后,这些车辆在依原来的次序进场。每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。 2.2、目的具有操作简单、使用方便、功能先进等特点,停车场使用者可以在最短的时间进入或离开停车场,从而提高停车场的管理水平,取得更高的经济效益和良好的社会效益。位于停车通道处等候车位的用户能快速找到车位。用户取车离开时能安全有序的离开。同时辅以智能化设备和完善的管理软件来简化人的劳动,实现停车场车辆进入、场内监控以及计费收费等全过程的完全无人化管理;另一方面通
4、过网络化管理实现能够在一个相对广阔的地域内(例如一个城市)了解多个停车场情况,提前了解停车情况,最终实现“随意”停车。 2.3、系统(或用户)特点 停车场管理系统利用现代科技技术管理车辆,提高了车辆管理的高效性、实用性、安全性、可靠性和车辆自动化管理的能力。有效的减少了人工的参与,从而最大限度的减少了人员费用以及由人员失误或人员舞弊造成的损失,大大提高整个停车场的经济性、安全性与使用效率。 2.4、基本要求以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据列:汽车“到达”或“离去”信息,汽车牌照号码以及到达或离去的时刻。对每一组输入数据
5、进行操作后的输出信息为:在停车场内停留的时间和应缴纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。3 模块划分退出管理系统停车场管理系统到达停车场停车场存放情况离开停车场 图3.1 停车场管理系统主菜单车辆到达停车场录入车辆信息打印车辆信息停车场已满,车辆停入便道车辆正常驶入停车场图3.2 车辆到达停车场车辆离开停车场输入离开车辆信息计算费用并提示车辆取出未在停车场内,车辆驶出便道车辆正常驶出停车场图3.3 车辆离开停车场停车场车辆存放情况打印停车场车辆存放情况图3.4 停车场车辆存放情况4 主要函数说明及其N-S图 .主函数(1) 主函数的主要流程。1) 初始化栈
6、和队列,定义变量和指针。2) 根据用户的输入,调用相关的处理函数。(2) 函数说明。1) 函数原型:int main();2) 功能:主函数。3) 返回值:有。(3) 主函数N-S图。开始初始化栈、队列,定义变量、指针用户输入菜单选择数字T 是否是1? F车辆驶入 T 是否是2? F 车辆驶离 打印停车场 情况F 判断是否是数字1、2、3? T图4.1 主函数N-S图.主菜单模块(1) 主要流程1) 输入3个菜单项(退出、车辆到达、车辆离开)。2) 循环等待用户输入菜单项。3) 如果用户输入在02之间,返回菜单号。(2) 功能:显示主菜单. 车辆到达模块 主要流程。 1) 输入2个停放车辆的信
7、息(车牌号、车辆到达时间)。2) 判断停车场是否已满。3) 如果停车场未满,打印车辆的车牌号、存车时间、停车位置。4) 如果停车场已满,车辆停放于便道,打印车辆的车牌号、存车时间、停车位置。. 车辆离开模块 主要流程。 1) 输入2个驶离车辆的信息(车牌号、车辆驶离时间)。2) 判断停车场是否为空。3) 如果停车场为空,提示用户停车场未停放车辆。4) 如果停车场不为空,且不为满,根据车牌号查找车辆,如果存在,计算停车所用费用,打印车辆信息,该车辆驶离停车场,让便道上的第一辆车辆驶入停车场;如果不存在,提示用户车辆未在停车场停放。5) 如果停车场已满,根据车牌号查找车辆,如果停车场内部不存在,继
8、续在便道查询, 如果存在于便道上,直接驶离便道即可;如果存在于停车场内,计算停车所用费 用,打印车辆信息,该车辆驶离停车场,让便道上的第一辆车辆驶入停车场。. 停车场车辆停放情况 主要流程。 1) 输入该命令所对应的选择(3)。2) 打印停车场的车位的停放情况。. 设计中用到的一些函数定义(栈、队列的定义)。设定链式栈的抽象数据类型为:InitStack(&S)操作结果:构造一个空栈S。DestroyStack(&S)初始条件:栈S已经存在。操作结果:销毁栈S。ClearStack(&S)初始条件:栈S已经存在。操作结果:将S清空为空栈。StackLength(&S)初始条件:栈S已经存在。操
9、作结果:返回栈S的长度。StackEmpty(&S)初始条件:栈S已经存在。操作结果:若S为空栈,则返回TURE,否则返回FALSE。GetTop(S,&e)初始条件:栈S已经存在。操作结果:若栈S不空,则以e返回栈顶元素。Push(&S,e)初始条件:栈S已经存在。操作结果:在栈S的栈顶插入新的栈顶元素e。Pop(&S,&e)初始条件:栈S已经存在。操作结果:删除S的栈顶元素,并以e返回其值。StackTraverse(S,visit()初始条件:栈S已经存在。操作结果:从栈底到栈顶一次对S中的每个元素调用函数visit()。ADT stack设定链式队列的抽象数据类型为:typedef s
10、truct QnodeQelemType data;Struct Qnode *next;Qnode,*QueuePtr;typedef structQueuePtr front;QueuePtr teat;ADT Queue数据对象:D=ai|aiElemSet,i=1,2,n,n=0数据关系:R1=/ai-1,aiD,i=2,n约定其中一端为队列头,一端为队列尾。基本操作InitQueue(&Q)操作结果:构造一个空队列Q。DestroyQueue(&Q)初始条件:队列Q已经存在。操作结果:队列Q被销毁,不再存在。ClearQueue(&Q)初始条件:队列Q已经存在。操作结果:将Q清空为空
11、队列。QueueLength(Q)初始条件:队列Q已经存在。操作结果:返回Q的元素个数,即队列的长度。QueueEmpty(Q)初始条件:队列Q已经存在。操作结果:若Q为空队列,则返回TURE,否则返回FALSE。GetHead(Q,&e)初始条件:Q为非空队列。操作结果:用e返回Q队列头元素。EnQueue(&Q,e)初始条件:队列Q已经存在。操作结果:插入元素e为Q的新队尾元素。DeQueue(&Q,&e)初始条件:Q为非空队列。操作结果:删除Q的队头元素,并以e返回其值。QueueTraverse(Q,visit()初始条件:队列Q已经存在。操作结果:从队头到队尾,依次对Q的每一个数据元
12、素调用函数visit()。一旦visit()失败,则操作失败。ADT Queue. 总的程序设计流程图初始化两个栈Stack和Stack2及一个队列Queue开始进入主菜单结束队列中元素进栈车到达车离开列表显示退出车场内信息便道信息退出列表显示让前方车辆进入临时栈对车量进行计费元素进栈Stack栈Stack元素出栈元素进队列Queue队列Queue中元素出队便道车进车场判断便道是否有车判断栈是否为满车场是否为空图4.1 停车场管理系统流程图5 程序运行数据及其结果 1.主界面:四个选项(到达、离开、显示停车场信息和退出程序)2.选择数字1后,点击回车,界面会提示请输入车牌号和车辆进站时间。然后
13、点击回车,显示车辆停放信息,并再次显示主界面,然用户输入要选择的数字。3.输入多辆车辆的信息,然后通过主界面的第1个选项,如果车辆信息多于停车场的车辆位置,便提示停车场已满,可以把车辆免费停放到便道上。4.在主界面上输入3,然后显示停车场里面停放的所有车辆信息,如果因车辆过多而停放于便道的车辆,则不会显示。5.在主界面选择数字2后,界面会提示用户输入车辆的车牌号和车辆离开时间,如果车辆在停车场内,系统会自动提示出车辆的信息,并计算出车辆应该缴纳的费用,并提示让便道上停放的第一辆车进入停车场。如果起初就停放于便道上,则输入车辆的车牌号和车辆的离开时间后,界面会提示您的车辆停放于便道上,本次停车免
14、费。6 课程设计心得通过本次课程设计,发现了许多原来自己并不知道的问题,巩固了许多以前学过的知识以及新学了许多技能,总之,这次课程设计收获颇丰。在本次课程设计刚刚开始时,由于设计的是一个综合性比较强的程序,所以显得有点不知所措,但在查找了部分资料和询问了周围的老师同学后,渐渐的对这个题目有了些许眉目,最终将题目分解成了一个个小模块,再通过这几周的努力,终于做出了这个不是特别完善的程序。在这次课程设计中,遇到了很多问题,也犯了很多错误,尤其是在文件这方面,自己掌握的还是很不熟练,走了很多弯路。所以今后应该加强这方面的练习,争取能够熟练的运用这方面知识,不过再最后做出这个程序时,还是很有成就感的,
15、相信自己以后肯定会对C语言更加感兴趣,会更努力的去学习!附录:/停车场管理系统 #include#include#define OVERFLOW 0#define ERROR 0#define OK 1#define STACKSIZE 2 /车库容量 /时间节点typedef struct timeint hour;int min;Time; /车辆信息typedef structchar CarNum;float time; int pos_a; /车在停车场中的位置 int pos_b; /车在便道上的位置 int flag;Car,Car2;/车库信息 (顺序栈)typedef str
16、uctCar *top;Car *base;int stacksize;SqStack; /初始化 int InitStack(SqStack &S)S.base=new CarSTACKSIZE; if(!S.base) exit(OVERFLOW);S.top=S.base;S.stacksize=STACKSIZE;return OK;/判空 int StackEmpty(SqStack S)if(S.top=S.base) return OK;elsereturn ERROR;/判满int StackFull(SqStack S)if(S.top-S.base=S.stacksize)
17、 return OK;elsereturn ERROR; /入栈int Push(SqStack &S,Car e)if(S.top-S.base=S.stacksize) return ERROR;*S.top+=e;return OK; /出栈int Pop(SqStack &S,Car &e)if(S.top=S.base) return ERROR;e=*-S.top; return OK; /遍历栈int StackTraverse(SqStack S) Car *p=S.top; Car *q=S.base;int l=1;if(StackEmpty(S)for(int j=1;j
18、next=NULL;return OK; /进队int EnQueue(LinkQueue &Q,Car e)QueuePtr p;p=new QNode;p-data=e;p-next=NULL;Q.rear-next=p;Q.rear=p;return OK; /判空int QueueEmpty(LinkQueue Q)if(Q.front=Q.rear) return OK;else return ERROR; /出队 int DeQueue(LinkQueue &Q,Car &e)QueuePtr p;if(Q.front=Q.rear) return ERROR;p=Q.front-
19、next;e=p-data;Q.front-next=p-next;delete p;return OK; /主函数 int main()int i=1;int j=1; int status;float time,money;LinkQueue Q;Car car_I,car_D,car_M;SqStack S;SqStack2 S2; InitStack(S); InitStack2(S2);InitQueue(Q);while(1)printf(ttt欢迎来到XXX停车场!n); printf(*n);printf(ttt1-车辆到达停车场n); printf(ttt2-车辆离开停车场n
20、); printf(ttt3-停车场存放车辆情况n); printf(ttt0-退出程序n);printf(*n);printf(选择(0-3):n); scanf(%d,&status) ;if(status=1)printf(t请输入车牌号:);scanf(%d,&car_I.CarNum);printf(t请输入车到达的时间:);scanf(%f,&car_I.time);if(!StackFull(S)Push(S,car_I); /车进入车库 car_I.pos_a=i;car_I.flag=1;i=i+1;for(int m=1;m50;m+) /边线 printf(-);prin
21、tf(n);printf(t车牌号:);printf(%d,car_I.CarNum);printf(t到达时间:);printf(%5.1ft,car_I.time); printf(t车库中的位置是:%dn,car_I.pos_a);for(int m=1;m50;m+) /边线 printf(-);printf(n);printf(n);printf(n);elseEnQueue(Q,car_I);car_I.pos_b=j;car_I.flag=0; /+j;printf(n); printf(tSorry!我们的车库已满!,您可以把车!免费!停在车道上!n);printf(n);fo
22、r(int m=1;m50;m+) /边线 printf(.);printf(n);printf(t车牌号:);printf(%d,car_I.CarNum);printf(t便道上的位置为:%dn,car_I.pos_b); for(int m=1;m=STACKSIZE)printf(您的车停在便道上,所以免费!); printf(n);printf(n);printf(n); /ifelsedo /挡在前面的车给要出去的车让路 Pop(S,car_M); /加一个判断,判断是不是停车场里的车 if(car_D.CarNum!=car_M.CarNum)Push2(S2,car_M);el
23、secar_I.time=car_M.time;while(car_D.CarNum!=car_M.CarNum);while(!StackEmpty2(S2)/让路的车返回去 Pop2(S2,car_M); Push(S,car_M);while(!QueueEmpty(Q)&!StackFull(S) if(!StackFull(S)DeQueue(Q,car_M); /便道上的车离开后进入停车场,那么后面的车的位置都得变。car_M.flag=1; Push(S,car_M);printf(车牌为%d的车离开车库,车道上车牌为%d的车进入车库n,car_D.CarNum,car_M.Ca
24、rNum); time=car_D.time-car_I.time;if(time0.0&time=3.0)money=time*4;else money=time*6;printf(你的车牌为%d的车,应收费%5.2f元。,car_D.CarNum,money);printf(欢迎下次光临我们的车库n);printf(n);printf(n);printf(n); else if(status=3) /指令为 3 ;查看车库停车情况; StackTraverse(S);else if(status!=1&status!=2&status!=3&status!=0)printf(t指令错误! 请在下面重新输入:); else if(status=0)break; 专心-专注-专业