停车场管理系统
——数据结构课程设计程序设计书
小组成员:
彭路
20131344031 崔琦
20131344028 徐佳
20131344027 范福龙 20121344024 班级 : 13软件工程1班 时间:2014.12.22
目录
一、程序设计目标
二、问题描述
三、需求分析
四、概要设计
五、详细设计
六、源程序清单
七、软件说明书
八、测试报告
九、课程设计总结
-
1
一、程序设计目标
本管理程序由c/c++语言完成,实现了对停车场收费问题的处理。本程序保证了程序的健壮性和操作性,在阅读过使用说明书之后可以轻松使用。本管理系统假设车辆在停车场时一直有人在驾驶,或者说停车场的每块停车位均可智能移动。并假设车辆进出场耗时不计,且时间均为整数类型。最后自动或者人工完成收费。
二、问题描述
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
- 2
三、需求分析
根据问题描述,可把本停车场抽象成一个栈存储类型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
4
sq->lastCar=car; sq->firstCar->nextCar=NULL; sq->length=0; } //进入队列操作
void enterSQueue(SQueue *sq,int num,int t) { 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++; } //出队列操作
void exceedSQueue(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);
}
//检测队列存在
int SQueueEmpty(SQueue sq) { if(sq.firstCar==sq.lastCar)
return 1; else
return 0; } //获取队首元素
void getSQueue(SQueue sq,Cars *e) { if(sq.firstCar==sq.lastCar)
return; *e=sq.firstCar->nextCar->headCar;S.base; }
extern int GetTop(SQstack S,Cars *e)//若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR { if(S.top == S.base) return 0;
*e = *(S.top -1);
return 1;
}
extern int Push(SQstack*S,Cars e)//插入元素e为新的栈顶元素
{ if(S->top
10
cout
scanf(\"%c\",&flag);
getchar(); } while(flag==\'Y\') {
flag=\'C\';
Cars car;
SQstack park;//定义栈并初始化
InitStack(&park);
SQueue street;//定义队列并初始化
setSQueue(&street);
cout
scanf(\"%d\",&maxNum);
getchar();
cout
cin>>Pprice;
cout
cout
cin>>car.condition>>car.number>>car.time;
//scanf(\"%c %d %d\",&car.condition,&car.number,&car.time);
//getchar();
while(car.condition!=\'E\'&&car.number!=0&&car.time!=0)
{
switch(car.condition)
{
case \'A\':
{
enterPark(car,park,street);
break;
}
case \'D\':
{
int lasttime;
lasttime=outOfPark(car,park,street,car.number,car.time);
cout
cout
break;
}
default :cout
}
cin>>car.condition>>car.number>>car.time;
//scanf(\"%c %d %d\",&car.condition,&car.number,&car.time);
12
Cars headCar; struct CarNode *nextCar; }CarNode;
typedef struct { CarNode *firstCar; CarNode *lastCar;
int length; }SQueue; //建队列链表
void setSQueue(SQueue *sq) { CarNode *car=(CarNode *)malloc(sizeof(CarNode)); sq->firstCar=car; sq->lastCar=car; sq->firstCar->nextCar=NULL; sq->length=0; } //进入队列操作
void enterSQueue(SQueue *sq,int num,int t) { 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++; } //出队列操作
void exceedSQueue(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);
-
13
}
//检测队列存在
int SQueueEmpty(SQueue sq) { if(sq.firstCar==sq.lastCar)
return 1; else
return 0; } //队首元素
void getSQueue(SQueue sq,Cars *e) { if(sq.firstCar==sq.lastCar)
return; *e=sq.firstCar->nextCar->headCar; }
//队列长度
int SQueueLength(SQueue sq) { int len=0; if(sq.firstCar!=sq.lastCar) len=sq.length; return len; }
#endif
manager_stack.h #include #include #include\"manager_cars.h\"
#ifndef manager_stack_h #define manager_stack_h
#define STACK_INIT_SIZE 100 //栈的存储空间初始分配量 #define STACKINCREMENT 10 //栈的存储空间分配增量
typedef struct SQstack
//栈的结构体
{ Cars * base; Cars * top; int stacksize;S.base; }
extern int GetTop(SQstack S,Cars *e)//若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR { if(S.top == S.base) return 0;
*e = *(S.top -1);
return 1;
}
-
15
extern int Push(SQstack*S,Cars e)//插入元素e为新的栈顶元素
{ if(S->top - S->base >= S->stacksize)
{
S->base = (Cars *)realloc(S->base,(S->stacksize + STACKINCREMENT)*sizeof(Cars));
if(!S->base) return 0;
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++ = e;
return 1;
}
extern int Pop(SQstack *S,Cars *e)//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR { if(S->top == S->base) return 0;
*e = * --S->top;
return 1;
}
#endif
七、软件说明书
1、打开系统,输入Y进入管理系统。
2、接下来按提示输入停车场的可供使用的车位数。
3、按提示输入该停车场每小时收费标准。
4、按提示输入到达后者离开信息,例如A 1 5,D 1 10。
5、输入E 0 0并输入N,退出系统。
八、测试报告
1、如图,当打开系统时出现此界面,输入Y为进入系统,输入N为退出系统。
- 16
2、如图,如果输入错误会提示出错,并重新输入。
3、如图,输入Y后,按提示依次输入停车场可提供的最大车位数和每小时的停车费。
4、如图,输入A 1 5后,提示进入停车场的信息。
- 17
5、如图,输入A 2 10,A 3 15后,依次显示提示信息。
6、如图,输入D 1 20后,分别显示便道进入停车场的3号车和1号车的收费情况。
- 18
7、如图,输入E 0 0,再按提示输入N,即可退出系统。
- 19
九、课程设计总结
通过团队对该问题分析,互相补充了观点,增强了对该题目正确认识。队员们进行了缜密的需求分析,并分工完成各文件和函数的编写。队员们纷纷表示,这绝对是一个以前不能想象到的任务。通过对该系统的编写、实现,着实增强了队员们的团队意识以及对数据结构的进一步的理解。当程序成功运行后,队员们都非常兴奋,虽然本系统仍有瑕疵,但是可以说这是队员们的心血。
- 20