收藏 分销(赏)

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

上传人:丰**** 文档编号:4314528 上传时间:2024-09-05 格式:DOC 页数:25 大小:523.24KB
下载 相关 举报
C语言停车场管理系统课程设计.doc_第1页
第1页 / 共25页
C语言停车场管理系统课程设计.doc_第2页
第2页 / 共25页
C语言停车场管理系统课程设计.doc_第3页
第3页 / 共25页
C语言停车场管理系统课程设计.doc_第4页
第4页 / 共25页
C语言停车场管理系统课程设计.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

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

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

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

4、设计1数据结构说明(1)用到两个堆栈:一个为车场栈;另一个为临时栈temptypedef struct NODE CarNode *stackMAX+1; int top;SeqStackCar; /*模拟车场*/(2) 一个队列结构,存储便道车辆信息: typedef struct Node QueueNode *head; QueueNode *rear; LinkQueueCar; /*模拟便道*/2算法说明(1) 功能模块说明:停车场管理系统含有三个模块,即:车辆到达、离开、列表显示 图1 (2)以模块为单位分析算法 1、“到达”模块:到达时有两种情况,即车场是否满,未满则直接进入停车

5、场;满时,到便道等待。如图2。 图2 2.“离开”模块:离开时,当车库为空时,提示没有车,结束;否则车辆离开。如图3。 图3 3. “显示”模块:显示模块有两个显示选项,即:车场与便道。如图4。图43.运行环境1) 软件环境操作系统:Windows72) 硬件环境处理器:Intel Pentium 166MX 或更高内存:32MB以上硬盘空间:1GB以上显卡:SVGA 显示适配4 开发工具和编程语言Microsoft visual C+C语言5 详细设计#include #include #include #include #include / 清空当前屏幕#define ClearScree

6、n() system( cls )/ 显示字符串 szPrompt 并等待用户按下任意键#define Pause( szPrompt ) printf( %s, szPrompt ),getch()typedef struct carinformation / 车辆信息 char szRegistrationMark64; / 车牌号 char szArrivalTime16; / 到达时间 char szEntranceTime16; / 进入停车场(开始计费)时间 char szDepartureTime16; / 离开时间 TCARINFORMATION, *LPTCARINFORMA

7、TION;typedef struct carstack LPTCARINFORMATION lpCarInformation; / 车辆信息 int nTop; / 栈顶元素下标 int nStackSize; / 栈容量 TCARSTACK, *LPTCARSTACK;/ 初始化栈 lpCarStack, 将其容量设置为 nSizevoid InitStack( LPTCARSTACK &lpCarStack, int nSize ) lpCarStack = ( LPTCARSTACK ) malloc( sizeof ( TCARSTACK ) ); lpCarStack-lpCarI

8、nformation = ( LPTCARINFORMATION ) malloc( nSize * sizeof ( TCARINFORMATION ) ); lpCarStack-nTop = -1; lpCarStack-nStackSize = nSize;/ 车辆信息 carinfo 入栈 lpCarStackvoid Push( LPTCARSTACK &lpCarStack, TCARINFORMATION carinfo ) lpCarStack-nTop+; lpCarStack-lpCarInformationlpCarStack-nTop = carinfo;/ 车辆信息

9、从栈 lpCarStack 中弹出并存入 carinfovoid Pop( LPTCARSTACK &lpCarStack, TCARINFORMATION &carinfo ) carinfo = lpCarStack-lpCarInformationlpCarStack-nTop; lpCarStack-nTop-;/ 若栈 lpCarstack 空,返回 TRUE;否则,返回 FALSEBOOL IsStackEmpty( LPTCARSTACK lpCarStack ) return lpCarStack-nTop = -1;/ 若栈 lpStackFull 满,返回 TRUE;否则,

10、返回 FALSEBOOL IsStackFull( LPTCARSTACK lpCarStack ) return lpCarStack-nTop = ( lpCarStack-nStackSize - 1 );/ 销毁栈 lpCarStack,将指针 lpCarStack 置为 NULLvoid DestroyStack( LPTCARSTACK &lpCarStack ) free( lpCarStack-lpCarInformation ); free( lpCarStack ); lpCarStack = NULL;typedef struct carnode / 链队结点信息 TCA

11、RINFORMATION carinfo; / 车辆信息 struct carnode *lpNext; / 指向下一个元素的指针 TCARNODE, *LPTCARNODE;typedef struct carqueue / 链队 LPTCARNODE lpHead; / 头结点 LPTCARNODE lpRear; / 指向当前队尾的指针 int nEffectiveSize; / 当前队中元素个数 TCARQUEUE, *LPTCARQUEUE;/ 初始化链队 lpCarQueuevoid InitQueue( LPTCARQUEUE &lpCarQueue ) lpCarQueue =

12、 ( LPTCARQUEUE ) malloc( sizeof( TCARQUEUE ) ); lpCarQueue-lpHead = ( LPTCARNODE) malloc( sizeof( TCARNODE ) ); lpCarQueue-lpHead-lpNext = NULL; lpCarQueue-lpRear = lpCarQueue-lpHead; lpCarQueue-nEffectiveSize = 0;/ 车辆信息 carinfo 入队 lpCarQueuevoid EnQueue( LPTCARQUEUE &lpCarQueue, TCARINFORMATION car

13、info ) LPTCARNODE lpCarNode = ( LPTCARNODE ) malloc( sizeof( carnode ) ); lpCarNode-carinfo = carinfo; lpCarNode-lpNext = NULL; lpCarQueue-lpRear-lpNext = lpCarNode; lpCarQueue-lpRear = lpCarQueue-lpRear-lpNext; lpCarQueue-nEffectiveSize+;/ 队头元素从链队 lpCarQueue 中出队并存入 carinfovoid DeQueue( LPTCARQUEUE

14、&lpCarQueue, TCARINFORMATION &carinfo ) LPTCARNODE lpTemp = lpCarQueue-lpHead-lpNext; carinfo = lpTemp-carinfo; lpCarQueue-lpHead-lpNext = lpTemp-lpNext; free( lpTemp ); lpCarQueue-nEffectiveSize-;/ 若链队 lpCarQueue 为空,返回 TRUE;否则,返回 FALSEBOOL IsQueueEmpty( LPTCARQUEUE lpCarQueue ) return lpCarQueue-nE

15、ffectiveSize = 0;/ 销毁链队 lpCarQueuevoid DestroyQueue( LPTCARQUEUE &lpCarQueue ) LPTCARNODE lpNextCarNode = NULL; for ( LPTCARNODE lpCarNode = lpCarQueue-lpHead; lpCarNode != NULL; lpCarNode = lpNextCarNode ) lpNextCarNode = lpCarNode-lpNext; free( lpCarNode ); free( lpCarQueue ); lpCarQueue = NULL;/

16、将字符串时间格式转换为数字(分钟)格式,例如 12:36 将被转换为 756 ( 12 * 60 + 36 )int ConvertTimeFormat( char *lpTime ) int nHour = 0; int nMinute = 0; sscanf( lpTime, %d:%d, &nHour, &nMinute ); return nHour * 60 + nMinute;/ 根据在停车场内的停留时间 nContinuanceMinutes (分钟)计算费用double CalculateExpense( int nContinuanceMinutes ) return nCo

17、ntinuanceMinutes * ( 5.0 / 60 );int main( void ) int nParkCapability = 0; / 停车场容量 putchar( n ); printf( 请输入停车场容量: ); scanf( %d, &nParkCapability ); LPTCARSTACK lpCarStack = NULL; / 停车场,用栈模拟 InitStack( lpCarStack, nParkCapability ); LPTCARQUEUE lpCarQueue = NULL; / 便道,用链队模拟 InitQueue( lpCarQueue ); c

18、har cCommandType = NULL; / 命令类型 char szUserInput128 = NULL ; / 用户输入 do ClearScreen(); putchar( n ); puts( - ); puts( 命令类型 ); 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

19、); putchar( n ); printf( 请输入命令: ); scanf( %s, szUserInput ); puts( - ); char szCarInformation128 = NULL ; sscanf( szUserInput, / 将命令类型与车辆信息分开存放 %c,%s, &cCommandType, / 用户输入的前半部分,即命令类型 szCarInformation / 用户输入的后半部分,即车辆信息 ); char *lpCommaLocation = NULL; / 车辆信息字符串中的逗号位置 for ( lpCommaLocation = szCarInf

20、ormation; *lpCommaLocation != 0; lpCommaLocation+ ) if ( *lpCommaLocation = , ) break; *lpCommaLocation = 0; TCARINFORMATION carinfo = NULL ; / 存储本次用户输入的车辆信息 strcpy( carinfo.szRegistrationMark, szCarInformation ); if ( cCommandType = A ) strcpy( carinfo.szArrivalTime, lpCommaLocation + 1 ); if ( FAL

21、SE = IsStackFull( lpCarStack ) ) strcpy( carinfo.szEntranceTime, carinfo.szArrivalTime ); Push( lpCarStack, carinfo ); printf( 已进入停车场第 %d 个车位n, lpCarStack-nTop + 1 ); printf( 车牌号:tt%sn, carinfo.szRegistrationMark ); printf( 进入时间:t%sn, carinfo.szEntranceTime ); puts( 是否收费:t是 ); else EnQueue( lpCarQue

22、ue, carinfo ); printf( 停车场已满,已停放在便道的第 %d 个车位n, lpCarQueue-nEffectiveSize ); printf( 车牌号:tt%sn, carinfo.szRegistrationMark ); printf( 停放时间:t%sn, carinfo.szArrivalTime ); puts( 是否收费:t否 ); else if ( cCommandType = D ) strcpy( carinfo.szDepartureTime, lpCommaLocation + 1 ); LPTCARSTACK lpTempCarStack =

23、NULL; InitStack( lpTempCarStack, nParkCapability ); TCARINFORMATION carinfoOut = NULL ; BOOL bIsCarFound = FALSE; while ( FALSE = IsStackEmpty( lpCarStack ) ) Pop( lpCarStack, carinfoOut ); if ( 0 != strcmp( carinfoOut.szRegistrationMark, carinfo.szRegistrationMark ) ) Push( lpTempCarStack, carinfoO

24、ut ); else bIsCarFound = TRUE; break; while ( FALSE = IsStackEmpty( lpTempCarStack ) ) TCARINFORMATION tempcarinfo = NULL ; Pop( lpTempCarStack, tempcarinfo ); Push( lpCarStack, tempcarinfo ); if ( FALSE = bIsCarFound ) printf( 车牌号为 %s 的车未进入停车场.n, carinfo.szRegistrationMark ); Pause( -n按任意键输入下一条信息.n

25、 ); continue; strcpy( carinfoOut.szDepartureTime, carinfo.szDepartureTime ); int nEntranceTime = ConvertTimeFormat( carinfoOut.szEntranceTime ); int nDepartureTime = ConvertTimeFormat( carinfoOut.szDepartureTime ); int nContinuanceMinutes = nDepartureTime - nEntranceTime; printf( 计费时段:t%s - %s (共 %d

26、 分钟)n, carinfoOut.szEntranceTime, carinfoOut.szDepartureTime, nContinuanceMinutes ); double rExpense = CalculateExpense( nContinuanceMinutes ); printf( 应交纳的费用:t%.1lf 元n, rExpense ); if ( FALSE = IsQueueEmpty( lpCarQueue ) ) TCARINFORMATION tempcarinfo = NULL ; DeQueue( lpCarQueue, tempcarinfo ); str

27、cpy( tempcarinfo.szEntranceTime, carinfoOut.szDepartureTime ); Push( lpCarStack, tempcarinfo ); puts( - ); printf( 停放在便道的第 1 个车位,车牌号为 %s 的车已进入停车场n, tempcarinfo.szRegistrationMark ); else if ( cCommandType = E ) puts( * ); puts( 陈赛 - Build20090507n ); puts( * ); break; else if ( cCommandType = O ) Cl

28、earScreen(); putchar( n ); puts( 停车场使用情况n ); puts( 车位t车牌号t到达时间t进入(开始计费)时间n); for ( int i = 0; i nTop; i+ ) printf( %dt%stt%stt%sn, i + 1, lpCarStack-lpCarInformationi.szRegistrationMark, lpCarStack-lpCarInformationi.szArrivalTime, lpCarStack-lpCarInformationi.szEntranceTime ); putchar( n ); putchar(

29、 n ); putchar( n ); puts( 便道使用情况n ); puts( 车位t车牌号t到达时间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.szRegistrationMark, lpCarNode-carinfo.szArrivalTime, lpCa

30、rNode-carinfo.szEntranceTime ); putchar( n ); else puts( 输入信息有误.第一个字符只能为 A 或 D 或 E 或 O (区分大小写). ); Pause( -n按任意键输入下一条信息.n ); while ( TRUE ); DestroyStack( lpCarStack ); DestroyQueue( lpCarQueue ); Pause( n按任意键退出程序.n ); return 0;6 调试分析1 测试中的问题举例:在测试删除联系人函数时发现无论通讯录中现存多少条记录只要删除一条之后,通讯录就会被清空,经过检查发现是删除函数

31、中的条件控制设置有错,导致只要一删除一个联系人就会事头结点与尾结点指向同一个,导致再显示联系人时显示无联系人。经过调整已处理好。2 算法改进设想举例:程序中还有很多地方不能很好的模拟通讯录的功能,比如在增肌联系人时,不管原来新联系人姓名是否已存在,都会被加入通讯录,这样一来就有可能重复记录。此外在查找联系人时只要查找到一个合法记录就会中断查找操作,如此有可能导致记录的漏查。结合以上两点应优化增加查找联系人算法,在存入之间进行防重判断。7、测试结果(一)测试用例(说明:测试用例要合理并且足够,既要有正确用例,也要有错误用例,同时检验程序的正确性和强壮性)1第一组测试用例(1)测试输入:停车场的车

32、辆离开,如下表:服务选择车牌号/车位到达/离开时间1QH05815:251AB12318:451EA64223:15220:30210:65(错误) (2)测试目的:测试离开方法时间格式控制以及费用计算是否正确。(3)正确输出:第一次离开的是AB123,应交费3.45元。第二次时,当在输入65时,应该提示输入错误,重输。(4)实际输出: (5)错误原因:第一个错误是在计算时,一个数字错了;第二个是没有对时间格式控制。(6)当前状态:已改正2第二组测试用例(1)测试输入:连续6辆车到达,如下表: 服务选择 车牌号 到达时间1A8828 7:561S22968:251WW6668:451HK456

33、15:501GH99912:301DD55513:40(2) 测试目的:测试到达方法与列表显示方法能否正确完成。(3)正确输出:先到达的五辆车先进入停车场,最后到达的一辆在便道等候。(4)实际输出:(5)错误原因:没有作出时间先后的判断,而是先输入先进入。(6)当前状态:待修改3第三组测试用例(1)测试输入:接上一步输入离开信息,下表:服务选择离开车位离开时间便道车进入时间2313:3013:40(2)测试目的:测试离开方法功能是否成功以及便道进入车场是否正确。(3)正确输出:输出3号车位的车辆离开信息清单,便道1号车进入停车场。(4)实际输出:(5) 错误原因:没有错误。 (6)当前状态:通

34、过(二)测试结果分析 此停车管理系统基本可能实现一个小的停车场的管理,其“到达”与“离开”方法都相对比较完整,以及结算清单明了。尽管在时间先后上有出现混乱,但当其用到实际应用时,那个时间先后就可以避免了。但在输入数据时,要按照严格的格式输入,否则有可能出现死去或崩溃。若本系统能加上保存功能就更好了,因为一个系统在使用过程中总会关机等,而此系统的缺点却是没有保存功能,关闭之后就要重新建立了。会慢慢完善。参考文献1严蔚敏,数据结构(C语言版) 清华大学出版社2谭浩强.C语言程序设计(第三版) 清华大学出版社心得体会通过这次数据结构的课程设计,我对C语言的认识更深,了解到数据结构对编程的重要性。如果

35、说c语言是程序的骨髓,则数据结构和算法便是程序的血液,要成功的编写程序必须选择好合适的数据结构。编程是很好的一种锻炼大脑的方式,以后的日子里,我会更加努力的去学习编程,使自己成为一名编程的强者。信息科学与工程 学院课程设计成绩评价表课程名称:数据结构课程设计设计题目:地图着色专业: 班级: 姓名: 学号:序号评审项目分 数满分标准说明1内 容思路清晰;语言表达准确,概念清楚,论点正确;实验方法科学,分析归纳合理;结论严谨,设计有应用价值。任务饱满,做了大量的工作。2创 新内容新颖,题目能反映新技术,对前人工作有改进或突破,或有独特见解3完整性、实用性整体构思合理,理论依据充分,设计完整,实用性强4数据准确、可靠数据准确,公式推导正确5规 范 性设计格式、绘图、图纸、实验数据、标准的运用等符合有关标准和规定6纪 律 性能很好的遵守各项纪律,设计过程认真;7答 辩准备工作充分,回答问题有理论依据,基本概念清楚。主要问题回答简明准确。在规定的时间内作完报告。总 分综合意见 指导教师 年 月 日24

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服