基于栈和队列的停车场管理系统设计与实现课程设计学位论文.docx
《基于栈和队列的停车场管理系统设计与实现课程设计学位论文.docx》由会员分享,可在线阅读,更多相关《基于栈和队列的停车场管理系统设计与实现课程设计学位论文.docx(24页珍藏版)》请在冰豆网上搜索。
基于栈和队列的停车场管理系统设计与实现课程设计学位论文
长春建筑学院《数据结构》课程设计(论文)
基于栈和队列的停车场管理系统设计与实现
Stackandqueue-basedparkingmanagementsystemdesignandImplementation
年级:
学号:
姓名:
专业:
指导老师:
二零一三年十二月
摘要
计算机科学技术的发展,不仅极大地促进了整个科学技术的发展,而且明显地加快了经济信息化和社会信息化的进程。
因此,计算机教育在全国备受重视,计算机知识与能力已成为21世纪人才素质的基本要素之一。
如今,高等教育的计算机教育发展十分迅速。
十多年前,只有部分理工科专业开设计算机课程。
今天,几乎所有高校的所有专业都开设了程度不同的计算机课程。
人们已经认识到,计算机知识已成为当代知识分子知识结构中不可缺少的重要组成部分。
而除了掌握计算机的基础知识和操作的基本能力外,掌握一门高级编程语言,并可以熟练运用它,已成为当代大学生综合能力必要组成。
计算机技术发展如此迅猛,计算机应用如此广泛,需要学习的东西愈来愈多,而我们的总学时是有限的。
一般来说,计算机课程学习可以分为两部分:
一部分是理论课程学习,一部分是上机应用实习。
根据我们专业的性质和要求,则应侧重于上机操作运用。
关键字:
计算机上机应用实习
Abstract
Developmentofcomputerscienceandtechnology,notonlygreatlypromotedthedevelopmentofthescienceandtechnology,butalsosignificantlyacceleratetheeconomicandsocialinformatizationprocessofinformation.Therefore,thecountryhasattractedincreasingattentionincomputereducation,computerknowledgeandabilityhasbecomeoneofthebasicelementsofthe21stcentury,thequalityoftalent.
Today,thecomputerisveryfastdevelopmentofhighereducation.Tenyearsago,onlyapartofthecreationofcomputerscienceandengineeringcourses.Today,almostallprofessionalcollegesanduniversitieshavesetupallthedifferentlevelsofcomputercourses.Ithasbeenrecognized,computerknowledgehasbecomethecontemporaryintellectualsimportantpartoftheknowledgestructureindispensable.Andinadditiontomasterthebasicsofcomputeroperationandbasicabilitytomasterahigh-levelprogramminglanguage,andcanskillfullyuseit,hasbecomeanessentialcomponentofcontemporarycollegestudents'comprehensiveability.
Computertechnologyisgrowingsofast,computerapplicationsoextensive,moreandmorethingstolearn,andourtotalhoursarelimited.Generally,computerlearningcoursescanbedividedintotwoparts:
oneisthetheoreticalcourses,practicalapplicationpartofthemachine.Accordingtothenatureandrequirementsofourprofessional,youshouldfocusontheuseofmachineoperation.
Keywords:
comptuerComputerapplicationpractice
目录
摘要I
AbstractII
第1章绪论-1-
1.1设计目的-1-
1.2设计内容-1-
1.3设计要求-2-
1.4设计思想-2-
第2章概要设计-3-
2.1抽象数据类型定义-3-
2.2模块划分-5-
第3章详细设计-7-
3.1数据类型的定义-7-
3.2主要模块的算法描述-8-
第4章系统测试-12-
第4章系统测试-13-
4.1调试分析-13-
第5章测试结果-14-
5.1测试数据及结果-14-
5.2结果分析-17-
第6章课程设计总结-18-
第1章绪论
引言:
课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。
课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。
《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。
数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
1.1设计目的
1、掌握栈和队列的建立。
2、掌握栈和队列的基本操作。
3、深入了解栈和队列的特性,以便在解决实际问题中灵活运用它们。
4、加深对栈和队列的理解和认识。
1.2设计内容
停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
停车场内已停了n辆汽车,后来的汽车只能在门外的便道上等候,一旦有车开走,排在通道上的第一辆车即可开入;当停车场内每辆车要离开时,在它之后进入的车辆必须先退出停车场为其让路,待该辆车开出大门,其他车辆再按原次序进入停车场。
为停车场编写按上述要求进行管理的模拟程序。
1.3设计要求
(1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。
(2)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。
实现停车场的调度功能。
(3)用顺序栈来表示停车场,链队表示停车场外的便道。
(4)显示停车场信息和便道信息。
(5)程序执行的命令为:
车辆进入停车场
车辆离开停车场
显示停车场的信息。
1.4设计思想
1.当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进入停车场;如果停车场已满,则车辆进入便道等候。
2.当车辆要求出栈时,先让在它之后进入停车场的车辆退出停车场为它让路,再让该车退出停车场,让路的所有车辆再按其原来进入停车场的次序进入停车场。
之后,再检查在便道上是否有车
等候,有车则让最先等待的那辆车进入停车场。
3.用顺序结构实现栈,用链表实现队列。
第2章概要设计
2.1抽象数据类型定义
(1)栈的抽象数据类型定义
ASTStack{
数据对象:
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}
数据关系:
R1={|ai-1,ai∈D,i=2,...,n}
约定an端为栈顶,a1端为栈底。
基本操作:
InitStack(&S)
操作结果:
构造一个空栈S。
DestroyStack(&S)
初始条件:
栈S已存在。
操作结果:
栈S被销毁。
ClearStack(&S)
初始条件:
栈S已存在。
操作结果:
将栈S清为空栈。
StackEmpty(S)
初始条件:
栈S已存在。
操作结果:
若栈S为空栈,则返回TRUE,否则FALSE。
StackLength(s)
初始条件:
栈S已存在。
操作结果:
返回S的元素个数,既栈的长度。
GetTop(S,&e)
初始条件:
栈S已存在且非空。
操作结果:
用e返回S的栈顶元素。
Push(&S,e)
初始条件:
栈S已存在。
操作结果:
插入元素e为新的栈顶元素。
Pop(&S,&e)
初始条件:
栈S已存在且非空。
操作结果:
删除S的栈顶元素,并用e返回其值。
StackTraverse(S,visit())
初始条件:
栈S已存在且非空。
操作结果:
从栈底到栈顶依次对S的每个数据元素调用函数visit()。
一旦visit()失败,则操作失效。
}ADTStack
(2)队列的抽象数据类型定义
ADTQueue{
数据对象:
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}
数据关系:
R1={|ai-1,ai∈D,i=2,...,n}
约定其中a1端为队列头,an为队列尾。
基本操作:
InitQueue(&Q)
操作结果:
构造一个空队列Q。
DestroyQueue(&Q)
初始条件:
队列Q已存在。
操作结果:
队列Q被销毁,不再存在。
ClearQueue(&Q)
初始条件:
队列Q已存在。
操作结果:
将Q清为空队列。
QueueEmpty(Q)
初始条件:
队列Q已存在。
操作结果:
若Q为空队列,则返回TRUE,否则FALSE。
QueueLength(Q)
初始条件:
队列Q已存在。
操作结果:
返回Q的元素个数,即队列的长度。
GetHead(Q,&e)
初始条件:
Q为非空队列。
操作结果:
用e返回的队头元素。
EnQueue(&Q,e)
初始条件:
队列Q已存在。
操作结果:
插入元素e为Q的新的队尾元素。
DeQueue(&Q,&e)
初始条件:
Q为非空队列。
操作结果:
删除Q的队头元素,并用e返回其值。
QueueTraverse(Q,visit())
初始条件:
Q已存在且非空。
操作结果:
从队头到队尾,依次对Q的每个数据元素调用函数visit()。
一旦visit() 失败,则操作失败。
}ADTQueue
2.2模块划分
本程序包括六个模块:
(1)主程序模块
voidmain()
{
初始化停车站;
初始化让路的临时栈;
初始化通道;
输出主菜单:
车辆到达、车辆离开与计费、查看停车场信息;
}
(2)入场模块
intarrive(SqStack*In,LinkQueue*W)
{
车辆进入停车场;
计算停车费用
}
(3)出场模块
voidleave(SqStack*In,SqStack*Out,LinkQueue*W)
{
车辆离开停车场;
}
(4)输出模块
voidinfo(SqStackS,LinkQueueW)
{
输出停车场信息;
}
(5)栈模块——实现栈的抽象数据类型
(6)队列模块——实现队列的抽象数据类型
第3章详细设计
3.1数据类型的定义
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;/*通道*/
3.2主要模块的算法描述
本程序主要分为四部分:
(1)主函数及程序框架、
(2)车辆到达模块、(3)车辆离开模块、(4)显示车辆信息模块,由梁伟明、段庆龙、丁磊和我合作编写,我主要负责leave(车辆离开)函数部分。
(1)主函数
voidmain()
{
SqStackIn,Out;LinkQueueWait;
intch;
InitStack(&In);/*初始化停车站*/
InitStack(&Out);/*初始化让路的临时栈*/
InitQueue(&Wait);/*初始化通道*/
while
(1)
{
printf("--------------------欢迎使用停车场管理系统--------------------\n");
printf("\t本系统由5011工作室开发,作者:
邓春国、段庆龙、梁伟明、丁磊。
\n\n");
printf("请输入停车场的容量:
");
scanf("%d",&MAX);
printf("请输入停车场的收费标准(元/小时):
");
scanf("%f",&price);
printf("您输入的停车场容量为%d位,费用为%2.1f元/小时。
\n",MAX,price);
printf("\n
(1)车辆到达\n
(2)车辆离开\n(3)停车场信息\n(4)退出系统\n请选择\n");
while
(1)
{
ch=getch();
switch(ch)
{
case49:
arrive(&In,&Wait);break;/*车辆到达*/
case50:
leave(&In,&Out,&Wait);break;/*车辆离开*/
case51:
info(In,Wait);break;/*输出车站信息*/
case52:
{printf("谢谢使用!
");exit(0);}/*退出主程序*/
default:
printf("\n按键无效,请重新按键选择!
");
}/*49-52分别表示“1”-“4”这四个按键的键值*/
system("CLS");
printf("--------------------欢迎使用停车场管理系统--------------------\n");
printf("\t本系统由CG工作室开发,作者:
邓春国、段庆龙、梁伟明、丁磊。
\n\n\n");
printf("您输入的停车场容量为%d位,费用为%2.1f元/小时。
\n",MAX,price);
printf("\n
(1)车辆到达\n
(2)车辆离开\n(3)停车场信息\n(4)退出系统\n请选择\n");
}
}
}
(2)车辆离开模块
算法分析
voidleave(SqStack*In,SqStack*Out,LinkQueue*W)/*车辆离开*/
{
introom;
Car*p,*t;QNode*q;
/*开始定义一个整型变量room,用来记录要离开的车辆在停车场的位置,定义车辆结点指针p和t和队列结点指针q。
*/
if(In->top>0)/*有车*/
{
while
(1)
{
printf("\n请输入车在停车场的位置(1-%d):
",In->top);
scanf("%d",&room);
if(room>=1&&room<=In->top)break;
}
/*判断停车场内是否有车,如果有车,就输入要离开的车辆在停车场的位置,否则就提示停车场没车。
这里用了while循环语句,如果输入的车辆位置超出范围,就要重新输入。
*/
while(In->top>room)/*车辆离开*/
{
Out->top++;
Out->stack[Out->top]=In->stack[In->top];
In->stack[In->top]=NULL;In->top--;
}
/*如果栈顶位置In->top大于要离开的车位置room(即要离开的车不在停车场的门口)的话,在要离开的车辆前面的车就要先离开,开到临时停车场,即临时栈中,因此Out所表示的临时栈的栈顶top加1,用来表示临时停车场增加1辆车;接着把该车的信息拷贝到栈Out中,然后删除栈In的栈顶(即这辆车开走)。
*/
p=In->stack[In->top];
In->stack[In->top]=NULL;In->top--;
while(Out->top>=1)
{
In->top++;In->stack[In->top]=Out->stack[Out->top];
Out->stack[Out->top]=NULL;Out->top--;
}
/*直到要离开的车辆前面的车都开到临时停车场之后,该车才离开,离开之后,该车的信息结点In->stack[In->top]置空,然后栈顶In->top减1。
之后就判断临时停车场是否有车,有车就一辆一辆的开回停车场里面,因此停车场的栈顶In->top加1,然后就把临时停车场的车结点的信息拷贝到停车场的车结点上,接着删除临时停车场车的结点(即Out->stack[Out->top]=NULL;Out->top--;)。
*/
PRINT(p,room);
if((W->head!
=W->rear)&&In->top{
q=W->head->next;t=q->data;In->top++;
printf("\n便道的%s号车进入车场第%d号停车位。
",t->num,In->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;
In->stack[In->top]=t;
free(q);
}
/*判断(W->head!
=W->rear)&&In->toptop加1以便增加新的车辆,接着输入队头的车辆信息,即要进去停车场的车的信息,然后便道队列的头结点指向q(即刚进入停车场的车的结点)的后继结点,即原队列中第二辆车的结点,接着判断刚离开的车是否是最后一辆车,如果是,就把队列置空,即队头等于队尾;之后就把结点t(即要进入停车场的车)的信息拷贝到停车场栈顶的车中,最后释放p的空间,即原队头结点。
*/}
elseprintf("\n停车场里没有车\n");/*没车*/
printf("请按任意键返回");
getch();}
leave函数流程图如图3.1所示:
图3.1leave函数流程图
否
是
是
是
否
否
第4章系统测试
4.1调试分析
调试过程中的主要问题由于此停车场管理系统是分模块设计的,而且在程序的实现过程中又使用了清屏函数,所以,运行时用户选择任务并且执行完任务后,又会回到供用户选择功能的主界面,因此整个程序从整体上来讲结构清晰,使用方便。
本程序的调试运行,总体上情况良好,但中间也出现了一些小问题。
其中比较有代表性的主要问题有:
(1)当停车场已经达到最大容量,但仍有车辆进入停车场的时候,运行界面上没有出现或者说出现了但又跳掉了“车站已满!
车辆已经入通道!
”的提示信息。
在查阅了多种资料后,在那一个printf语句后加了一个getch(),此时,程序运行结果就符合要求了,看起来也比较清晰了。
(2)使用getch()语句必须使用头文件#include
刚开始因为没有使用这个头文件,所以会出现getch()这个无法辨别
图5.1错误报告1
(3)在对字符型的数据进行赋值的时候,要用strcpy,而不能直接用pcar.num=pnum这样的赋值形式,这样子会产生如下的错误:
图5.2错误报告2
正确的形式应该是这样的:
strcpy(pcar.num,pnum);
第5章测试结果
5.1测试数据及结果
输入停车场的容量4,收费5元/小时,接着查看停车场的信息,如图5.1所示:
图5.1停车场系统初始化示意图
接着输入4辆车的信息,然后查看停车场信息,如图5.2所示:
图5.2车辆进入停车场示意图
再输入1辆车的信息,然后查看停车场信息,如图5.3(a)和图5.3(b)所示:
图5.3(a)车辆进入便道示意图
图5.3(b)车辆进入便道示意图
最后选择车辆离开,输入第2辆车离开,再查看停车场信息,如图5.4(a)和图5.4(b)所示:
图5.4(a)车辆离开示意图
图5.4(b)车辆离开示意图
5.2结果分析
通过这次数据结构课程设计,我认识到从课本上学到的知识是远远不够的。
本次设计使我深入的了解了栈与队列的建立、插入、删除和在实际问题下灵活运用它们,另一方面使我对栈和队列的抽象数据类型有了进一步的认识。
虽然经过努力终于把该系统完成,可是该系统还是不完善,程序中的一些算法还不是很清楚,只不过把简单的功能实现了出来,这些缺憾归根结底都是因为我的C++语言和数据结构的水平还不是很高,还需要经过不懈的努力才能做出比较完善的系统。
这次课程设计让我明白要真正的掌握一门编程语言需要的不仅仅是课本上的东西,还要在实际的编程过程中慢慢的掌握其中的奥妙。
同时我明白了,要成为一名优秀的编程人员所要具备的各种条件(坚实的编程语言基础、熟练的调试程序的技能、重要的是要有耐心、同时细心也是不可缺少的)。
所以为了自己的梦想,在以后的学习过程中,我要不断的充实自己,努力的学习。
通过这次课程设计,对数据结构的特点以及存储表示方式的认识有了明显的提高,同时还对在具体应用中选择合适的数据结构和存储结构的能