数据结构课程设计模拟停车场管理问题.docx
- 文档编号:12826990
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:26
- 大小:167.18KB
数据结构课程设计模拟停车场管理问题.docx
《数据结构课程设计模拟停车场管理问题.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计模拟停车场管理问题.docx(26页珍藏版)》请在冰豆网上搜索。
数据结构课程设计模拟停车场管理问题
1、设计目的………………………………2
2、设计内容………………………………2
1.题目………………………………………2
2.问题描述……………………………………2
3.基本要求……………………………………2
4.实现提示……………………………………2
3、算法思想分析…………………………3
4、算法描述与实现………………………4
1.数据结构类型定义…………………………4
2.主要算法的流程图及系统模块划分……………6
3.功能描述…………………………………7
4.程序代码…………………………………8
5、测试结果……………………………17
6、总结体会……………………………20
1、设计目的
《数据结构》是计算机专业的核心课程,是一门实践性很强的课程。
为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。
课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、将算法转换成程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。
本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养学生的基本程序设计素养和软件工作者工作作风。
2、设计内容
1.题目:
模拟停车场管理问题
2.问题描述:
设停车场只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场按车辆到来的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆在按原次序进入车场。
每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
3.基本要求:
试为停车场编制按上述要求进行管理的模拟程序。
在这里假设汽车不能从便道上开走。
试设计一个停车场管理程序。
4.实现提示:
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:
汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,例如:
('A',1,5)表示一号牌照车在5这个时刻到达,而('D',5,20)表示5号牌照车在20这个时刻离去,整个程序可以在输入信息为('E',0,0)时结束。
对每一组输入数据进行操作后的输出数据为:
若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表实现。
需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车。
3、算法思想分析
1.输入
根据提示输入停车场容量n。
2.创建
根据读入的停车场容量n,创建长度为n的栈(停车场)。
3.主要操作
1)插入(车辆停入)
根据提示往栈中插入元素(车辆信息),即使车辆停在停车场中。
首先检查停车场是否已满,若不满,则车辆停放在停车场中,记录车辆到达时间,并把此时间作为开始计费时间。
若插入的元素个数超过停车场的容量,则此后的车辆停在便道上——用队列表示,即元素储存在队列中。
2)删除(车辆离开)
根据提示删除栈中的元素(车辆信息),即使车辆离开停车场,同时停在便道上的车辆停入停车场中。
当车辆离开时,首先要寻找到要离开车辆的车牌号,若车是从停车场离开,则在它之后进入的车辆必须先退出(进入临时栈)为它让路,待该辆车开出大门外,其它车辆再按原次序进入停车场,并将停放在便道上第一位置的车开进停车场,离开的车辆按其在停车场内停留的时间交费,并把离开车辆的离开时间作为便道上第一位置的车进入停车场的进入时间和开始计费时间。
3)显示
根据提示操作,显示当前停车场和便道使用情况。
4)退出
释放停车场和便道(栈和队列)上的车辆信息等,退出当前运行程序。
4、算法描述与实现
1.数据结构类型定义
//停车场车辆信息(存储结构)
typedefstructcarinfor//车辆信息
{
charszRegMark[64];//车牌号
charszArrTime[16];//到达时间
charszEntTime[16];//进入停车场(开始计费)时间
charszDepTime[16];//离开时间
}TCARINFOR,*LPTCARINFOR;
//栈carstack存储结构
typedefstructcarstack
{
LPTCARINFORlpCarInfor;//车辆信息
intnTop;//栈顶元素下标
intnStackSize;//栈容量
}TCARSTACK,*LPTCARSTACK;
栈顶元素下标
nTop
停车场carstack(栈)存储结构
lpcarinfor
nStackSize=nTop+1
//便道车辆信息(存储结构)
typedefstructcarnode//链队结点信息
{
TCARINFORcarinfo;//车辆信息
structcarnode*lpNext;//指向下一个元素的指针
}TCARNODE,*LPTCARNODE;
//链队carqueue存储结构
typedefstructcarqueue
{
LPTCARNODElpHead;//头结点
LPTCARNODElpRear;//指向当前队尾的指针
intnEffSize;//当前队中元素个数(有效车位)
}TCARQUEUE,*LPTCARQUEUE;
LPTCARNODElpRear
便道carsqueue(队列)存储结构
LPTCARNODElpHead
lpcarinfor
next
^
2.
程序运行界面
输入停车场容量,创建栈
开始
根据当前提示操作
取得key值
向栈或队列加入元素信息
向栈或队列删除元素信息
显示栈和队列的停车情况
退出程序
E、释放空间
A
D
O
主要算法的流程图及功能描述
(1)流程图:
(2)系统模块划分:
(3)算法描述:
(1)voidInitStack(LPTCARSTACK&lpCarStack,intnSize)
初始化栈lpCarStack,,为栈和车辆信息分配储存空间,将其容量设置为nSize。
intInitQueue(LPTCARQUEUE&lpCarQueue)
初始化链队lpCarQueue,分配队列存储空间和头结点空间,有效车位初始化。
(2)voidPush(LPTCARSTACK&lpCarStack,TCARINFORcarinfo)
向栈中加入元素信息:
车辆信息carinfo入栈lpCarStack,栈顶元素下标+1。
intEnQueue(LPTCARQUEUE&lpCarQueue,TCARINFORcarinfo)
向队列中加入元素信息:
分配结点空间,车辆信息carinfo入队lpCarQueue,顺序存储到队列中,有效车位加1。
(3)voidPop(LPTCARSTACK&lpCarStack,TCARINFOR&carinfo)
从栈中删除元素时:
车辆信息从栈lpCarStack中弹出并存入carinfo中,栈顶元素下标-1。
intDeQueue(LPTCARQUEUE&lpCarQueue,TCARINFOR&carinfo)
从队列中删除元素时:
队头元素从链队lpCarQueue中出队并存入carinfo,当队列中无元素时,返回ERROR;否则carinfo中信息存入临时队列中,再释放临时队列,队列长度减1。
(4)intmain(void)
主函数:
主要设计一个分支语句,让用户根据提示选择要执行的操作,实现所需要的功能。
3.程序代码
#include
#include
#include
#include
#include
#defineOK1
#defineERROR0
#defineOVERFLOW-1
#defineClearScreen()system("cls")//清空当前屏幕
//显示字符串szPrompt并等待用户按下任意键
#definePause(szPrompt)printf("%s",szPrompt),getch()
//停车场车辆信息(存储结构)
typedefstructcarinfor//车辆信息
{
charszRegMark[64];//车牌号
charszArrTime[16];//到达时间
charszEntTime[16];//进入停车场(开始计费)时间
charszDepTime[16];//离开时间
}TCARINFOR,*LPTCARINFOR;
//栈carstack存储结构
typedefstructcarstack
{
LPTCARINFORlpCarInfor;//车辆信息
intnTop;//栈顶元素下标
intnStackSize;//栈容量
}TCARSTACK,*LPTCARSTACK;
//初始化栈lpCarStack,将其容量设置为nSize
voidInitStack(LPTCARSTACK&lpCarStack,intnSize)
{
lpCarStack=(LPTCARSTACK)malloc(sizeof(TCARSTACK));//栈储存分配
lpCarStack->lpCarInfor=(LPTCARINFOR)malloc(
nSize*sizeof(TCARINFOR));//栈中车辆信息储存分配
lpCarStack->nTop=-1;//栈中无元素
lpCarStack->nStackSize=nSize;//栈的长度为nSize
}
//车辆信息carinfo入栈lpCarStack
voidPush(LPTCARSTACK&lpCarStack,TCARINFORcarinfo)
{
lpCarStack->nTop++;//栈顶元素下标+1
lpCarStack->lpCarInfor[lpCarStack->nTop]=carinfo;//把carinfo存入栈中
}
//车辆信息从栈lpCarStack中弹出并存入carinfo
voidPop(LPTCARSTACK&lpCarStack,TCARINFOR&carinfo)
{
carinfo=lpCarStack->lpCarInfor[lpCarStack->nTop];//把栈中元素存入carinfo中
lpCarStack->nTop--;//栈顶元素下标减1
}
//若栈lpCarstack空,返回TRUE;否则,返回FALSE
BOOLIsStackEmpty(LPTCARSTACKlpCarStack)
{
returnlpCarStack->nTop==-1;//栈空时返回栈顶下标nTop值为-1
}
//若栈lpStackFull满,返回TRUE;否则,返回FALSE
BOOLIsStackFull(LPTCARSTACKlpCarStack)
{//栈满返回nTop值为栈长度减1
returnlpCarStack->nTop==(lpCarStack->nStackSize-1);}
//销毁栈lpCarStack,将指针lpCarStack置为NULL
voidDestroyStack(LPTCARSTACK&lpCarStack)
{
free(lpCarStack->lpCarInfor);//释放车辆信息存储空间
free(lpCarStack);//释放栈的存储空间
lpCarStack=NULL;//把栈lpCarStack置空
}
//便道车辆信息(存储结构)
typedefstructcarnode//链队结点信息
{
TCARINFORcarinfo;//车辆信息
structcarnode*lpNext;//指向下一个元素的指针
}TCARNODE,*LPTCARNODE;
//链队carqueue存储结构
typedefstructcarqueue
{
LPTCARNODElpHead;//头结点
LPTCARNODElpRear;//指向当前队尾的指针
intnEffSize;//当前队中元素个数(有效车位)
}TCARQUEUE,*LPTCARQUEUE;
//初始化链队lpCarQueue
intInitQueue(LPTCARQUEUE&lpCarQueue)
{
lpCarQueue=(LPTCARQUEUE)
malloc(sizeof(TCARQUEUE));//分配对列存储空间
lpCarQueue->lpHead=lpCarQueue->lpRear=
(LPTCARNODE)malloc(sizeof(TCARNODE));//分配头结点空间
if(!
lpCarQueue->lpHead)exit(OVERFLOW);//分配储存失败
lpCarQueue->lpHead->lpNext=NULL;
lpCarQueue->nEffSize=0;
returnOK;
}
//车辆信息carinfo入队lpCarQueue
intEnQueue(LPTCARQUEUE&lpCarQueue,TCARINFORcarinfo)
{//插入元素carinfo为队lpCarQueue的新的队尾元素
LPTCARNODElpCarNode=(LPTCARNODE)
malloc(sizeof(carnode));//分配结点空间
if(!
lpCarNode)exit(OVERFLOW);//分配储存失败
lpCarNode->carinfo=carinfo;
lpCarNode->lpNext=NULL;
lpCarQueue->lpRear->lpNext=lpCarNode;
lpCarQueue->lpRear=lpCarNode;
lpCarQueue->nEffSize++;
returnOK;
}
//队头元素从链队lpCarQueue中出队并存入carinfo
intDeQueue(LPTCARQUEUE&lpCarQueue,TCARINFOR&carinfo)
{
if(lpCarQueue->lpHead==lpCarQueue->lpRear)returnERROR;
//队列里没有元素,返回ERROR
LPTCARNODElpTemp=lpCarQueue->lpHead->lpNext;
carinfo=lpTemp->carinfo;
lpCarQueue->lpHead->lpNext=lpTemp->lpNext;//指向下一结点
if(lpCarQueue->lpRear==lpTemp)lpCarQueue->lpHead=lpCarQueue->lpRear;
//如果队列尾指针指向临时结点时,队列中没有元素
free(lpTemp);//释放临时队列
lpCarQueue->nEffSize--;//容量-1
returnOK;
}
//若链队lpCarQueue为空,返回TRUE;否则,返回FALSE
BOOLIsQueueEmpty(LPTCARQUEUElpCarQueue)
{
returnlpCarQueue->nEffSize==0;//链队为空时返回长度为0
}
//销毁链队lpCarQueue
voidDestroyQueue(LPTCARQUEUE&lpCarQueue)
{
LPTCARNODElpNextCarNode=NULL;
for(LPTCARNODElpCarNode=lpCarQueue->lpHead;
lpCarNode!
=NULL;lpCarNode=lpNextCarNode)
{
lpNextCarNode=lpCarNode->lpNext;
free(lpCarNode);//释放结点lpCarNode信息
}
free(lpCarQueue);//释放队列lpCarQueue
lpCarQueue=NULL;
}
//将字符串时间格式转换为数字(分钟)格式,例如12:
36将被转换为756=(12*60+36)
intConvertTime(char*lpTime)
{
intnHour=0;
intnMinu=0;
sscanf(lpTime,"%d:
%d",&nHour,&nMinu);
returnnHour*60+nMinu;
}
//根据在停车场内的停留时间nContiMinu(分钟)计算费用
doubleCalcuExp(intnContiMinu)
{
returnnContiMinu*(5.0/60);
}
intmain(void)
{
intnParkCap=0;//停车场容量
putchar('\n');
printf("\t\t********************************************\n");
printf("\t\t=======********=======\n");
printf("\t\t=======****欢迎进入停车场管理系统****=======\n");
printf("\t\t=======********=======\n");
printf("\t\t********************************************\n");
putchar('\n');
printf("请输入停车场容量:
");
scanf("%d",&nParkCap);
LPTCARSTACKlpCarStack=NULL;//停车场,用栈模拟
InitStack(lpCarStack,nParkCap);//创建停车场
LPTCARQUEUElpCarQueue=NULL;//便道,用链队模拟
InitQueue(lpCarQueue);//创建队列
charComType=NULL;//命令类型
charszUserInput[128]={NULL};//用户输入
do
{
ClearScreen();
putchar('\n');
puts("--------------------");
puts("[命令类型]");
puts("A-车辆到达");
puts("D-车辆离开");
puts("O-显示当前停车场和便道使用情况");
puts("E-退出程序");
putchar('\n');
puts("例:
");
puts("A,T45,14:
26");
puts("D,E32,16:
51");
puts("E");
puts("O");
putchar('\n');
printf("请输入命令:
");
scanf("%s",szUserInput);
puts("--------------------");
charszCarInfor[128]={NULL};
sscanf(szUserInput,//将命令类型与车辆信息分开存放
"%c,%s",
&ComType,//用户输入的前半部分,即命令类型
szCarInfor//用户输入的后半部分,即车辆信息
);//sscanf()从一个字符串中读进与指定格式相符的数据.
char*lpComLoc=NULL;//车辆信息字符串中的逗号位置
for(lpComLoc=szCarInfor;*lpComLoc!
='\0';lpComLoc++)
{
if(*lpComLoc==',')
{
break;//跳出整个for循环
}
}
*lpComLoc='\0';
TCARINFORcarinfo={NULL};//存储本次用户输入的车辆信息
strcpy(carinfo.szRegMark,szCarInfor);
//把szCarInfor复制到carinfo.szRegMark(车牌号)里
if(ComType=='A')//车辆到达
{
strcpy(carinfo.szArrTime,lpComLoc+1);
//把lpComLoc+1复制到carinfo.szArrTime里
if(FALSE==IsStackFull(lpCarStack))//判断栈lpCarStack不满时
{
strcpy(carinfo.szEntTime,carinfo.szArrTime);
//车辆到达时间szArrTime复制给开始收费时间szEntTime
Push(lpCarStack,carinfo);
printf("已进入停车场第%d个车位\n",lpCarStack->nTop+1);
printf("车牌号:
\t\t%s\n",carinfo.szRegMark);
printf("进入时间:
\t%s\n",carinfo.szEntTime);
puts("是否收费:
\t是");
}
else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 模拟 停车场 管理 问题