停车场管理课程设计.docx
《停车场管理课程设计.docx》由会员分享,可在线阅读,更多相关《停车场管理课程设计.docx(28页珍藏版)》请在冰豆网上搜索。
停车场管理课程设计
一、绪论
数据结构是计算机程序设计的重要理论技术基础,也是计算机学科的核心课程,而课程设计则是考察我们学生对数据结构的熟悉程度及掌握程度。
此次的课程设计是关于停车场管理系统的编程,需要考查的是对栈和队列的熟练使用,以及对基础知识的掌握。
这次的课程设计主要是用栈和队列实现模拟停车场的基本原理,栈的顺序存储结构和队列的链式存储结构的定义和算法描述,同时也学会了编写停车场问题的程序。
二、程序设计
2.1、需求分析
(1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时收费。
进入主菜单前需要输入收费标准以及停车场所能容纳的车辆数目。
(2)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放。
实现停车场的调度功能。
(3)用顺序栈来表示停车场,链队表示停车场外的便道。
(4)显示停车场信息和便道信息。
(5)程序执行的命令为:
车辆进入停车场
车辆离开停车场
显示停车场的信息。
2.2、概要设计
抽象数据类型定义
(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.3、详细设计
2.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;/*通道*/
2.3.2、主要模块的算法描述
1、功能模块说明:
停车场管理系统含有三个模块,即:
车辆到达、离开、主菜单显示停车场信息
(1)、“到达”模块即为车辆到达:
到达时有两种情况,即车场是否满,未满则直接进入停车场;满时,到便道等待。
如下图流程图1所示:
是
否
图2-1车辆到达流程图
(2)“离开”模块:
离开时,当车库为空时,提示没有车,结束;否则车辆离开。
如下图流程图2所示:
否是
是
否
图2-2车辆离开流程图
(3)主菜单显示模块:
停车场显示中会有四种选择,选择1表示车辆到达,选择2表示车辆离开,选择3表示显示停车场信息以及便道信息,选择4表示退出停车管理系统。
如下图流程图3所示:
1234
图2-3主菜单显示流程图
2.4、编码实现
本程序主要分为四部分:
(1)主函数及程序框架、
(2)车辆到达模块、(3)车辆离开模块、(4)显示车辆信息模块。
(1)主函数
voidmain()
{
SqStackIn,Out;
LinkQueueWait;
intch;
InitStack(&In);/*初始化停车站*/
InitStack(&Out);/*初始化让路的临时栈*/
InitQueue(&Wait);/*初始化通道*/
while
(1)
{
printf("请输入停车场的容量:
");
scanf("%d",&MAX);
printf("请输入停车场的收费标准(元/小时):
");
scanf("%f",&price);
printf("您输入的停车场容量为%d位,费用为%2.1f元/小时。
\n",MAX,price);
printf("-----------欢迎使用本停车管理系统-----------\n");
printf("********************************************************\n");
printf("1.车辆到达\n");
printf("2.车辆离开\n");
printf("3.停车场信息\n");
printf("4.退出系统\n");
printf("********************************************************\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("您输入的停车场容量为%d位,费用为%2.1f元/小时。
\n",MAX,price);
printf("您输入的停车场容量为%d位,费用为%2.1f元/小时。
\n",MAX,price);
printf("-----------欢迎使用本停车管理系统-----------\n");
printf("********************************************************\n");
printf("1.车辆到达\n");
printf("2.车辆离开\n");
printf("3.停车场信息\n");
printf("4.退出系统\n");
printf("********************************************************\n");
}
}
}
(2)车辆到达模块
intarrive(SqStack*In,LinkQueue*W)/*车辆到达*/
{
Car*p;
QNode*t;
p=(Car*)malloc(sizeof(Car));
flushall();
printf("\n停车场还有%d停车位(若停车位为0,车可先进入便道等待)",MAX-In->top);
printf("\n请输入车牌号码:
");
gets(p->num);
if(In->top{
In->top++;
printf("\n停车的位置:
%d号停车位。
",In->top);
printf("\n请输入车到达的时间:
");
scanf("%d:
%d",&(p->reach.hour),&(p->reach.min));
In->stack[In->top]=p;
printf("请按任意键返回");
getch();
return
(1);
}
else/*停车场已满,车进便道*/
{
printf("\n停车位已满,该车须在便道等待!
");
t=(QNode*)malloc(sizeof(QNode));
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
printf("请按任意键返回");
getch();
return
(1);
}
}
(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--;
}
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--;
}
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->top}
elseprintf("\n停车场里没有车\n");/*没车*/
printf("请按任意键返回");
getch();}
(4)停车场显示信息
voidPRINT(Car*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)+(B2-A2)/60.0)*price);
free(p);
}
2.5、调试分析与结果
测试数据及结果如下:
输入停车场的容量4,收费5元/小时,接着查看停车场的信息;
如下图2-4所示:
图2-4停车场系统初始化示意图
接着输入4辆车的信息,然后查看停车场信息,如图2-5所示:
图2-5车辆进入停车场示意图
再输入1辆车的信息,然后查看停车场信息,如图2-6(a)和图2-6(b)所示:
图2-6(a)车辆进入便道示意图
图2-6(b)车辆进入便道示意图
最后选择车辆离开,输入第2辆车离开,再查看停车场信息,如图2-7所示:
图2-7(a)车辆离开示意图
图2-7(b)车辆离开示意图
四、总结与体会
通过这次课程设计使我充分的理解了用栈和队列实现模拟停车场的基本原理,知道了栈的顺序存储结构和队列的链式存储结构的定义和算法描述,同时也学会了编写停车场问题的程序。
虽然此次的程序不是很完备,没有加入一些更完善的功能,但是总体还是一个比较能体现数据结构知识点能力的程序了,当然只是相对于我这个初学者来说。
在刚开始编程的时候,我感到有点无从下手,但经过对题目的详细分析和思考之后,我就知道具体应该做什么,怎么做了。
经过几天的研究,我顺利的完成了这个程序,完成这个程序,我学到了很多东西,这是在课堂上无法做到的。
在此我非常要感谢指导老师,感谢老师的细心认真的辅导,让我对数据结构这门课程掌握得更好,懂得更多,她教我怎么分析问题,应该要注意些什么,最后还指出我存在的问题。
五、参考文献
[1]黄同成,黄俊民,董建寅.数据结构[M].北京:
中国电力出版社,2008
[2]董建寅,黄俊民,黄同成.数据结构实验指导与题解[M].北京:
中国电力出版社,2008
[3]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2002
[4]刘振鹏,张晓莉,郝杰.数据结构[M].北京:
中国铁道出版社,2003
六、源程序清单
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"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++)
s->stack[s->top]=NULL;
}
intInitQueue(LinkQueue*Q)/*初始化便道*/
{
Q->head=(QNode*)malloc(sizeof(QNode));
if(Q->head!
=NULL)
{
Q->head->next=NULL;
Q->rear=Q->head;
return
(1);
}
elsereturn(-1);
}
voidmain()
{
SqStackIn,Out;
LinkQueueWait;
intch;
InitStack(&In);/*初始化停车站*/
InitStack(&Out);/*初始化让路的临时栈*/
InitQueue(&Wait);/*初始化通道*/
while
(1)
{
printf("请输入停车场的容量:
");
scanf("%d",&MAX);
printf("请输入停车场的收费标准(元/小时):
");
scanf("%f",&price);
printf("您输入的停车场容量为%d位,费用为%2.1f元/小时。
\n",MAX,price);
printf("-----------欢迎使用本停车管理系统-----------\n");
printf("********************************************************\n");
printf("1.车辆到达\n");
printf("2.车辆离开\n");
printf("3.停车场信息\n");
printf("4.退出系统\n");
printf("********************************************************\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("您输入的停车场容量为%d位,费用为%2.1f元/小时。
\n",MAX,price);
printf("您输入的停车场容量为%d位,费用为%2.1f元/小时。
\n",MAX,price);
printf("-----------欢迎使用本停车管理系统-----------\n");
printf("********************************************************\n");
printf("1.车辆到达\n");
printf("2.车辆离开\n");
printf("3.停车场信息\n");
printf("4.退出系统\n");
printf("********************************************************\n");
}
}
}
intarrive(SqStack*In,LinkQueue*W)/*车辆到达*/
{
Car*p;
QNode*t;
p=(Car*)malloc(sizeof(Car));
flushall();
printf("\n停车场还有%d停车位(若停车位为0,车可先进入便道等待)",MAX-In->top);
printf("\n请输