宿迁学院数据结构课程设计报告 停车场管理系统.docx
《宿迁学院数据结构课程设计报告 停车场管理系统.docx》由会员分享,可在线阅读,更多相关《宿迁学院数据结构课程设计报告 停车场管理系统.docx(19页珍藏版)》请在冰豆网上搜索。
![宿迁学院数据结构课程设计报告 停车场管理系统.docx](https://file1.bdocx.com/fileroot1/2023-5/21/0fc9bde7-5eb5-42c4-a209-fa5056bf8967/0fc9bde7-5eb5-42c4-a209-fa5056bf89671.gif)
宿迁学院数据结构课程设计报告停车场管理系统
《数据结构》课程设计报告
课题名称:
停车场管理系统
专业班级:
09计本一
学号:
***********
***********************
******************
2010年12月
一、课题名称
停车场管理系统
二、课题设计的基本思想,原理和算法描述
基本思想
停车场的管理流程如下:
1.当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进入停车场;如果停车场已满,则车辆进入便道等候。
2.当车辆要求出栈时,先让在它之后进入停车场的车辆退出停车场为它让路,再让该车退出停车场,让路的所有车辆再按其原来进入停车场的次序进入停车场。
之后,再检查在便道上是否有车等候,有车则让最先等待的那辆车进入停车场。
3.用顺序结构实现栈,用链表实现队列。
原理
由于停车场只有一个大门,当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,先进停车场的后退出,后进车场的先退出,符合栈的“后进先出,先进后出”的操作特点,因此,可以用一个栈来模拟停车场。
而当停车场满后,继续来到的其它车辆只能停在便道上,根据便道停车的特点,先排队的车辆先离开便道进入停车场,符合队列的“先进先出,后进后出”的操作特点,因此,可以用一个队列来模拟便道。
排在停车场中间的车辆可以提出离开停车场,并且停车场内在要离开的车辆之后到达的车辆都必须先离开停车场为它让路,然后这些车辆依原来到达停车场的次序进入停车场,因此在前面已设的一个栈和一个队列的基础上,还需要有一个地方保存为了让路离开停车场的车辆,由于先退出停车场的后进入停车场,所以很显然保存让路车辆的场地也应该用一个栈来模拟。
因此,本题求解过程中需用到两个栈和一个队列。
栈以顺序结构实现,队列以链表结构实现。
算法描述
程序提示:
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:
汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
1.算法描述
(1)结构体:
本程序共有两个结构体。
CarInfo存储车辆信息,StackSq存储停车场信息,二者定义如下。
typedefstruct//车辆信息
{
int number; //汽车车号
int ar_time; //汽车到达时间
}zanInode;
typedef struct{
zanInode *base; //停车场的堆栈底
zanInode *top; //停车场的堆栈顶
int stacksize_curren;
}stackhead;
//堆栈的基本操作;
(2)函数设计:
void initstack(stackhead &L) //构造一个空栈
void push(stackhead &L,zanInode e) //把元素e压入s栈
void pop(stackhead &L,zanInode &e) //把元素e弹出s栈
void initqueue(linkqueue &q) //构造一个空队列
void enqueue(linkqueue &q,int number,int ar_time) //把元素的插入队列(属性为number,ar_time)
void popqueue(linkqueue &q,queueptr &w) //把元素的插入队列(属性为number,ar_time)
void jinru(stackhead &st,linkqueue &q) //对进入停车场的汽车的处理;
void likai(stackhead &st,stackhead &sl,linkqueue &q) //对离开的汽车的处理;
主函数:
void main()
{
int m=100;
char flag; //进入或离开的标识;
stackhead sting,slinshi; //停车场和临时倒车场堆栈的定义;
linkqueue line; //队列的定义;
initstack(sting); //构造停车场堆栈sting
initstack(slinshi); //构造倒车场堆栈slinshi
initqueue(line); //构造便道队列line
while(m)
{
cout<<"\n ** 停车场管理程序 **"< cout<<"==================================================="< cout<<"** **"< cout<<"** A --- 汽车 进 车场 D --- 汽车 出 车场 **"< cout<<"** **"< cout<<"** E --- 退出 程序 **"< cout<<"==================================================="< cout<<" 请选择 :
(A,D,E):
";
cin>>flag;
switch(flag)
{
case 'A':
jinru(sting,line);break; //汽车进车场
case 'D':
likai(sting,slinshi,line);break; //汽车出车场
case 'E':
exit(0);
}
m--;
}
}
2.算法说明
(1)功能模块说明:
停车场管理系统含有三个模块,即:
车辆到达、离开、列表显示
图1
(2)以模块为单位分析算法
1、“到达”模块:
到达时有两种情况,即车场是否满,未满则直接进入停车场;满时,到便道等待。
如图2。
图2
2.“离开”模块:
离开时,当车库为空时,提示没有车,结束;否则车辆离开。
如图3。
图3
3.“显示”模块:
显示模块有两个显示选项,即:
车场与便道。
如图4。
图4
三、源程序及注释
#include
#include
#include
#include
#include
#define size 1 //停车场位置数
//模拟停车场的堆栈的性质;
typedef struct zanlind{
int number; //汽车车号
int ar_time; //汽车到达时间
}zanInode;
typedef struct{
zanInode *base; //停车场的堆栈底
zanInode *top; //停车场的堆栈顶
int stacksize_curren;
}stackhead;
//堆栈的基本操作;
void initstack(stackhead &L) //构造一个空栈
{
L.base=(zanInode*)malloc(size*sizeof(zanlind));
if(!
L.base) exit(0);
L.top=L.base;
L.stacksize_curren=0;
}
void push(stackhead &L,zanInode e) //把元素e压入s栈
{
*L.top++=e;
L.stacksize_curren++;
}
void pop(stackhead &L,zanInode &e) //把元素e弹出s栈
{
if(L.top==L.base)
{
cout<<"停车场为空 !
!
";
return;
}
e=*--L.top;
L.stacksize_curren--;
}
//模拟便道的队列的性质;
typedef struct duilie{
int number; //汽车车号
int ar_time; //汽车到达时间
struct duilie *next;
}*queueptr;
typedef struct{
queueptr front; //便道的队列的对头
queueptr rear; //便道的队列的队尾
int length;
}linkqueue;
//队列的基本操作;
void initqueue(linkqueue &q) //构造一个空队列
{
q.front=q.rear=(queueptr)malloc(sizeof(duilie));
if(!
q.front||!
q.rear)
exit(0);
q.front->next=NULL;
q.length=0;
}
void enqueue(linkqueue &q,int number,int ar_time) //把元素的插入队列(属性为number,ar_time)
{
queueptr p;
p=(queueptr)malloc(sizeof(duilie));
if(!
p) exit(0);
p->number=number;
p->ar_time=ar_time;
p->next=NULL;
q.rear->next=p;
q.rear=p;
q.length++;
}
void popqueue(linkqueue &q,queueptr &w) //把元素的插入队列(属性为number,ar_time)
{
queueptr p;
if(q.front==q.rear)
{
cout<<"停车场的通道为空 !
!
"< return;
}
p=q.front->next;
w=p;
q.front->next=p->next;
q.length--;
if(q.rear==p) q.front=q.rear;
}
void jinru(stackhead &st,linkqueue &q) //对进入停车场的汽车的处理;
{
int number,time_a;
cout<<"车牌为:
";
cin>>number;
cout<<"进场的时刻:
";
cin>>time_a;
if(st.stacksize_curren<2)
{
zanInode e;
e.number=number;
e.ar_time=time_a;
push(st,e);
cout<< " 该车已进入停车场在:
"< }
else
{
enqueue(q,number,time_a);
cout<<"停车场已满,该车先停在便道的第"< }
}
void likai(stackhead &st,stackhead &sl,linkqueue &q) //对离开的汽车的处理;
{ //st堆栈为停车场,sl堆栈为倒车场
int number,time_d,flag=1,money,arrivaltime; //q为便道队列
cout<<"车牌为:
";
cin>>number;
cout<<"出场的时刻:
";
cin>>time_d;
zanInode e,q_to_s;
queueptr w;
while(flag) //找到要开出的车,并弹出停车场栈
{
pop(st,e);
push(sl,e);
if(e.number==number)
{
flag=0;
money=(time_d-e.ar_time)*2;
arrivaltime=e.ar_time;
}
}
pop(sl,e); //把临时堆栈的第一辆车(要离开的)去掉;
while(sl.stacksize_curren) //把倒车场的车倒回停车场
{
pop(sl,e);
push(st,e);
}
if(st.stacksize_curren<2&&q.length!
=0) //停车场有空位,便道上的车开进入停车场
{
popqueue(q,w);
q_to_s.ar_time=time_d;
q_to_s.number=w->number;
push(st,q_to_s);
cout<<"车牌为"<"< }
cout<<"\n 收 据"< cout<<" ====================== 车牌号:
"< cout<<"==================================================="< cout<<"|进车场时刻 | 出车场时刻 | 停留时间 | 应付(元)|"< cout<<"===================================================="< cout<<"| "< cout<<"-----------------------------------------------------"<
}
void main()
{
int m=100;
char flag; //进入或离开的标识;
stackhead sting,slinshi; //停车场和临时倒车场堆栈的定义;
linkqueue line; //队列的定义;
initstack(sting); //构造停车场堆栈sting
initstack(slinshi); //构造倒车场堆栈slinshi
initqueue(line); //构造便道队列line
while(m)
{
cout<<"\n ** 停车场管理程序 **"< cout<<"==================================================="< cout<<"** **"< cout<<"** A --- 汽车 进 车场 D --- 汽车 出 车场 **"< cout<<"** **"< cout<<"** E --- 退出 程序 **"< cout<<"==================================================="< cout<<" 请选择 :
(A,D,E):
";
cin>>flag;
switch(flag)
{
case 'A':
jinru(sting,line);break; //汽车进车场
case 'D':
likai(sting,slinshi,line);break; //汽车出车场
case 'E':
exit(0);
}
m--;
}
}
四、运行示例及结果分析
原始界面
.车辆1111于7:
00驶入;车辆1110于8:
00驶入
2.车辆1001要停车,但停车场已满
3.车辆1111于10点驶出停车场。
输出其停车位置,及停车费用
4.车辆1110于11点驶出停车场。
输出其停车位置,及停车费用
5.退出程序
五、调试和运行程序过程中产生的问题及采取的措施
在运行过程中有时确实会出现一些小插曲,大都是少加一个括号啊,少加一个标点啊,术语拼错了啊等等的小问题,经过半天的努力全部修改完毕了,还有一个很重要的问题,对于停车场内可以停放的最多车辆数,为了测试数据的方便,我在程序中,定为了2,在实际使用中,可以改变程度开头的宏定义以增加停车场的容量
六、对课题相关算法的讨论、分析,改进设想
栈和队列可以方便地用线性表的基本结构实现,因此不少教科书把栈和队列看作是特殊的操作受限的线性表从抽象数据类型的角度看,栈和队列是与线性表完全不同的数据结构,因为它们具有不同的操作集合栈和队列都提供了元素存入、访问和删除操作,以及几个辅助
操作,如创建、判断空等。
将栈和队列运用在这个停车场管理系统中正是发挥它的最大限度,他可以让这个系统做到很完美,将能表达的全都表达出来。
七、总结
通过这段时间的课程设计,本人对计算机的应用,数据结构的作用以及C语言的使用都有了更深的了解。
尤其是C语言的进步让我深刻的感受到任何所学的知识都需要实践,没有实践就无法真正理解这些知识以及掌握它们,使其成为自己的财富。
在理论学习和上机实践的各个环节中,通过自主学习和请教老师,我收获了不少。
当然也遇到不少的问题,也正是因为这些问题引发的思考给我带了收获。
从当初不喜欢上机写程序到现在能主动写程序,从当初拿着程序不只如何下手到现在知道如何分析问题,如何用专业知识解决实际问题的转变,我发现无论是专业知识还是动手能力,自己都有很大程度的提高。
在这段时间里,我对for、while等的循环函数用法更加熟悉,逐渐形成了较好的编程习惯。
在老师的指导帮助下,同学们课余时间的讨论中,这些问题都一一得到了解决。
在程序的调试能力上,无形中得到了许多的提高。
例如:
头文件的使用,变量和数组的范围问题,定义变量时出现的问题等等。
在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,所以相信通过此次实习可以提高我们分析设计能力和编程能力,为后续课程的学习及实践打下良好的基础。
在这次短短的课程实践里,我们得到了刘杰老师的关心和帮助。
她给了我们很多的信息,与我们一起探讨问题,询问我们遇到了哪些问题并耐心给予指导。
当我们遇到技术上难以解决的问题时,她就会指导我们解决问题,她把自己多年来积累的经验教授给我们,使我们顺利地完成了课程实践任务。
时间过得真快,大学生活不知不觉就走过了一年,一年的大学学习和课程实践阶段的提高,使我们本身知识得到提高的同时,也增强了我们对未来工作的信心,我们相信自己未来两年的学习更使我们有能力胜任将来的工作。
八、参考文献
参考资料:
[1]朱蓉,《数据结构实验指导书》
[2]严蔚敏吴伟民,.数据结构(C语言版),1999,清华大学出版社;
[3]严蔚敏吴伟民,.数据结构题集(C语言版),1999,清华大学出版社;
[4]徐孝凯,数据结构课程实验,2002,清华大学出版社;
[5]孟佳娜胡潇琨,算法与数据结构实验与习题,2004,机械工业出版社;