资源预览内容
第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
第9页 / 共15页
第10页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
数据结构课程设计停车场管理班级:姓名:学号:设计日期: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;
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号