《停车场管理系统实验报告.docx》由会员分享,可在线阅读,更多相关《停车场管理系统实验报告.docx(20页珍藏版)》请在课桌文档上搜索。
1、停车场管理系统实验报告一、需求分析1程序的功能:设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。(1)建立静态数组栈作为模拟停车场,动态链表栈作为模拟便道。(2)车辆到达,停入
2、停车场或者便道,记录车牌号,到达时间。(3)车辆离开,记录离开时间,输出停车时间和收费。将便道内车停入停车场,记录进入时间。(4)列表显示停车场,便道内车辆情况。(5)列表显示历史记录(已经离开车的车牌号,到达离开时间,收费)。2 .输入输出的要求:(1)输入:字符串车牌号,到达时间,离开时间(2)输出:停车时间和收费,停车场和便道的停车情况,历史记录。3 .测试数据:1停车场:车牌号苏Allll到达时间12:20离开时间13:002停车场:车牌号苏Allll到达时间12:20离开时间13:00;车牌号苏A2222到达时间13:00离开时间14:00选择停车场内1号位离开,再选择停车场内2号位
3、离开3停车场:车牌号苏AlIIl到达时间12:20离开时间13:00;车牌号苏A2222到达时间13:00离开时间14:00便道:车牌号苏A3333到达时间12:30离开时间13:00;车牌号苏A4444到达时间13:00离开时间15:00选择停车场内2号位离开,再选择选择停车场内2号位离开4停车场:车牌号苏AllII到达时间12:20离开时间13:00;车牌号苏A2222到达时间13:00高开时间14:00便道:车牌号苏A3333到达时间12:30离开时间13:00;车牌号苏A4444到达时间13:00离开时间15:00输出停车场内和便道的停车情况5停车场:车牌号苏AllII到达时间12:2
4、0离开时间13:00;车牌号苏A2222到达时间13:00高开时间14:00便道:车牌号苏A3333到达时间12:30离开时间13:00;车牌号苏A4444到达时间13:00离开时间15:00让苏AIlII和苏A2222高开后,再输出停车场内和便道的停车情况,以及历史记录6选择4退出系统二.概要设计4.本程序所用的抽象数据类型的定义ADTStack数据对象:D=aiai为ElemSe3i为正整数数据关系:Rl=ail,ai都属于D,i为正整数基本操作:InitStack(&S)栈SDestroyStack(&S)StackLength(三)元素个数,即栈的长度。StackEmpty(三)空栈,
5、则返回TRUE,否则FALEoGetTop(S,&e)S的栈顶元素ClearStack(&S)构建一个空/S被销毁返回S的若栈S为用e返回将S清为空栈PUSh(&S, e)入元素e为新的栈顶元素。Pop(&S,&e)/删除S的栈顶元素,并用e返回其值2.主程序的流程及各程序模块之间的层次关系(1)流程:输出菜单“1.车辆达到2.车辆离开3.列表显示4.退出系统”。0先选择1,输入车牌号,输出车在停车场的位置,再输入到达时间。随意选择123,4。若选1,停车场满后停在便道上,输入车牌号。选择2,输入要离开的车辆在停车场的位置和离开时间。输出停车时间和费用。若便道上有车,将一辆车移到停车场,输入现
6、在时间。选择3,输出菜单“L停车场2.便道3.历史记录4.返回”。选择1,23分别显示停车场,便道,历史记录的情况。选择4返回到开始菜单。最后选择4结束程序。二、详细设计1.采用c语言定义相关的数据类型(1) typedefstructtimeinthour;intmin;Time;/*时间结点*/(2) typedefstructnode(charnum10;Timereach;Timeleave;inttime;车停在停车场的总时间CarNode;/*车辆信息结点*/(3) typedefstructNODECarNodestackMAX+l;inttop;SeqStackCar;/*模拟
7、车站*/(4) typedefstructcar(CarNodedata;structcar*next;JQueueNode;(5) typedefstructNodeQueueNode*head;QueueNode*rear;LinkQueueCar;*模拟通道*/2.写出各模块的伪码算法(1)主函数voidmain()SeqStackCarEnter,Temp;1.inkQueueCarWait9Leavecar;intch;InitStaCk(&Enter);*初始化车站*/InitStaCk(&Temp);*初始化让路的临时栈*/InitQUeUe(&Wait);/*初始化通道*/In
8、itQUeUe(&Leavecar);/*初始化离开的车*/while(l)pt11*1*5C5C5Cjc5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C*,)printf(nl.车辆到达)printf(2.车辆离开”);printf(3.列表显示);printf(4.退出系统n”);printf(*n)while(l)scanf(%dch);if(ch=1&chtop=0;)(3)初始化便道intInitQueue(LinkQueueCar*carwait)/*初始化便道*/(carwait-head=carwait-r
9、ear=(QueueNode*)malloc(sizeof(QueueNode);if(!carwait-head)exit(OVERFLOW);CarWait-head-next=NULL;/队列初始化为NULLreturnOK;)(4)车辆到达,登记车牌号和到达时间intArrival(SeqStackCar*enter9LinkQueueCar*wait)/*车辆到达*/(if(enter-topMAX)车辆停入停车场并且登记车牌和到达时间PrintfC请输入车牌号:”);scanf(%s,enter-stackenter-top.num);PrintfC该车在停车场第d个位置nu,(e
10、nter-top)+1);Printf(请输入该车的到达时间例如:12:00:”);scanf(n%d:%dH,&(enter-stackenter-top.reach.hour),&(enter-stackenter-top.reach.min);(enter-top)+;returnOK;)else车辆停在便道上并且登记车牌和到达时间EnQueue(Wait);PrintfC请输入车牌号:”);scanf(,%s,wait-rear-data.num);Printf(该车停在便道上等待n”);returnOK;)(5)插入新的链表尾voidEnQueue(LinkQueueCar*wait
11、)/*插入新的队尾*/QueueNode*p=wait-rear;wait-rear=(QueueNode*)malloc(sizeof(QueueNode);if(!wait-rear)exit(OVERFLOW);p-next=wait-rear;wait-rear-next=NULL;)(6)车辆离开,登记离开时间,输出停车时间和收费。将便道内车辆intLeave(SeqStackCar*enter,SeqStackCar*temp9LinkQueueCar*wait,LinkQueueCar*leavecar)inti,j=enter-top;QueueNode*q=NULL;if(!
12、enter-top)若停车场内没有车则返回(Printfe停车场内没有车内returnERROR;)Printf(”请输入车在停车场中的位序(l-%d):,j);scanf(n%di);while(ienter-top)Printf(输入错误,请重新输入(l-%d):,j);scanf(,%di);)while(temp-top+istack(temp-top)+=enter-stack-(enter-top);fee(enter,leavecar);while(temp-top)将临时存放的车再停回停车场enter-stack(enter-top)+=temp-stack-(temp-top
13、);if(wait-head!=wait-rear)将便道里的一辆车停入停车场(q=wait-head-next;Printf(便道里的s车进入停车场第d个位置n,q-data.num,MAX);enter-stack(enter-top)+=q-data;PrintfC请输入现在时间:“);scanf(u%d:%d,&(enter-stackenter-top-l.reach.hour),&(enter-stackenter-top-l.reach.min);wait-head-next=q-next;if(!q-next)wait-rear=wait-head;free(q);)retur
14、nOK;)(7)计算收费,将离开车辆的信息登记入历史记录voidfee(SeqStackCar*enter,LinkQueueCar*leavecar)/*车费计算以及登记历史记录*/EnQueue(Ieavecar);(enter-top);PrintfC请输入离开时间例如:12:00:“);scanf(n%d:%dH,&(enter-stackenter-top.leave.hour),&(enter-stackenter-top.leave.min);enter-stackenter-top.time=(enter-stackenter-top.1eave.hour-enter-stac
15、kenter-top.reach.hour)*60;enter-stackenter-top.time+=enter-stackenter-top.leave.min-enter-stackenter-top.reach.min;printf(nn,enter-stackenter-top.num,enter-stacketer-top.time,enter-stackenter-top.time*price);leavecar-rear-data=enter-stackenter-top;/将离开的车的信息存在历史记录里)(8)显示存车信息,输出历史记录intList(SeqStackCar
16、*enter9LinkQueueCar*wait,LinkQueueCarlfiIeavecar)/*显示存车信息*/(intij;QueueNode*q=wait-head,*p=leavecar-head;while(l)t“5C5C5C5Cjjc5C5C55C5jC5C5C55C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C55C5C5C5C5C11n);PrintfCI停车场2.便道3.历史记录4.返回11);11n);scanf(%di);switch(i)casekprintf(位置到达时间车牌号11);for(j-Jtop;j+)Printf(8
17、d%8d:%2d%snu,j+l,enter-stackj.reach.hour,enter-stackj.reach.min,enter-stackj.num);break;case2:if(wait-head=wait-rear)printf(便道里没有车n)elseprintf(”便道内等待车辆车牌号:n)while(q=q-next)printf(%s,q-data.num);printf(un);Jbreak;)case3printf(,车牌号到达时间离开时间停车时间费用n)while(p=p-next)printf(n%8s%8d:%2d%8d:%2d%10d%8.2Ann,p-d
18、ata.num,p-data.reach.hour,p-data.reach.min,p-data.leave.hour,p-data.leave.min,p-data.time,p-data.time*price);break;case4:returnOK;2.画出函数的调用关系图主函数调用InitStack(),InitQueue(),Arrival(),Leave(),List()函数。Arrival()函数调用EnQUeUe()函数。1.eave()函数调用fee()函数。三、调试分析1 .调试中遇到的问题及对问题的解决方法序号错误信息解决方法1选择功能1出现“请输入车牌”后出现应用程
19、序错误初始化栈错误,不要再申请动态内存,只有赋初始值即可2选择功能1出现“请输入车牌”后出现应用程序错误数据应用错误,将栈的结构体类型CarNOde*stackMAX+l修改为CarNodestackMAX+13选择功能L输入到达时间出现应用程序错误数据应用错误,将栈的结构体类型CarNodedata;修改为CarNOdedata;4输出车费时小数点后又太多将输出函数里%f改为%6.2f位5从便道转移到停车场的车,离开后费用是乱码忘记登记进入停车场的时间6当停车场只有一辆车,让其禺开时,输出费用是乱码将车停放在临时车站的判断条件错误,while(temp-top+itop+itop刚进入该调用
20、函数的值7让便道车辆进入停车场第多少个位置输出有无推理可知总是第MAX个位置8当停车场内没有车时程序进入死循环加一个判断,if(!enter-top)returnERROR;9输出停车场信息是,停车位置错误将停车位置加1即可10车辆在便道里的位置输出错、口庆不输出位置信息2.算法的时间复杂度序号函数功能函数名称时间复杂度1主函数voidmain()2初始化栈voidInitStack(SeqStackCarO(1)*carstack)3初始化便道intInitQueue(LinkQueueCar*carwaitO(1)4车辆到达,登记车牌号和到达时间Arrival(SeqStackCar*en
21、ter9LinkQueueCar*wait)O(1)5插入新的链表尾voidEnQueue(LinkQueueCar*wait)O(1)6车辆离开,登记离开时间,输出停车时间和收费。将便道内车辆intLeave(SeqStackCar*enter,SeqStackCar*temp,LinkQueueCarlicWait9LinkQueueCarlfiIeavecar)7计算收费,将离开车辆的信息记入历史记录voidfee(SeqStackCar*enter,LinkQueueCar*leavecar)O(1)8显示存车信息,输出历史记录intList(SeqStackCar*enter,Lin
22、kQueueCarlicWait9LinkQueueCarlfiIeavecar)四、使用说明及测试结果1 .使用说明:输出菜单“1.车辆达到2车辆离开3.列表显示4.退出系统二0先选择1,输入车牌号,输出车在停车场的位置,再输入到达时间。随意选择123,4。若选1,停车场满后停在便道上,输入车牌号。选择2,输入要离开的车辆在停车场的位置和离开时间。输出停车时间和费用。若便道上车,将一辆车移到停车场,输入现在时间。选择3,输出菜单“L停车场2.便道3.历史记录4.返回二选择1,2,3,分别显示停车场,便道,历史记录的情况。选择4返回到开始菜单。最后选择4结束程序。2 .测试结果序号测试数据输出
23、结果1停车场:车牌号苏AnIl到车牌号:苏AIllI停车时间:40分达时间12:20离开时间13:00钟停车费:2.002停车场:车牌号苏AIIll到达时间12:20离开时间13:00;车牌号苏A2222到达时间13:00离开时间14:00选择停车场内1号位离开,再选择停车场内2号位离开车牌号:苏AnIl停车时间:40分钟停车费:2.00车牌号:苏A2222停车时间:120分钟停车费:6.003停车场:车牌号苏Allll到达时间12:20高开时间13:00;车牌号苏A2222到达时间13:00离开时间14:00便道:车牌号苏A3333到达时间12:30离开时间13:00;车牌号苏A4444到达
24、时间13:00离开时间15:00选择停车场内2号位离开,再选择选择停车场内2号位离开车牌号:苏A2222停车时间:120分钟停车费:6.00车牌号:苏A3333停车时间:30分钟停车费:1.504停车场:车牌号苏AIIil到达时间12:20高开时间13:00;车牌号苏A2222到达时间13:00离开时间14:00停车场内位置达到时间车牌号112:20苏AIlll213:00苏A2222便道:车牌号苏A3333到达时间12:30离开时间13:00;车牌号苏A4444到达时间13:00高开时间15:00输出停车场内和便道的停车情况便道内等待车辆车牌号苏A3333苏A44445停车场:车牌号苏Alnl到达时间12:20离开时间13:00;车牌号苏A2222到达时间13:00离开时间14:00便道:车牌号苏A3333到达时间12:30离开时间13:00;车牌号苏A4444到达时间13:00高开时间15:00让苏Al111和苏A2222离开后,再输出停车场内和便道的停车情况,以及历史记录停车场内位置达到时间车牌号112:30苏A3333213:00苏A4444便道内没有车辆历史记录车牌号到达时间离开时间停车时间费用苏AlIIl12:2013:00402.00苏A222213:0014:00603.006选择4退出系统成功退出程序