数据结构实验报告—停车场问题_第1页
数据结构实验报告—停车场问题_第2页
数据结构实验报告—停车场问题_第3页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、计算机软件技术基础 实验报告 I 数据结构实验二:停车场管理问题、问题描述1. 实验题目:设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在 停车场内按车辆到达时间的先后顺序, 依次由北向南排列 (大门在最南端, 最先到达的第一 辆车停放在车场的最北端) 。若停车场内已经停满 n 辆车,那么后来的车只能在门外的便道 上等候。一旦有车开走,则排在便道上的第一辆车即可开入。当停车场内某辆车要离开时, 在它之后进入的车辆必须先退出车场为它让路, 待该辆车开出大门外, 其他车辆再按原次序 进入车场。 每辆停放在车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。 试为

2、停车场编制按上述要求进行管理的模拟程序。2基本要求:以栈模拟停车场, 以队列模拟车场外的便道, 按照从终端读入数据的序列进行模拟管理。 每一组输入数据包括三个数据项:汽车的“到达” ( A'表示)或“离去”( D'表示)信息、 汽车标识(牌照号)以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为: 若是车辆到达, 则输出汽车在停车场内或者便道上的停车位置; 若是车辆离去, 则输出汽车 在停车场停留的时间和应缴纳的费用(便道上停留的时间不收费) 。栈以顺序结构实现,队 列以链表结构实现。3测试数据:设 n=2, 输入数据为: (A',1,5),( A',

3、2,10),(D',1,15),(A',3, 20 ), (A',4,25),(A',5,30),(D',2,35),(D',4,40),(E',0,0)。每一组输入 数据包括三个数据项:汽车 “到达”或“离去”信息、汽车牌照号码及到达或离去的时刻, 其中, A'表示到达;D'表示离去, E'表示输入结束。其中: ( A', 1,5)表示 1 号牌 照车在 5 这个时刻到达,而( D',1,15)表示 1号牌照车在 15 这个时刻离去。二、需求分析1. 程序所能达到的基本可能:本程序用来模拟一个可停

4、放 n 辆车的停车场的停车管理问题。 用栈和队列模拟停车场及 场外通道,输入车辆状态(到达或者离开) ,车牌号和时间,就可显示停车位置或者该车在 停车场停留时间及应缴费用。2. 输入的形式及输入值范围:程序接受 5个命令,分别是:到达( A',车牌号 ,时间);离去(D',车牌号,时间); 停车场(P', 0, 0 )显示停车场的车数;候车场( W', 0, 0)显示候车场的车数;退出 (E', 0, 0 )退出程序。3. 输出的形式:对于车辆到达,要输出汽车在停车场内或者便道上的停车位置;对于车辆离去,则输 出汽车在停车场停留的时间和应缴纳的费用(便道

5、上不收费) 。用户输入完毕后,程序自动 运行输出运行结果。4. 测试数据要求:设 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)。每一组输入 数据包括三个数据项:汽车 “到达”或“离去”信息、汽车牌照号码及到达或离去的时刻, 其中, A'表示到达;D'表示离去, E'表示输入结束。其中: ( A', 1,5)表示 1 号牌 照车在 5 这个

6、时刻到达,而( D',1,15)表示 1号牌照车在 15 这个时刻离去。三、概要设计为了实现上述功能,该程序以栈模拟停车场以及临时停放为给要离去的汽车让路而从 停车场退出来的汽车的场地, 以队列模拟车场外的便道, 因此需要栈和队列这两个抽象数据 类型。1. 栈抽象数据类型定义 :ADT SqStack数据对象: D=ai,bi,ci,di|ai int, bi int,ci int,di char),i =1,2.,n,n 0:数据关系: R=(ai,bi,di,)|ai,bi,di D,ai,bi,di struct car;基本操作:Car_enter(carnum,cartime

7、).,n,n0;数据关系: R= ?基本操作:Car_enter(carnum,cartime) 主程序流程及其模块调用关系 :1)主程序流程:主函数提示用户输入指令:到达( A',车牌号 ,时间);离去 (D',车牌号,时间) ;停 车场 P' 显示停车场的车数;候车场 W'显示候车场的车数;退出 E'退出程序。调用 int Result(char carmove,int carnum,int cartime)根据输入信息完成车辆的离开或者达到。若输入 A 则调用 Car_enter(int carnum,int cartime),创建顺序栈 CarS

8、 和链式队列CarQ,根据栈是否满决定输入的信息入栈还是入队列。若栈未满,输入的车辆信息入栈,若已满,入队列。若输入 D 则调用 Car_Leave(int carnum,int cartime) :创建一个临时栈存放退出让 路的车,若在车库中找到对应的车,车库中该车后面的车辆信息进入临时栈CarS2,该车出栈,显示车牌号,此时时间,停留时间,应缴费用。临时栈中的车的信息再回到 CarS 中。 此时若队列 CarQ不为空则将队列中车辆信息放入栈 CarS 中。若在车库中找不到对应的车的 车牌号信息, 则在表示候车场的队列中找该车信息, 如果它在队列的最后, 直接出列并输出 车牌号,此时时间,停

9、留时间,应缴费用。如果它不在队尾,先把对应信息保存在一个指向 队列的指针中,输出车牌号,此时时间,停留时间,应缴费用。删除队列中此结点表示此车 离开候车场。若输入 P,则输出车库车辆数 PCar;若输入 W,则输出候车场车辆数 WCa;r若输入 E,则退出程序。2)调用关系四、详细设计1. 元素类型、结点类型和结点指针类型:typedef struct Node1 arnum=carnum;ime=cartime;PCar+;arnum,.time,PCar);+;arnum)findcar=i;arnum=.carnum;.time=.time;printf("%d号车离开停车场离

10、 开 时 刻 : %d, 停 留 时 长(%d)n",.carnum,cartime,.time);PCar-;ime)*5);for(i=;i>=0;i-)arnum=i.carnum;.time=i.time;+;if!=arnum=>carnum;ime=cartime;入一组数据进行测试:( 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)。初始界面为:输入到达

11、车辆:到达车辆超过车库容量时:输入车辆离开信息:输入 P输入 W:输入 E:八 、遇到的问题和解决方法1. 开始,程序编写完成后虽然没有报错,却不能运行,如图经检查程序,将 Stack *CarS; Queue *CarQ;这两个指针型变量改成Stack CarS;arnum=>carnum;ime=cartime; 算费用时发现错误, 在候车厅时间也被计入停车费。 经检查程 序,将.time=>time;改成 .time=cartime; 使其计费时间从进入车库开始而不是从达到候车场开始。 再次运行发 现结果正确。九、实验收货和感想这是第一次运用栈和队列的相关知识编写程序, 开始

12、看到这个题目感觉挑战很大, 从未尝 试过这么复杂的一个系统。 停车场问题相较与约瑟夫斯问题要复杂得多, 分了多个模块。 起 初编写时漏洞很多, 好在当框架出来后各个漏洞都可以被弥补。 比如程序刚运行成功时, 发 现不能显示位置, 车库车辆数和候车场车辆数不正确, 计费不正确等很多漏洞, 但这些细节 的小问题都比较容易排查修改, 最终终于做出了符合要求的停车场管理系统。 当完成后, 我 对栈和队列的相关算法的理解也更加清晰深刻了。这个程序中还有一些灵活可变的地方, 用宏定义定义了车库容量和费用单价, 使具体数字可以较为灵活的改变, 增加了这个程序的使 用价值。 计算机实践课程给了我动手操作的机会

13、, 使我将理论和实际操作结合起来, 更好地 理解算法, 更快地学会编程。每次编程都感觉收获非常多。练习的越多,对算法语句越是熟 练,越能有深刻的理解, 不仅帮助我更好的学习软件技术基础 也为以后我们专业课的道 路打好基石,对我们的逻辑能力也是很大的提升。十、源程序#include<>#include<>#include <>#define MaxSize 2arnum=carnum;ime=cartime;PCar+;arnum,.time,PCar);+;arnum)findcar=i;arnum=.carnum;.time=.time;printf(&q

14、uot;%d 号 车 离 开 停 车 场 ! 离 开 时 刻 : %d, 停 留 时 长 (%d)n",.carnum,cartime,.time);PCar-;ime)*5);for(i=;i>=0;i-)arnum=i.carnum;.time=i.time;+;if!=arnum=>carnum;ime=cartime;/ 将此时的时刻记录入栈 CarS ,确保计算费用是 从车辆从候车场进入车库后才开始算+;PCar+;/车库车辆数 +1WCar-;/候车场车辆数 -1p=;=>next;free(p);else/ 如果车库中找不到此车,再在候车场找候车场队列

15、不为空p=;if(p!=&&p->carnum!=carnum) /f=p->next;while(f!=&&f->carnum!=carnum)p=f;f=f->next;if(f->carnum=carnum)/ 如果寻找的车在便道上,出队列findcar=1;p->next=f->next;printf("%d 号 车 离 开 候 车 场 ! 离 开 时 间 : %d, 停 留 时 长 (%d)n",f->carnum,cartime,cartime-f->time);WCar-;p

16、rintf(" 应付停车费 : %dn",(cartime-f->time)*0);free(f);if(p->carnum=carnum)/ 要离开的车在队尾,直接出队findcar=1;=>next;printf("%d号 车 离 开 候 车 场 ! 离 开 时 间 : %d, 停 留 时 长 (%d)!n",p->carnum,cartime,cartime-p->time);WCar-;printf(" 应付停车费 : %dn",(cartime-p->time)*0); free(p);i

17、f(findcar=-1)printf("%d 号车不在停车场中 !n",carnum);int Result(char carmove,int carnum,int cartime)/根据输入信息完成车辆的离开或者达到switch(carmove)case 'A':Car_enter(carnum,cartime);break;case 'D':Car_Leave(carnum,cartime);break;default :printf(" 输入错误 !n");break;return 1;main()printf(&

18、quot; 试验名称:停车场管理问题 n");printf("学号: n");printf("姓名: xxn");n");时间函数;: %s", asctime(timeinfo1);printf("=time_t rawtime1;struct tm * timeinfo1;time (&rawtime1);timeinfo1 = localtime (&rawtime1); /printf ("程序运行开始 ,当前日期和时间int go=1,carnum,cartime,MM;char

19、 carmove;=0;=(Node2 *)malloc(sizeof(Node2);while(go)printf("n车辆到达请输入 A;n 车辆离开请输入 D;n 显示停车场内车数请输入P;n 显示候车场车数请输入 W;n 退出程序请输入 E:n");printf("n 请输入信息 :");carmove=getchar();printf("n");switch(carmove)case 'A':printf("%cn 车牌号 :t",carmove);scanf("%d",&carnum);printf("时间 :t");scanf(&qu

温馨提示

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

最新文档

评论

0/150

提交评论