当前位置:文档之家› 停车场管理系统课程设计报告 最终版

停车场管理系统课程设计报告 最终版

目录1 实习目的 (1)2 问题描述 (1)3.1 设计基本要求 (1)3.2 停车场管理系统的主要功能 (2)4概要设计 (2)4.1设计思想 (2)4.2函数及功能要求 (3)5 详细设计 (4)5.1 数据结构的设计 (4)5.2 算法的设计思想及流程图 (5)5.2.1 主要函数的功能说明 (5)5.2.2 停车场管理系统流程图 (6)5.2.3 主要模块算法描述 (8)6 测试分析 (8)6.1 测试用例 (8)6.1.1 第一组测试用例 (8)6.1.2 第二组测试用例 (10)6.1.3 第三组测试用例 (11)6.2 测试结果分析 (12)7 使用说明 (12)8 总结 (13)参考文献 (15)附录 (16)停车场管理系统1 实习目的通过本次课程设计,了解并初步掌握设计、实现系统的完整过程,包括系统分析、编码设计、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。

2 问题描述停车场是一条可以停放n辆车的狭窄通道,且只有一个大门。

汽车停放安到达时间的先后依次由北向南排列(大门在最南端,最先到达的第一辆车停在最北端)若停车场已经停满n辆车,后来的汽车在便道上等候,一旦有车开走,排在便道上的第一辆车可以开入;当停车场的某辆车要离开时,停在他后面的车要先后退为他让路,等它开出后其他车在按照原次序开入车场,每两停在车场的车要安时间长短缴费。

3 需求分析停车场是一条可以停放n辆车的狭窄通道,且只有一个大门。

汽车停放按到达时间的先后排列。

若停车场已经停满n辆车,后来的汽车在便道上等候。

一旦有车开走,排在便道上的第一辆车可以开入;当停车场的某辆车要离开时,停在他后面的车要先后退为他让路。

等它开出后,其他车再按照原次序开入车场,每辆停在车场的车要按时间长短缴费。

3.1 设计基本要求(1) 以栈模拟停车场,以队列模拟车场外的便道,按照从终端输入的数据序列进行模拟管理。

每一组数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码、以及到达或离去的时刻。

对每一组数据进行操作后的信息为:若是车辆到达,则输出汽车在停车场的内或便道上的位置:若是车辆离去则输出汽车在停车场内的停留时间和应缴纳的费用(在便道上的停留时间不收费)。

栈以顺序结构实现,队列以链表结构实现。

(2) 友好性:界面要友好,输入有提示,尽量展示人性化。

(3) 可读性:源程序代码清晰、有层次,必要时给出注释。

(4) 健壮性:用户输入非法数据时,系统要及时给出警告信息。

(5) 测试数据:要求使用全部合法数据、整体非法数据、局部非法数据进行程序测试,以保证程序的稳定。

测试数据及测试结果请在上交的资料中写明。

3.2 停车场管理系统的主要功能(1) 根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。

(2) 该程序设计能够通过车牌号查到该车辆在停车场或便道中的位置。

(3) 当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。

实现停车场的调度功能。

该程序设计可以完整的模拟停车场的管理过程。

4概要设计4.1数据库设计(1)栈的抽象数据类型定义AST Stack{数据对象:D={ai|ai∈ElemSet,i=1,2,...,n, n≥0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,...,n}约定an端为栈顶,a1端为栈底。

基本操作:InitStack(&S)操作结果:构造一个空栈S。

DestroyStack(&S)初始条件:栈S已存在。

操作结果:栈S被销毁。

ClearStack(&S)初始条件:栈S已存在。

操作结果:将栈S清为空栈。

tackEmpty(S)初始条件:栈S已存在。

操作结果:若栈S为空栈,则返回TRUE,否则FALSE。

StackLength(s)初始条件:栈S已存在。

操作结果:返回S的元素个数,既栈的长度。

GetTop(S,&e)初始条件:栈S已存在且非空。

操作结果:用e返回S的栈顶元素。

Push(&S,e)初始条件:栈S已存在。

操作结果:插入元素e为新的栈顶元素。

Pop(&S,&e)初始条件:栈S已存在且非空。

操作结果:删除S的栈顶元素,并用e返回其值。

StackTraverse(S,visit())初始条件:栈S已存在且非空。

操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit()。

一旦visit()失败,则操作失效。

}ADT Stack(2)队列的抽象数据类型定义ADT Queue{数据对象:D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,...,n}约定其中a1端为队列头,an为队列尾。

基本操作:InitQueue(&Q)操作结果:构造一个空队列Q。

DestroyQueue(&Q)初始条件:队列Q已存在。

操作结果:队列Q被销毁,不再存在。

ClearQueue(&Q)初始条件:队列Q已存在。

操作结果:将Q清为空队列。

QueueEmpty(Q)初始条件:队列Q已存在。

操作结果:若Q为空队列,则返回TRUE,否则FALSE。

QueueLength(Q)初始条件:队列Q已存在。

操作结果:返回Q的元素个数,即队列的长度。

GetHead(Q,&e)初始条件:Q为非空队列。

操作结果:用e返回的队头元素。

EnQueue(&Q,e)初始条件:队列Q已存在。

操作结果:插入元素e为Q的新的队尾元素。

DeQueue(&Q,&e)初始条件:Q为非空队列。

操作结果:删除Q的队头元素,并用e返回其值。

QueueTraverse(Q,visit())初始条件:Q已存在且非空。

操作结果:从队头到队尾,依次对Q的每个数据元素调用函数visit()。

一旦visit()失败,则操作失败。

}ADT Queue4.2函数及功能要求(1)此停车场管理系统,主要分为以下若干模块:首先定义用来模拟停车场的堆栈以及用来模拟通道的链队列为全局变量,然后编写主函数,在此主函数中实现对其它各个模块的调用。

在主函数中首先调用option()函数,出现欢迎用户使用的主界面,然后提示用户进入此停车场管理系统后,再出现一个供用户选择的界面,在用户的选择过程中,程序又分别调用车辆的到达、车辆的离开、停车场内停放车辆的信息以及退出程序这四个函数模块。

其中,在车辆的离开那个模块函数中又调用了打印离开车辆信息的函数,在停车场内停放车辆信息的那个模块函数中,又分别调用了显示停车场上车辆信息的函数以及显示便道上车辆信息的函数。

最后,从调用的这四个函数中回到主函数结束整个程序的运行。

(2)在以上各个模块中,出现的调用的函数为:void InitStack(SeqStackCar *s);int InitQueue(LinkQueueCar *Q);option();int Arrival(SeqStackCar *Enter,LinkQueueCar *W);void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W);void PRINT(CarNode *p);void List(SeqStackCar S,LinkQueueCar W);void List1(SeqStackCar *S);void List2(LinkQueueCar *W);5 详细设计5.1 数据结构的设计程序中使用了一个类,五个结构体,两个栈(模拟停车场,其中一个为临时栈),一个队列(模拟便道)。

(1)车辆信息的表示车辆可看成是一个节点,设计成一个结构体,车辆信息包括:车牌号码,车辆的进站时间和离开停车场的时间,定义如下:typedef struct node{char num[10]; //车牌号码Time reach; //到站时间Time leave; //离开时间}CarNode;(2)时间、栈和队列的定义时间是由小时和分钟表示的,有两部分数据,设计两个变量分别存储小时和分钟,定义如下:typedef struct time{int hour;int min;}Time;停车场内用栈表示:typedef struct NODE{CarNode *stack[MAX+1]; //栈用顺序表示 int top;}SeqStackCar;SeqStackCar Enter,Temp; InitStack(&Temp)在车辆离开时,应用temp临时栈把将要离开的车辆后续车辆压入,等车辆离开后压回原栈stack。

便道上的车辆表示:typedef struct car{CarNode *data; // 便道上的车用链表表示struct car *next;}QueueNode;typedef struct Node{QueueNode *head;//设置头指针、尾指针QueueNode *rear;}LinkQueueCar;5.2 算法的设计思想及流程图5.2.1 主要函数的功能说明(1)void InitStack(SeqStackCar *);//车辆节点进栈。

即当栈未满时,就把到达的车辆进栈。

(2)int InitQueue(LinkQueueCar *);//车辆节点进队列。

即当栈已满时,车辆就进入便道上的队列中(3)int Arrival(SeqStackCar *,LinkQueueCar *);//车辆到达登记。

即车辆到达时,先登记车辆车牌号码。

然后再判断停车场有没有停满,没停满就进栈,停满了就停在便道上,即进队列。

(4)void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *);//车辆离开处理。

即通过输入离开车辆的位置处理,然后调用PRINT(CarNode *p,int room);函数进行收费。

然后再判断便道上有没有车,如果有,就把便道上的车进停车场内。

(5)void List(SeqStackCar,LinkQueueCar);//显示车场内和便道上的车辆情况。

利用switch();函数选择显示车场内或是便道上的车辆情况,包括对下面两个子函数的调用: void List1(SeqStackCar *S);void List2(LinkQueueCar *W);//分别用来显示车场和便道上的车辆情况(6)void PRINT(CarNode *p,int room);//车辆离开时的收费。

即这个函数由车辆离开的函数调用,以分钟计时算费,但只能计算当天之内的费用,如果第二天的话会导致计费为负或减少。

相关主题