停车场管理系统数据结构课设报告.docx
《停车场管理系统数据结构课设报告.docx》由会员分享,可在线阅读,更多相关《停车场管理系统数据结构课设报告.docx(16页珍藏版)》请在冰豆网上搜索。
停车场管理系统数据结构课设报告
数据结构课程设计
停车场管理系统
一、课设目的
(1)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
(2)初步掌握软件开发过程中的问题分析,系统设计,程序编码,测试等基本方法和技能;
(3)提高综合应用所学的理论知识和方法独立分析和解决问题的能力;
(4)训练用系统的观点和软件开发和一般规范进行软件开发,培养软件工作者所应具有的
科学的工作方法和作风。
二、问题描述
设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
三、基本要求
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:
汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;
若是车离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表实现。
4、详细设计
(1)原理分析:
栈是一种只能在一段进行输入和输出操作的线性表,表尾称为栈顶,表头称为栈底。
栈的主要特点是“后进先出”,即后进栈的元素先处理,停车场的容量即为栈的存储空间。
队列是限定仅能在表的一段进行插入,在表的另一端进行删除的线性表。
队列中可以插入的一段称为队尾,可以删除的一端称为队首。
队列的主要特点是“先进先出”。
停车场管理系统是充分利用数据结构中栈和队列的思想实现的,用到两个堆栈,一个用来模拟停车场,另一个为临时栈,存储为离开停车场的车辆让道的其他车辆;一个队列结构,存储便道的车辆信息。
typedefstruct{//定义栈,表示停车场
CarNode*base;//停车场的堆栈底
CarNode*top;//停车场的堆栈顶
intstacksize;//停车场的容量
}Park;
typedefstruct{//定义队列,表示便道
CarPtrfront;//便道的队列的队头
CarPtrrear;//便道的队列的队尾
intlength;
}Shortcut;
(2)功能模块:
车辆到达:
a、若栈不满,车辆进栈,停到停车场;
b、若栈满,车辆入队,停到便道;
StatusArrival(Park&P,Shortcut&S)
{intnumber,ar_time;//对进站车辆的处理:
printf("请输入车牌号:
");//记录车牌号,时间,并根据停车场
scanf("%d",&number);//是否满来判断入栈还是入队列
printf("进场的时刻:
");
scanf("%d",&ar_time);
if(P.stacksize{CarNodec;
c.number=number;
c.ar_time=ar_time;
Push(P,c);
printf("该车应停在第%d号车道.\n",P.stacksize);
}
else
{
EnQueue(S,number,ar_time);
printf("停车场已满,请暂时停在便道的第%d个位置.\n",S.length);
}
returnOK;
}
车辆离开:
如果队列不空且栈不满,队列上的车出队入栈。
StatusLeave(Park&P,Park&P1,Shortcut&S)
{intnumber,le_time,flag=1,money,ar_time;//对离站车辆的处理:
printf("请输入车牌号:
");//记录车牌号,时间,停车费用
scanf("%d",&number);
printf("出场的时刻:
");
scanf("%d",&le_time);
CarNodee,m;
CarPtrw;
while(P.stacksize)
{Pop(P,e);
if(e.number==number)
{flag=0;
money=(le_time-e.ar_time)*PRICE;
ar_time=e.ar_time;
break;
}
Push(P1,e);//后面的车开出停车场让路,进入备用栈
}
while(P1.stacksize)
{
Pop(P1,e);
Push(P,e);//备用栈中的车开入停车场
}
if(flag==0)
{
if(S.length!
=0)
{
DeQueue(S,w);
m.ar_time=le_time;
m.number=w->number;
Push(P,m);//便道中的车开入停车场
free(w);
printf("车牌号为%d的车已由便道进入停车场\n",m.number);
}
printf("停车费为%d,占用车位数为%d\n",money,P.stacksize);
}
else
{printf("停车场不存在牌号为%d的车\n",number);
}
returnOK;
}
(3)用户手册:
①输出菜单选项;请选择(A,D,E):
②如果选择A,即车辆到达:
若栈不满,车辆进栈,停到停车场;若栈满,车辆入队,
停到便道;
③如果选择D,即车辆离开:
计算时间及费用;如果队列不空且栈不满,队列上的车
出队入栈;
④如果选择E,则退出程序。
(4)流程图:
图一、函数关系调用图
图二、操作流程图
(5)测试用例:
(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3,20),(‘A’,4,25),(‘A’,
5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。
每一组输入数据包括三个数据项:
汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,‘A’表示到达,
‘D’表示离去,‘E’表示输入结束。
(6)测试目的:
测试菜单显示方法,到达方法和离开方法能否正确完成,时间和费用计算是否正确。
(7)测试要求:
测试用例要合理并足够,既要有正确用例,也要有错误用例,检验程序的正确性和健壮性。
五、程序源码
#include
#include
#include
#defineOK1//函数返回状态代码,宏定义
#defineERROR0
#defineTRUE1
#defineFALSE0
#defineINFEASIBLE-1
#defineOVERFLOW-2
#defineSIZE2//停车场位置数
#definePRICE2
typedefintStatus;
//栈,模拟停车场
typedefstructCar1{//定义一个结构体来表示停车场中的车
intnumber;//汽车车号
intar_time;//汽车到达时间
}CarNode;
typedefstruct{//定义栈,表示停车场
CarNode*base;//停车场的堆栈底
CarNode*top;//停车场的堆栈顶
intstacksize;//停车场的容量
}Park;
typedefintStatus;
//队列,模拟便道
typedefstructCar2{//用另一个结构体来表示便道中停放的车
intnumber;//汽车车号
intar_time;//汽车到达时间
structCar2*next;
}*CarPtr;
typedefstruct{//定义队列,表示便道
CarPtrfront;//便道的队列的队头
CarPtrrear;//便道的队列的队尾
intlength;
}Shortcut;
StatusInitStack(Park&P)
{//初始化停车场
P.base=(CarNode*)malloc(SIZE*sizeof(Car1));
if(!
P.base)exit(OVERFLOW);
P.top=P.base;
P.stacksize=0;
returnOK;
}
StatusPush(Park&P,CarNodee)
{//车进入停车场,栈的输入操作
*P.top++=e;
++P.stacksize;
returnOK;
}
StatusPop(Park&P,CarNode&e)
{if(P.top==P.base)//车离开停车场,栈的输出操作
printf("停车场为空.");
else
{e=*--P.top;
--P.stacksize;
}
returnOK;
}
StatusInitQueue(Shortcut&S)
{S.front=S.rear=(CarPtr)malloc(sizeof(Car2));//初始化便道
if(!
S.front||!
S.rear)exit(OVERFLOW);
S.front->next=NULL;
S.length=0;
returnOK;
}
StatusEnQueue(Shortcut&S,intnumber,intar_time)
{CarPtrp;//车进入便道,队列的输入操作
p=(CarPtr)malloc(sizeof(Car2));
if(!
p)exit(OVERFLOW);
p->number=number;
p->ar_time=ar_time;
p->next=NULL;
S.rear->next=p;
S.rear=p;
++S.length;
returnOK;
}
StatusDeQueue(Shortcut&S,CarPtr&w)
{if(S.length==0)//车离开便道,队列的输出操作
printf("通道为空.");
else
{w=S.front->next;
S.front->next=S.front->next->next;
--S.length;
}
returnOK;
}
StatusArrival(Park&P,Shortcut&S)
{intnumber,ar_time;//对进站车辆的处理:
printf("请输入车牌号:
");//记录车牌号,时间,并根据停车场
scanf("%d",&number);//是否满来判断入栈还是入队列
printf("进场的时刻:
");
scanf("%d",&ar_time);
if(P.stacksize{CarNodec;
c.number=number;
c.ar_time=ar_time;
Push(P,c);
printf("该车应停在第%d号车道.\n",P.stacksize);
}
else
{EnQueue(S,number,ar_time);
printf("停车场已满,请暂时停在便道的第%d个位置.\n",S.length);
}
returnOK;
}
StatusLeave(Park&P,Park&P1,Shortcut&S)
{intnumber,le_time,flag=1,money,ar_time;//对离站车辆的处理:
printf("请输入车牌号:
");//记录车牌号,时间,停车费用
scanf("%d",&number);
printf("出场的时刻:
");
scanf("%d",&le_time);
CarNodee,m;
CarPtrw;
while(P.stacksize)
{Pop(P,e);
if(e.number==number)
{flag=0;
money=(le_time-e.ar_time)*PRICE;
ar_time=e.ar_time;
break;
}
Push(P1,e);//后面的车开出停车场让路,进入备用栈
}
while(P1.stacksize)
{
Pop(P1,e);
Push(P,e);//备用栈中的车开入停车场
}
if(flag==0)
{if(S.length!
=0)
{
DeQueue(S,w);
m.ar_time=le_time;
m.number=w->number;
Push(P,m);//便道中的车开入停车场
free(w);
printf("车牌号为%d的车已由便道进入停车场\n",m.number);
}
printf("停车费为%d,占用车位数为%d\n",money,P.stacksize);
}
else
{printf("停车场不存在牌号为%d的车\n",number);
}
returnOK;
}
intmain()
{intm=1;
charflag;//选项
ParkP,Q;
ShortcutS;
InitStack(P);
InitStack(Q);
InitQueue(S);
while(m)
{printf("\n停车场管理程序\n");
printf("\n");
printf("请选择(A,D,E):
");
scanf("%c",&flag);
switch(flag)
{case'A':
case'a':
Arrival(P,S);break;//车进入停车场
case'D':
case'd':
Leave(P,Q,S);break;//车离开停车
case'E':
case'e':
m=0;break;
default:
printf("Inputerror!
\n");break;
}case'E':
while(flag!
='\n')
scanf("%c",&flag);
}
}
六、测试结果
七、课设总结
通过这次课程设计,我充分理解了用栈和队列实现模拟停车场的基本原理,探究了栈的顺序存储结构和队列的链式存储结构的定义和算法描述,同时也学会了编写停车场问题的程序。
虽然此次的程序比较简单,没有加入一些更完善的功能,但总体上来说比较完整,实现了基础功能。
在实践的过程中,我了解到了自己的一些不足,因为很多书写错误导致花费大量的时间去纠正,对课本知识掌握的不是很熟练。
经过长达几天的准备,提高了自己的动手能力和独立思考能力,加深了对知识的理解和记忆。
编程是一项枯燥乏味的工作,但只要认真专研,我们会从中学到很多课本上学不到或课堂上无法掌握的东西,同时也能从中体会到编程的乐趣。
通过与同学相互交流经验,取长补短,达到共同进步的学习效果。
兴趣是可以培养的,只要坚持下去,面对困难总会找到解决的办法。
八、参考文献
1、《C语言程序设计》清华大学出版社;
2、《数据结构》(严蔚敏版)清华大学出版社;
3、上网查阅停车场管理系统的相关资料。