数据结构实践报告停车场管理系统.docx
《数据结构实践报告停车场管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构实践报告停车场管理系统.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构实践报告停车场管理系统
河南财经政法大学
集
中
实
践
报
告
院系:
班级:
指导老师:
小组:
小组成员:
目 录
(一)设计目的………………………………………………………3
(二)问题描述………………………………………………………3
(三)概要设计………………………………………………………4
(四)详细设计………………………………………………………8
(五)调试分析………………………………………………………9
(六)测试分析………………………………………………………10
(七)心得体会………………………………………………………11
(八)附录(源代码)………………………………………………12
(一)设计目的
1.通过课程设计,了解并掌握数据结构的设计方法,具备初步的独立分析和设计能力;
2.通过课程设计,初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.通过课程设计,提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.通过课程设计,训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
(二)问题描述及要求
基本要求
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:
汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表结构实现。
测试数据
设n=2,输入数据为:
(‘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’表示到达(arrival);‘D’表示离去(departure);‘E’表示输出结束(end)。
实现提示
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。
输入数据按到达或离去的时刻有序。
栈中每个元素表示一辆汽车,包含两个数据项:
汽车的牌照号码和进入停车场的时刻。
此外还要实现:
(1)两个栈共享空间,思考应开辟数组的空间是多少?
(2)汽车可有不同种类,则他们的占地面积不同,收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。
(3)汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。
(三)概要设计
1、设计思想
此停车场管理系统是在一个狭长的通道上的,而且只有一个大门可以供车辆进出,并且要实现停车场内某辆车要离开时,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场的功能,就可以设计两个栈,其中一个栈用来模拟停车场,另一个栈用来模拟临时停车场,该临时停车场用来存放当有车辆离开时,原来停车场内为其让路的车辆。
至于当停车场已满时,需要停放车辆的通道可以用一个链队列来实现。
当停车场内开走一辆车时,通道上便有一辆车进入停车场,此时只需要改变通道上车辆结点的连接方式就可以了,使通道上第一辆车进入停车场这个栈,并且使通道上原来的第二辆车成为通道上的第一辆车,此时只需将模拟通道的链队列的头结点连到原来的第二辆车上就可以了。
2、实现方法
对于此停车场管理系统的实现,就是用两个堆栈来分别模拟停车场以及停车场内车辆为其它车辆让路时退出停车的临时停放地点。
至于通道上车辆的停放则用一个链队列来实现,此时,通道上车辆的离开或者进入停车场只需改变此链队列上的结点而已。
对于要对停车场内的车辆根据其停放时间收取相应的停车费用,可以记录下车辆进入以及离开停车场的时间,再用时间差乘以相应的单价并且打印出最后的费用就可以实现了。
3、流程图分析
流程图按块来分析,共分成整体系统,汽车到达系统,汽车离去系统,汽车显示系统。
如图1。
(1)汽车整体系统
图1
S
D
(2)以模块为单位分析算法
1、“到达”模块:
到达时有两种情况,即车场是否满,未满则直接进入停车场;满时,到便道等待。
如图2。
图2
2.“离开”模块:
离开时,当车库为空时,提示没有车,结束;否则车辆离开。
如图3。
图3
3.“显示”模块:
显示模块有两个显示选项,即:
车场与便道。
如图4。
图4
(四)详细设计
1.此函数分为不同的函数,其中包含主函数,用此来调用其他子函数,其子函数包括车辆进车站、便道函数;车辆离开函数;车辆显示函数等。
2.函数的定义:
typedefstruct{
intnum;/*车牌号*/
intarrtime;/*到达/离开时间*/
charcar;/*车的类型*/
}ELEMTP;/*顺序栈的数据元素类型*/
typedefstruct{
ELEMTPelem[N];
inttop;
}SqStack;/*顺序栈类型*/
typedefstructnode{
intnum;/*车牌号/便道上的车辆数量*/
structnode*next;
}QNode;/*链队列的数据元素类型*/
typedefstruct{
QNode*front,*rear;
}LQueue;/*链队列类型*/
3.主函数为voidmain(),在此函数中用switch()函数来调用子函数。
其中车辆进入车站、便道的函数为voidArrive(SqStack*s1,LQueue*q,ELEMTPx);车辆离开函数为voidDelive(SqStack*s1,SqStack*s2,LQueue*q,ELEMTPx);车辆显示函数为voidDisplay(SqStack*s1,LQueue*q)。
(五)调试分析
由于此停车场管理系统是分模块设计的,而且在程序的实现过程中又使用了清屏函数,所以,运行时用户选择任务并且执行完任务结构清晰,使用方便。
本程序的调试运行,总体上情况良好,但中间也出现了一些小问题。
如当删除第3个元素时,出现了错误。
明明有4号车,却出现了提示错误,后经过调试,发现了问题,原来if(y.num==x.num&&y.car==x.car),这个判定限制了太多,当把其改为if(y.num==x.num),便不会再次出现此问题。
(六)测试分析
1.主界面
2.车辆到达
3.车辆离开
4.显示车辆信息
5.程序结束
(七)心得体会
(1)该实验涉及到顺序栈的建立、插入、删除等操作,涉及到了链队列的建立、插入、删除等操作。
做这个实验,加深了我对以上知识点的认识和理解。
(2)在这一周中,我们提高了C语言编程的能力。
在程序设计过程中,需要经过反复地编写,调试,运行,发现问题并解决问题,在这次实验的设计中,我加深对程序的了解,提高自己的实际动手能力和独立思考的能力同时我也学会了综合以前学到的基本知识来解决较大问题的方法。
(3)在这一周中,我们通过小组中的团结合作,解决了程序中一个又一个问题。
在这个过程中,我们更加了解彼此,更加明白合作的重要性。
这次集中实践,不但学会了知识,还明白了团结的重要性,可谓收获良多。
(八)附录(源代码)
#include"stdio.h"
#include"stdlib.h"
#defineN2/*停车场容量*/
#defineM10
#defineTrue1
#defineFalse0
typedefstruct{
intnum;/*车牌号*/
intarrtime;/*到达/离开时间*/
charcar;/*车的类型*/
}ELEMTP;/*顺序栈的数据元素类型*/
typedefstruct{
ELEMTPelem[N];
inttop;
}SqStack;/*顺序栈类型*/
typedefstructnode{
intnum;/*车牌号/便道上的车辆数量*/
structnode*next;
}QNode;/*链队列的数据元素类型*/
typedefstruct{
QNode*front,*rear;
}LQueue;/*链队列类型*/
voidInitStack_Sq(SqStack*s);/*初始化栈*/
intPush_Sq(SqStack*s,ELEMTPx);/*入栈*/
ELEMTPPop_Sq(SqStack*s);/*出栈*/
voidInitQueue_L(LQueue*q);/*初始化队列*/
voidEnQueue_L(LQueue*q,intnum1);/*入队列*/
intDelQueue_L(LQueue*q);/*出队列*/
voidArrive(SqStack*s1,LQueue*q,ELEMTPx){
/*车辆x进入停车场*/
intf;
f=Push_Sq(s1,x);
if(f==False){/*停车场栈s1已满入便道q*/
EnQueue_L(q,x.num);
printf("第%d号车停在便道第%d车位上\n",x.num,q->front->num);
}
elseprintf("第%d号车停在停车场第%d车位上\n",x.num,s1->top);
}/*Arrive*/
voidDelive(SqStack*s1,SqStack*s2,LQueue*q,ELEMTPx){
/*车辆x离开停车场*/
intn,f=False;
ELEMTPy;QNode*p;
while((s1->top>0)&&(f!
=True)){/*在栈s1中寻找车辆x*/
y=Pop_Sq(s1);
if(y.num!
=x.num)
n=Push_Sq(s2,y);
elsef=True;
}
if(y.num==x.num){/*寻找到车辆x*/
if('A'==x.car)
printf("第%d号车应收费%d元\n",y.num,(x.arrtime-y.arrtime)*M);
else
if('B'==x.car)
printf("第%d号车应收费%d元\n",y.num,(x.arrtime-y.arrtime)*M*2);
else
printf("第%d号车应收费%d元\n",y.num,(x.arrtime-y.arrtime)*M*3);
while(s2->top>0){/*将栈s2中的车辆倒回到栈s1中*/
y=Pop_Sq(s2);
f=Push_Sq(s1,y);
}
n=DelQueue_L(q);
if(n!
=NULL){/*便道q上的第一辆车入栈s1*/
y.num=n;
y.arrtime=x.arrtime;
f=Push_Sq(s1,y);
printf("第%d号车停在停车场第%d号车位上\n",y.num,s1->top);
}
}
else{/*栈s1中未找到车辆x*/
while(s2->top>0){/*将栈s2中的车辆倒回到栈s1中*/
y=Pop_Sq(s2);
f=Push_Sq(s1,y);
}
p=q->front;/*在便道q上找到车辆x*/
f=False;
while(f==False&&p->next!
=NULL)
if(p->next->num!
=x.num)
p=p->next;
else{
p->next=p->next->next;
q->front->num--;
if(p->next==NULL)
q->rear=q->front;
printf("第%d号车离开便道\n",x.num);
f=True;
}
if(f==False)
printf("输入数据错误,停车场和便道上均无%d号车\n",x.num);
}
}/*Delive*/
voidDisplay(SqStack*s1,LQueue*q){
/*显示停车场的状况*/
intk;QNode*p;
printf("停车场状况:
\n");
if(s1->top!
=0){
printf("车道车号\n");
for(k=0;ktop;k++)
printf("%d %d\n",k+1,s1->elem[k].num);
}
elseprintf("停车场没有车辆\n");
printf("便道状况:
\n");
if(q->front->num){
printf("车道车号\n");
for(k=1,p=q->front->next;p;p=p->next)
printf("%d %d\n",k++,p->num);
}
elseprintf("便道没有车辆\n");
}/*Display*/
voidmain()
{
charch1,ch2;
SqStack*s1,*s2;
LQueue*q;
ELEMTPx;
intflag;
s1=(SqStack*)malloc(sizeof(SqStack));
s2=(SqStack*)malloc(sizeof(SqStack));
q=(LQueue*)malloc(sizeof(LQueue));
InitStack_Sq(s1);
InitStack_Sq(s2);
InitQueue_L(q);
flag=True;
while(flag){
printf("\n *******************************\n");
printf(" ****欢迎进入停车场管理系统****\n");
printf(" *******************************");
printf("\n");
printf("\n 请输入您的选择\n");
printf("\n");
printf(" S------显示停车场状况\n");
printf("\n");
printf(" A------车辆到达\n");
printf("\n");
printf(" D------车辆离开\n");
printf("\n");
printf(" E------程序结束\n");
printf("\n");
ch1=getchar();
switch(ch1){
case'S':
Display(s1,q);break;
case'A':
printf("输入数据:
车牌号,到达时间,车辆类型(A代表小汽车,B代表客车,C代表卡车):
");
scanf("%d,%d,%c",&x.num,&x.arrtime,&x.car);
Arrive(s1,q,x);break;
case'D':
printf("输入数据:
车牌号,离开时间,车辆类型(A代表小汽车,B代表客车,C代表卡车):
");
scanf("%d,%d,%c",&x.num,&x.arrtime,&x.car);
Delive(s1,s2,q,x);break;
case'E':
flag=False;
printf("程序正常结束\n");break;
default:
printf("输入数据错误,重新输入\n");break;
}
getchar();
}
}
voidInitStack_Sq(SqStack*s)
{
s->top=0;
}
intPush_Sq(SqStack*s,ELEMTPx)
{
if(s->top==N)
return(False);
else
{
s->elem[s->top]=x;s->top++;
return(True);
}
}
ELEMTPPop_Sq(SqStack*s)
{
ELEMTPx;
if(s->top==0)
{
x.num=NULL;
x.arrtime=NULL;
return(x);
}
else
{
s->top--;
return(s->elem[s->top]);
}
}
voidInitQueue_L(LQueue*q)
{
q->front=(QNode*)malloc(sizeof(QNode));
q->rear=q->front;
q->front->next=NULL;
q->front->num=0;
}
voidEnQueue_L(LQueue*q,intnum1)
{
QNode*p;
p=(QNode*)malloc(sizeof(QNode));
p->num=num1;
p->next=NULL;
q->rear->next=p;
q->rear=p;
q->front->num++;
}
intDelQueue_L(LQueue*q)
{ QNode*p;
intn;
if(q->front==q->rear)
return(NULL);
else
{
p=q->front->next;
q->front->next=p->next;
if(p->next==NULL)
q->rear=q->front;
n=p->num;
free(p);
q->front->num--;
return(n);
}
}