数据结构课程设计《停车场管理系统》.docx

上传人:b****3 文档编号:26561588 上传时间:2023-06-20 格式:DOCX 页数:34 大小:232.46KB
下载 相关 举报
数据结构课程设计《停车场管理系统》.docx_第1页
第1页 / 共34页
数据结构课程设计《停车场管理系统》.docx_第2页
第2页 / 共34页
数据结构课程设计《停车场管理系统》.docx_第3页
第3页 / 共34页
数据结构课程设计《停车场管理系统》.docx_第4页
第4页 / 共34页
数据结构课程设计《停车场管理系统》.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

数据结构课程设计《停车场管理系统》.docx

《数据结构课程设计《停车场管理系统》.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计《停车场管理系统》.docx(34页珍藏版)》请在冰豆网上搜索。

数据结构课程设计《停车场管理系统》.docx

数据结构课程设计《停车场管理系统》

《数据结构与算法》课程设计任务书

题目:

停车场管理系统

学生姓名:

李雷正学号:

班级:

物联网工程二班

题目类型:

停车场管理系统指导教师:

一.题目简介

该设计要求学生以停车场管理业务为背景,设计出一个简单的能够实现停车场管理功能的系统。

通过该题目的设计过程,可以加深理解线性表的逻辑结构、存储结构,掌握栈、队列上基本运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。

二.主要任务

第一部分:

基本算法实现

1、线性结构基本算法实现(指导老师根据题目指定);

2、树型结构基本算法实现(指导老师根据题目指定);

3、图型结构基本算法实现(指导老师根据题目指定);

4、查找基本算法实现(指导老师根据题目指定);

5、排序基本算法实现(指导老师根据题目指定);

第二部分:

指定题目的设计与实现

1、查阅文献资料,一般在3篇以上;

2、建立数据的逻辑结构和物理结构;

3、完成相应算法的设计;

4、完成测试工作;

5、撰写设计说明书;

6、做好答辩工作。

三.主要内容、功能及技术指标

(1)使用链表或顺序表实现数据的录入(顺序表或链表的创建)、查找、修改、插入、追加、删除、排序、统计、输出等功能;

(2)建立一个测试的数据表,至少要有20个测试数据,算法对于这些合法的输入数据都能产生满足规格说明要求的结果;

(3)算法对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果;对算法实现过程中的异常情况能给出有效信息;

(4)车辆基本情况包括的数据项有:

汽车到达或离开的信息、汽车牌照号码、到达或离去的时刻等;

(5)要求:

若车辆到达,则输出汽车在停车场内或便道上的停车位置;若车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用。

四.提交的成果

1.设计说明书一份,内容包括:

1)中文摘要100字;关键词3-5个;

2)序言;

3)采用类c语言定义相关的数据类型

4)各模块的伪码算法

5)函数的调用关系图

6)调试分析

a、调试中遇到的问题及对问题的解决方法;

b、算法的时间复杂度和空间复杂度。

7)测试结果

8)源程序(带注释)

9)设计总结、参考文献、致谢等。

2.刻制光盘一张。

五.主要参考文献

1严蔚敏,吴伟民.《数据结构(C语言版)》.清华大学出版社.

2严蔚敏,吴伟民.《数据结构题集(C语言版)》.清华大学出版社.

3《DATASTRUCTUREWITHC++》.WilliamFord,WilliamTopp.清华大学出版社(影印版).

4谭浩强.《c语言程序设计》.清华大学出版社.

5.数据结构与算法分析(Java版),APracticalIntroductiontoDataStructuresandAlgorithmAnalysisJavaEditionCliffordA.Shaffer,张铭,刘晓丹译 电子工业出版社2001年1月.

六.各阶段时间安排(共3周)

周次

日期

内容

地点

第1周

星期一

教师讲解设计要求,准备参考资料

教室、

图书馆

星期二~三

分析设计要求,进行数据结

构及算法设计

教室

星期四~五

算法设计,编程实现

教室

第2周

星期一~三

编程上机实现、测试程序

教室

星期四~五

检查程序,答辩

教室

 

2018年6月25日

 

 

摘要

伴随着科技的飞速发展,交通工具的越来越普及,汽车作为人类社会中一个最主要的交通工具之一,在人类生活当中起着不可或缺的作用,所以每个人都梦想着拥有一辆属于自己的汽车,随着人们生活水平的提高,每个人的梦想都快速的实现,并且汽车的数量直线上升,进而引发出一系列的问题。

例如,停车场的智能化管理问题成为一个普遍的问题。

智能化停车场管理不仅可以减少管理人员的开支,而且可以减少由操作人员失误造成损失,从而大大提高了管理效率,降低了管理成本。

 

关键字:

停车场;栈;线性表;队列

 

1.序言

在竞争激烈的现代市场中,随处都可用到系统,程序。

可见,一套完整的系统对人们的生活显得尤为重要。

当然,这些最主要的还是应用于与人们息息相关的停车场管理情况当中。

尤其是上下班之间,人们出行的机率在日益升高。

为此,设计一套完整的停车场管理系统对实现停车场的系统管理显得尤为重要。

随着我国经济的迅速发展,人们的生活水平有了显著提高,假日旅行车流量特别大。

同时,随着经济的发展,车辆越来越多,为了能更好的管理停车场的车辆是停车场管理员必须面临的问题。

对停车场的运行状况起决定作用的是车辆管理效率。

如何利用先进的管理手段,提高停车场的管理水平,已成为停车场的当务之急。

面对信息时代的机遇和挑战,利用科技手段提高企业管理无疑是一条行之有效的途径。

可以最大限度地发挥准确、快捷、高效等作用,对停车场管理提供强有力的支持。

因此,采用全新的计算机网络和宾馆管理系统,已成为提高停车场的管理效率、改善服务水准的重要手段之一。

在某种意义上,停车场内车辆管理方面的信息化已成为现代化停车场的重要标志。

1.1设计任务

根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。

当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。

实现停车场的调度功能。

用顺序栈来表示停车场,链队表示停车场外的便道。

程序执行的命令为:

车辆进入停车场车辆离开停车场显示停车场的信息。

1.2设计思想

由于停车场是一个狭窄通道,而且只有一个大门可供汽车进出,问题要求汽车停车场内按车辆到达时间的先后顺序,依次由北向南排列。

由此很容易联想到数据结构中的堆栈模型,因此可首先设计一个堆栈,以堆栈来模拟停车场。

再设计一个队列来模拟便道,队列中的数据元素设计成汽车的车牌号,并以链表的形式存储。

另外,停车场根据汽车在停车场内停放的总时长来收费的,在便道上的时间不计费,因此必须记录车辆进入停车场时的时间和车辆离开停车场时的时间,然后计算、显示费用情况。

 

2.采取c语言定义相关的数据类型

2.1相关数据类型的定义

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.1.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详细数据类型的定义

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.各模块的伪码算法

3.1模块划分

3.1.1主程序模块

voidmain()

{

初始化停车站;

初始化让路的临时栈;

初始化通道;

输出主菜单:

车辆到达、车辆离开与计费、查看停车场信息;

}

3.1.2入场模块

intarrive(SqStack*In,LinkQueue*W)

{

车辆进入停车场;

计算停车费用

}

3.1.3出场模块

voidleave(SqStack*In,SqStack*Out,LinkQueue*W)

{

车辆离开停车场;

}

3.1.4输出模块

voidinfo(SqStackS,LinkQueueW)

{

输出停车场信息;

}

3.1.5栈模块——实现栈的抽象数据类型

3.1.6队列模块——实现队列的抽象数据类型

3.2主要模块的算法描述

3.2.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");

}

}

}

3.2.2车辆到达模块

voidjinru(stackhead&st,linkqueue&q)//对进入停车场的汽车的处理;

{

intnumber,time_a;

/*开始定义一个整型变量number,用来给到达的车辆编号,定义一个时间a,用来记录车辆到达的时间*/

Printf("车牌为:

");

Scanf(“%d”,&number);

Printf("进场的时刻:

");

Scanf(“%d”,&time_a);

/*对到达车辆的车牌号、到达时间信息的录入*/

if(st.stacksize_curren<2)

{

zanInodee;

e.number=number;

e.ar_time=time_a;

push(st,e);

printf("\n第%s号车进入车场第%d号停车位。

",t->num,In->top);

}

/*判断停车场是否已满,如果有停车位将录入的信息存储,并且显示车辆的位置*/

else

{

enqueue(q,number,time_a);

printf("\n停车场已满,该车进入车场第%d号停车位。

",In->top);

}

}

/*如果停车场已满,系统将提示把车停在便道上的第N个位置*/

3.2.3车辆离开模块

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();

}

 

 

4.函数的调用关系图及流程图

4.1函数调用关系图

 

Enqueue

Popqueue

Push

Pop

 

4.2程序运行流程图

 

4.3车辆到达流程图

 

进站

判断是否有车位

输出:

停车位已满

登记车辆信息

车辆离开

输出:

停站信息

 

4.4车辆离开程序运行流程图

5.调试程序中遇到的问题与解决方法

首先,在程序运行当中遇到的问题有很多,对于程序运行当中的第一个问题就是变量的错误定义,导致程序运行当中出现了问题,经过我坚持不懈的改进,最终将程序运行出来了。

从中我懂得了做每件事需要有不达目的不罢休精神。

第二个问题就是在做函数调用关系图的过程当中出现了做的关系图保存不了,做完就出现遗失调用关系图的情况。

通过跟同学的商讨跟请教,原来问题是出在了没建立画布,最终我建立画布,重新做完了函数调用关系图及程序运行流程图。

在这当中我学到了很多新的技能,还深刻的体会到了学以致用的难度。

6.测试分析

6.1主界面

6.2车辆进站信息界面:

 

6.3完成车辆停放界面

6.4车辆离站界面

6.5收据界面

6.6退出程序界面

7.源程序

#include

#include

#include

#include

#include

#definesize1//停车场位置数

//模拟停车场的堆栈的性质;

typedefstructzanlind{

intnumber;//汽车车号

intar_time;//汽车到达时间

}zanInode;

typedefstruct{

zanInode*base;//停车场的堆栈底

zanInode*top;//停车场的堆栈顶

intstacksize_curren;

}stackhead;

//堆栈的基本操作;

voidinitstack(stackhead&L)//构造一个空栈

{

L.base=(zanInode*)malloc(size*sizeof(zanlind));

if(!

L.base)exit(0);

L.top=L.base;

L.stacksize_curren=0;

}

voidpush(stackhead&L,zanInodee)//把元素e压入s栈

{

*L.top++=e;

L.stacksize_curren++;

}

voidpop(stackhead&L,zanInode&e)//把元素e弹出s栈

{

if(L.top==L.base)

{

cout<<"停车场为空!

!

";

return;

}

e=*--L.top;

L.stacksize_curren--;

}

//模拟便道的队列的性质;

typedefstructduilie{

intnumber;//汽车车号

intar_time;//汽车到达时间

structduilie*next;

}*queueptr;

typedefstruct{

queueptrfront;//便道的队列的对头

queueptrrear;//便道的队列的队尾

intlength;

}linkqueue;

//队列的基本操作;

voidinitqueue(linkqueue&q)//构造一个空队列

{

q.front=q.rear=(queueptr)malloc(sizeof(duilie));

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1