数据结构课程设计停车场管理.docx
《数据结构课程设计停车场管理.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计停车场管理.docx(15页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计停车场管理.docx](https://file1.bdocx.com/fileroot1/2023-1/26/f57bbe6a-61b1-4f50-bee7-a57f17113c50/f57bbe6a-61b1-4f50-bee7-a57f17113c501.gif)
数据结构课程设计停车场管理
数据结构课程设计报告
学校:
中南大学
学院:
信息科学与工程学院
班级:
计算机科学与技术1101班
姓名:
杜茂鹏
课题:
停车场管理系统
时间:
2013年7月3日
1.设计目的
2.问题描述
3.设计要求
4.设计构思
5.算法说明
6.复杂度说明
7.测试结果
8.总结反思
9.源程序
1设计目的
1)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4)进行全面综合的训练,对课堂教学、实验等环节的有益补充。
5)提高解决实际问题和培养软件工作所需的动手能力。
6)深化理解和灵活掌握教学内容
7)进行软件工程的综合训练。
训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
2问题描述
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。
车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。
如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。
停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。
编制一程序模拟该停车场的管理。
3设计要求
要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。
4设计构思
根据题目要求,停车场只有一个大门,因此可用一个栈来模拟:
当栈满后,继续来的车只能停在便道上,根据便道停车的特点,可知这可以用一个队列来实现,先排队的车先离开便道进入停车场。
由于排在停车场的车可以离开并要求后面的车辆都离开停车场,让此车离去。
再让后面的车辆依原来的次序进入停车场,因此在一个栈和一个队列的基础上还需要有一个地方(车辆规避所)保存为了让路离开的车辆,很显然着也应该用一个栈来模拟。
因此,本题中用到俩个栈和一个队列。
对于停车场和车辆规避所,有车辆进入和车辆离开俩个过程,这就是是进栈出栈操作,只是还允许排在中间的车辆离开,因此在栈中需要查找。
对于便道,也有如队列和出队列操作,同样允许排在中间的车辆先离开队列。
这样基本动作只需利用栈和队列的基本操作即可。
整个操作过程是:
当输入数据表示有车辆到达时,则判断栈是否满,若未满则新数据进栈,数据包括时间和车牌号;否则,将数据放在队尾,表示车辆在道上等待。
当输入数据表示有车辆离开时,就在栈中寻找是不是有此车牌号的车辆,若有就让其离开,并根据时间计费;若没有,就在便道上找,否则反映出错信息。
当离开停车场的车辆位于栈的中间时,必须先将此位置到栈顶之间的所有数据转到车辆规避所中,然后安排车辆出栈,最后将一个栈中的数据倒回倒停车场栈中。
在模拟停车场管理时还要注意,如果停车长栈中没有车辆停放时数据输入仍然要求车辆退出,则显示出错信息,程序中停车场的停车数为N,便道不做要求。
且每经过一次操作都要显示当前停车场的状况。
5算法说明
2.算法说明
(1)功能模块说明:
停车场管理系统含有三个模块,即:
车辆到达、离开、列表显示
(2)以模块为单位分析算法
1、“到达”模块:
到达时有两种情况,即车场是否满,未满则直接进入停车场;满时,到便道等待。
2.“离开”模块:
离开时,当车库为空时,提示没有车,结束;否则车辆离开。
如图3。
3.“显示”模块:
显示模块有两个显示选项,即:
车场与便道。
6复杂度说明
说明:
对时间复杂度的分析,均指在最坏情况下的时间复杂度。
在栈结构中:
(1)初始化栈(即车库),使车库为空的,此时,时间复杂度=O(max)。
(2)停车最坏的情况是要车位已经满,此时,时时间复杂度=O
(1)。
(3)关于车辆离开的时间复杂度=O(max)。
(4)车场信息的显示的时间复杂度=O
(1)。
在队列结构中:
(1)出场车的信息的时间复杂度=O
(1)。
(2)判断通道上是否有车及车站是否已满,此时,时间复杂度O=(max)。
(3)车辆停车费用的时间复杂度O=
(1)。
7测试结果
1)车辆到达
2)车辆离开
3)列表查看
8总结反思
通过本次课程设计,我对数据结构的理解进一步加深,我理解和掌握了每一段程序代码的功能及含义,并且能够实现模拟停车场管理的主要功能:
利用栈实现车的入库问题,利用队列完成车在便道上停放的问题,主要是通过栈和队列的初始化,调用等函数来模拟停车问题。
学习数据结构,我学会如何将所学的知识运用到实际中,解决一些实际的问题,这才是学习的根本。
当然在实验中我也遇到了不少实际性的问题,比如车辆停车的时间hour限制在24小时,min限制在60分钟之内,如果加入日期计算就更好了;在便道上等待的车辆,车主不可能无限制的等待,应该编写一个便道上车辆离开的函数更合理些。
编写的程度要与实际有联系,这就不能只依赖于课本,还要联系实际多多思考,重复调试,不断改进,才能编出一个符合实际的有价值的系统。
9源程序
#include
#include
#include
/*------------------------------------------------------------------------------*/
#defineMAX3/*车库容量*/
#defineprice0.05/*每车每分钟费用*/
typedefstructtime{
inthour;
intmin;
}Time;/*时间结点*/
typedefstructnode{
charnum[10];
Timereach;
Timeleave;
}CarNode;/*车辆信息结点*/
typedefstructNODE{
CarNode*stack[MAX+1];
inttop;
}SeqStackCar;/*模拟车场*/
typedefstructcar{
CarNode*data;
structcar*next;
}QueueNode;
typedefstructNode{
QueueNode*head;
QueueNode*rear;
}LinkQueueCar;/*模拟通道*/
/*------------------------------------------------------------------------------*/
voidInitStack(SeqStackCar*);/*初始化栈*/
intInitQueue(LinkQueueCar*);/*初始化便道*/
intArrival(SeqStackCar*,LinkQueueCar*);/*车辆到达*/
voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);/*车辆离开*/
voidList(SeqStackCar,LinkQueueCar);/*显示存车信息*/
/*------------------------------------------------------------------------------*/
intmain()
{
SeqStackCarEnter,Temp;
LinkQueueCarWait;
intch;
InitStack(&Enter);/*初始化车站*/
InitStack(&Temp);/*初始化让路的临时栈*/
InitQueue(&Wait);/*初始化通道*/
while
(1)
{
printf("\n1.车辆到达");
printf("2.车辆离开");
printf("3.列表显示");
printf("4.退出系统");
while
(1)
{
scanf("%d",&ch);
if(ch>=1&&ch<=4)break;
elseprintf("\npleasechoose:
1|2|3|4.");
}
switch(ch)
{
case1:
Arrival(&Enter,&Wait);break;/*车辆到达*/
case2:
Leave(&Enter,&Temp,&Wait);break;/*车辆离开*/
case3:
List(Enter,Wait);break;/*列表打印信息*/
case4:
exit(0);/*退出主程序*/
default:
break;
}
}
}
/*------------------------------------------------------------------------------*/
voidInitStack(SeqStackCar*s)/*初始化栈*/
{
inti;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[s->top]=NULL;
}
intInitQueue(LinkQueueCar*Q)/*初始化便道*/
{
Q->head=(QueueNode*)malloc(sizeof(QueueNode));
if(Q->head!
=NULL)
{
Q->head->next=NULL;
Q->rear=Q->head;
return
(1);
}
elsereturn(-1);
}
voidPRINT(CarNode*p,introom)/*打印出场车的信息*/
{
intA1,A2,B1,B2;
printf("\n请输入离开的时间:
/**:
**/");
scanf("%d:
%d",&(p->leave.hour),&(p->leave.min));
printf("\n离开车辆的车牌号为:
");
puts(p->num);
printf("\n其到达时间为:
%d:
%d",p->reach.hour,p->reach.min);
printf("离开时间为:
%d:
%d",p->leave.hour,p->leave.min);
A1=p->reach.hour;
A2=p->reach.min;
B1=p->leave.hour;
B2=p->leave.min;
printf("\n应交费用为:
%2.1f元",((B1-A1)*60+(B2-A2))*price);
free(p);
}
intArrival(SeqStackCar*Enter,LinkQueueCar*W)/*车辆到达*/
{
CarNode*p;
QueueNode*t;
p=(CarNode*)malloc(sizeof(CarNode));
_flushall();
printf("\n请输入车牌号:
");
gets(p->num);
if(Enter->top{
Enter->top++;
printf("\n车辆在车场第%d位置.",Enter->top);
printf("\n请输入到达时间:
/**:
**/");
scanf("%d:
%d",&(p->reach.hour),&(p->reach.min));
Enter->stack[Enter->top]=p;
return
(1);
}
else/*车场已满,车进便道*/
{
printf("\n该车须在便道等待!
");
t=(QueueNode*)malloc(sizeof(QueueNode));
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
return
(1);
}
}
voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)
{/*车辆离开*/
inti,room;
CarNode*p,*t;
QueueNode*q;
/*判断车场内是否有车*/
if(Enter->top>0)/*有车*/
{
while
(1)/*输入离开车辆的信息*/
{
printf("\n请输入车在车场的位置/1--%d/:
",Enter->top);
scanf("%d",&room);
if(room>=1&&room<=Enter->top)break;
}
while(Enter->top>room)/*车辆离开*/
{
Temp->top++;
Temp->stack[Temp->top]=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
}
p=Enter->stack[Enter->top];
Enter->stack[Enter->top]=NULL;
Enter->top--;
while(Temp->top>=1)
{
Enter->top++;
Enter->stack[Enter->top]=Temp->stack[Temp->top];
Temp->stack[Temp->top]=NULL;
Temp->top--;
}
PRINT(p,room);
/*判断通道上是否有车及车站是否已满*/
if((W->head!
=W->rear)&&Enter->top{
q=W->head->next;
t=q->data;
Enter->top++;
printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);
printf("\n请输入现在的时间/**:
**/:
");
scanf("%d:
%d",&(t->reach.hour),&(t->reach.min));
W->head->next=q->next;
if(q==W->rear)W->rear=W->head;
Enter->stack[Enter->top]=t;
free(q);
}
elseprintf("\n便道里没有车.\n");
}
elseprintf("\n车场里没有车.");/*没车*/
}
voidList1(SeqStackCar*S)/*列表显示车场信息*/
{
inti;
if(S->top>0)/*判断车站内是否有车*/
{
printf("\n车场:
");
printf("\n位置到达时间车牌号\n");
for(i=1;i<=S->top;i++)
{
printf("%d",i);
printf("%d:
%d",S->stack[i]->reach.hour,S->stack[i]->reach.min);
puts(S->stack[i]->num);
}
}
elseprintf("\n车场里没有车");
}
voidList2(LinkQueueCar*W)/*列表显示便道信息*/
{
QueueNode*p;
p=W->head->next;
if(W->head!
=W->rear)/*判断通道上是否有车*/
{
printf("\n等待车辆的号码为:
");
while(p!
=NULL)
{
puts(p->data->num);
p=p->next;
}
}
elseprintf("\n便道里没有车.");
}
voidList(SeqStackCarS,LinkQueueCarW)
{
intflag,tag;
flag=1;
while(flag)
{
printf("\n请选择1|2|3:
");
printf("\n1.车场\n2.便道\n3.返回\n");
while
(1)
{
scanf("%d",&tag);
if(tag>=1||tag<=3)break;
elseprintf("\n请选择1|2|3:
");
}
switch(tag)
{
case1:
List1(&S);break;/*列表显示车场信息*/
case2:
List2(&W);break;/*列表显示便道信息*/
case3:
flag=0;break;
default:
break;
}
}}