数据结构课程设计报告15停车场管理.docx
《数据结构课程设计报告15停车场管理.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告15停车场管理.docx(23页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计报告15停车场管理.docx](https://file1.bdocx.com/fileroot1/2022-11/16/50638114-3318-4311-8ffd-2410965ddc30/50638114-3318-4311-8ffd-2410965ddc301.gif)
数据结构课程设计报告15停车场管理
停车场管理系统
——数据结构课程设计程序设计书
小组成员:
彭路20131344031
崔琦20131344028
徐佳20131344027
范福龙20121344024
班级:
13软件工程1班
时间:
2014.12.22
一、程序设计目标
二、问题描述
三、需求分析
四、概要设计
五、详细设计
六、源程序清单
七、软件说明书
八、测试报告
九、课程设计总结
一、程序设计目标
本管理程序由c/c++语言完成,实现了对停车场收费问题的处理。
本程序保证了程序的健壮性和操作性,在阅读过使用说明书之后可以轻松使用。
本管理系统假设车辆在停车场时一直有人在驾驶,或者说停车场的每块停车位均可智能移动。
并假设车辆进出场耗时不计,且时间均为整数类型。
最后自动或者人工完成收费。
二、问题描述
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
三、需求分析
根据问题描述,可把本停车场抽象成一个栈存储类型s1,需要输入最大停车容量n。
每当输入’A’时即为有车辆申请进入停车场操作,此时需要判断停车场是否有空位,如果有空位,那么这辆车可以进入停车场,即为执行一次压栈操作(push),并记录进入停车场的时间t1,并输出位置p1;如果停车场没有空位,那么这辆车在门外便道等候,并输出位置p2。
根据问题描述,可以把此门外便道抽象成一个队列存储类型q,而每有一辆车进入门外便道,即相当于进行一次插入队列操作(push)。
每当输入’D’时即为有车辆申请离开停车场操作,此时需要判断该车辆在停车场的位置。
如果该车位于停车场最外侧即相当于栈顶,那么该车可以直接批准离开并根据输入的离开时间t2计算出停车时间t2-t1,根据该车本次停车时间完成收费后即可成功驶出停车场,即相当于成功弹出栈顶元素(pop);如果该车没有位于停车场最外侧,事实上,这也是大多数的情况,那么需要将该车外侧的车依次(即为挡路的车)移动进一个临时停车场,根据问题描述,可以将该临时停车场抽象成另一个栈存储类型s2,那么此次移动操作相当于将栈中某元素以上的元素依次压入另一个栈(push)。
当申请离开的车驶出停车场后,在临时停车场的车辆依次进入停车场,此操作相当于将栈s2内元素依次弹出栈(pop)并压入栈s1(push)。
此时判断门外便道上有无等待进入停车场的车辆,如果有的话,门外便道上第一辆车可以进入停车场,并记录进入时间t1,此次操作相当于取出队列q的队首元素并将其压入栈s1中。
而输入’E’时,即退出系统。
至此,所有分析结束。
四、概要设计
根据需求分析,解决此问题需要构建一个Cars类型的结构体,构建一个CarNode类型的节点结构体以构建SQueue类型的队列结构体,并需要构建一个SQstack类型的栈结构体。
接下来,分别定义队列和栈的各项基本操作函数。
最后,完成菜单函数以实现各项操作。
五、详细设计
本程序定义了三个头文件,manager_cars.h、manager_stack.h、manager_queue.h。
分别实现了Cars类型的结构体、SQueue类型的队列结构体、SQstack类型的栈结构体以及队列的相关操作函数和栈的相关操作函数。
具体如下:
1、manager_cars.h
#ifndefmanager_cars_h
#definemanager_cars_h
//车辆的结构体
typedefstructCars
{
charcondition;
intnumber;
inttime;
intposition;
}Cars;
#endif
2、manager_stack.h
#include
#include
#include"manager_cars.h"
#ifndefmanager_quene_h
#definemanager_quene_h
#definetrue1
#definefalse0
typedefstructCarNode
{
CarsheadCar;
structCarNode*nextCar;
}CarNode;
typedefstruct
{
CarNode*firstCar;
CarNode*lastCar;
intlength;
}SQueue;
//建队列链表
voidsetSQueue(SQueue*sq)
{
CarNode*car=(CarNode*)malloc(sizeof(CarNode));
sq->firstCar=car;
sq->lastCar=car;
sq->firstCar->nextCar=NULL;
sq->length=0;
}
//进入队列操作
voidenterSQueue(SQueue*sq,intnum,intt)
{
CarNode*car=(CarNode*)malloc(sizeof(CarNode));
car->headCar.condition='D';
car->headCar.number=num;
car->headCar.time=t;
car->headCar.position=2;
car->nextCar=NULL;
sq->lastCar->nextCar=car;
sq->lastCar=car;
sq->length++;
}
//出队列操作
voidexceedSQueue(SQueue*sq)
{
if(sq->firstCar==sq->lastCar)
return;
CarNode*car=(CarNode*)malloc(sizeof(CarNode));
car=sq->firstCar->nextCar;
sq->firstCar->nextCar=car->nextCar;
sq->length--;
if(sq->lastCar==car)
sq->lastCar=sq->firstCar;
free(car);
}
//检测队列存在
intSQueueEmpty(SQueuesq)
{
if(sq.firstCar==sq.lastCar)
return1;
else
return0;
}
//获取队首元素
voidgetSQueue(SQueuesq,Cars*e)
{
if(sq.firstCar==sq.lastCar)
return;
*e=sq.firstCar->nextCar->headCar;
}
//队列长度
intSQueueLength(SQueuesq)
{
intlen=0;
if(sq.firstCar!
=sq.lastCar)
len=sq.length;
returnlen;
}
#endif
3、manager_queue.h
#include
#include
#include"manager_cars.h"
#ifndefmanager_stack_h
#definemanager_stack_h
#defineSTACK_INIT_SIZE100//栈的存储空间初始分配量
#defineSTACKINCREMENT10//栈的存储空间分配增量
typedefstructSQstack//栈的结构体
{
Cars*base;
Cars*top;
intstacksize;
}SQstack;
externvoidInitStack(SQstack*S)//构造一个空栈S
{
S->base=(Cars*)malloc(STACK_INIT_SIZE*sizeof(Cars));
if(!
S->base)return;
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
}
externvoidDestroyStack(SQstack*S)//销毁栈S,S不再存在
{
free(S->base);
S->base=NULL;
S->top=NULL;
S->stacksize=0;
}
externvoidClearStack(SQstack*S)//把S置为空栈
{
S->top=S->base;
}
externintStackEmpty(SQstack*S)//若栈S为空,则返回TRUE,否则返回FALSE
{
if(S->top==S->base)
return1;
else
return0;
}
externintStackLength(SQstackS)//返回S的元素的个数,即栈的长度
{
returnS.top-S.base;
}
externintGetTop(SQstackS,Cars*e)//若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
{
if(S.top==S.base)return0;
*e=*(S.top-1);
return1;
}
externintPush(SQstack*S,Carse)//插入元素e为新的栈顶元素
{
if(S->top-S->base>=S->stacksize)
{
S->base=(Cars*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(Cars));
if(!
S->base)return0;
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*S->top++=e;
return1;
}
externintPop(SQstack*S,Cars*e)//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
{
if(S->top==S->base)return0;
*e=*--S->top;
return1;
}
#endif
在主函数中,实现了菜单功能,具体如下:
while(car.condition!
='E'&&car.number!
=0&&car.time!
=0)
{
switch(car.condition)//判断操作是A还是D或者是E
{
case'A':
{
enterPark(car,par