版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一问题描述1.实验题目: 设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端)。若停车场内已经停满 n辆车,那么后来的车只能在门外的便道上等候。一旦有车开走,则排在便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。试为停车场编制按上述要求进行管理的模拟程序。2.基本要求: 以栈模拟停车场,以队列模拟车场外的便道
2、,按照从终端读入数据的序列进行模拟管理。每一组输入数据包括三个数据项:汽车的“到达”(a表示)或“离去”(d表示)信息、汽车标识(牌照号)以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或者便道上的停车位置;若是车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。3.测试数据: 设n=2,输入数据为:(a,1,5),(a,2,10),(d,1,15),(a,3, 20),(a,4,25),(a,5,30),(d,2,35),(d,4,40),(e,0,0)。每一组输入数据包括三个数
3、据项:汽车 “到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,a表示到达;d表示离去,e表示输入结束。其中:(a,1,5)表示1号牌照车在5这个时刻到达,而(d,1,15)表示1号牌照车在15这个时刻离去。4.简述每一部分的对象、目的和要求:i.主函数部分:对象:栈,队列;目的:创建栈和队列对停车场管理系统进行模拟;要求:对栈和队列进行初始化。ii被调函数部分:对象:栈和队列中的结点(亦即车辆的信息);目的:将结点存放到栈和队列中,并作出正确的处理;要求:根据各结点的信息,调用相应的函数或者语句,将结点入栈入队,出栈或者出队。2 需求分析1.程序所能达到的基本可能:程序以栈模拟停车
4、场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理。栈以顺序结构实现,队列以链表结构实现。同时另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车。输入数据按到达或离去的时刻有序。当输入数据包括数据项为汽车的“到达”(a表示)信息,汽车标识(牌照号)以及到达时刻时,应输出汽车在停车场内或者便道上的停车位置;当输入数据包括数据项为汽车的“离去”(d表示)信息,汽车标识(牌照号)以及离去时刻时,应输出汽车在停车场停留的时间和应缴纳的费用(便道上停留的时间不收费);当输入数据项为(p,0,0)时,应输出停车场的车数;当输入数据项为(w, 0, 0)时,应输出候车场车数;当输入
5、数据项为(e, 0, 0),退出程序;若输入数据项不是以上所述,就输出error!。2.输入输出形式及输入值范围: 程序运行后进入循环,显示提示信息:“please input the state,number and time of the car:”,提示用户输入车辆信息(“到达”或者“离开”,车牌编号,到达或者离开的时间)。若车辆信息为“到达”,车辆信息开始进栈(模拟停车场),当栈满,会显示栈满信息:“the parking place is full!”,同时车辆进队列(模拟停车场旁便道),并显示该进入便道车辆的车牌编号,让用户知道该车的具体位置;若车辆信息为“离开”,会显示该车进入停
6、车场的时间以及相应的停车费用,若该车较部分车早进停车场,这部分车需先退出停车场,暂时进入一个新栈为其让道,会显示进入新栈的车辆的车牌编号及其入停车场的时间,当待离开车离开停车场后,这部分车会重新进入停车场,同时便道上的第一辆车进入停车场;若输入(p,0,0),会显示停车场的车数;若输入(w,0,0),会显示便道上的车数;若输入(e,0,0),程序会跳出循环,同时程序结束;若输入为其他字母,程序会显示“error!”报错。若便道上没有车辆停靠,会显示便道为空的信息:用户每输入一组数据,程序就会根据相应输入给出输出。输入值第一个必须为字母,后两个为数字。3.测试数据要求:用户输入字母时,输入大写或
7、小写,都可以被该程序识别,正常运行。但要求用户输入数据时,三个数据项之间必须用逗号相分隔开。三概要设计 为了实现上述功能,该程序以栈模拟停车场以及临时停放为给要离去的汽车让路而从停车场退出来的汽车的场地,以队列模拟车场外的便道,因此需要栈和队列这两个抽象数据类型。1. 栈抽象数据类型定义:adt sqstack 数据对象:d=, i=1,2,3.,n,n 数据关系:r=()|d,struct car; 基本操作: judge_output(s,q,r);/根据r中车辆信息控制车辆是入栈s还是 入队q以及相关操作 a_cars(s,q, a);/将到达车辆a的信息入栈s或者入队q d_cars(
8、s,q, d);/将待离开车辆d出栈s,并将q中相应车辆 入栈并进行相关的操作adt sqstack2.队列抽象数据类型定义:adt linkqueue 数据对象:d=qnode *,qnode *,i=1,2,3.,n,n; 数据关系:r=; 基本操作: judge_output(s,q,r);/根据r中车辆信息控制车辆是入栈s 还是入队q以及相关操作 a_cars(s,q, a);/将到达车辆a的信息入栈s或者入队q d_cars(s,q, d);/将待离开车辆d出栈s,并将q中相应车 辆入栈并进行相关的操作adt linkqueue 3.主要算法流程图:ijudge_output算法流程
9、图:iia_cars算法流程图:iiid_cars算法流程图:4.本程序保护模块:主函数模块栈单元模块:实现栈的抽象数据类型队列单元模块:实现队列的抽象数据类型调用关系:四详细设计1.相关头文件库的调用说明:#include #include#define maxsize 14#define n 2#define fee 102.元素类型、结点类型和结点指针类型:struct car char bb; int num; int time; ;struct rangweicarint num; int time;typedef struct stackkstruct rangweicar hma
10、xsize; int topp;sqstackk;#define qnode struct qnodeqnode int data; qnode *next; ;3.栈类型和队列类型:typedef struct stackstruct car gn; int top;sqstack;typedef struct linkqueueqnode *front,*rear; int geshu;linkqueue;/部分基本操作的伪码实现void judge_output(sqstack *s,linkqueue *q,struct car *r) if(*r).bb=e|(*r).bb=e) p
11、rintf(stop!n); else if(*r).bb=p|(*r).bb=p)printf(the number of parking cars is %dn,(s-top)+1);else if(*r).bb=w|(*r).bb=w)printf(the number of waiting cars is %dn,q-geshu);else if(*r).bb=a|(*r).bb=a)a_cars(s,q,*r);else if(*r).bb=d|(*r).bb=d)d_cars(s,q,*r);elseprintf(error!n);a_cars(sqstack *s,linkque
12、ue *q,struct car a)qnode *t;if(s-top!=n-1) (s-top)+; (s-gs-top).bb=a.bb;(s-gs-top).num=a.num;(s-gs-top).time=a.time;elseprintf(the parking place is full!n); t=(qnode *)malloc(sizeof(qnode); t-data=a.num; t-next=null; q-rear-next=t; q-rear=t; printf(the number of the car in the access road is:%dn,q-r
13、ear-data); q-geshu+;int d_cars(sqstack *s,linkqueue *q,struct car d)int i,j,l;float x,y;qnode *p;sqstackk *k;if(d.num=(s-gs-top).num)x=d.time-(s-gs-top).time;y=fee*x; printf(the time is %.2f hours,the fee is %.2f yuann,x,y); if(q-geshu=0) printf(the queue is empty!n); return 0; else p=q-front-next;
14、q-front-next=p-next; (s-gs-top).num=p-data; (s-gs-top).time=d.time; free(p); q-geshu-; if(q-front-next=null) q-rear=q-front; return 1; else for(i=0;itop);i+) if(s-gi).num!=d.num) continue;else break; if(i=(s-top) printf(error!n); return -1; x=d.time-(s-gi).time; y=fee*x; printf(the time is %.2f hour
15、s,the fee is %.2f yuann,x,y); k=(sqstackk *)malloc(sizeof(sqstackk); k-topp=-1; for(j=(s-top);ji;j-) k-topp+; (k-hk-topp).num=(s-gj).num; (k-hk-topp).time=(s-gj).time; s-top-; for(l=0;ltopp);l+) printf(the information(number and time) in the new stack is:n); printf(%d,%dn,(k-hl).num,(k-hl).time); s-
16、top-; while(k-topp=0) s-top+; (s-gs-top).bb=a; (s-gs-top).num=(k-hk-topp).num; (s-gs-top).time=(k-hk-topp).time; k-topp-; if(q-geshu=0) printf(the access road is empty!n); return 2; else s-top+; p=q-front-next; q-front-next=p-next; (s-gs-top).num=p-data; (s-gs-top).time=d.time; free(p); q-geshu-; if
17、(q-front-next=null) q-rear=q-front; return 3; 4.主函数的伪码:main() sqstack *s; linkqueue *q; qnode *p; struct car aamaxsize; int i; s=(sqstack *)malloc(sizeof(sqstack); s-top=-1; q=(linkqueue *)malloc(sizeof(linkqueue); p=(qnode *)malloc(sizeof(qnode); p-next=null; q-front=q-rear=p; q-geshu=0;printf(*n);
18、 printf(* *n); printf(* 停车场管理系统 *n); printf(* *n); printf(*n); for(i=0;imaxsize;i+) printf(please input the state,number and time of the car:n); scanf(%c,%d,%d,&(aai.bb),&(aai.num),&(aai.time); getchar();judge_output(s,q,&aai); if(aai.bb=e|aai.bb=e) break; 5.函数调用关系:五测试分析:1. 出现问题及解决办法:该程序是四个程序调试中最顺利的
19、一个,只在一个地方上出了问题,就是输入字符时由于回车键也是字符,回车键总会被读入,导致经常输出“error!”。后来找到原因后在scanf函数后紧接着加了一个getchar();语句后就恢复了正常。2.方法优缺点分析:优点:用栈和队列来模拟停车场让整个问题显得简单,易于实现;缺点:栈和队列这两个数学模型用在停车场管理上还是有失妥当的,现实中停车场出口入口不可能为同一处,不可能当一辆车要离开,在它后面进来的车必须为它让路,因此无法用栈的“后进先出”原则来模拟;而且没有考虑便道上的车在等待过程中可以中途开走等情况,而这些都无法用队列的“先进先出”原则来模拟。3.主要算法的时间和空间复杂度分析:(1
20、)由于算法judge_output函数根据判断条件,每次只选择一个程序段执行,所以其时间复杂度是o(1);(2)由于算法a_cars函数根据判断条件,将数据入栈或入队列,所以其时间复杂度也是o(1);(3)由于算法d_cars函数在出栈数据不在最顶端时需将n个数据先出该栈,再入新栈,再回旧栈的操作,故其时间复杂度是o(n);(4)所有算法的空间复杂度都是o(1)。6 使用说明程序运行后用户根据提示一次输入车辆的状态信息,车牌编号,时间,程序会根据车辆的状态信息调用相应的函数,并输出用户想得到的信息。7 调试结果输入数据:(a,1,5),(a,2,10),(d,1,15),(a,3, 20),(
21、a,4,25),(a,5,30),(d,2,35),(d,4,40),(p,0,0),(w,0,0),(f,0,0),(e,0,0)。输出数据:1号车停放时间为10小时,收费100元;2号车停放时间为25小时,收费250元;4号车停放5小时,收费50元;此时停车场有两辆车,便道上无车。若停车场已满,则会显示停车场已满的信息;若便道上无车等待停车,会显示便道上无车的信息;若中途有车离开,需其后的车让道,会显示进入临时停车场的车辆的信息;若输入(f,0,0),输出“error!”;若输入(e,0,0),程序结束。运行结果截屏:8 附录源程序文件清单:#include /*调用的头文件库声明*/#i
22、nclude#define maxsize 14#define n 2#define fee 10 struct car /*用该结构体来存放车的状态,编号和时间信息 */ char bb; int num; int time; ;typedef struct stack /*用该栈来模拟停车场*/struct car gn; int top;sqstack;struct rangweicar /*用该结构体来存放临时让出的车辆的编号以及时间信息*/int num; int time;typedef struct stack /*用该栈来模拟临时让出的车辆的停靠场地*/struct rangw
23、eicar hmaxsize; int topp;sqstackk;#define qnode struct qnodeqnode int data; /*链队结点的类型*/qnode *next; ;typedef struct linkqueue /*用该链队来模拟便道*/qnode *front,*rear; int geshu; linkqueue;void judge_output(sqstack *s,linkqueue *q,struct car *r) /*该算法通过传递来的车辆信息调 用相关函数实现操作*/ if(*r).bb=e|(*r).bb=e) /*若车辆状态为e,终
24、止程序*/ printf(stop!n); else if(*r).bb=p|(*r).bb=p) /*若车辆状态为p,输出停车场车辆数*/ printf(the number of parking cars is %dn,(s-top)+1); else if(*r).bb=w|(*r).bb=w) /*若车辆状态为w,输出便道车辆数*/ printf(the number of waiting cars is %dn,q-geshu); else if(*r).bb=a|(*r).bb=a) /*若车辆状态为a,调用a_cars函数*/ a_cars(s,q,*r); else if(*r
25、).bb=d|(*r).bb=d) /*若车辆状态为d,调用d_cars函数*/ d_cars(s,q,*r); else printf(error!n); /*若车辆状态为其他字母,报错*/a_cars(sqstack *s,linkqueue *q,struct car a) /*该算法实现对车辆状态为到达的车辆的操qnode *t; 作*/ if(s-top!=n-1) /*若停车场还没有满,则车进停车场,并存入车辆的状态,车牌编 (s-top)+; 号和到达时间信息*/ (s-gs-top).bb=a.bb; (s-gs-top).num=a.num; (s-gs-top).time=
26、a.time; else printf(the parking place is full!n); /*若停车场已满,车进便道,并显示该车的车牌编 t=(qnode *)malloc(sizeof(qnode); 号,同时记录便道车辆数目*/ t-data=a.num; t-next=null; q-rear-next=t; q-rear=t; printf(the number of the car in the access road is:%dn,q-rear-data); q-geshu+; int d_cars(sqstack *s,linkqueue *q,struct car d
27、) /*该算法实现车辆状态为离开的车int i,j,l; 辆的操作*/ float x,y; qnode *p; sqstackk *k; if(d.num=(s-gs-top).num) /*若待离开车为最后进停车场的车的情况*/ x=d.time-(s-gs-top).time; y=fee*x; /*直接计算停车时间,费用并离去*/ printf(the time is %.2f hours,the fee is %.2f yuann,x,y); if(q-geshu=0) /*若便道上无车,函数返回*/ printf(the queue is empty!n); return 0; e
28、lse /*若便道上有车,第一辆车进停车场*/ p=q-front-next; q-front-next=p-next; (s-gs-top).num=p-data; /*并存入其车牌编号及进停车场的时间*/ (s-gs-top).time=d.time; free(p); q-geshu-; if(q-front-next=null) q-rear=q-front; /*若此时便道上无车,返回1*/ return 1; else /*待离开的车不是最后进停车场的那辆车的情况*/ for(i=0;itop);i+) /*先找到待离开车在停车场中的位置*/ if(s-gi).num!=d.num
29、) continue;else break; if(i=(s-top) printf(error!n); return -1; x=d.time-(s-gi).time; /*计算待离开车的停车时间并计算费用*/ y=fee*x; printf(the time is %.2f hours,the fee is %.2f yuann,x,y); k=(sqstackk *)malloc(sizeof(sqstackk); /*设立一个新栈临时停放为该车离开而让 k-topp=-1; 路的车辆*/ for(j=(s-top);ji;j-) k-topp+; (k-hk-topp).num=(s-gj).num; (k-hk-topp).time=(s-gj).time; s-top-; for(l=0;ltopp);l+) printf(the information(number and time) in the new stack is:n); printf(%d,%dn,(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 腹泻的中医辩证分型及治疗
- 课件开头动画教学课件
- 精准开采课件教学课件
- 胃肠道术后饮食护理
- 虫咬伤课件教学课件
- 2.3.1物质的量+课件高一上学期化学人教版(2019)必修第一册
- 犬咬伤应急演练方案
- 高血压预防:控制血压的方法
- 解决方案总监年终述职
- 舞者表演规范
- 幼儿园故事课件:《精忠报国》
- 家庭主要成员及重要社会关系表
- 艺术系列各专业职称资格名称一览表
- 防防呆法防错法-课件
- 参会嘉宾签到表【范本模板】
- 2023年医疗事故案例
- 大课间跑操细则
- 小学语文-整本书《漂亮老师和坏小子》读书分享会教学课件设计
- ISO9001-ISO14001-ISO45001三体系内部审核检查表
- 华为鸿蒙系统
- 中国城市代码对照表
评论
0/150
提交评论