C语言停车场管理系统课程设计.docx

上传人:牧羊曲112 文档编号:3155253 上传时间:2023-03-11 格式:DOCX 页数:23 大小:44.46KB
返回 下载 相关 举报
C语言停车场管理系统课程设计.docx_第1页
第1页 / 共23页
C语言停车场管理系统课程设计.docx_第2页
第2页 / 共23页
C语言停车场管理系统课程设计.docx_第3页
第3页 / 共23页
C语言停车场管理系统课程设计.docx_第4页
第4页 / 共23页
C语言停车场管理系统课程设计.docx_第5页
第5页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《C语言停车场管理系统课程设计.docx》由会员分享,可在线阅读,更多相关《C语言停车场管理系统课程设计.docx(23页珍藏版)》请在三一办公上搜索。

1、C语言停车场管理系统课程设计课 程 设 课程设计名称: 课程设计 专 业 班 级 : 学 生 姓 名 : 学 号 : 指 导 教 师 : 课程设计时间: 0 计 目 录 1 需求分析 .3 2 概要设计 .3 3详细设计 .4 4 运行环境 .6 5开发环境 .6 6 程序设计 .6 7 调试分析 .11 8 测试结果 .19 9参考文献 .22 10心得体会 .23 11成绩评价表 .24 1 计算机应用技术 专业课程设计任务书 学生姓名 题 目 课题性质 指导教师 专业班级 学号 停车场管理系统 课题来源 同组姓名 学习掌握并熟练运用C语言进行程序设计; 针对具体应用问题,选择、设计和实现

2、合适的抽象数据类型; 主要内容 进行简单的需求分析,给出设计方案。 综合运用和融化所学理论知识,提高分析和解决实际问题的能力,达到培养良好程序设计能力和习惯的目的,为开发满足问题要求的小型应用软件奠定基础,任务要求 达到软件工程的综合性基础训练的目的。 完成需求分析报告,报告中对关键部分给出图表说明。要求格式规范,工作量饱满。 数据结构严蔚敏 清华大学出版社 参考文献 C语言程序设计谭浩强 清华大学出版社 指导教师签字: 审查意见 教研室主任签字: 年 月 日 2 一、需求分析 设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。在停车场内,汽车按到达的先后次序,由北向南依次排列

3、。若停车场内已停满n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出停车场为它让路,待该辆车开出大门后,其他车辆再按原次序返回车场。每辆车离开停车场时,应按其停留时间的长短交费。 设计要求: 1模拟上述管理过程。要求以顺序栈模拟停车场,以链队列模拟便道。 2从终端读入汽车到达或离去的数据,每组数据包括三项: 是“到达”还是“离开”; 汽车牌照号码; “到达”或“离开”的时刻。 3与每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和

4、应交的费用。 二、概要设计 1数据结构说明 用到两个堆栈:一个为车场栈;另一个为临时栈temp typedef struct NODE CarNode *stackMAX+1; int top; SeqStackCar; /*模拟车场*/ 一个队列结构,存储便道车辆信息: typedef struct Node QueueNode *head; QueueNode *rear; 3 LinkQueueCar; /*模拟便道*/ 2算法说明 (1) 功能模块说明:停车场管理系统含有三个模块,即:车辆到达、离开、列表显示 停车场系统12车辆到达 图1 以模块为单位分析算法 1、“到达”模块:到达时

5、有两种情况,即车场是否满,未满则直接进入停车场;满时,到便道等待。如图2。 3车辆离开列表显示车辆到达停车场是否满否进入停车场是进入便道结束 图2 4 2.“离开”模块:离开时,当车库为空时,提示没有车,结束;否则车辆离开。如图3。 车辆离开停车场是否空否车辆离开是提示没有车是便道是否有车车进入车场否结束 图3 3. “显示”模块:显示模块有两个显示选项,即:车场与便道。如图4。 列表显示判断输入值1.车场显示车场列表2.便道显示便道列表结束图4 5 3.运行环境 1) 软件环境 操作系统:Windows7 2) 硬件环境 处理器:Intel Pentium 166MX 或更高 内存:32MB

6、以上 硬盘空间:1GB以上 显卡:SVGA 显示适配 4 开发工具和编程语言 Microsoft visual C+ C语言 5 详细设计 #include #include #include #include #include / 清空当前屏幕 #define ClearScreen system( cls ) / 显示字符串 szPrompt 并等待用户按下任意键 6 #define Pause( szPrompt ) printf( %s, szPrompt ),getch typedef struct carinformation / 车辆信息 char szRegistrationM

7、ark64; / 车牌号 char szArrivalTime16; / 到达时间 char szEntranceTime16; / 进入停车场(开始计费)时间 char szDepartureTime16; / 离开时间 TCARINFORMATION, *LPTCARINFORMATION; typedef struct carstack LPTCARINFORMATION lpCarInformation; / 车辆信息 int nTop; / 栈顶元素下标 int nStackSize; / 栈容量 TCARSTACK, *LPTCARSTACK; / 初始化栈 lpCarStack,

8、 将其容量设置为 nSize void InitStack( LPTCARSTACK &lpCarStack, int nSize ) lpCarStack = ( LPTCARSTACK ) malloc( sizeof ( TCARSTACK ) ); lpCarStack-lpCarInformation = ( LPTCARINFORMATION ) malloc( nSize * sizeof ( TCARINFORMATION ) ); lpCarStack-nTop = -1; lpCarStack-nStackSize = nSize; 7 / 车辆信息 carinfo 入栈

9、lpCarStack void Push( LPTCARSTACK &lpCarStack, TCARINFORMATION carinfo ) lpCarStack-nTop+; lpCarStack-lpCarInformationlpCarStack-nTop = carinfo; / 车辆信息从栈 lpCarStack 中弹出并存入 carinfo void Pop( LPTCARSTACK &lpCarStack, TCARINFORMATION &carinfo ) carinfo = lpCarStack-lpCarInformationlpCarStack-nTop; lpCa

10、rStack-nTop-; / 若栈 lpCarstack 空,返回 TRUE;否则,返回 FALSE BOOL IsStackEmpty( LPTCARSTACK lpCarStack ) return lpCarStack-nTop = -1; / 若栈 lpStackFull 满,返回 TRUE;否则,返回 FALSE BOOL IsStackFull( LPTCARSTACK lpCarStack ) return lpCarStack-nTop = ( lpCarStack-nStackSize - 1 ); 8 / 销毁栈 lpCarStack,将指针 lpCarStack 置为

11、NULL void DestroyStack( LPTCARSTACK &lpCarStack ) free( lpCarStack-lpCarInformation ); free( lpCarStack ); lpCarStack = NULL; typedef struct carnode / 链队结点信息 TCARINFORMATION carinfo; / 车辆信息 struct carnode *lpNext; / 指向下一个元素的指针 TCARNODE, *LPTCARNODE; typedef struct carqueue / 链队 LPTCARNODE lpHead; /

12、头结点 LPTCARNODE lpRear; / 指向当前队尾的指针 int nEffectiveSize; / 当前队中元素个数 TCARQUEUE, *LPTCARQUEUE; / 初始化链队 lpCarQueue void InitQueue( LPTCARQUEUE &lpCarQueue ) lpCarQueue = ( LPTCARQUEUE ) malloc( sizeof( TCARQUEUE ) ); lpCarQueue-lpHead = ( LPTCARNODE) malloc( sizeof( TCARNODE ) ); 9 lpCarQueue-lpHead-lpNe

13、xt = NULL; lpCarQueue-lpRear = lpCarQueue-lpHead; lpCarQueue-nEffectiveSize = 0; / 车辆信息 carinfo 入队 lpCarQueue void EnQueue( LPTCARQUEUE &lpCarQueue, TCARINFORMATION carinfo ) LPTCARNODE lpCarNode = ( LPTCARNODE ) malloc( sizeof( carnode ) ); lpCarNode-carinfo = carinfo; lpCarNode-lpNext = NULL; lpCa

14、rQueue-lpRear-lpNext = lpCarNode; lpCarQueue-lpRear = lpCarQueue-lpRear-lpNext; lpCarQueue-nEffectiveSize+; / 队头元素从链队 lpCarQueue 中出队并存入 carinfo void DeQueue( LPTCARQUEUE &lpCarQueue, TCARINFORMATION &carinfo ) LPTCARNODE lpTemp = lpCarQueue-lpHead-lpNext; carinfo = lpTemp-carinfo; lpCarQueue-lpHead-

15、lpNext = lpTemp-lpNext; free( lpTemp ); lpCarQueue-nEffectiveSize-; / 若链队 lpCarQueue 为空,返回 TRUE;否则,返回 FALSE 10 BOOL IsQueueEmpty( LPTCARQUEUE lpCarQueue ) return lpCarQueue-nEffectiveSize = 0; / 销毁链队 lpCarQueue void DestroyQueue( LPTCARQUEUE &lpCarQueue ) LPTCARNODE lpNextCarNode = NULL; for ( LPTCA

16、RNODE lpCarNode = lpCarQueue-lpHead; lpCarNode != NULL; lpCarNode = lpNextCarNode ) lpNextCarNode = lpCarNode-lpNext; free( lpCarNode ); free( lpCarQueue ); lpCarQueue = NULL; / 将字符串时间格式转换为数字(分钟)格式,例如 12:36 将被转换为 756 ( 12 * 60 + 36 ) int ConvertTimeFormat( char *lpTime ) int nHour = 0; int nMinute =

17、 0; sscanf( lpTime, %d:%d, &nHour, &nMinute ); return nHour * 60 + nMinute; 11 / 根据在停车场内的停留时间 nContinuanceMinutes (分钟)计算费用 double CalculateExpense( int nContinuanceMinutes ) return nContinuanceMinutes * ( 5.0 / 60 ); int main( void ) int nParkCapability = 0; / 停车场容量 putchar( n ); printf( 请输入停车场容量: )

18、; scanf( %d, &nParkCapability ); LPTCARSTACK lpCarStack = NULL; / 停车场,用栈模拟 InitStack( lpCarStack, nParkCapability ); LPTCARQUEUE lpCarQueue = NULL; / 便道,用链队模拟 InitQueue( lpCarQueue ); char cCommandType = NULL; / 命令类型 char szUserInput128 = NULL ; / 用户输入 do ClearScreen; putchar( n ); 12 puts( - ); put

19、s( 命令类型 ); puts( A - 车辆到达 ); puts( D - 车辆离开 ); puts( E - 停止输入 ); puts( O - 显示当前停车场和便道使用情况 ); putchar( n ); puts( 例: ); puts( A,冀A1234,14:26 ); puts( D,冀A1234,16:51 ); puts( E ); puts( O ); putchar( n ); printf( 请输入命令: ); scanf( %s, szUserInput ); puts( - ); char szCarInformation128 = NULL ; sscanf(

20、szUserInput, / 将命令类型与车辆信息分开存放 %c,%s, &cCommandType, / 用户输入的前半部分,即命令类型 szCarInformation / 用户输入的后半部分,即车辆信息 ); char *lpCommaLocation = NULL; / 车辆信息字符串中的逗号位置 for ( lpCommaLocation = szCarInformation; *lpCommaLocation lpCommaLocation+ ) if ( *lpCommaLocation = , ) 13 0; != break; *lpCommaLocation = 0; TC

21、ARINFORMATION carinfo = NULL ; / 存储本次用户输入的车辆信息 strcpy( carinfo.szRegistrationMark, szCarInformation ); if ( cCommandType = A ) strcpy( carinfo.szArrivalTime, lpCommaLocation + 1 ); if ( FALSE = IsStackFull( lpCarStack ) ) strcpy( carinfo.szEntranceTime, carinfo.szArrivalTime ); Push( lpCarStack, car

22、info ); printf( 已进入停车场第 %d 个车位n, lpCarStack-nTop + 1 ); printf( 车牌号:tt%sn, carinfo.szRegistrationMark ); printf( 进入时间:t%sn, carinfo.szEntranceTime ); puts( 是否收费:t是 ); else EnQueue( lpCarQueue, carinfo ); printf( 停车场已满,已停放在便道的第 %d 个车位n, lpCarQueue-nEffectiveSize 14 ); printf( 车牌号:tt%sn, carinfo.szReg

23、istrationMark ); printf( 停放时间:t%sn, carinfo.szArrivalTime ); puts( 是否收费:t否 ); else if ( cCommandType = D ) strcpy( carinfo.szDepartureTime, lpCommaLocation + 1 ); LPTCARSTACK lpTempCarStack = NULL; InitStack( lpTempCarStack, nParkCapability ); TCARINFORMATION carinfoOut = NULL ; BOOL bIsCarFound = F

24、ALSE; while ( FALSE = IsStackEmpty( lpCarStack ) ) Pop( lpCarStack, carinfoOut ); if ( 0 != strcmp( carinfoOut.szRegistrationMark, carinfo.szRegistrationMark ) ) Push( lpTempCarStack, carinfoOut ); else bIsCarFound = TRUE; break; 15 while ( FALSE = IsStackEmpty( lpTempCarStack ) ) TCARINFORMATION te

25、mpcarinfo = NULL ; Pop( lpTempCarStack, tempcarinfo ); Push( lpCarStack, tempcarinfo ); if ( FALSE = bIsCarFound ) printf( 车牌号为 %s 的车未进入停车场.n, carinfo.szRegistrationMark ); Pause( -n按任意键输入下一条信息.n ); continue; strcpy( carinfoOut.szDepartureTime, carinfo.szDepartureTime ); int nEntranceTime = ConvertT

26、imeFormat( carinfoOut.szEntranceTime ); int nDepartureTime = ConvertTimeFormat( carinfoOut.szDepartureTime ); int nContinuanceMinutes = nDepartureTime - nEntranceTime; printf( 计费时段:t%s - %s (共 %d 分钟)n, carinfoOut.szEntranceTime, carinfoOut.szDepartureTime, nContinuanceMinutes ); double rExpense = Ca

27、lculateExpense( nContinuanceMinutes ); printf( 应交纳的费用:t%.1lf 元n, rExpense ); if ( FALSE = IsQueueEmpty( lpCarQueue ) ) TCARINFORMATION tempcarinfo = NULL ; 16 DeQueue( lpCarQueue, tempcarinfo ); strcpy( tempcarinfo.szEntranceTime, carinfoOut.szDepartureTime ); Push( lpCarStack, tempcarinfo ); puts(

28、- ); printf( 停放在便道的第 1 个车位,车牌号为 %s 的车已进入停车场n, tempcarinfo.szRegistrationMark ); else if ( cCommandType = E ) puts( * ); puts( 陈赛 - Build20090507n ); puts( * ); break; else if ( cCommandType = O ) ClearScreen; putchar( n ); puts( 停车场使用情况n ); puts( 车位t车牌号t到达时间t进入(开始计费)时间n); for ( int i = 0; i nTop; i+

29、 ) printf( %dt%stt%stt%sn, i + 1, lpCarStack-lpCarInformationi.szRegistrationMark, lpCarStack-lpCarInformationi.szArrivalTime, lpCarStack-lpCarInformationi.szEntranceTime ); 17 putchar( n ); putchar( n ); putchar( n ); puts( 便道使用情况n ); puts( 车位t车牌号t到达时间t进入(开始计费)时间n); int nNum = 0; for ( LPTCARNODE l

30、pCarNode = lpCarQueue-lpHead-lpNext; lpCarNode != NULL; lpCarNode = lpCarNode-lpNext ) nNum+; printf( %dt%stt%stt%sn, nNum, lpCarNode-carinfo.szRegistrationMark, lpCarNode-carinfo.szArrivalTime, lpCarNode-carinfo.szEntranceTime ); putchar( n ); else puts( 输入信息有误.第一个字符只能为 A 或 D 或 E 或 O (区分大小写). ); Pa

31、use( -n按任意键输入下一条信息.n ); while ( TRUE ); DestroyStack( lpCarStack ); DestroyQueue( lpCarQueue ); 18 Pause( n按任意键退出程序.n ); return 0; 6 调试分析 1测试中的问题举例: 在测试删除联系人函数时发现无论通讯录中现存多少条记录只要删除一条之后,通讯录就会被清空,经过检查发现是删除函数中的条件控制设置有错,导致只要一删除一个联系人就会事头结点与尾结点指向同一个,导致再显示联系人时显示无联系人。经过调整已处理好。 2算法改进设想举例: 程序中还有很多地方不能很好的模拟通讯录的

32、功能,比如在增肌联系人时,不管原来新联系人姓名是否已存在,都会被加入通讯录,这样一来就有可能重复记录。此外在查找联系人时只要查找到一个合法记录就会中断查找操作,如此有可能导致记录的漏查。结合以上两点应优化增加查找联系人算法,在存入之间进行防重判断。 7、测试结果 测试用例 1第一组测试用例 测试输入:停车场的车辆离开,如下表: 服务选择 车牌号/车位 19 到达/离开时间 1 1 1 2 2 QH058 AB123 EA642 2 1 15:25 18:45 23:15 0:30 0:65 测试目的:测试离开方法时间格式控制以及费用计算是否正确。 正确输出:第一次离开的是AB123,应交费3.

33、45元。第二次时,当在输入65时,应该提示输入错误,重输。 实际输出: 错误原因:第一个错误是在计算时,一个数字错了;第二个是没有对时间格式控制。 当前状态:已改正 2第二组测试用例 测试输入:连续6辆车到达,如下表: 服务选择 1 1 1 1 车牌号 A8828 S2296 WW666 HK456 到达时间 7:56 8:25 8:45 15:50 20 1 1 GH999 DD555 12:30 13:40 测试目的:测试到达方法与列表显示方法能否正确完成。 正确输出:先到达的五辆车先进入停车场,最后到达的一辆在便道等候。 实际输出: 错误原因:没有作出时间先后的判断,而是先输入先进入。

34、当前状态:待修改 3第三组测试用例 测试输入:接上一步输入离开信息,下表: 服务选择 2 测试目的:测试离开方法功能是否成功以及便道进入车场是否正确。 正确输出:输出3号车位的车辆离开信息清单,便道1号车进入停车场。 实际输出: 离开车位 3 离开时间 13:30 便道车进入时间 13:40 21 错误原因:没有错误。 当前状态:通过 测试结果分析 此停车管理系统基本可能实现一个小的停车场的管理,其“到达”与“离开”方法都相对比较完整,以及结算清单明了。尽管在时间先后上有出现混乱,但当其用到实际应用时,那个时间先后就可以避免了。但在输入数据时,要按照严格的格式输入,否则有可能出现死去或崩溃。若

35、本系统能加上保存功能就更好了,因为一个系统在使用过程中总会关机等,而此系统的缺点却是没有保存功能,关闭之后就要重新建立了。会慢慢完善。 22 参考文献 1严蔚敏,数据结构 清华大学出版社 2谭浩强.C语言程序设计 清华大学出版社 心得体会 通过这次数据结构的课程设计,我对C语言的认识更深,了解到数据结构对编程的重要性。 如果说c语言是程序的骨髓,则数据结构和算法便是程序的血液,要成功的编写程序必须选择好合适的数据结构。 编程是很好的一种锻炼大脑的方式,以后的日子里,我会更加努力的去学习编程,使自己成为一名编程的强者。 23 信息科学与工程 学院课程设计成绩评价表 课程名称:数据结构课程设计 设

36、计题目:地图着色 专业: 班级: 姓名: 学号: 序号 评审项目 分 数 满分标准说明 思路清晰;语言表达准确,概念清楚,论点正确;实验方法科1 内 容 学,分析归纳合理;结论严谨,设计有应用价值。任务饱满,做了大量的工作。 2 创 新 内容新颖,题目能反映新技术,对前人工作有改进或突破,或有独特见解 3 完整性、实用性 整体构思合理,理论依据充分,设计完整,实用性强 4 数据准确、可靠 数据准确,公式推导正确 5 规 范 性 设计格式、绘图、图纸、实验数据、标准的运用等符合有关标准和规定 6 纪 律 性 能很好的遵守各项纪律,设计过程认真; 7 答 辩 准备工作充分,回答问题有理论依据,基本概念清楚。主要问题回答简明准确。在规定的时间内作完报告。 总 分 综 合 意 见 指导教师 年 月 日 24

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号