数据结构课程设计停车场管理报告.docx
- 文档编号:25760040
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:15
- 大小:52.26KB
数据结构课程设计停车场管理报告.docx
《数据结构课程设计停车场管理报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计停车场管理报告.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构课程设计停车场管理报告
数据结构课程设计
《停车场管理》
班级:
:
学号:
设计日期:
2012年7月2日——2012年7月11日
1)需求分析
本次的数据结构课程设计所选的题目是停车场管理系统。
根据题目要求,已知停车场是一个可停放n辆汽车的狭长通道,只有一个大门可供汽车出入,由此可将停车场的类型定义为栈,其容量为n。
当停车场已经停满n辆车后,后来的车辆只能在便道上等待。
当停车场有车开走,便道上的第一辆汽车便可以进入停车场中。
根据其先入先出的特点,可以将便道的类型定义为队列,容量不限。
由题目可知,需停车辆的信息包括:
车牌、汽车“到达”“离去”的信息、“到达”“离去”的时刻等。
按照从终端读入的数据序列进行模拟管理。
每辆车需要三个数据,其中车辆数据为:
A表示到达,D表示离去,E表示程序结束。
车辆牌照为整型数据,车辆到达或离开的时刻同样为整型数据。
输入车辆到达应该输出的信息为:
汽车在停车场或便道上的停车位置;输入车辆离开应该输出的信息为汽车在停车场停留的时间和应交纳的费用(在便道上停留的时间不收费)。
停车场管理系统主要实现以下几个功能:
(1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。
(2)该程序设计能够通过车牌号能查到该车辆在停车场或便道中的位置。
(3)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。
实现停车场的调度功能。
该程序设计可以完整的模拟停车场的管理过程。
2)概要设计
停车场管理系统是充分利用数据结构中栈和队列的思想实现的,栈是一种只能在叫做栈的一段进行进栈或者出栈操作的线性数据结构。
栈的主要特点是”后进先出”,即后进栈的元素先处理。
停车场的容量即为栈的存储空间,停车场的车辆的停靠是无秩序的,因此采用链式存储的方式更适合,也方便车辆的调度。
队列是限定仅能在表的一端进行插入,在表的另一端进行删除的线性表。
队列中可以插入的一端称为队尾,可以删除的一端称为队首。
把一个元素插入队列中的操作为进队,队列中删除一个元素的操作为出队。
队列存取操作符合:
先进先出。
停车场的车辆到达停车和车辆的离开的管理方式就是采用队列的“先进先出”的移动的思想。
停车场的入口就是队列的队首,停车场的出口就是队列的队尾。
停车场管理系统流程图如图1所示。
入口
出口
开闸
关闸
车辆过闸
入队
出队
停车
计时
调度等待
准备离场
缴费
、
图1停车场管理系统流程图
3.详细设计
1.全局变量及编译预处理语句
#defineERROR0
#defineOK1
#defineNULL0
intcount=0;//队列是否为空的标志
inttimes;
stacks,temp;//初始化栈
LinkQueueQ;//初始化队列
2.车辆信息类型
typedefstructnode{
intpassport;//存储车辆牌照信息
inttime;//存储进场时间信息
}node;
3.栈类型(停车场)
typedefstructstack{
node*base;
node*top;
intstacksize;
}stack;
voidinitstack(stack&S,intn){//构造空栈
S.base=(node*)malloc(n*sizeof(node));
S.top=S.base;
S.stacksize=n;
}
voidpush(stack&S,nodee){//入栈函数
if((S.top-S.base)>=S.stacksize){EnQueue(Q,e);}//如果栈满,调用入队函数
else{
S.top->passport=e.passport;
S.top->time=e.time;
S.top++;
}
}
intpop(stack&S,node&e){//出栈函数
if(S.top==S.base)returnERROR;//如果栈空,返回ERROR
--S.top;
e.passport=S.top->passport;
e.time=S.top->time;
returnOK;
}
4.队列类型(便道)
typedefstructQnode{
nodeQdata;
structQnode*next;
}Qnode;
typedefstruct{
Qnode*front;
Qnode*rear;
}LinkQueue;
voidEnQueue(LinkQueue&Q,nodee){//入队函数
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;
}
voidDeQueue(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++算法
voidmain(){
intn,exit;
floatmoney;
charinfo;
intpass;
Q.front=NULL;
Q.rear=(Qnode*)malloc(sizeof(Qnode));
Q.rear->next=Q.rear;
printf("欢迎使用停车场管理系统\n本停车场容量为:
");
cin>>n;
initstack(s,n);
initstack(temp,n);
printf("停车场费率为:
");
cin>>money;
while(exit!
=OK){
printf("\n请输入车辆数据\nA到达D离去E结束:
");
cin>>info;
printf("请输入车辆牌照:
");
cin>>pass;
if(info=='A'||info=='E')printf("请输入车辆进场时间:
");
if(info=='D')printf("请输入车辆离场时间:
");
cin>>times;
if(info=='E'){exit=OK;}
elseif(info=='A'){
inti,j;
nodea;
a.passport=pass;
a.time=times;
push(s,a);
for(i=1;i<=n;i++){
if(s.base[i-1].passport==a.passport){
printf("停车位置(停车场):
%d\n",i);
}
}
Qnode*tp;
tp=Q.front;
if(tp==NULL){}
else{
j=1;
while(tp!
=Q.rear){
tp=tp->next;
j++;
}
printf("停车位置(便道):
%d\n",j);
}
}
elseif(info=='D'){
noded;
inttp,counter=0;
do{
counter++;
tp=pop(s,d);
while(tp!
=ERROR){
if(d.passport==pass){
floatm;
m=(times-d.time)*money;
printf("停留时间:
%d您需交费:
%f\n",times-d.time,m);
while(temp.base!
=temp.top){
pop(temp,d);
push(s,d);
}
wait(s);
d.passport=9999;
tp=ERROR;
}
else{
push(temp,d);
d.passport=0;
tp=ERROR;
}
}
}while(d.passport==0||counter>n);
}
elseif(info!
='A'&&info!
='D'&&info!
='E'){}
}
}
voidwait(stack&S){
if((S.top-S.base)==(S.stacksize-1)&&count!
=0){
nodetemp;
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停车位置(停车场):
1
A,2,10停车位置(停车场):
2
D,1,15停留时间:
10分钟需交费:
15.00元
A,3,20停车位置(停车场):
2
A,4,25停车位置(便道):
1
A,5,30停车位置(便道):
2
D,2,35停留时间:
25分钟需交费:
37.50元
D,4,40停留时间:
5分钟需交费:
7.50元
E,0,0
7)附录(源程序代码)
#include
#include
#include
#include
#defineERROR0
#defineOK1
#defineNULL0
typedefstructnode{
intpassport;
inttime;
}node;
typedefstructstack{
node*base;
node*top;
intstacksize;
}stack;
typedefstructQnode{
nodeQdata;
structQnode*next;
}Qnode;
typedefstruct{
Qnode*front;
Qnode*rear;
}LinkQueue;
intcount=0;
inttimes;
stacks,temp;
LinkQueueQ;
voidinitstack(stack&S,intn){
S.base=(node*)malloc(n*sizeof(node));
S.top=S.base;
S.stacksize=n;
}
voidEnQueue(LinkQueue&Q,nodee);
voidDeQueue(LinkQueue&Q,node&e);
voidpush(stack&S,nodee){
if((S.top-S.base)>=S.stacksize){EnQueue(Q,e);}
else{
S.top->passport=e.passport;
S.top->time=e.time;
S.top++;
}
}
intpop(stack&S,node&e){
if(S.top==S.base)returnERROR;
--S.top;
e.passport=S.top->passport;
e.time=S.top->time;
returnOK;
}
voidwait(stack&S){
if((S.top-S.base)==(S.stacksize-1)&&count!
=0){
nodetemp;
DeQueue(Q,temp);
temp.time=times;
push(S,temp);
}
}
voidEnQueue(LinkQueue&Q,nodee){
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;
}
voidDeQueue(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;}
}
}
intmain(){
intn,exit;
floatmoney;
charinfo;
intpass;
Q.front=NULL;
Q.rear=(Qnode*)malloc(sizeof(Qnode));
Q.rear->next=Q.rear;
printf("欢迎使用停车场管理系统\n本停车场容量为:
");
cin>>n;
initstack(s,n);
initstack(temp,n);
printf("停车场费率为:
");
cin>>money;
while(exit!
=OK){
printf("\n请输入车辆数据\nA到达D离去E结束:
");
cin>>info;
if(info=='E'){return0;}
printf("请输入车辆牌照:
");
cin>>pass;
if(info=='A')printf("请输入车辆进场时间:
");
if(info=='D')printf("请输入车辆离场时间:
");
cin>>times;
if(info=='A'){
inti,j;
nodea;
a.passport=pass;
a.time=times;
push(s,a);
for(i=1;i<=n;i++){
if(s.base[i-1].passport==a.passport){
printf("停车位置(停车场):
%d\n",i);
}
}
Qnode*tp;
tp=Q.front;
if(tp==NULL){}
else{
j=1;
while(tp!
=Q.rear){
tp=tp->next;
j++;
}
printf("停车位置(便道):
%d\n",j);
}
}
elseif(info=='D'){
noded;
inttp,counter=0;
do{
counter++;
tp=pop(s,d);
while(tp!
=ERROR){
if(d.passport==pass){
floatm;
m=(times-d.time)*money;
printf("停留时间:
%d分钟您需交费:
%2.2f元\n",times-d.time,m);
while(temp.base!
=temp.top){
pop(temp,d);
push(s,d);
}
wait(s);
d.passport=9999;
tp=ERROR;
}
else{
push(temp,d);
d.passport=0;
tp=ERROR;
}
}
}while(d.passport==0||counter>n);
}
elseif(info!
='E'){}
}
}
参考文献:
数据结构(C语言版)严蔚敏吴伟民编著清华大学
数据结构实验教程(C语言版)王国钧唐国民编著清华大学
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 停车场 管理 报告