数据结构设计方案报告停车场管理系统.docx
- 文档编号:28668179
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:25
- 大小:26.83KB
数据结构设计方案报告停车场管理系统.docx
《数据结构设计方案报告停车场管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构设计方案报告停车场管理系统.docx(25页珍藏版)》请在冰豆网上搜索。
数据结构设计方案报告停车场管理系统
数据结构课程设计报告
题目汽车场停车管理系统程序
班级软件技术2班
姓名梁瑞瑞
学号1032104220
停车场管理系统
1问题描述
设停车场是一个可停放n辆汽车的狭长通道,且只有一个门可供出入。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆汽车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原顺序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
2需求分析
(1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。
(2)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。
实现停车场的调度功能。
(3)用顺序栈来表示停车场,链队表示停车场外的便道。
(4)显示停车场信息和便道信息。
(5)程序执行的命令为:
车辆进入停车场
车辆离开停车场
显示停车场的信息。
(以栈S作为停车场,栈S1作为让路的临时停车点,队列Q作为车等待时用的便道。
stack[Max+1]作为车场能够容纳的车辆数,num[10]作为车所在位置的编号,并且限定车场最多能够容纳10辆车.
(2).用户根据系统所规定并提示的要求输入有关内容,车场所能容纳的车辆数由收费人员来确定,车辆离开时,车主还可以得到收据,便于收费的管理使用;并且系统程序所提供的一些信息可通过特殊硬件显示出来,供车主了解信息,准确有效的停车。
(3).程序应该能够显示当前存车信息以及等待车的信息,便于管理人员对车辆进行管理,并且能够给等待的车提供一些信息,便于他们能够及时的停车。
(4).程序执行的命令为:
输入进站信息->输入出站信息->打印收据
(5).改程序系简单的用于运用栈与队列基本知识的工具,不能用于现实中,特别是栈“先进后出”的规则大大限定了该程序的推广,现实世界的车站管理系统比这个远远复杂的多。
二.概要设计:
1.设定栈的抽象数据类型定义为:
ADTstack{
数据对象:
D={ai|ai∈charset,i=1,2,……,n,n>=0}
数据关系:
R1={
基本操作:
InitStack(&S)
操作结果:
构造一个空栈S。
Push(&S,e)
初始条件:
栈S已经存在。
操作结果:
在栈S的栈顶插入新的栈顶元素e。
Pop(&S,&e)
初始条件:
栈S已经存在。
操作结果:
删除S的栈顶元素,并以e返回其值。
StackTraverse(S,visit())
初始条件:
栈S已经存在。
操作结果:
从栈底到栈顶依次对S中的每一个元素调用函数visit().
}ADTstack
2.设定队列的抽象数据类型定义为:
数据对象:
D={ai|ai∈Elemset,i=1,2,……,n,n>=0}
数据关系:
R1={
约定其中ai为队列头,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返回Q的对头元素.
EnQueue(&Q,e)
初始条件:
队列Q已存在.
操作结果:
插入元素e为Q新的队尾元素.
DeQueue(&Q,&e)
初始条件:
Q为非空队列.
操作结果:
删除Q的队头元素,并用e返回其值.
QueueTraverse(Q,visit())
初始条件:
Q已存在且非空.
操作结果:
从队头到队尾,依次对Q的每一个数据元素调用函数visit().一旦visit()失败,则操作失败.
}ADTQueue
3.本程序包括四个模块
1)主程序模块
Voidmain()
{
声明定义
调用栈与队列的函数
主信息(输入初始操作信息)
}
2)栈模块---实现栈抽象数据类型
3)队列模块---实现队列抽象数据类型
4)结构体模块---用于对对象及变量的管理
各模块之间的调用关系如下:
主程序模块
↓
结构体模块
↓
栈模块
↓
队列模块
4.设计停车管理程序的要求
按照从终端读入的输入数据进行模拟管理,每一组输入数据包括三个数据项:
汽车“进站”或“出站”信息、汽车牌照号码以及进站或出站的时刻,对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内逗留的时间和应交纳的费用(在便道上停留不收费),按以顺序结构实现,队列以链表结构实现。
三.详细设计:
1.时间结点类型
typedefstructtime{
inthour。
intmin。
}Time。
/*时间结点*/
2.车辆进出站信息类型
typedefstructnode{
charnum[10]。
Timereach。
Timeleave。
}CarNode。
/*车辆信息结点*/
3.停车场和便道信息类型
typedefstructNODE{
CarNode*stack[Max+1]。
inttop。
}SeqStackCar。
/*模拟车站*/
typedefstructcar{
CarNode*data。
structcar*next。
}QueueNode。
typedefstructNode{
QueueNode*head。
QueueNode*rear。
}LinkQueueCar。
/*模拟通道*/
voidInitStack(SeqStackCar*,intn)。
/*声明栈*/
//初始化,创建两个新栈S,S1
intInitQueue(LinkQueueCar*)。
/*声明便道*/
//初始化,创建一个队列Q用于便道
intArrival(SeqStackCar*,LinkQueueCar*,intn)。
/*车辆进站*/
voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*,intn)。
/*车辆出站*/
voidList(SeqStackCar,LinkQueueCar)。
/*显示存车信息*/
voidInitStack(SeqStackCar*s,intn)/*初始化栈*/
4.主函数和其它函数的伪码算法
voidmain()
{//主程序
initialization()。
//初始化
while
(1){
scanf(...................)。
//根据提示信息输入想要的操作
switch(k){//根据输入的数调用不同的函数
case1:
case2:
....................
}
}
}
typedefstruct**{
//用于创建不同结构体类型的指针与变量
}
voidPRINT(CarNode*p){
//调用输出函数
Leave(*p,n)...................
根据求解时间值来求得费用,并通过收据打印出来
}
5.主要函数思想
本程序是个简单的栈与队列的应用程序,其所用的函数也是栈与队列的基本函数,但在编写函数时应特别注意它的面向对象性与窗口化设计,切身为使用者着想.所以在运用一些函数时调用的基本语句有太多的重复,其目的在于实现它本来的基本目的.
四.调试分析:
1.本次作业比较简单,只是栈与队列的复习应用,所以总的调试比较顺利,只是在调用栈与队列的函数时遇到一些问题,比如我想通过键盘输入来确定停车场的停车数,所以初始化时那些操作函数必须带有停车数这个参数。
2.在定义栈的元素最大空间时如果使用顺序栈必须先给它赋初值,但如果通过链表就可以实现动态分配内存,为栈动态开辟新空间。
3.在判断键盘输入是否符合要求时,如果不符合要求应循环赋值,直到符合要求为止,在此利用的do-while循环语句与外部while语句套用时应使用两次break语句,才能跳出循环,否则会造成死循环。
4.经验体会:
通过DEBUG调试器和数据观察窗口,可以加快找到程序中的疵点。
五.软件使用说明书:
本系统为存车信息管理软件,能实现车场存车及便道存车信息的输入,输出,查找等功能,并建立和更新的存车费用信息保存于文件输出或打印。
对于查找等功能能够按存车位置及车牌号分别进行。
每辆车的相关信息包括:
车牌号,进站时间,出站时间,存车位置,停车费用等。
本系统功能还需完善,操作简单,只是供学习之用,并不能作为实际生活使用。
下面介绍了此软件的使用说明:
1.停车场.exe;
2.进入演示系统后首先是一个用户及管理员使用注意事项界面,进入后会出现菜单选项。
1.车辆进站2.车辆出站3.存车信息4.离开系统
请选择:
1|2|3|4.
这时可按照提示进行你想要的操作。
3.对于1-4的具体操作与内容请详见前面的调试分析,您便可以轻松操作了!
六.总结:
经过这次课程设计,通过对程序的编制,调试和运行,使我更好的掌握了栈和队列基本性质和有关它们之间关系使用问题的解决方法,熟悉了各种调用的数据类型,在调试和运行过程中使我更加的了解和熟悉程序运行的环境,提高了我对程序调试分析的能力和对错误的纠正能力。
这次数据结构的程序设计,对于我来说是一个挑战。
我对数据结构的学习在程序的设计中也有所体现。
课程设计是培养学生综合运用所学知识、发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。
七.附录
所用到的库函数:
Stdio.h/*标准输入/输出头文件*/
String.h/*包含字符串处理函数头文件*/
Stdlib.h/*包含动态存储与释放函数头文件*/
Malloc.h/*包含内存分配头文件*/
该停车场管理系统的主要程序如下:
/*停车场管理系统*/
#include
#include
#include
#include
/*------------------------------------------------------------------------------*/
#defineMax10
intgetn()
{
intn。
printf("欢迎您光临顺风停车场,")。
printf("本停车场管理实行24小时制,停车每分钟0.1元.\n")。
printf("请输入停车场可容纳的车(最多10辆):
")。
scanf("%d",&n)。
fflush(stdin)。
do{
if(n<1||n>10)
{
printf("输入的车辆数不在要求范围内,请重新输入!
")。
scanf("%d",&n)。
fflush(stdin)。
}
elsebreak。
}while(n<1||n>10)。
returnn。
}
typedefstructtime{
inthour。
intmin。
}Time。
/*时间结点*/
typedefstructnode{
charnum[10]。
Timereach。
Timeleave。
}CarNode。
/*车辆信息结点*/
typedefstructNODE{
CarNode*stack[Max+1]。
inttop。
}SeqStackCar。
/*模拟车站*/
typedefstructcar{
CarNode*data。
structcar*next。
}QueueNode。
typedefstructNode{
QueueNode*head。
QueueNode*rear。
}LinkQueueCar。
/*模拟通道*/
voidInitStack(SeqStackCar*,intn)。
/*声明栈*/
intInitQueue(LinkQueueCar*)。
/*声明便道*/
intArrival(SeqStackCar*,LinkQueueCar*,intn)。
/*车辆进站*/
voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*,intn)。
/*车辆出站*/
voidList(SeqStackCar,LinkQueueCar)。
/*显示存车信息*/
voidInitStack(SeqStackCar*s,intn)/*初始化栈*/
{
inti。
s->top=0。
for(i=0。
i<=n。
i++)
s->stack[s->top]=NULL。
}
intInitQueue(LinkQueueCar*Q)/*初始化便道*/
{
Q->head=(QueueNode*)malloc(sizeof(QueueNode))。
if(Q->head!
=NULL)
{
Q->head->next=NULL。
Q->rear=Q->head。
return
(1)。
}
elsereturn(-1)。
}
voidPRINT(CarNode*p)/*打印出站车的信息*/
{
intA1,A2,B1,B2。
inta,b,c。
printf("\n请输入离开的时间:
/**:
**/")。
scanf("%d:
%d",&(p->leave.hour),&(p->leave.min))。
fflush(stdin)。
do{
if(p->leave.hour
{
printf("输入离开时间比进站时间早,请重新输入!
\n")。
scanf("%d:
%d",&(p->leave.hour),&(p->leave.min))。
fflush(stdin)。
}
if(p->leave.hour<0||p->leave.hour>=24||p->leave.min<0||p->leave.min>=60)
{
printf("输入的时间格式有错,请重新输入!
")。
scanf("%d:
%d",&(p->leave.hour),&(p->leave.min))。
fflush(stdin)。
}
elsebreak。
}while(p->leave.hour
printf("车场现在有一辆车离开,请便道里的第一辆车进入车场!
\n")。
printf("出站的车的车牌号为:
")。
puts(p->num)。
printf("\n")。
A1=p->reach.hour。
A2=p->reach.min。
B1=p->leave.hour。
B2=p->leave.min。
a=(B1-A1)*60+B2-A2。
if(a>=60)
{
b=a/60。
c=a-60*b。
}
else
{
b=0。
c=a。
}
printf("祝您一路顺风,欢迎您下次光临.")。
printf("\n收据\n")。
printf("==================================车牌号:
")。
puts(p->num)。
printf("\n")。
printf("===================================================\n")。
printf("|进车场时刻|出车场时刻|停留时间|应付(元)|\n")。
printf("====================================================\n")。
printf("|%d:
%d",p->reach.hour,p->reach.min)。
printf("|%d:
%d",p->leave.hour,p->leave.min)。
printf("|%d:
%d",b,c)。
printf("|%2.1f",0.1*a)。
printf("|\n")。
printf("-----------------------------------------------------\n")。
free(p)。
}
intArrival(SeqStackCar*Enter,LinkQueueCar*W,intn)/*车辆到达*/
{
CarNode*p。
QueueNode*t。
inta,b。
p=(CarNode*)malloc(sizeof(CarNode))。
flushall()。
printf("\n请输入车牌号(七位,例:
陕A1234):
\n")。
printf("请严格按照要求输入车牌号,否则系统会出错!
\n")。
do{
a=strlen("陕A1234")。
b=strlen(gets(p->num))。
fflush(stdin)。
if(a!
=b)
{
printf("输入车牌号格式错误,请重新输入(七位)!
\n")。
gets(p->num)。
fflush(stdin)。
}
elsebreak。
if(a!
=b)
printf("输入车牌号格式错误,请重新输入(七位)!
\n")。
}while(a!
=b)。
if(Enter->top { Enter->top++。 printf("\n车辆在车场第%d位置.",Enter->top)。 fflush(stdin)。 printf("\n请输入到达时间: /**: **/")。 scanf("%d: %d",&(p->reach.hour),&(p->reach.min))。 fflush(stdin)。 do{ if(p->reach.hour<0||p->reach.hour>=24||p->reach.min<0||p->reach.min>=60) { printf("输入的时间格式有错,请重新输入! ")。 scanf("%d: %d",&(p->reach.hour),&(p->reach.min))。 fflush(stdin)。 } else break。 }while(p->reach.hour<0||p->reach.hour>=24||p->reach.min<0||p->reach.min>=60)。 Enter->stack[Enter->top]=p。 return (1)。 } else/*车场已满,车进便道*/ { printf("\n请该车在便道稍作等待! ")。 t=(QueueNode*)malloc(sizeof(QueueNode))。 t->data=p。 t->next=NULL。 W->rear->next=t。 W->rear=t。 return (1)。 } } voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W,intn) {/*车辆离开*/ inti,room。 CarNode*p,*t。 QueueNode*q。 /*判断车场内是否有车*/ if(Enter->top>0)/*有车*/ { while (1)/*输入离开车辆的信息*/ { printf("\n请输入要离开的车在车场的位置/1--%d/: ",Enter->top)。 scanf("%d",&room)。 fflush(stdin)。 if(room>=1&&room<=Enter->top)break。 } while(Enter->top>room)/*车辆离开*/ { Temp->top++。 Temp->stack[Temp->top]=Enter->stack[Enter->top]。 Enter->stack[Enter->top]=NULL。 Enter->top--。 } p=Enter->stack[Enter->top]。 Enter->stack[Enter->top]=NULL。 Enter->top--。 while(Temp->top>=1) { Enter->top++。 Enter->stack[Enter->top]=Temp->stack[Temp->top]。 Temp->stack[Temp->top]=NULL。 Temp->top--。 } PRINT(p)。 /*判断通道上是否有车及车站是否已满*/ if((W->head! =W->rear)&&Enter->top { q=W->head->next。 t=q->data。 Enter->top++。 printf("\n现在请便道上的车进入车场.该车的车牌号为: ")。 puts(t->num)。 printf("\n该车进入车场第%d位置.",Enter->top)。 printf("\n请输入现在的时间(即该车进站的时间)/**: **/: ")。 scanf("%d: %d",&(t->reach.hour),&(t->reach.min))。 fflush(stdin)。 do{ if(t->reach.hour<0||t->reach.hour>=24||t->reach.min<0||t->reach.min>=60) { printf("输入的时间格式有错,请重新输入! ")。 s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 设计方案 报告 停车场 管理 系统