数据结构课程设计停车场管理系统设计报告2Word下载.docx
《数据结构课程设计停车场管理系统设计报告2Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计停车场管理系统设计报告2Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场。
每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。
如果停留在便道上的车未进停车场时,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。
编制一程序模拟该停车场的管理。
2基本要求:
要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场应交纳的费用和它在停车场内停留的时间。
3实现提示:
汽车的模拟输入信息格式可以是:
(到达/离去,汽车牌照号码,到达/离去的时刻)。
例如,(‘A’,1,5)表示1号牌照车在5这个时刻到达,而(‘D’,5,20)表示5号牌照车在20这个时刻离去。
整个程序可以在输入信息为(‘E’,0,0)时结束。
本题可用栈和队列来实现。
三、概要设计
1、设计思想
此停车场管理系统是在一个狭长的通道上的,而且只有一个大门可以供车辆进出,并且要实现停车场内某辆车要离开时,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场的功能,就可以设计两个堆栈,其中一个堆栈用来模拟停车场,另一个堆栈用来模拟临时停车场,该临时停车场用来存放当有车辆离开时,原来停车场内为其让路的车辆。
至于当停车场已满时,需要停放车辆的通道可以用一个链队列来实现。
当停车场内开走一辆车时,通道上便有一辆车进入停车场,此时只需要改变通道上车辆结点的连接方式就可以了,使通道上第一辆车进入停车场这个堆栈,并且使通道上原来的第二辆车成为通道上的第一辆车,此时只需将模拟通道的链队列的头结点连到原来的第二辆车上就可以了。
2、实现方法
对于此停车场管理系统的实现,就是用两个堆栈来分别模拟停车场以及停车场内车辆为其它车辆让路时退出停车的临时停放地点。
至于通道上车辆的停放则用一个链队列来实现,此时,通道上车辆的离开或者进入停车场只需改变此链队列上的结点而已。
对于要对停车场内的车辆根据其停放时间收取相应的停车费用,可以记录下车辆进入以及离开停车场的时间,再用时间差乘以相应的单价并且打印出最后的费用就可以实现了。
3、主要模块
①此停车场管理系统,主要分为以下若干模块:
首先定义用来模拟停车场的堆栈以及用来模拟通道的链队列为全局变量,然后编写主函数,在此主函数中实现对其它各个模块的调用。
在主函数中首先调用option()函数,出现欢迎用户使用的主界面,然后提示用户进入此停车场管理系统后,再出现一个供用户选择的界面,在用户的选择过程中,程序又分别调用车辆的到达、车辆的离开、停车场内停放车辆的信息以及退出程序这四个函数模块。
其中,在车辆的离开那个模块函数中又调用了打印离开车辆信息的函数,在停车场内停放车辆信息的那个模块函数中,又分别调用了显示停车场上车辆信息的函数以及显示便道上车辆信息的函数。
最后,从调鼐的这四个函数中回到主函数结束整个程序的运行。
②在以上各个模块中,出现的调用的函数为:
voidInitStack(SeqStackCar*s);
intInitQueue(LinkQueueCar*Q);
option();
intArrival(SeqStackCar*Enter,LinkQueueCar*W);
voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W);
voidPRINT(CarNode*p);
voidList(SeqStackCarS,LinkQueueCarW);
voidList1(SeqStackCar*S);
voidList2(LinkQueueCar*W);
4、模块间关系
四、调试分析
(1)调试过程中的主要问题
由于此停车场管理系统是分模块设计的,而且在程序的实现过程中又使用了清屏函数,所以,运行时用户选择任务并且执行完任务后,又会回到供用户选择功能的主界面,因此整个程序从整体上来讲结构清晰,使用方便。
本程序的调试运行,总体上情况良好,但中间也出现了一些小问题。
其中比较有代表性的主要问题有:
当停车场已经达到最大容量,但仍有车辆进入停车场的时候,运行界面上没有出现或者说出现了但又跳掉了“停车场已满,该车辆需在便道上等待!
”的提示信息。
我们小组成员经过反复商量讨论,并且在查阅了多种资料后,在那一个printf语句后加了一个getch(),此时,程序运行结果就符合要求了。
对于在WIN—TC下不能显示中文的问题,我们通过在第一个printf语句前加了一句system("
graftabl936"
);
就很好地解决了这个问题,使得整个程序的运行都出现了中文提示,而且是在中文的环境下操作,设计更加合理,更加人性化,更加方面用户使用,同时也提高了用户的操作效率。
(2)测试结果的分析与讨论
①欢迎界面
②车辆到达
③车辆离开
④车辆信息(车场)
⑤车辆信息(便道)
五、用户手册
这个程序用来实现对停车场内车辆的管理,整个操作界面为中文,更加符合人性化的标准,使得用户使用方便,而且每一个操作都有提示,使得初次接触该程序的用户也能很快适应程序的操作。
这个程序操作简单,对于车牌号,只需输入车牌号上的数字就行,而且对于进出停车场的时间,也简化了操作,只需输入当时的时刻就行,没有具体到小时和分钟,但也许这也是该程序不足之处所在。
而且该程序也给用户提供了选择的机会,当点击运行该程序后,如果想退出程序,可以输入n或N退出该运行程序。
至于使用过程中的更具体的问题,可以参照该报告书中调试分析那一项的屏幕截图,整个程序的运行界面大致就如上述屏幕截图的内容。
六、附录
1、源程序代码
#include"
stdio.h"
stdlib.h"
string.h"
conio.h"
intMAX;
/*定义一个全局变量用来存储车库最大容量*/
floatprice;
/*每车每小时的费用*/
typedefstructtime
{
inthour;
intmin;
}Time;
/*时间结点*/
typedefstructnode
charnum[10];
Timereach;
Timeleave;
}Car;
/*车辆信息结点*/
typedefstructNODE
Car*stack[100];
inttop;
}SqStack;
/*停车站*/
typedefstructcar
Car*data;
structcar*next;
}QNode;
typedefstructNode
QNode*head;
QNode*rear;
}LinkQueue;
/*通道*/
voidInitStack(SqStack*);
/*初始化栈*/
intInitQueue(LinkQueue*);
/*初始化便道*/
intarrive(SqStack*,LinkQueue*);
/*车辆到达*/
voidleave(SqStack*,SqStack*,LinkQueue*);
/*车辆离开*/
voidinfo(SqStack,LinkQueue);
/*显示停车场信息*/
voidPRINT(Car*p,introom);
voidInitStack(SqStack*s)/*初始化栈*/
inti;
s->
top=0;
for(i=0;
i<
=MAX;
i++)
stack[s->
top]=NULL;
}
intInitQueue(LinkQueue*Q)/*初始化便道*/
Q->
head=(QNode*)malloc(sizeof(QNode));
if(Q->
head!
=NULL)
{
Q->
head->
next=NULL;
rear=Q->
head;
return
(1);
}
elsereturn(-1);
voidmain()
SqStackIn,Out;
LinkQueueWait;
intch;
InitStack(&
In);
/*初始化停车站*/
Out);
/*初始化让路的临时栈*/
InitQueue(&
Wait);
/*初始化通道*/
while
(1)
printf("
--------------------欢迎使用停车场管理系统--------------------\n"
);
\t本系统由5011工作室开发,作者:
邓春国、段庆龙、梁伟明、丁磊。
\n\n"
请输入停车场的容量:
"
scanf("
%d"
&
MAX);
请输入停车场的收费标准(元/小时):
%f"
price);
您输入的停车场容量为%d位,费用为%2.1f元/小时。
\n"
MAX,price);
\n
(1)车辆到达\n
(2)车辆离开\n(3)停车场信息\n(4)退出系统\n请选择\n"
while
(1)
{
ch=getch();
switch(ch)
{
case49:
arrive(&
In,&
break;
case50:
leave(&
Out,&
case51:
info(In,Wait);
/*输出车站信息*/
case52:
{printf("
谢谢使用!
exit(0);
}/*退出主程序*/
default:
printf("
\n按键无效,请重新按键选择!
}/*49-52分别表示“1”-“4”这四个按键的键值*/
system("
CLS"
printf("
\t本系统由CG工作室开发,作者:
\n\n\n"
}
intarrive(SqStack*In,LinkQueue*W)/*车辆到达*/
Car*p;
QNode*t;
p=(Car*)malloc(sizeof(Car));
flushall();
printf("
\n停车场还有%d停车位(若停车位为0,车可先进入便道等待)"
MAX-In->
top);
\n请输入车牌号码(例:
湘D0734):
gets(p->
num);
if(In->
top<
MAX)/*停车场未满,车进车场*/
In->
top++;
\n停车的位置:
%d号停车位。
In->
\n请输入车到达的时间(格式“**:
**”):
%d:
(p->
reach.hour),&
reach.min));
stack[In->
top]=p;
请按任意键返回"
getch();
else/*停车场已满,车进便道*/
\n停车位已满,该车须在便道等待!
t=(QNode*)malloc(sizeof(QNode));
t->
data=p;
W->
rear->
next=t;
rear=t;
voidleave(SqStack*In,SqStack*Out,LinkQueue*W)
{/*车辆离开*/
introom;
Car*p,*t;
QNode*q;
/*判断车场内是否有车*/
top>
0)/*有车*/
while
(1)/*输入离开车辆的信息*/
\n请输入车在停车场的位置(1-%d):
scanf("
room);
if(room>
=1&
&
room<
=In->
top)break;
while(In->
room)/*车辆离开*/
Out->
stack[Out->
top]=In->
top];
In->
top--;
p=In->
while(Out->
=1)
top]=Out->
PRINT(p,room);
/*判断通道上是否有车及车站是否已满*/
if((W->
=W->
rear)&
In->
MAX)/*便道的车辆进入停车场*/
q=W->
next;
t=q->
data;
\n便道的%s号车进入车场第%d号停车位。
t->
num,In->
\n请输入现在的时间(格式“**:
(t->
W->
next=q->
if(q==W->
rear)W->
rear=W->
top]=t;
free(q);
elseprintf("
\n停车场里没有车\n"
/*没车*/
getch();
}
voidinfo1(SqStack*S)/*列表输出车场信息*/
if(S->
0)/*判断停车场内是否有车*/
\n车场:
\n位置到达时间车牌号\n"
for(i=1;
=S->
top;
%d\t"
i);
%d"
S->
stack[i]->
reach.hour,S->
reach.min);
puts(S->
\n停车场里没有车"
voidinfo2(LinkQueue*W)/*显示便道信息*/
QNode*p;
p=W->
if(W->
rear)/*判断通道上是否有车*/
\n便道中车辆的号码为:
while(p!
puts(p->
data->
p=p->
\n便道里没有车\n"
voidinfo(SqStackS,LinkQueueW)
info1(&
S);
info2(&
W);
/*显示停便道信息*/
voidPRINT(Car*p,introom)/*输出停车站车的信息*/
intA1,A2,B1,B2;
\n请输入车离开的时间(格式“**:
scanf("
leave.hour),&
leave.min));
\n车牌号码:
puts(p->
\n车到达的时间是:
%d:
p->
reach.hour,p->
车离开的时间是:
leave.hour,p->
leave.min);
A1=p->
reach.hour;
A2=p->
reach.min;
B1=p->
leave.hour;
B2=p->
leave.min;
\n费用为:
%2.1f元"
((B1-A1)+(B2-A2)/60.0)*price);
free(p);
2、设计体会
通过这一周的课程设计,加深了我对《数据结构》这门课程所学内容的进一步的理解与掌握;
同时,通过对停车场管理系统的开发,使得我将计算机课程所学知识与实际问题很好地相联接在了一起。
在这次课程设计中,不仅培养了我开发一个中小型程序的能力,而且也培养了我的团队合作能力。
在这次对停车场管理系统的开发过程中,我们小组成员互相合作,互相帮助,其中有程序功能成功实现时的欣喜,也有遇到问题、解决问题时的执着以及迷茫。
在这次课程设计中,使得我很好地了解了在开发程序过程中合作的重要性。
在这周课程设计中,我们小组所开发的停车场管理系统,基本上可以完成每一项功能。
汽车进入停车场的信息、离开停车场的信息以及通道上的信息都可以在程序上一一实现。
但是,该程序也有不足的地方。
主要表现在车辆的车牌号上,现实中的车牌号是一串字符,可是,在这个程序中,为了简便起见,我们就车牌号定义为了整型,这个与现实是有些不符的。
还有一个可以改进的地方就是记录车辆进入停车场以及离开停车场的时间,应该精确到小时以及分钟的,可是在程序中,为了简便起见,我们只是设置成了一个时刻,所以,在这方面还是有待改进的。
改进的程序中,还应该增加时间的判断功能,即停车场内有可能有车辆停放的时间超过一天。
还有一个很重要的问题,对于停车场内可以停放的最多车辆数,为了测试数据的方便,我在程序中,定为了2,在实际使用中,可以改变程度开头的宏定义以增加停车场的容量。
总之,在这周的课程设计中,我以及我们这组的收获还是挺大的,不仅对于专业课有了更好的认识,而且在合作的过程中更加了解了团队精神的重要性。