c语言数据结构停车场系统实验报告.doc_第1页
c语言数据结构停车场系统实验报告.doc_第2页
c语言数据结构停车场系统实验报告.doc_第3页
c语言数据结构停车场系统实验报告.doc_第4页
c语言数据结构停车场系统实验报告.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验题目:实验六 停车场管理班级:11计算机2班 姓名:仇越 学号:11070204 日期:10.30一、 需求分析1 程序的功能:设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。(1)建立静态数组栈作为模拟停车场,动态链表栈作为模拟便道。(2)车辆到达,停入停车场或者便道,记录车牌号,到达时间。(3)车辆离开,记录离开时间,输出停车时间和收费。将便道内车停入停车场,记录进入时间。(4)列表显示停车场,便道内车辆情况。(5)列表显示历史记录(已经离开车的车牌号,到达离开时间,收费)。2 输入输出的要求:(1) 输入:字符串车牌号,到达时间,离开时间(2) 输出:停车时间和收费,停车场和便道的停车情况,历史记录。3 测试数据:1停车场:车牌号 苏A1111 到达时间12:20 离开时间13:002停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00;车牌号 苏A2222 到达时间13:00 离开时间14:00 选择停车场内1号位离开,再选择停车场内2号位离开3停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00;车牌号 苏A2222 到达时间13:00 离开时间14:00 便道:车牌号苏A3333 到达时间12:30 离开时间13:00;车牌号 苏A4444 到达时间13:00 离开时间15:00 选择停车场内2号位离开,再选择选择停车场内2号位离开4停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00;车牌号 苏A2222 到达时间13:00 离开时间14:00 便道:车牌号苏A3333 到达时间12:30 离开时间13:00;车牌号 苏A4444 到达时间13:00 离开时间15:00 输出停车场内和便道的停车情况5停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00;车牌号 苏A2222 到达时间13:00 离开时间14:00 便道:车牌号苏A3333 到达时间12:30 离开时间13:00;车牌号 苏A4444 到达时间13:00 离开时间15:00 让苏A1111和苏A2222离开后,再输出停车场内和便道的停车情况,以及历史记录6选择4退出系统二概要设计4 本程序所用的抽象数据类型的定义ADT Stack数据对象:D=ai|ai为ElemSet,i为正整数数据关系:R1=|ai-1,ai都属于D,i为正整数 基本操作:InitStack(&S) /构建一个空栈S DestroyStack(&S) /S 被销毁 StackLength(S) /返回 S 的元素个数,即栈的长度。 StackEmpty(s) /若栈 S 为空栈,则返回 TRUE,否则 FALE。 GetTop(S, &e) /用 e 返回 S 的栈顶元素 ClearStack(&S) /将 S 清为空栈 Push(&S, e) /入元素 e 为新的栈顶元素。 Pop(&S, &e) /删除 S 的栈顶元素,并用 e 返回其值2. 主程序的流程及各程序模块之间的层次关系 (1)流程:输出菜单“1.车辆达到 2.车辆离开 3.列表显示 4.退出系统”。 先选择1,输入车牌号,输出车在停车场的位置,再输入到达时间。 随意选择1,2,3,4。若选1,停车场满后停在便道上,输入车牌号。 选择2,输入要离开的车辆在停车场的位置和离开时间。输出停车时间和费用。若便道上有车,将一辆车移到停车场,输入现在时间。 选择3,输出菜单“1.停车场 2.便道 3.历史记录 4.返回”。选择1,2,3,分别显示停车场,便道,历史记录的情况。选择4返回到开始菜单。 最后选择4结束程序。 二、 详细设计1. 采用c语言定义相关的数据类型(1)typedef struct timeint hour;int min;Time; /*时间结点*/(2)typedef struct nodechar num10;Time reach;Time leave; int time;/车停在停车场的总时间CarNode; /*车辆信息结点*/(3)typedef struct NODECarNode stackMAX+1;int top;SeqStackCar; /*模拟车站*/(4)typedef struct carCarNode data;struct car *next;QueueNode;(5)typedef struct NodeQueueNode *head;QueueNode *rear;LinkQueueCar; /*模拟通道*/2.写出各模块的伪码算法(1)主函数void main()SeqStackCar Enter,Temp;LinkQueueCar Wait,Leavecar;int ch;InitStack(&Enter); /*初始化车站*/ InitStack(&Temp); /*初始化让路的临时栈*/InitQueue(&Wait); /*初始化通道*/ InitQueue(&Leavecar); /*初始化离开的车*/while(1) printf(n*);printf(n1. 车辆到达);printf( 2. 车辆离开);printf( 3. 列表显示);printf( 4. 退出系统n); printf(*n);while(1)scanf(%d,&ch);if(ch=1&chtop=0;(3)初始化便道int InitQueue(LinkQueueCar *carwait) /*初始化便道*/carwait-head=carwait-rear=(QueueNode *)malloc(sizeof(QueueNode);if(!carwait-head) exit(OVERFLOW);carwait-head-next=NULL;/队列初始化为NULLreturn OK;(4)车辆到达,登记车牌号和到达时间int Arrival(SeqStackCar *enter,LinkQueueCar *wait) /*车辆到达*/ if(enter-topMAX) /车辆停入停车场并且登记车牌和到达时间printf(请输入车牌号 : );scanf(%s,enter-stackenter-top.num);printf(该车在停车场第%d个位置n,(enter-top)+1);printf(请输入该车的到达时间 : );scanf(%d:%d,&(enter-stackenter-top.reach.hour),&(enter-stackenter-top.reach.min);(enter-top)+;return OK;else /车辆停在便道上并且登记车牌和到达时间 EnQueue(wait);printf(请输入车牌号 : );scanf(%s,wait-rear-data.num);printf(该车停在便道上等待n);return OK; (5)插入新的链表尾void EnQueue(LinkQueueCar *wait) /*插入新的队尾*/ QueueNode *p=wait-rear;wait-rear=(QueueNode *)malloc(sizeof(QueueNode);if(!wait-rear) exit(OVERFLOW);p-next=wait-rear;wait-rear-next=NULL;(6)车辆离开,登记离开时间,输出停车时间和收费。将便道内车辆int Leave(SeqStackCar *enter,SeqStackCar *temp,LinkQueueCar *wait,LinkQueueCar *leavecar)int i,j=enter-top; QueueNode *q=NULL; if(!enter-top) /若停车场内没有车则返回printf(停车场内没有车);return ERROR;printf(请输入车在停车场中的位序(1-%d): ,j);scanf(%d,&i);while(ienter-top) printf(输入错误,请重新输入(1-%d): ,j); scanf(%d,&i); while(temp-top +istack(temp-top)+=enter-stack-(enter-top);fee(enter,leavecar);while(temp-top) /将临时存放的车再停回停车场enter-stack(enter-top)+=temp-stack-(temp-top); if(wait-head!=wait-rear) /将便道里的一辆车停入停车场q=wait-head-next;printf(便道里的%s车进入停车场第%d个位置n,q-data.num,MAX);enter-stack(enter-top)+=q-data;printf(请输入现在时间 : ); scanf(%d:%d,&(enter-stackenter-top-1.reach.hour),&(enter-stackenter-top-1.reach.min);wait-head-next=q-next;if(!q-next) wait-rear=wait-head;free(q); return OK;(7)计算收费,将离开车辆的信息登记入历史记录void fee(SeqStackCar *enter,LinkQueueCar *leavecar) /*车费计算以及登记历史记录*/ EnQueue(leavecar); -(enter-top); printf(请输入离开时间 : );scanf(%d:%d,&(enter-stackenter-top.leave.hour),&(enter-stackenter-top.leave.min);enter-stackenter-top.time=(enter-stackenter-top.leave.hour - enter-stackenter-top.reach.hour)*60;enter-stackenter-top.time+=enter-stackenter-top.leave.min - enter-stackenter-top.reach.min; printf( n,enter-stackenter-top.num,enter-stackenter-top.time,enter-stackenter-top.time*price);leavecar-rear-data=enter-stackenter-top;/将离开的车的信息存在历史记录里(8)显示存车信息,输出历史记录int List(SeqStackCar *enter,LinkQueueCar *wait,LinkQueueCar *leavecar) /*显示存车信息*/ int i,j; QueueNode *q=wait-head,*p=leavecar-head; while(1)printf(*n);printf(1.停车场 2.便道 3.历史记录 4.返回n);printf(*n);scanf(%d,&i);switch(i)case 1:printf( 位置 到达时间 车牌号n); for(j=0;jtop;j+)printf(%8d%8d:%2d %sn,j+1,enter-stackj.reach.hour,enter-stackj.reach.min,enter-stackj.num); break;case 2:if(wait-head=wait-rear)printf(便道里没有车n); else printf(便道内等待车辆车牌号:n); while(q=q-next) printf(%s ,q-data.num); printf(n); break;case 3:printf( 车牌号 到达时间 离开时间 停车时间 费用n); while(p=p-next)printf(%8s%8d:%2d%8d:%2d%10d%8.2fn,p-data.num,p-data.reach.hour,p-data.reach.min,p-data.le ave.hour,p-data.leave.min,p-data.time,p-data.time*price); break;case 4:return OK;2. 画出函数的调用关系图主函数调用InitStack(),InitQueue(),Arrival(),Leave(),List()函数。Arrival()函数调用EnQueue()函数。Leave()函数调用fee()函数。三、 调试分析1 调试中遇到的问题及对问题的解决方法序号错误信息解决方法1选择功能1出现“请输入车牌”后出现应用程序错误初始化栈错误,不要再申请动态内存,只有赋初始值即可2选择功能1出现“请输入车牌”后出现应用程序错误数据应用错误,将栈的结构体类型CarNode *stackMAX+1修改为CarNode stackMAX+13选择功能1,输入到达时间出现应用程序错误数据应用错误,将栈的结构体类型CarNode data;修改为CarNode data;4输出车费时小数点后又太多位将输出函数里 %f 改为%6.2f5从便道转移到停车场的车,离开后费用是乱码忘记登记进入停车场的时间6当停车场只有一辆车,让其离开时,输出费用是乱码将车停放在临时车站的判断条件错误,while(temp-top +itop +itop刚进入该调用函数的值7让便道车辆进入停车场第多少个位置输出有无推理可知总是第MAX个位置8当停车场内没有车时程序进入死循环加一个判断,if(!enter-top) return ERROR;9输出停车场信息是,停车位置错误将停车位置加1即可10车辆在便道里的位置输出错误不输出位置信息2 算法的时间复杂度序号函数功能函数名称时间复杂度1主函数void main()2初始化栈void InitStack(SeqStackCar *carstack)O(1)3初始化便道int InitQueue(LinkQueueCar *carwaitO(1)4车辆到达,登记车牌号和到达时间Arrival(SeqStackCar *enter,LinkQueueCar *wait)O(1)5插入新的链表尾void EnQueue(LinkQueueCar *wait)O(1)6车辆离开,登记离开时间,输出停车时间和收费。将便道内车辆int Leave(SeqStackCar *enter,SeqStackCar *temp,LinkQueueCar *wait,LinkQueueCar *leavecar)7计算收费,将离开车辆的信息记入历史记录void fee(SeqStackCar *enter,LinkQueueCar *leavecar)O(1)8显示存车信息,输出历史记录int List(SeqStackCar *enter,LinkQueueCar *wait,LinkQueueCar *leavecar)四、 使用说明及测试结果 1. 使用说明:输出菜单“1.车辆达到 2.车辆离开 3.列表显示 4.退出系统”。 先选择1,输入车牌号,输出车在停车场的位置,再输入到达时间。 随意选择1,2,3,4。若选1,停车场满后停在便道上,输入车牌号。 选择2,输入要离开的车辆在停车场的位置和离开时间。输出停车时间和费用。若便道上车,将一辆车移到停车场,输入现在时间。 选择3,输出菜单“1.停车场 2.便道 3.历史记录 4.返回”。选择1,2,3,分别显示停车场,便道,历史记录的情况。选择4返回到开始菜单。 最后选择4结束程序。 2.测试结果序号测试数据输出结果1停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00车牌号:苏A1111 停车时间:40分钟 停车费:2.002停车场:车牌号 苏A1111 到达时间12:20 离开时间13:00;车牌号 苏A2222 到达时间13:00 离开时间14:00 选择停车场内1号位离开,再选择停车场内2号位离开车牌号:苏A1111 停车时间:40分钟 停车费:2.00车牌号:苏A2222 停车时间:120分钟 停车费:6.003停车场:车牌号 苏A1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论