数据结构实验报告模拟停车场管理(含代码)_第1页
数据结构实验报告模拟停车场管理(含代码)_第2页
数据结构实验报告模拟停车场管理(含代码)_第3页
数据结构实验报告模拟停车场管理(含代码)_第4页
数据结构实验报告模拟停车场管理(含代码)_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、模拟停车场管理班级:物联网 姓名:XXX 学号:XXXXXXX 日期:4月9日一、需求分析 1、程序的功能描述 按照从终端输入的数据序列进行模拟管理。 1)狭道停车用栈来实现,并且用的顺序栈,等车位的便道用队列来实现,并用链 式存储。 2)每一组输入信息包含三个数据项,汽车的“到达”和“离去”的信息,汽车牌 照号码,汽车“到达”或“离去”的时刻。 3)对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出车辆在停车场内或便道上的停车位置;若是车子离去,则输出车辆在停车场内停留的时间和缴纳的费用。(假设在便道等车的时间不收费) 4)选作内容:(1)便道也是要收费的,仅仅比狭道收费便宜点。

2、(2)狭道上的车可以直接开走。 2、 输入/输出的要求 首先选择操作的模块,根据提示输入车牌和到达时间,程序会告知是否停满或者停车车位。车牌为10个字符以内的字符串,时间的输入中间有冒号把时分隔开。3、 测试数据 1 苏D543 1:10 1 苏Q123 1:20 1 苏D145 1:30二、概要设计 1、本程序所用的抽象数据类型的定义 typedef struct NODECarNode *stackMAX+1; int top;SeqStackCar;/狭道的堆栈顺序存储typedef struct carCarNode *data; struct car *next;QueueNode;

3、/队列的链式存储typedef struct NodeQueueNode *head; QueueNode *rear;LinkQueueCar;/便道上等候的队列定义2、 主模块的流程及各子模块的主要功能 车辆到达:int Arrival(SeqStackCar *Enter,LinkQueueCar *W)首先定义一个栈和队列的结构体指针为:*p , *t 。然后申请一个车辆信息的内存空间,并把它赋给栈指针。 车辆到达时就输入车牌号,并通过if(Enter->top<MAX)来判断该车是进车场内还是进便道上,如果是进车场内就把top 加1,显示 在车场内的位置,还要输入进车场的

4、时间,然后把该节点进栈。如果是else 就显示该车要停在便道上,并进行进队列的操作。 车辆离开: void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) 定义一个整型变量room 记录要离开车辆的位置,定义两个栈指针和一个队列指针, 用个if(Enter->top>0) 确保栈不空,然后用个while(1) 确保输入的车辆离开位置的合法 性。如果不和法,显示输入有误,要重新输入。通过while(Enter->top>room) 判断离开车辆的位置,如果是中间位置,就要再用一个栈前面临时开出来的车,

5、等要开出的车开出后,再把临时栈的车看进 车场内,并要调用PRINT(p,room); 这个函数计算显示费用。然后还要用 if(W->head!=W->rear)&&Enter->top<MAX) 语句判断便道上有没有车,如果有车就要显示进车场的车的车牌号,并登记进入时间。开始初始化两个栈Enter和Temp及一个队列Wait。进入主菜单车到达车离开退出Room前车辆进临时栈对room计费便道车信息车场内信息判便道是否有车车场是否为空列表显示栈Enter元素出栈队列中元素进栈队列Wait中元素出队元素进栈Enter便道车进车场元素进队列Wait判断栈是否为

6、满结束退出列表显示是否否是否是3、 模块之间的层次关系 主函数中包含着各个函数模块,各模块也在互相调用。比如,离开函数中要计算停车费,故要调取价格函数。价格函数计算要用到离开和进入的时间,又要调用进入和离开函数。三、详细设计 1、采用C语言定义相关的数据类型#define MAX 3 / 停车场最大容量为3辆,便于观察#define price 0.05typedef struct time / 定义时间结构体int hour;int min;Time;typedef struct node / 定义车辆信息结构体char num10; Time reach; Time leave;CarNo

7、de;2、 写出各模块的伪码算法void PRINT(CarNode *p,int room) / 车辆收费int A1,A2,B1,B2;printf("n车辆离开的时间:"); scanf("%d:%d",&(p->leave.hour),&(p->leave.min); printf("n离开车辆的车牌号为:"); puts(p->num); printf("n其到达停车位时间); printf("n离开停车位时间为:); A1=p->reach.hour; A2=p-

8、>reach.min; B1=p->leave.hour; B2=p->leave.min; printf("n应交费用为: %2.1f元",(B1-A1)*60+(B2-A2)*price+PRINTE(p,room);free(p);int Arrival(SeqStackCar *Enter,LinkQueueCar *W)/进入便道或者狭道 CarNode *p; QueueNode *t; p=(CarNode *)malloc(sizeof(CarNode); flushall(); printf("n请输入车牌号(例:豫B1234)

9、:"); gets(p->num);if(Enter->top<MAX)Enter->top+; printf("n车辆在车场第%d位置.",Enter->top); printf("n车辆到达时间:"); scanf("%d:%d",&(p->reach.hour),&(p->reach.min); Enter->stacktop=p; return(1);else printf("n该车须在便道等待!有车位时进入车场"); t=(Queu

10、eNode *)malloc(sizeof(QueueNode); 进入队列,调整指针;printf("请输入进入便道的时间"); scanf("%d:%d",&(p->reach.hour),&(p->reach.min); return(1);void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) /车辆的离开int room; CarNode *p,*t; QueueNode *q;if(Enter->top>0) / 判断车场是否为空

11、 while(1) printf("n请输入车在车场的位置/1-%d/:",Enter->top); scanf("%d",&room); if(room>=1&&room<=Enter->top) break; else printf("n 输入有误,请重输: ");while(Enter->top>room) / 把要删除的车辆的前面的车开出来,进临时栈。Temp->top+; Temp->stackTemp->top=Enter->stackEn

12、ter->top; Enter->stackEnter->top=NULL; Enter->top-; p=Enter->stackEnter->top; /把要删除的车辆节点赋给p。 Enter->stackEnter->top=NULL; Enter->top-;while(Temp->top>=1) / 再把临时栈里德车辆进停车场Enter->top+; Enter->stackEnter->top=Temp->stackTemp->top; Temp->stackTemp->to

13、p=NULL; Temp->top-;PRINT(p,room); / 调用计费函数计费。if(W->head!=W->rear)&&Enter->top<MAX) /如果便道上有车,则再开进停车场。 q=W->head->next; t=q->data; Enter->top+; scanf("%d:%d",&(t->reach.hour),&(t->reach.min); / t->leave .hour =t->reach.hour; /t->leave

14、 .min =t->reach.min; W->head->next=q->next;if(q=W->rear) W->rear=W->head;Enter->stackEnter->top=t;PRINTE(t,room); free(q);else printf("n便道里没有车.n");else printf("n车场里没有车."); 3、画出函数的调用关系图 |->到达函数-| |->离开函数->停车费用主函数->显示车场里的情况 |->显示便道里的情况四、调试分

15、析 1、调试中遇到的问题及对问题的解决方法 因为时间结构体里的小时,分钟都是用的是整型,所以如果出现1:01这个时间的话,会导致显示列表是1:1;这样的话会造成人的误解,同时会导致程序对停车缴纳的费用计算错误。解决方法1:可以用数组和或者字符串来表示时间,但是问题来了,要是用字符串的话,算停车费有点问题,要废上一段时间的,会提高复杂度。解决方案2:将输出用右对齐方式,缺位的用0补齐,这样最快捷啦!2、 算法的时间复杂度和空间复杂度 由于没有进行循环嵌套之类的运算,只有简单的循环语句,所以时间复杂度T(O)=O(n),在数据的存储方面,除了车牌号用的是数组以外,便道用的是顺序栈,这些是提前要申请

16、一定的存储空间的,这样非动态分配的存储空间,在某些时候是会导致空间的浪费,增加其空间复杂度。其余的都是结构体和链式存储的队列属于动态存储。当停车场的规模较小时,空间复杂度较小,随着规模的增加,动态存储的扩充,空间复杂度也随之增加。5、 使用说明及测试结果(给出程序的使用说明、注意事项及不同情况的测试结果) 时间以24进制计算,停车时间不能跨越24进制。车牌号是10个字符串以内,不可溢出。第一个应缴费用是在便道中的费用,第二个费用是总费用。六、源程序(要求程序简洁、清晰、主要语句带注释)代码非本人写,对其进行改进而已#include<stdio.h>#include<stdli

17、b.h>#include<string.h>#define MAX 3 / 停车场最大容量为3辆,便于观察#define price 0.05#define pricee 0.02typedef struct time / 定义时间结构体int hour;int min;Time;typedef struct node / 定义车辆信息结构体char num10; Time reach; Time leave;CarNode;typedef struct NODECarNode *stackMAX+1; int top;SeqStackCar;typedef struct c

18、arCarNode *data; struct car *next;QueueNode;typedef struct NodeQueueNode *head; QueueNode *rear;LinkQueueCar;void InitStack(SeqStackCar *); int InitQueue(LinkQueueCar *);int Arrival(SeqStackCar *,LinkQueueCar *); void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *);void List(SeqStackCar,LinkQueueC

19、ar); void main()SeqStackCar Enter,Temp; LinkQueueCar Wait; int ch;system("color 4A"); InitStack(&Enter); InitStack(&Temp); InitQueue(&Wait); while(1) printf("n §§§§§§ 欢迎使用停车场系统.§§§§§§tnn"); printf("nt# 1

20、. 车辆到达登记.#tn"); printf("nt# 2. 车辆离开登记.#tn"); printf("nt# 3. 车辆列表显示.#tn"); printf("nt# 4. 退出系统. #tnn");while(1)printf(" 请选择: "); scanf("%d",&ch); if(ch>=1&&ch<=4)break; else printf("n 输入有误,请重新选择: 14: ");switch(ch) case

21、 1:Arrival(&Enter,&Wait);break; case 2:Leave(&Enter,&Temp,&Wait);break; case 3:List(Enter,Wait);break; case 4:exit(0); default: break;/ 自定义函数void InitStack(SeqStackCar *s) / 栈的初始化 int i; s->top=0; for(i=0;i<=MAX;i+) s->stacks->top=NULL;int InitQueue(LinkQueueCar *Q) /

22、 队列的初始化Q->head=(QueueNode *)malloc(sizeof(QueueNode);if(Q->head!=NULL)Q->head->next=NULL; Q->rear=Q->head; return(1); else return(-1);float PRINTE(CarNode *p,int room) / 车辆收费int A1,A2,B1,B2;printf("n车辆离开便道的时间:"); scanf("%d:%d",&(p->leave.hour),&(p->

23、;leave.min); printf("n离开车辆的车牌号为:"); puts(p->num); printf("n其到达便道时间为: %d:%d",p->reach.hour,p->reach.min); printf("n离开便道时间为: %d:%d",p->leave.hour,p->leave.min); A1=p->reach.hour; A2=p->reach.min; B1=p->leave.hour; B2=p->leave.min; printf("n

24、应交费用为: %2.1f元",(B1-A1)*60+(B2-A2)*pricee);return(B1-A1)*60+(B2-A2)*pricee); free(p);void PRINT(CarNode *p,int room) / 车辆收费int A1,A2,B1,B2;printf("n车辆离开的时间:"); scanf("%d:%d",&(p->leave.hour),&(p->leave.min); printf("n离开车辆的车牌号为:"); puts(p->num); prin

25、tf("n其到达停车位时间为: %d:%d",p->reach.hour,p->reach.min); printf("n离开停车位时间为: %d:%d",p->leave.hour,p->leave.min); A1=p->reach.hour; A2=p->reach.min; B1=p->leave.hour; B2=p->leave.min; printf("n应交费用为: %2.1f元",(B1-A1)*60+(B2-A2)*price+PRINTE(p,room); free

26、(p); / 车辆的到达登记int Arrival(SeqStackCar *Enter,LinkQueueCar *W) CarNode *p; QueueNode *t; p=(CarNode *)malloc(sizeof(CarNode); flushall(); printf("n请输入车牌号(例:豫B1234):"); gets(p->num);if(Enter->top<MAX)Enter->top+; printf("n车辆在车场第%d位置.",Enter->top); printf("n车辆到达时

27、间:"); scanf("%d:%d",&(p->reach.hour),&(p->reach.min); Enter->stackEnter->top=p; return(1);else printf("n该车须在便道等待!有车位时进入车场"); t=(QueueNode *)malloc(sizeof(QueueNode); t->data=p; t->next=NULL; W->rear->next=t; W->rear=t;printf("请输入进入便道的时

28、间"); scanf("%d:%d",&(p->reach.hour),&(p->reach.min); return(1);void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W) /车辆的离开int room; CarNode *p,*t; QueueNode *q;if(Enter->top>0) / 判断车场是否为空 while(1) printf("n请输入车在车场的位置/1-%d/:",Enter->top); sc

29、anf("%d",&room); if(room>=1&&room<=Enter->top) break; else printf("n 输入有误,请重输: ");while(Enter->top>room) / 把要删除的车辆的前面的车开出来,进临时栈。Temp->top+; Temp->stackTemp->top=Enter->stackEnter->top; Enter->stackEnter->top=NULL; Enter->top-; p=

30、Enter->stackEnter->top; /把要删除的车辆节点赋给p。 Enter->stackEnter->top=NULL; Enter->top-;while(Temp->top>=1) / 再把临时栈里德车辆进停车场Enter->top+; Enter->stackEnter->top=Temp->stackTemp->top; Temp->stackTemp->top=NULL; Temp->top-;PRINT(p,room); / 调用计费函数计费。if(W->head!=W-&

31、gt;rear)&&Enter->top<MAX) /如果便道上有车,则再开进停车场。 q=W->head->next; t=q->data; Enter->top+; printf("n便道的%s号车进入车场第%d位置.",t->num,Enter->top); printf("n请输入%s号车进入车场的时间:",t->num); scanf("%d:%d",&(t->reach.hour),&(t->reach.min); / t->leave .hour =t->reach.hour; /t->leave .min =t->reach.min; W->head->next=q->next;if(q=W->rear) W->rear=W->head;Enter->stackEnter->top=t;PRINTE(t,room); free(q);else printf("n便道里没有车.n");else printf("n车场里没有车.")

温馨提示

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

评论

0/150

提交评论