数据结构课程设计停车场管理报告.docx_第1页
数据结构课程设计停车场管理报告.docx_第2页
数据结构课程设计停车场管理报告.docx_第3页
数据结构课程设计停车场管理报告.docx_第4页
数据结构课程设计停车场管理报告.docx_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构课程设计 停车场管理班级:姓名:学号:设计日期:2012年7月2日2012年7月11日1) 需求分析本次的数据结构课程设计所选的题目是停车场管理系统。根据题目要求,已知停车场是一个可停放n辆汽车的狭长通道,只有一个大门可供汽车出入,由此可将停车场的类型定义为栈,其容量为n。当停车场已经停满n辆车后,后来的车辆只能在便道上等待。当停车场内有车开走,便道上的第一辆汽车便可以进入停车场中。根据其先入先出的特点,可以将便道的类型定义为队列,容量不限。由题目可知,需停车辆的信息包括:车牌号码、汽车“到达”“离去”的信息、“到达”“离去”的时刻等。按照从终端读入的数据序列进行模拟管理。每辆车需要三个数据,其中车辆数据为:A表示到达,D表示离去,E表示程序结束。车辆牌照号码为整型数据,车辆到达或离开的时刻同样为整型数据。输入车辆到达应该输出的信息为:汽车在停车场内或便道上的停车位置;输入车辆离开应该输出的信息为汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。停车场管理系统主要实现以下几个功能: (1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。 (2)该程序设计能够通过车牌号能查到该车辆在停车场或便道中的位置。(3)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。实现停车场的调度功能。该程序设计可以完整的模拟停车场的管理过程。2) 概要设计停车场管理系统是充分利用数据结构中栈和队列的思想实现的,栈是一种只能在叫做栈的一段进行进栈或者出栈操作的线性数据结构。栈的主要特点是”后进先出”,即后进栈的元素先处理。停车场的容量即为栈的存储空间,停车场的车辆的停靠是无秩序的,因此采用链式存储的方式更适合,也方便车辆的调度。队列是限定仅能在表的一端进行插入,在表的另一端进行删除的线性表。队列中可以插入的一端称为队尾,可以删除的一端称为队首。把一个元素插入队列中的操作为进队,队列中删除一个元素的操作为出队。队列存取操作符合:先进先出。停车场的车辆到达停车和车辆的离开的管理方式就是采用队列的“先进先出”的移动的思想。停车场的入口就是队列的队首,停车场的出口就是队列的队尾。停车场管理系统流程图如图1所示。开闸关闸出口 入口 车辆过闸计时出队入队缴费 停车准备离场调度等待、图1 停车场管理系统流程图3.详细设计1.全局变量及编译预处理语句#define ERROR 0#define OK 1#define NULL 0int count=0; /队列是否为空的标志int times;stack s,temp; /初始化栈LinkQueue Q; /初始化队列2 车辆信息类型typedef struct nodeint passport; /存储车辆牌照信息int time; /存储进场时间信息node;3栈类型(停车场)typedef struct stacknode *base;node *top;int stacksize;stack;void initstack(stack &S,int n) /构造空栈S.base=(node *)malloc(n*sizeof(node);S.top=S.base;S.stacksize=n;void push(stack &S,node e) /入栈函数if(S.top-S.base)=S.stacksize)EnQueue(Q,e); /如果栈满,调用入队函数else S.top-passport=e.passport;S.top-time=e.time;S.top+;int pop(stack &S,node &e) /出栈函数if(S.top=S.base)return ERROR; /如果栈空,返回ERROR-S.top;e.passport=S.top-passport;e.time=S.top-time;return OK;4队列类型(便道)typedef struct Qnodenode Qdata;struct Qnode *next;Qnode;typedef struct Qnode *front;Qnode *rear;LinkQueue;void EnQueue(LinkQueue &Q,node e) /入队函数Qnode *q;q=(Qnode *)malloc(sizeof(Qnode);q-Qdata.passport=e.passport;q-Qdata.time=e.time;q-next=NULL;if(count=0)Q.front=q;count+; /若创建节点前队空,头指针指向节点Q.rear-next=q;Q.rear=q;void DeQueue(LinkQueue &Q,node &e) /出队函数if(Q.rear=NULL)else e.passport=Q.front-Qdata.passport;e.time=Q.front-Qdata.time;Q.front=Q.front-next;if(Q.front=NULL)Q.rear=Q.front;count=0;5主函数及其他函数的C+算法void main()int n,exit;float money;char info;int pass;Q.front=NULL ;Q.rear=(Qnode *)malloc(sizeof(Qnode);Q.rear-next=Q.rear;printf(欢迎使用停车场管理系统n本停车场容量为:);cinn;initstack(s,n);initstack(temp,n);printf(停车场费率为:);cinmoney;while(exit!=OK)printf(n请输入车辆数据nA到达 D离去 E结束:);cininfo;printf(请输入车辆牌照号码:);cinpass;if(info=A|info=E)printf(请输入车辆进场时间:);if(info=D)printf(请输入车辆离场时间:);cintimes;if(info=E)exit=OK;else if(info=A)int i,j;node a;a.passport=pass;a.time=times;push(s,a);for(i=1;inext;j+;printf(停车位置(便道):%dn,j);else if(info=D)node d;int tp,counter=0;docounter+;tp=pop(s,d);while(tp!=ERROR)if(d.passport=pass)float m;m=(times-d.time)*money;printf(停留时间:%d您需交费:%fn,times-d.time,m);while(temp.base!=temp.top)pop(temp,d);push(s,d);wait(s);d.passport=9999;tp=ERROR;elsepush(temp,d);d.passport=0;tp=ERROR;while(d.passport=0|countern);else if(info!=A&info!=D&info!=E)void wait(stack &S)if(S.top-S.base)=(S.stacksize-1)&count!=0)node temp;DeQueue(Q,temp);temp.time=times;push(S,temp);4.调试分析(1)一开始在调试程序时遇到了内存错误,经过DEBUG,找到了引起内存错误的原因:即在建立队头指针与队尾指针时没有对指针进行初始化(没有为指针动态分配空间)。问题得到解决。 (2)在Wait函数中的If语句处,一开始的算法有些问题,导致实现的功能与设想的有出入,无法得到正确的结果。原条件为: S.top-S.base=S.stacksize后改为: (S.top-S.base)=(S.stacksize-1)&count!=0 该函数的功能得以正确实现。(3)在EnQueue函数中,一开始用的是建立实体结点,用队头队尾指针指向该实体的方法来创建队列。在调试过程中发现,忽略了生存期,导致队列并没有被创建。改为创建指针,并为指针分配空间,再给头指针和尾指针赋值的方式解决问题。虽然指针也有生存期,但为它分配的空间却并没有被收回,于是队列创建成功,问题解决。 (4)本程序中:车辆到达,离去时的时间复杂度均为:O(n)。本程序空间复杂度为:O(n)。 (5)前面运行一切正常,但是最后无法结束退出。经调试后解决。5).用户手册1、运行程序进入停车场管理界面,首先输入停车场容量和停车场费率。2、然后根据车辆到达和离去的实际情况输入A或D。例如车辆到达输入A,然后输入车辆车牌号码及到达时刻。此时便会显示车辆停放的信息(在停车场内,当停车场停满后,车辆会停放在便道上)。3、车辆离开输入D,然后输入车辆号码及离开时刻。此时会显示离开车辆的停车时间以及应缴纳的费用。4、输入E结束本程序。6)测试结果测试数据:设n=2输入数据:2输出:停车场容量为:2停车场费率为:1.5元/分钟A,1,5 停车位置(停车场内):1A,2,10 停车位置(停车场内):2D,1,15 停留时间:10分钟 需交费:15.00元A,3,20 停车位置(停车场内):2A,4,25 停车位置(便道):1A,5,30 停车位置(便道):2D,2,35 停留时间:25分钟 需交费:37.50元D,4,40 停留时间:5分钟 需交费:7.50元E,0,07)附录(源程序代码)#include #include #include #include #define ERROR 0#define OK 1#define NULL 0typedef struct nodeint passport;int time;node;typedef struct stacknode *base;node *top;int stacksize;stack;typedef struct Qnodenode Qdata;struct Qnode *next;Qnode;typedef struct Qnode *front;Qnode *rear;LinkQueue;int count=0;int times;stack s,temp;LinkQueue Q;void initstack(stack &S,int n)S.base=(node *)malloc(n*sizeof(node);S.top=S.base;S.stacksize=n;void EnQueue(LinkQueue &Q,node e);void DeQueue(LinkQueue &Q,node &e);void push(stack &S,node e)if(S.top-S.base)=S.stacksize)EnQueue(Q,e);else S.top-passport=e.passport;S.top-time=e.time;S.top+;int pop(stack &S,node &e)if(S.top=S.base)return ERROR;-S.top;e.passport=S.top-passport;e.time=S.top-time;return OK;void wait(stack &S)if(S.top-S.base)=(S.stacksize-1)&count!=0)node temp;DeQueue(Q,temp);temp.time=times;push(S,temp);void EnQueue(LinkQueue &Q,node e)Qnode *q;q=(Qnode *)malloc(sizeof(Qnode);q-Qdata.passport=e.passport;q-Qdata.time=e.time;q-next=NULL;if(count=0)Q.front=q;count+;Q.rear-next=q;Q.rear=q;void DeQueue(LinkQueue &Q,node &e)if(Q.rear=NULL)else e.passport=Q.front-Qdata.passport;e.time=Q.front-Qdata.time;Q.front=Q.front-next;if(Q.front=NULL)Q.rear=Q.front;count=0;int main()int n,exit;float money;char info;int pass;Q.front=NULL;Q.rear=(Qnode *)malloc(sizeof(Qnode);Q.rear-next=Q.rear;printf(欢迎使用停车场管理系统n本停车场容量为:);cinn;initstack(s,n);initstack(temp,n);printf(停车场费率为:);cinmoney;while(exit!=OK)printf(n请输入车辆数据nA到达 D离去 E结束:);cininfo;if(info=E)retu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论