1、实习报告题目:停车场管理 姓名:袁韬博 学号:16030120021 完成日期:2017.10.23一、 需求分析1. 本题目要求建立一个可指定长度的栈,和长度可变化的队列,以当作停车场和便道的车的存放。2. 本题目要求在停车场的车离开时,便道的车按照先后顺序进入一辆,并开始于此时记录时间。3. 在本题目之中在便道的停车不计费用,在此题中应判断在停车场还是在便道的信息。4. 本题目要求根据数据的第一位数据判断进入还是离开,根据要求输出信息。5. 程序执行命令为:1.存入车辆时输出停车信息2.车辆离开时输出停车时间和应缴纳费用 3.输入E时表示结束。6. 测试数据:n=2,m(每小时停车费用)=
2、3,(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表示为Arrival(到达),D表示为Departure(离开),E表示为End(结束)。二、 概要设计1. 设定栈的抽象数据类型定义数据对象 :D=ai|aiSStop,i=1,2,3,n数据关系 :R=|aiD, i=1,2,3,n 基本操作:initStack(&S,d)操作结果:建立一个长度为d的空栈Push(&S, &e, &d)初始条件:栈已存在,长度为d操作结果:如栈已满返回false,否则将e,压入栈中,返回truePop(&S,
3、 e)初始条件:栈已存在操作结果:如栈为空返回false,否则弹栈入e,返回true2. 设定队列的抽象数据类型定义数据对象 :D=ai|aiSStop,i=1,2,3,n数据关系 :R=|aiD, i=1,2,3,n *SQTypeInit()操作结果:建立一个空队列InSQType(*q, &data)初始条件:队列已存在操作结果:将data压入队列之中*OutSQType( *q)初始条件:队列已存在操作结果:弹出队列,返回其指针。3. 程序包含6个模块1) 主程序模块:包含栈与队列的对象建立,输入值的判断以及函数的实现 2) 栈模块:实现停车场抽象数据类型3) 队列模块:实现便道抽象数
4、据类型4) 函数模块:实现数据的输入,进入和离开的弹栈与压栈及输出操作三、 详细设计#include#include#include using namespace std;typedef struct /定义车辆的结构体char a; /进入与离开信息int b; /车牌号int c; /进入或离开时间int d; /在停车场或便道的序号int e; /在停车场为1,在便道为0SStop;typedef struct /定义栈结构体SStop *base; /定义栈底指针SStop *top; /定义栈顶指针SStop a; /定义栈元素Stop; struct SQType /定义队列结构
5、体 SStop data100; /分配队列neicun int head; /定义队列头 int tail; /定义队列尾;SQType *SQTypeInit()/建立空队列 SQType * q; /定义队列指针 if(q=new SQType) /建立队列 q-head=0; /将队列的头的定为0 q-tail=0; /将队列的尾的定为0 return q; /返回队列指针 else return NULL; /建立不成功返回NULL int InSQType(SQType *q,SStop &data)/入队列操作 if(q-tail=100) /如果队列满返回队列已满!操作失败!
6、cout队列已满!操作失败!head+q-tail; q-dataq-tail+=data; return 1; SStop *OutSQType(SQType *q)/出队列操作 if(q-tail=q-head) /如果队列为空返回NULL return NULL; else /如果队列不为空出队列并返回此数据指针 return &(q-dataq-head+); bool initStack(Stop &S,int d) /建立空栈S.base=(SStop*)malloc(d*sizeof(SStop); /分配长达d的内存if(!S.base)return false; /分配不成功
7、返回falseS.top=S.base; /是栈顶指针等于栈底指针return true; /建立成功返回turebool Push(Stop &S,SStop &e,int &d) /压栈操作if(S.top-S.base=d)return false; /如果栈满返回falseif(S.top=S.base)e.d=1; /如果栈为空将e的停车位置设为1else e.d=1+S.top-S.base; /设置e的停车位置*S.top+=e; /将e压入栈中return true; /返回truebool Pop(Stop &S,SStop &e) /弹栈操作if(S.top=S.base)
8、return false; /如果栈为空返回falsee=*-S.top; /弹栈并将其值赋给ereturn true; /返回trueint Scanf(SStop &e) /输入数据操作cine.a; /输入操作cine.b; /输入车牌号cine.c; /输入进入或离开时间e.d=0; return 0;int Arrival(Stop &stop,SQType *wait,SStop &e,int &n,SStop a,int &y)/进入操作if(Push(stop,e,n) /如果栈不满将e压入栈e.e=1; /将判断数据设置为1ay=e;y+; /将数据存入数组coute.b车停
9、在停车场的e.d位置endl ;/打印停车位置else /如果栈满将e入队列 InSQType(wait,e);e.e=0; /将判断数据数值为0ay=e;y+; /将数据存入数组coute.b车停在便道的e.d位置endl; /打印停车位置int Departure(Stop &stop,SStop a,Stop &wait1,SQType *wait,SStop &e,int &n,int &y,int &rt)/离开操作int o=0;SStop *q,u,mn,*kl;for(int i=0;iy;i+) /应用循环判断停车时间if(e.b=ai.b)e.e=ai.e;e.d=ai.d
10、;o=e.c-ai.c; int ui=0;if(e.e=0)cout该车在停车场停车时间为:0 费用为0head1) /将e之前的数据出队列再入队列kl=OutSQType(wait);InSQType(wait,*kl);if(wait!=NULL)OutSQType(wait); /将e出队列while(wait-tail-e.d-wait-head1&wait!=NULL)/ 将e之后的数据出队列再入队列mn=*OutSQType(wait);InSQType(wait,mn);if(e.e=1)cout该车在停车场停车时间为:o 费用为:o*rtendl; /如果在停车场之中,计算费
11、用并输出while(uin-e.d) /将e之后的数据出栈Pop(stop,u);Push(wait1,u,n);ui+;Pop(stop,mn); /将e出栈while(wait1.top!=wait1.base)/将先前出栈数据压入栈中Pop(wait1,u);Push(stop,u,n);q=OutSQType(wait); /从队列中出一个数据if(q!=NULL) Push(stop,*q,n); /将q压入栈中for(int i=0;ib=ai.b)ai.e=1; /用循环将q的判断数据设置为1ai.c=e.c; /用循环将q的如停车场时间设为e离开时间return 0;int m
12、ain() /主函数模块SStop as100; /定义一个数组存储车辆信息Stop stop,wait1; /定义两个栈SQType *wait; /定义队列int n,m,y=0;coutn;coutm;initStack(stop,n); /建立空栈stopinitStack(wait1,n); /建立空栈wait1wait=SQTypeInit(); /建立空队列waitSStop a; loop:cout请输入数据:; Scanf(a); /应用函数输入数据if(a.a=A) /如果为进入执行进入操作Arrival(stop,wait,a,n,as,y);if(a.a=D) /如果为
13、离开执行离开操作Departure(stop,as,wait1,wait,a,n,y,m);if(a.a!=E)goto loop; cout结束endl; /如果为E结束return 0;四、 调试分析1. 在此程序之中,一开始在栈与队列的建立是出现指针的错乱,检查后更改。2. 在一开始未曾考虑过对车辆的停车位置的判断,在发现问题后将判断数据加上。3. 在编写时为曾判断从何处出车,造成费用的计算混乱。4. 在车队列的操作中未曾判断出队列指针是否为NULL,调试后改正。5. 出队列的while循环操作的判断依据搞错致使陷入死循环,调试后改正。五、 用户手册1. 本程序在DOS命令界面下执行stop_port.exe2. 按照提示语输入数据3. 程序界面如下六、 测试结果输入:n=2输入:m=3输入:A 1 5 输出:1车停在停车场1位置输入:A 2 10 输出:2车停在停车场 2位置输入:D 1 15 输出:该车在停车场停车时间为:10 费用为:30输入:A 3 20 输出:3车停在停车场 3位置输入:A 4 25 输出:4车停在便道1位置输入:A 5 30 输出:5车停在便道2位置输入:D 2 35 输出:该车在停车场停车时间为:25 费用为:75输入:D 4 40 输出:该车在停车场停车时间为:5 费用为:15输入:E 0 0 输出:结束