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

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

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

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

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

停车场管理系统数据结构课程设计论文

 

数据结构课程设计

题目:

停车场管理系统

 

一课题分析

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={|ai-1,ai∈D,i=2,…,n}

基本操作:

initstack()

操作结果:

构造一个空栈,并返回地址。

gettop(&S)

初使条件:

栈S已存在。

操作结果:

栈S不为空,输出顶元素。

stop(&S,e)

初始条件:

栈S已存在。

操作结果:

要栈S中栈顶插入新的栈顶元素e。

ADTqueue{

数据对象:

D={ai|ai∈ElemSet,i=1,2,…,n,n≥0}

数据关系:

R1={|ai-1,ai∈D,i=2,…,n}

约定其中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

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

当前位置:首页 > 总结汇报

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

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