停车场管理系统数据结构课程设计论文.docx
- 文档编号:7016189
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:24
- 大小:465.75KB
停车场管理系统数据结构课程设计论文.docx
《停车场管理系统数据结构课程设计论文.docx》由会员分享,可在线阅读,更多相关《停车场管理系统数据结构课程设计论文.docx(24页珍藏版)》请在冰豆网上搜索。
停车场管理系统数据结构课程设计论文
数据结构课程设计
题目:
停车场管理系统
一课题分析
a)该程序主要利用栈和队列来实现车的到达与其离开功能,其中主要有对各种情况的处理,要求如下:
1、要求以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的数据序列进行模拟管理
2、要求处理的数据元素包括三个数据项:
汽车“到达”或“离去”信息,汽车牌照与到达或离去的时间
3、该系统完成以下功能:
若是车辆到达,则输出汽车在停车场或便道上的停车位置;若是离去,则输出汽车在停车场停留的时间和应缴纳的费用(在便道上停留的时间不收费)
4、要求栈以顺序结构实现;
b)程序的输入,程序功能选择,字符型,A为到达,D离开,E退出系统;车的编号是整型,输入数字即可;时间是float类型,可精确到分钟
c)程序的输出,当车到达,程序输出车的编号与到达时间,若栈满则提示停到便道上;车离开时,输出车的编号与其所需费用。
d)测试数据,(A,1,5),(A,2,10),(D,1,15),(A,3,20),(A,4,25),(A,5,30),(D,2,35),(D,4,40),E以与a)中的要求。
其中‘A’表示到达,D表示离开,E表示结束。
二逻辑分析
2.1数据结构的描述和每个基本操作的功能说明
ADTstack{
数据对象:
D={ai|ai∈CharSet,i=1,2,…,n,n≥0}
数据关系:
R1={
基本操作:
initstack()
操作结果:
构造一个空栈,并返回地址。
gettop(&S)
初使条件:
栈S已存在。
操作结果:
栈S不为空,输出顶元素。
stop(&S,e)
初始条件:
栈S已存在。
操作结果:
要栈S中栈顶插入新的栈顶元素e。
ADTqueue{
数据对象:
D={ai|ai∈ElemSet,i=1,2,…,n,n≥0}
数据关系:
R1={
约定其中ai端为队列的头,an端为队列的尾
}
initqueue(&Q)
操作结果:
构造一个空栈,并返回地址。
gethead(&S)
初使条件:
栈S已存在。
操作结果:
栈S不为空,输出顶元素。
enqueue(&S,e)
初始条件:
栈S已存在。
操作结果:
要栈S中栈顶插入新的栈顶元素e
2.1给出本程序包含的模块与模块之间的调用关系图
本程序包含三个模块:
1)主程序模块:
Voidmain()
{
初始化;
do{
接受命令;
处理命令;
}while(命令!
=“退出”)
}
2)栈模块——实现栈抽象数据类型
3)队列模块——实现队列抽象数据类型
2.3写出重要部分的伪码算法
车辆到达或者离开的伪码算法:
do{
输出菜单选项;
如果选择A,即车辆到达,
则{若栈不满,车辆进栈,停到停车场;
否则,车入队,车停在便道上;
}
如果选择D,即车辆离开,
则{如果队不空并且栈不满,被选的车辆离开,队列上的车出队入栈;
被选的车辆离开;
计算时间与其所需费用;
}
如果选择E,退出程序;
}while(输入的菜单选项不正确)
三详细设计
3.1数据结构的定义,与其基本操作的实现
typedefstructtime
{
inthour;
intmin;
}Time;
typedefstruct//车信息
{
charlabel[10];
floattime;
}Car,Car2;
typedefstruct//车库信息
{
Car*top;
Car*base;
intstacksize;
}SqStack;
typedefstruct//临时车道
{
Car2*top2;
Car2*base2;
intstacksize2;
}SqStack2;
typedefstructQNode//车道信息
{
Cardata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
3.2主函数和其他函数的实现或伪码算法
voidmain()
{
SqStackS;
SqStack2S2;
InitStack(&S);
InitStack2(&S2);
InitQueue(&Q);//初始化
while(ch==1)
{
do
{
printf("\n\t\t\t\tA-车辆到达\n\t\t\t\tD-车辆离开\n\t\t\t\tE-退出\n\t\t\t\tA/D/E?
\b");
scanf("%c",&status);
getchar();
}while(status!
='A'&&status!
='a'&&status!
='D'&&status!
='d'&&status!
='E'&&status!
='e');
if(status=='A'||status=='a')//当车到达
{
输入车号;
输入车到达时间;
if(!
StackFull(S))//栈不满
{
车入栈;
printf("\n\t\t\t\t继续请输入1\n\t\t\t\t放弃请输入0?
\b");
scanf("%d",&ch);
getchar();
}//if
else
{
车入队;
printf("\n\t\t\t\t继续请输入1\n\t\t\t\t放弃请输入0?
\b");
scanf("%d",&ch);
getchar();
}//else
}//if当车到达
elseif(status=='D'||status=='d')/*当车离开*/
{
do
{
输入车号;
输入车离开时间;
do
{
Pop(&S,&car_M);
if(car_D.label!
=car_M.label)
Push2(&S2,car_M);
else
car_I.time=car_M.time;
}while(car_D.label!
=car_M.label);
position_s--;
while(!
StackEmpty2(S2))//栈2不空
{
Pop2(&S2,&car_M);
Push(&S,car_M);
}//while
while(!
QueueEmpty(Q)&&!
StackFull(S))
{
if(!
StackFull(S))
{
栈不满的话,临时车道上的车进栈
}//if
}//while
time=car_D.time-car_I.time;
if(time<0.00)
{
printf("\n\t\t\t\tSorry!
Youinputawrongtime!
\n\t\t\t\tPleasecheckandtypeagain.\n");
}//if
else
{
计算停车时间;
计算所需费用;
}//else
printf("\n\t\t\t\tWelcometoback!
Doyouwanttocontinue\n\t\t\t\t1-contine/0-quit?
\b");
scanf("%d",&ch);
getchar();
}while(!
mistime);
}//elseif
elseexit(0);//退出程序
}//第一个while
}//main
3.3程序的层次结构的函数调用关系图
3.4详细设计
根据老师的要求,在这里我主要分析程序设计中停车场管理系统的进站模块:
该模块涉与多个函数,过程依次有初始化,选择进站输入A,车牌号,时间。
若站满,则车进入临时车道,分别记录时间和车牌号以与临时车道上的位置,站不满时临时车道上的车进站。
该程序流程图如下:
车进站流程图
四程序源代码
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#defineNULL0
#defineERROR0
#defineOK1
#defineOVERFLOW-1
#defineSTACK_INIT_SIZE2//车库容量
typedefstructtime{
inthour;
intmin;
}Time;//时间结点
typedefstruct//车信息
{
charlabel[10];
floattime;
}Car,Car2;
typedefstruct//车库信息
{
Car*top;
Car*base;
intstacksize;
}SqStack;
intInitStack(SqStack*S)//栈的初始化
{
S->base=(Car*)malloc(STACK_INIT_SIZE*sizeof(Car));
if(!
(S->base))returnERROR;
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
returnOK;
}
intStackEmpty(SqStackS)//栈空
{
if(S.top==S.base)
returnOK;
else
returnERROR;
}
intStackFull(SqStackS)//栈满
{
if(S.top-S.base>=STACK_INIT_SIZE)
returnOK;
else
returnERROR;
}
intPush(SqStack*S,Care)//入栈
{
if(S->top-S->base>=STACK_INIT_SIZE)
returnOVERFLOW;
else{
*(S->top++)=e;
returnOK;
}//else
}
intPop(SqStack*S,Car*e)//出栈
{
if(S->top==S->base)
returnERROR;
else*e=*(--(S->top));
returnOK;
}
intGetTop(SqStack*S,Car*e)//返回栈顶元素
{if(S->top==S->base)returnERROR;
else*e=*(S->top-1);
returnOK;
}
typedefstruct//临时车道
{
Car2*top2;
Car2*base2;
intstacksize2;
}SqStack2;
intInitStack2(SqStack2*S2)
{
S2->base2=(Car2*)malloc(STACK_INIT_SIZE*sizeof(Car2));
if(!
(S2->top2))returnERROR;
S2->top2=S2->base2;
S2->stacksize2=STACK_INIT_SIZE;
returnOK;
}
intPush2(SqStack2*S2,Car2e2)
{
if(S2->top2-S2->base2>=STACK_INIT_SIZE)
returnOVERFLOW;
*(S2->top2++)=e2;
returnOK;
}
intPop2(SqStack2*S2,Car2*e2)
{
if(S2->top2==S2->base2)
exit(OVERFLOW);
*e2=*(--(S2->top2));
returnOK;
}
intStackEmpty2(SqStack2S2)
{
if(S2.top2==S2.base2)
returnOK;
else
returnERROR;
}
typedefstructQNode//车道信息
{
Cardata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
intInitQueue(LinkQueue*Q)//初始化队列
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!
(Q->front))returnERROR;
Q->front->next=NULL;
returnOK;
}
intEnQueue(LinkQueue*Q,Care)//插入元素
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
if(!
p)returnERROR;
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
returnOK;
}
intQueueEmpty(LinkQueueQ)//队空
{
if(Q.front==Q.rear)
returnOK;
else
returnERROR;
}
intDeQueue(LinkQueue*Q,Car*e)
{
QueuePtrp;
if(Q->front==Q->rear)returnERROR;
p=Q->front->next;
*e=p->data;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
free(p);
returnOK;
}
voidmain()
{
inti,position_s=1,position_q=1,mistime=1;
intch=1;
charstatus;
floattime,money;
LinkQueueQ;
Carcar_I,car_D,car_M,car_S;
SqStackS;
SqStack2S2;
InitStack(&S);
InitStack2(&S2);
InitQueue(&Q);
printf("\n\t\t\t\t停车场管理系统");
printf("\n\n\n\t\t\t11信息与计算科学邓全飞5\n");
printf("\n\t\t\t\t停车场\t\t");
printf("\n");
printf("\t\t\t\t相关信息:
\n");
printf("\t\t\t\t请输入字符(ADE)进行相关操作");
printf("\n");
while(ch==1)
{
do
{
printf("\n\t\t\t\tA.车辆到达\n\t\t\t\tB.车辆离开\n\t\t\t\tC.退出\n\t\t\t\tA/B/C?
\b");
scanf("%c",&status);
getchar();
}while(status!
='A'&&status!
='a'&&status!
='D'&&status!
='d'&&status!
='E'&&status!
='e');
if(status=='A'||status=='a')
{
printf("\n\t\t\t\t请输入车牌号:
");
gets(car_I.label);//scanf("%d",&(car_I.label));
printf("\n\t\t\t\t请输入车辆到达时间:
?
\b");
scanf("%f",&(car_I.time));
if(!
StackFull(S))//栈不满
{
Push(&S,car_I);
printf("\n\n");
for(i=0;i<80;i++)printf("-");
printf("\n");
printf("\t\t\t\t输出车牌号:
");
printf("%s\n",car_I.label);
printf("\n\t\t\t\t请输出车辆到达时间:
");
printf("%5.2f",car_I.time);
printf("\n\n");
for(i=0;i<80;i++)printf("-");
printf("\n\n");
printf("\n\t\t\t\t欢迎您来我们车站!
\n\n\t\t\t\t您的车位号是:
%d",position_s);
position_s++;
printf("\n");
printf("\t\t\t\t继续请输入1\n\t\t\t\t放弃请输入0?
\b");
scanf("%d",&ch);
getchar();
}//if
else
{
EnQueue(&Q,car_I);
printf("\t\t\t\tWelcometoourCARPOSITION,Wearesorrythat\n\n\t\t\t\tOurpositionisfull,butyouarefreetoplace\
\n\n\t\t\t\tyourcaronourroad.Thepositionofyourcar\n\t\t\t\tis%d",position_q);
position_q++;
printf("\n\t\t\t\t进站请输入1\n\t\t\t\t放弃请输入0?
\b");
scanf("%d",&ch);
getchar();
}//else
}//if当车到达
elseif(status=='D'||status=='d')/*当车离开*/
{
do
{
for(i=0;i<80;i++)
printf("*");
printf("\n");
printf("\t\t\t\tCARPOSITION");
printf("\n\t\t\t\t");
printf("Information");
printf("\n\n");
printf("\t\t\t\tYouraregoingtodriveyourcaraway,\n\t\t\t\tPleasefilloftheform!
\n");
printf("\t\t\t\tYourcarNumber:
");
scanf("%d",&car_D.label);
printf("\n\t\t\t\tTime:
?
\b");
scanf("%f",&(car_D.time));
do
{
Pop(&S,&car_M);
if(car_D.label!
=car_M.label)
Push2(&S2,car_M);
else
car_I.time=car_M.time;
}while(car_D.label!
=car_M.label);
position_s--;
while(!
StackEmpty2(S2))//栈2不空
{
Pop2(&S2,&car_M);
Push(&S,car_M);
}//while
while(!
QueueEmpty(Q)&&!
StackFull(S))
{
if(!
StackFull(S))
{//栈不满的话,临时车道上的车进栈
DeQueue(&Q,&car_S);
position_q--;
car_S.time=car_D.time;
Push(&S,car_S);
printf("\n\t\t\t\tThecar%djustdrivedaway,\n\n\t\t\t\tthecar%dhasenteredtheCARPOSITION.\n",car_D.label,car_S.label);
}//if
}//while
time=car_D.time-car_I.time;
if(time<0.00)
{
printf("\n\t\t\t\tSorry!
Youinputawrongtime!
Pleasecheckandtypeagain.\n");
;}//if
else
{
mistime=1;
money=time*2;
printf("\n\n");
for(i=0;i<80;i++)
printf("-");
printf("\n\t");
printf("\t\t\tYourcarnumber%d:
\n\t\t\t\tThefeeis:
%5.2f",car_D.label,money);
printf("\n\n");
for(i=0;i<80;i++)printf("-");
printf("\n\n");
}//else
printf("\t\t\t\tWelcometoback!
Doyouwanttocontinue\n\t\t\t\t1-contine/0-quit?
\b");
scanf("%d",&ch);
getchar();
}while(!
mistime);
}//elseif
elseexit(0);//退出程序
}//第一个while
}//main
五程序调试与测试
5.1主界面
5.2具体操作
5.2.1进站时间与车牌号
5.2.2车站已满,请进入临时车道
5.2.3出站与收费
5.2.4结束
5.3相关操作
1、输入(A,1,5)时,显示是CARNUMBER:
1ARRIVETIME:
5.00
2、入(A,2,10)时,显示CARNUMBER:
2ARRIVETIME:
10.00
3、入(D,1,15)时,显示Yourcarnumber:
1Thefeeis:
20.00
4、入(A,3,20)时,显示CARNUMBER:
3ARRIVETIME:
20.00
5、输入(A,4,25)时,显示WelcometoourCARPOSITION,WearesorrythatO
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 停车场 管理 系统 数据结构 课程设计 论文