数据结构课程设计模拟停车场管理问题.doc

上传人:rrsccc 文档编号:9935631 上传时间:2021-04-05 格式:DOC 页数:21 大小:205.50KB
返回 下载 相关 举报
数据结构课程设计模拟停车场管理问题.doc_第1页
第1页 / 共21页
数据结构课程设计模拟停车场管理问题.doc_第2页
第2页 / 共21页
数据结构课程设计模拟停车场管理问题.doc_第3页
第3页 / 共21页
数据结构课程设计模拟停车场管理问题.doc_第4页
第4页 / 共21页
数据结构课程设计模拟停车场管理问题.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《数据结构课程设计模拟停车场管理问题.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计模拟停车场管理问题.doc(21页珍藏版)》请在三一文库上搜索。

1、目 录1、 设计目的22、 设计内容21. 题目 22. 问题描述23. 基本要求24. 实现提示23、 算法思想分析34、 算法描述与实现41.数据结构类型定义 42.主要算法的流程图及系统模块划分63.功能描述 74.程序代码 85、 测试结果 176、 总结体会 201、 设计目的数据结构是计算机专业的核心课程,是一门实践性很强的课程。为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、将算法转换成程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。本课程设计的目的就

2、是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养学生的基本程序设计素养和软件工作者工作作风。2、 设计内容1.题目:模拟停车场管理问题2.问题描述:设停车场只有一个可停放几辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场按车辆到来的先后顺序依次排列,若车场内已停满几辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入;当停车场内某辆车要离开时,由于停车场是狭长的通道,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门后,为它让路的车辆在按原次序进入

3、车场。每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。3.基本要求:试为停车场编制按上述要求进行管理的模拟程序。在这里假设汽车不能从便道上开走。试设计一个停车场管理程序。4.实现提示:以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,例如:(A,1,5)表示一号牌照车在5这个时刻到达,而(D,5,20)表示5号牌照车在20这个时刻离去,整个程序可以在输入信息为(E,0,0)时结束。对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或

4、便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表实现。需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车。3、 算法思想分析1. 输入 根据提示输入停车场容量n。2. 创建 根据读入的停车场容量n,创建长度为n的栈(停车场)。3. 主要操作1)插入(车辆停入) 根据提示往栈中插入元素(车辆信息),即使车辆停在停车场中。首先检查停车场是否已满,若不满,则车辆停放在停车场中,记录车辆到达时间,并把此时间作为开始计费时间。若插入的元素个数超过停车场的容量,则此后的车辆停在便道上用队列表示,即元素储存在队

5、列中。2)删除(车辆离开) 根据提示删除栈中的元素(车辆信息),即使车辆离开停车场,同时停在便道上的车辆停入停车场中。当车辆离开时,首先要寻找到要离开车辆的车牌号,若车是从停车场离开,则在它之后进入的车辆必须先退出(进入临时栈)为它让路,待该辆车开出大门外,其它车辆再按原次序进入停车场,并将停放在便道上第一位置的车开进停车场,离开的车辆按其在停车场内停留的时间交费,并把离开车辆的离开时间作为便道上第一位置的车进入停车场的进入时间和开始计费时间。3) 显示 根据提示操作,显示当前停车场和便道使用情况。4) 退出 释放停车场和便道(栈和队列)上的车辆信息等,退出当前运行程序。4、 算法描述与实现1

6、.数据结构类型定义/停车场车辆信息(存储结构)typedef struct carinfor / 车辆信息 char szRegMark64; / 车牌号 char szArrTime16; / 到达时间 char szEntTime16; / 进入停车场(开始计费)时间 char szDepTime16; / 离开时间 TCARINFOR, *LPTCARINFOR;szRegMark64/车牌号szArrTime16/到达时间szEntTime16/计费时间szDepTime16/离开时间carinfor停车场车辆信息存储结构/栈carstack存储结构typedef struct car

7、stack LPTCARINFOR lpCarInfor; / 车辆信息 int nTop; / 栈顶元素下标 int nStackSize; / 栈容量 TCARSTACK, *LPTCARSTACK;栈顶元素下标 nTop停车场carstack(栈)存储结构lpcarinfornStackSize=nTop+1/便道车辆信息(存储结构)typedef struct carnode / 链队结点信息 TCARINFOR carinfo; / 车辆信息 struct carnode *lpNext; / 指向下一个元素的指针 TCARNODE, *LPTCARNODE;szRegMark64/

8、车牌号szArrTime16/到达时间szEntTime16/计费时间szDepTime16/离开时间carinfor便道车辆信息存储结构/ 链队carqueue存储结构typedef struct carqueue LPTCARNODE lpHead; / 头结点 LPTCARNODE lpRear; / 指向当前队尾的指针 int nEffSize; / 当前队中元素个数(有效车位) TCARQUEUE, *LPTCARQUEUE;LPTCARNODE lpRear便道carsqueue(队列)存储结构LPTCARNODE lpHeadlpcarinfornext 程序运行界面 输入停车场

9、容量,创建栈开 始根据当前提示操作取得key值向栈或队列加入元素信息向栈或队列删除元素信息显示栈和队列的停车情况退出程序E、释放空间ADO2. 主要算法的流程图及功能描述(1)流程图:(2)系统模块划分:车进入停车场判断停车场是否已满车进入停车场记录时间开始计费车辆离开记录离开时间计算持续时间和费用否是进入便道记录进入时间但不计费判断停车场是否有空位否继续等待是(3)算法描述:(1) void InitStack( LPTCARSTACK &lpCarStack, int nSize ) 初始化栈 lpCarStack,,为栈和车辆信息分配储存空间,将其容量设置为 nSize。 int Ini

10、tQueue( LPTCARQUEUE &lpCarQueue ) 初始化链队 lpCarQueue,分配队列存储空间和头结点空间,有效车位初始化。(2) void Push( LPTCARSTACK &lpCarStack, TCARINFOR carinfo ) 向栈中加入元素信息:车辆信息 carinfo 入栈 lpCarStack,栈顶元素下标+1。 int EnQueue( LPTCARQUEUE &lpCarQueue, TCARINFOR carinfo ) 向队列中加入元素信息:分配结点空间,车辆信息 carinfo 入队 lpCarQueue,顺序存储到队列中,有效车位加1。

11、(3) void Pop( LPTCARSTACK &lpCarStack, TCARINFOR &carinfo ) 从栈中删除元素时:车辆信息从栈 lpCarStack 中弹出并存入 carinfo中,栈顶元素下标-1。 int DeQueue( LPTCARQUEUE &lpCarQueue, TCARINFOR &carinfo ) 从队列中删除元素时:队头元素从链队 lpCarQueue 中出队并存入 carinfo,当队列中无元素时,返回ERROR;否则carinfo中信息存入临时队列中,再释放临时队列,队列长度减1。(4) int main( void ) 主函数:主要设计一个分

12、支语句,让用户根据提示选择要执行的操作,实现所需要的功能。3. 程序代码#include /getch(void)#include /内存分配 #include #include #include #define OK 1#define ERROR 0#define OVERFLOW -1#define ClearScreen() system( cls ) / 清空当前屏幕/ 显示字符串 szPrompt 并等待用户按下任意键#define Pause(szPrompt) printf( %s,szPrompt),getch()/停车场车辆信息(存储结构)typedef struct car

13、infor / 车辆信息 char szRegMark64; / 车牌号 char szArrTime16; / 到达时间 char szEntTime16; / 进入停车场(开始计费)时间 char szDepTime16; / 离开时间 TCARINFOR, *LPTCARINFOR;/栈carstack存储结构typedef struct carstack LPTCARINFOR lpCarInfor; / 车辆信息 int nTop; / 栈顶元素下标 int nStackSize; / 栈容量 TCARSTACK, *LPTCARSTACK;/ 初始化栈 lpCarStack, 将其

14、容量设置为 nSizevoid InitStack( LPTCARSTACK &lpCarStack, int nSize ) lpCarStack = ( LPTCARSTACK ) malloc( sizeof ( TCARSTACK ) ); /栈储存分配 lpCarStack-lpCarInfor = ( LPTCARINFOR ) malloc( nSize * sizeof ( TCARINFOR ); /栈中车辆信息储存分配 lpCarStack-nTop = -1; /栈中无元素 lpCarStack-nStackSize = nSize; /栈的长度为nSize/ 车辆信息

15、carinfo 入栈 lpCarStackvoid Push( LPTCARSTACK &lpCarStack, TCARINFOR carinfo ) lpCarStack-nTop+; /栈顶元素下标+1 lpCarStack-lpCarInfor lpCarStack-nTop = carinfo; /把carinfo存入栈中/ 车辆信息从栈 lpCarStack 中弹出并存入 carinfovoid Pop( LPTCARSTACK &lpCarStack, TCARINFOR &carinfo ) carinfo = lpCarStack-lpCarInfor lpCarStack-

16、nTop; /把栈中元素存入carinfo中 lpCarStack-nTop-; /栈顶元素下标减1/ 若栈 lpCarstack 空,返回 TRUE;否则,返回 FALSEBOOL IsStackEmpty( LPTCARSTACK lpCarStack ) return lpCarStack-nTop = -1;/栈空时返回栈顶下标nTop值为-1/ 若栈 lpStackFull 满,返回 TRUE;否则,返回 FALSEBOOL IsStackFull( LPTCARSTACK lpCarStack )/栈满返回nTop值为栈长度减1 return lpCarStack-nTop = (

17、 lpCarStack-nStackSize - 1 ); / 销毁栈 lpCarStack,将指针 lpCarStack 置为 NULLvoid DestroyStack( LPTCARSTACK &lpCarStack ) free( lpCarStack-lpCarInfor ); /释放车辆信息存储空间 free( lpCarStack ); /释放栈的存储空间 lpCarStack = NULL; /把栈lpCarStack置空/便道车辆信息(存储结构)typedef struct carnode / 链队结点信息 TCARINFOR carinfo; / 车辆信息 struct c

18、arnode *lpNext; / 指向下一个元素的指针 TCARNODE, *LPTCARNODE;/ 链队carqueue存储结构typedef struct carqueue LPTCARNODE lpHead; / 头结点 LPTCARNODE lpRear; / 指向当前队尾的指针 int nEffSize; / 当前队中元素个数(有效车位) TCARQUEUE, *LPTCARQUEUE;/ 初始化链队 lpCarQueueint InitQueue( LPTCARQUEUE &lpCarQueue ) lpCarQueue = ( LPTCARQUEUE ) malloc( si

19、zeof( TCARQUEUE ) ); /分配对列存储空间 lpCarQueue-lpHead =lpCarQueue-lpRear=( LPTCARNODE) malloc( sizeof( TCARNODE ) ); /分配头结点空间 if(!lpCarQueue-lpHead) exit(OVERFLOW); /分配储存失败 lpCarQueue-lpHead-lpNext = NULL; lpCarQueue-nEffSize = 0; return OK;/ 车辆信息 carinfo 入队 lpCarQueueint EnQueue( LPTCARQUEUE &lpCarQueue

20、, TCARINFOR carinfo )/插入元素carinfo为队lpCarQueue的新的队尾元素 LPTCARNODE lpCarNode = ( LPTCARNODE ) malloc( sizeof( carnode ) ); /分配结点空间 if(!lpCarNode) exit(OVERFLOW); /分配储存失败 lpCarNode-carinfo = carinfo; lpCarNode-lpNext = NULL; lpCarQueue-lpRear-lpNext = lpCarNode; lpCarQueue-lpRear = lpCarNode; lpCarQueue

21、-nEffSize+; return OK;/ 队头元素从链队 lpCarQueue 中出队并存入 carinfoint DeQueue( LPTCARQUEUE &lpCarQueue, TCARINFOR &carinfo ) if(lpCarQueue-lpHead=lpCarQueue-lpRear) return ERROR; /队列里没有元素,返回ERROR LPTCARNODE lpTemp = lpCarQueue-lpHead-lpNext; carinfo = lpTemp-carinfo; lpCarQueue-lpHead-lpNext = lpTemp-lpNext;

22、 /指向下一结点 if(lpCarQueue-lpRear=lpTemp) lpCarQueue-lpHead=lpCarQueue-lpRear; /如果队列尾指针指向临时结点时,队列中没有元素 free( lpTemp ); /释放临时队列 lpCarQueue-nEffSize-; /容量-1 return OK;/ 若链队 lpCarQueue 为空,返回 TRUE;否则,返回 FALSEBOOL IsQueueEmpty( LPTCARQUEUE lpCarQueue ) return lpCarQueue-nEffSize = 0; /链队为空时返回长度为0/ 销毁链队 lpCar

23、Queuevoid DestroyQueue( LPTCARQUEUE &lpCarQueue ) LPTCARNODE lpNextCarNode = NULL; for ( LPTCARNODE lpCarNode = lpCarQueue-lpHead; lpCarNode != NULL; lpCarNode = lpNextCarNode ) lpNextCarNode = lpCarNode-lpNext; free( lpCarNode );/释放结点 lpCarNode信息 free( lpCarQueue );/释放队列 lpCarQueue lpCarQueue = NUL

24、L;/ 将字符串时间格式转换为数字(分钟)格式,例如 12:36 将被转换为 756 =( 12 * 60 + 36 )int ConvertTime ( char *lpTime ) int nHour = 0; int nMinu = 0; sscanf( lpTime, %d:%d, &nHour, &nMinu ); return nHour * 60 + nMinu; / 根据在停车场内的停留时间 nContiMinu (分钟)计算费用double CalcuExp ( int nContiMinu ) return nContiMinu * ( 5.0 / 60 );int mai

25、n( void ) int nParkCap = 0; / 停车场容量 putchar( n ); printf(tt*n); printf(tt=* *=n); printf(tt=*欢迎进入停车场管理系统*=n); printf(tt=* *=n); printf(tt*n); putchar( n ); printf( 请输入停车场容量: ); scanf( %d, &nParkCap ); LPTCARSTACK lpCarStack = NULL; / 停车场,用栈模拟 InitStack( lpCarStack, nParkCap );/创建停车场 LPTCARQUEUE lpCa

26、rQueue = NULL; / 便道,用链队模拟 InitQueue( lpCarQueue ); /创建队列 char ComType = NULL; / 命令类型 char szUserInput128 = NULL ; / 用户输入 do ClearScreen(); putchar( n ); puts( - ); puts( 命令类型 ); puts( A - 车辆到达 ); puts( D - 车辆离开 ); puts( O - 显示当前停车场和便道使用情况 ); puts( E - 退出程序 ); putchar( n ); puts( 例: ); puts( A,T45,14

27、:26 ); puts( D,E32,16:51 ); puts( E ); puts( O ); putchar( n ); printf( 请输入命令: ); scanf( %s, szUserInput ); puts( - ); char szCarInfor 128 = NULL ; sscanf( szUserInput, / 将命令类型与车辆信息分开存放 %c,%s, &ComType, / 用户输入的前半部分,即命令类型 szCarInfor / 用户输入的后半部分,即车辆信息 );/sscanf()从一个字符串中读进与指定格式相符的数据. char *lpComLoc = N

28、ULL; / 车辆信息字符串中的逗号位置 for ( lpComLoc = szCarInfor; *lpComLoc != 0; lpComLoc+ ) if ( *lpComLoc = , ) break;/跳出整个for循环 *lpComLoc = 0; TCARINFOR carinfo = NULL ; / 存储本次用户输入的车辆信息 strcpy( carinfo.szRegMark, szCarInfor );/把szCarInfor复制到carinfo.szRegMark(车牌号)里 if (ComType = A )/车辆到达 strcpy( carinfo.szArrTim

29、e, 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( 车牌号:tt%sn, carinfo.szRe

30、gMark ); printf( 进入时间:t%sn, carinfo.szEntTime ); puts( 是否收费:t是 ); else EnQueue( lpCarQueue, carinfo );printf( 停车场已满,已停放在便道的第 %d 个车位n,lpCarQueue-nEffSize); printf( 车牌号:tt%sn, carinfo.szRegMark ); printf( 停放时间:t%sn, carinfo.szArrTime ); puts( 是否收费:t否 ); else if (ComType = D ) strcpy( carinfo.szDepTime

31、, lpComLoc + 1 ); LPTCARSTACK lpTempCarStack = NULL; InitStack( lpTempCarStack, nParkCap );/ 创建临时lpTempCarStack,nParkCap(停车辆) TCARINFOR carinfoOut = NULL ; BOOL bIsCarFound = FALSE; /初始化bIsCarFound while ( FALSE = IsStackEmpty( lpCarStack ) )/判断栈lpCarStack不为空时 Pop( lpCarStack, carinfoOut ); /车辆出栈lpC

32、arStack if ( 0 != strcmp( carinfoOut.szRegMark, carinfo.szRegMark ) )/比较 Push( lpTempCarStack, carinfoOut );/车辆进栈lpTempCarStack else bIsCarFound = TRUE; break; while ( FALSE = IsStackEmpty( lpTempCarStack ) )/判断临时栈不为空时 TCARINFOR tempcarinfo = NULL ; Pop( lpTempCarStack, tempcarinfo ); Push( lpCarSta

33、ck, tempcarinfo ); if ( FALSE = bIsCarFound ) printf( 车牌号为 %s 的车未进入停车场.n, carinfo.szRegMark ); Pause( -n按任意键输入下一条信息.n ); continue; strcpy( carinfoOut.szDepTime, carinfo.szDepTime ); int nEntTime = ConvertTime ( carinfoOut.szEntTime ); int nDepTime = ConvertTime ( carinfoOut.szDepTime ); int nContiMi

34、nu = nDepTime - nEntTime; printf( 计费时段:t%s - %s (共 %d 分钟)n, carinfoOut.szEntTime, /开始计费时间 carinfoOut.szDepTime, /车辆离开时间 nContiMinu /持续时间 ); double rExpense = CalcuExp ( nContiMinu ); /计算停车费 printf( 应交纳的费用:t%.1lf 元n, rExpense ); if ( FALSE = IsQueueEmpty( lpCarQueue ) ) /如果队列lpCarQueue不空时 TCARINFOR t

35、empcarinfo = NULL ; DeQueue( lpCarQueue, tempcarinfo ); strcpy( tempcarinfo.szEntTime, carinfoOut.szDepTime ); Push( lpCarStack, tempcarinfo ); puts( - ); printf( 停放在便道的第 1 个车位,车牌号为 %s 的车已进入停车场n, tempcarinfo.szRegMark); else if (ComType = O ) ClearScreen(); putchar( n ); puts( 停车场使用情况n ); puts( 车位t车

36、牌号t到达时间t进入(开始计费)时间n); for ( int i = 0; i nTop; i+ ) printf( %dt%stt%stt%sn, i + 1, /车位 lpCarStack-lpCarInfor i.szRegMark, /车牌号 lpCarStack-lpCarInfor i.szArrTime, /车辆到达时间 lpCarStack-lpCarInfor i.szEntTime /车辆进停车场时间 ); /显示停车场车辆信息 putchar( n ); putchar( n ); putchar( n ); puts( 便道使用情况n ); puts( 车位t车牌号t

37、到达时间t进入(开始计费)时间n); int nNum = 0; for ( LPTCARNODE lpCarNode = lpCarQueue-lpHead-lpNext; lpCarNode != NULL; lpCarNode = lpCarNode-lpNext ) nNum+; printf( %dt%stt%stt%sn, nNum, /车位 lpCarNode-carinfo.szRegMark, /车牌号 lpCarNode-carinfo.szArrTime, /车辆到达时间 lpCarNode-carinfo.szEntTime /车辆进停车场时间 ); /显示便道车辆信息

38、 putchar( n ); else if (ComType = E ) puts( * ); puts( *谢谢使用* ); puts( 班级:计081班n ); puts( 组长:耿超 080720n ); puts( 组员:彭松 080706n ); puts( 组员:孙郭建 080707n ); puts( * ); break; else puts( 输入信息有误.第一个字符只能为 A 或 D 或 E 或 O (区分大小写). ); Pause( -n按任意键输入下一条信息.n ); while ( TRUE ); DestroyStack( lpCarStack ); Destr

39、oyQueue( lpCarQueue ); Pause( n按任意键退出程序.n ); return 0;5、 测试结果1.程序运行界面2.输入停车场容量3.输入命令4.输入命令A-输入车辆信息停入停车场、便道5.输入命令O显示当前存储情况6.输入命令D-输入车辆信息驶出停车场,计算停车费7.输入命令O显示当前存储情况6、 总结体会 程序设计是一个长期而又艰苦的过程。它需要经过设计者对课题的理解与接受,找出对应的合理的算法,构建基本框架,上机调试,不断地修改和改进等一系列复杂的过程。不过,通过不断的探索和实践,慢慢地克服一个个难题。 通过此次课程设计我们学到了好多的东西,对以前会的知识更加熟悉了,并且有了更深的认识;对不太清楚的知识点也有了新的理解。 在调试时要认真,出现的错误要及时找出并改正,遇到问题及时去查相关的资料,再反复的调试程序。把各个要注意的问题要想到:同时还要在程序中体现自己的风格,从每个细节出发,不放过每个知识点。另外,要注意语句、符号的使用。 在设计过程中,团队精神也很重要,大家一起探讨各个语句的作用,加深对程序的理解。 参考文献:1严蔚敏等著。数据结构(C语言)。北京:清华大学

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1