版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1. 实验题目:设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。 汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端, 最先到达的第一辆车停放在车场的最北端)。若停车场内已经停满 n 辆车,那么后 来的车只能在门外的便道上等候。一旦有车开走,则排在便道上的第一辆车即可开 入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路, 待该辆车开出大门外,其他车辆再按原次序进入车场。每辆停放在车场的车在它离 开停车场时必须按它停留的时间长短缴纳费用。试为停车场编制按上述要求进行管 理的模拟程序。要求:根据各结点的信息,调用相应的函数或者语句,
2、将结点入栈入队,出栈或者 出队。二需求分析1. 程序所能达到的基本可能:程序以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列 进行模拟管理。栈以顺序结构实现,队列以链表结构实现。同时另设一个栈,临时 停放为给要离去的汽车让路而从停车场退出来的汽车。输入数据按到达或离去的时 刻有序。当输入数据包括数据项为汽车的“到达”(A表示)信息,汽车标识(牌 照号)以及到达时刻时,应输出汽车在停车场内或者便道上的停车位置;当输入数 据包括数据项为汽车的“离去” (D表示)信息,汽车标识(牌照号)以及离去时刻时,应输出汽车在停车场停留的时间和应缴纳的费用(便道上停留的时间不收 费);当输入数据
3、项为( P, 0, 0)时,应输出停车场的车数;当输入数据项为 ( W, 0, 0 )时,应输出候车场车数;当输入数据项为(E, 0, 0 ),退出程序;若输入数据项不是以上所述,就输出ERROR!。2. 输入输出形式及输入值范围:程序运行后进入循环,显示提示信息:“Please input the state,number andtime of the car: ”,提示用户输入车辆信息(“到达”或者“离开”,车牌编号, 到达或者离开的时间)。若车辆信息为“到达”,车辆信息开始进栈(模拟停车 场),当栈满,会显示栈满信息:“The parking place is full!”,同时车辆进队
4、列(模拟停车场旁便道),并显示该进入便道车辆的车牌编号,让用户知道该车 的具体位置;若车辆信息为“离开”,会显示该车进入停车场的时间以及相应的停 车费用,若该车较部分车早进停车场,这部分车需先退出停车场,暂时进入一个新 栈为其让道,会显示进入新栈的车辆的车牌编号及其入停车场的时间,当待离开车 离开停车场后,这部分车会重新进入停车场,同时便道上的第一辆车进入停车场; 若输入( P, 0, 0),会显示停车场的车数;若输入( W, 0, 0),会显示 便道上的车数;若输入 ( E, 0, 0),程序会跳出循环,同时程序结束;若输入 为其他字母,程序会显示“ ERRO!R ”报错。若便道上没有车辆停
5、靠,会显示便道 为空的信息:用户每输入一组数据,程序就会根据相应输入给出输出。输入值第一 个必须为字母,后两个为数字。3. 测试数据要求:用户输入字母时,输入大写或小写,都可以被该程序识别,正常运行。但要求用户输入数据时,三个数据项之间必须用逗号相分隔开。三概要设计为了实现上述功能,该程序以栈模拟停车场以及临时停放为给要离去的汽车让 路而从停车场退出来的汽车的场地,以队列模拟车场外的便道,因此需要栈和队列 这两个抽象数据类型。1. 栈抽象数据类型定义:ADT SqStack数据对象:D=ai,bi,ci,di |ai int, bi int, ci int, di char ,i=1,2,3,
6、n,n0数据关系:R=( ai,bi,di)| ai,bi,di D,ai,bi,di struct car;基本操作:Judge_Output(s,q,r)是; / 根据 r 中车辆信息控制车辆是入栈 s 还入队 q 以及相关操作A_cars(s,q, a); / 将到达车辆 a 的信息入栈 s 或者入队 qD_cars(s,q, d);/ 将待离开车辆 d 出栈 s ,并将 q 中相应车辆入栈并进行相关的操作ADT SqStack2. 队列抽象数据类型定义:ADT LinkQueue数据对象: D=ai ,bi,ci |ai Qnode *, bi Qnode*,ci int ,i=1,2
7、,3 ,n,n0;数据关系: R= ;基本操作:Judge_Output(s,q,r)A_cars(s,q, a)D_cars(s,q, d);/ 根据 r 中车辆信息控制车辆是入栈 s 还是入队 q 以及相关操作; / 将到达车辆 a 的信息入栈 s 或者入队 q;将待离幵车辆d出栈s,并将q中相应车辆入栈并进行相关的操作ADT LinkQueue3. 主要算法流程图:I Judge_Output 算法流程图:II A_cars 算法流程图:III D_cars 算法流程图:4. 本程序保护模块:主函数模块栈单元模块:实现栈的抽象数据类型 队列单元模块:实现队列的抽象数据类型 调用关系:四详
8、细设计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 HMAXSIZE;int topp;SqStackk;#define QNODE struct QnodeQNODE int data;QNODE *next;3. 栈类型和队列类型:ty
9、pedef 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)printf(STOP!n);else if(*r).bb=P|(*r).bb=p)printf(The number of parking cars is %dn,(s-top)+1);els
10、e 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,LinkQueue *q,struct car a)QNODE *t;if(s-top!=n-1)(s-top)+;(s-Gs-top).bb=a.bb;(s-Gs-top).time=a.time;els
11、eprintf(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 roadis:%dn,q-rear-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
12、).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;elsep=q-front-next;q-front-next=p-next;(s-Gs-top).num=p-data;free(p);q-geshu-;if(q-front-next=NULL)q-rear=q-front;return 1;elsefor(i=0;itop);i+)if(s-Gi).
13、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 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(
14、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-top-;while(k-topp=0)s-top+;(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;elses-top+;p=q-front-next;
15、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 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 *)m
16、alloc(sizeof(QNODE);p-next=NULL;q-front=q-rear=p;q-geshu=0;printf(*n);H*printf(n);H*printf(H*停车场管理系统*n);printf(H*n);printf(H*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
17、|aai.bb=e) break;5. 函数调用关系:五测试分析:1. 出现问题及解决办法:该程序是四个程序调试中最顺利的一个,只在一个地方上出了问题,就是输入字符时由于回车键也是字符,回车键总会被读入,导致经常输出“ERRO!R ”。后来找到原因后在 scanf 函数后紧接着加了一个 getchar ();语句后就恢复了正常。2. 方法优缺点分析 :优点:用栈和队列来模拟停车场让整个问题显得简单,易于实现;缺点:栈和队列这两个数学模型用在停车场管理上还是有失妥当的,现实中停车场 出口入口不可能为同一处,不可能当一辆车要离开,在它后面进来的车必须为它让 路,因此无法用栈的“后进先出”原则来模拟
18、;而且没有考虑便道上的车在等待过 程中可以中途开走等情况,而这些都无法用队列的“先进先出”原则来模拟3. 主要算法的时间和空间复杂度分析: ( 1)由于算法 Judge_Output 函数根据判断条件,每次只选择一个程序段执行,所 以其时间复杂度是 O(1) ;( 2)由于算法 A_cars 函数根据判断条件,将数据入栈或入队列,所以其时间复杂 度也是 O(1) ;(3)由于算法D_cars函数在出栈数据不在最顶端时需将 n个数据先出该栈,再入新栈,再回旧栈的操作,故其时间复杂度是 O(n) ;( 4)所有算法的空间复杂度都是 O(1) 。六使用说明程序运行后用户根据提示一次输入车辆的状态信息
19、,车牌编号,时间,程序会 根据车辆的状态信息调用相应的函数,并输出用户想得到的信息。七调试结果输入数据:( A, 1, 5),( A, 2, 10),( D, 1, 15),( A, 3, 20),( 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 元;此时停车场有两辆车,便道上无车。若 停车场已满,则会显示停车场已满的信息;若便道上无
20、车等待停车,会显示便道上 无车的信息;若中途有车离开,需其后的车让道,会显示进入临时停车场的车辆的 信息;若输入(F, 0, 0),输出“ ERROR”;若输入(E, 0, 0),程序 结束。运行结果截屏:八附录源程序文件清单:#include /* 调用的头文件库声明 */#include#define MAXSIZE 14#define n 2#define fee 10struct car/*用该结构体来存放车的状态,编号和时间信息 */ char bb;int num;int time;typedef struct stack /*用该栈来模拟停车场 */struct car Gn;i
21、nt top;SqStack;struct rangweicar/*用该结构体来存放临时让出的车辆的编号以及时间信息 */int num;int time;1;typedef struct stack /*用该栈来模拟临时让出的车辆的停靠场地 */struct rangweicar HMAXSIZE;int topp;SqStackk;#define QNODE struct QnodeQNODE int data;/* 链队结点的类型 */QNODE *next;typedef struct linkqueue /* 用该链队来模拟便道 */QNODE *front,*rear;int ge
22、shu;LinkQueue;void Judge_Output(SqStack *s,LinkQueue *q,struct car *r) /* 该算法通过传递 来的车辆信息调 用相关函数实现操作 */if(*r).bb=E|(*r).bb=e)/*若车辆状态为E,终止程序*/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,输出便道车辆数
23、*/printf(The number of waiting cars is %dn,q-geshu);A_cars 函数 */A_cars(s,q,*r);若车辆状态为D,调用else if(*r).bb=D|(*r).bb=d) /*D_cars 函数 */D_cars(s,q,*r);elseprintf(ERROR!n); /*若车辆状态为其他字母,报错 */A_cars(SqStack *s,LinkQueue *q,struct car a) /*该算法实现对车辆状态为到达的车辆的操QNODE *t;作*/if(s-top!=n-1) /*状态,车牌编(s-top)+;若停车场还没
24、有满,则车进停车场,并存入车辆的号和到达时间信息 */(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(thenumber of the car in the access road is
25、:%dn,q-rear-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)
26、;if(q-geshu=0) /* 若便道上无车,函数返回 */printf(The queue is empty!n);return 0;Else /* 若便道上有车,第一辆车进停车场 */ 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/*待离开的车不是最后进停车场的那辆车的
27、情况 */for(i=0;itop);i+)/*先找到待离开车在停车场中的位置 */continue;if(s-Gi).num!=d.num)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,(k-Hl).num,(k-Hl).time);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离婚财产分割合同模板
- 保安公司安保人员聘用合同样本
- 旅游设施建设报名表
- 建筑脚手架施工合同副本
- 2024年动画电影配音协议
- 电力设备检修员聘用合同样本
- 高三班主任工作计划(5篇)
- 企业咨询服务合同
- 2024年度农业技术推广与服务合同
- 企业总部二手房交易合同模板
- 相对湿度计算公式
- 2024版肿瘤患者静脉血栓防治指南解读 课件
- 商业银行开展非法集资风险排查活动情况报告
- 英语连读发音技巧讲解
- 危货运输车辆挂靠协议
- 加快推进涉外法治建设
- 绿色供应链管理企业一般要求符合性评价表
- 中航集团招聘笔试题库2024
- 某系统安防工程施工组织设计方案
- 2024年7月13日云南省昆明市直遴选笔试真题及解析综合管理岗
- 《明朝的统治》(2016年人教版)
评论
0/150
提交评论