1、若输入(W,0,0),会显示便道上的车数;若输入(E,0,0),程序会跳出循环,同时程序结束;若输入为其他字母,程序会显示“ERROR!”报错。若便道上没有车辆停靠,会显示便道为空的信息:用户每输入一组数据,程序就会根据相应输入给出输出。输入值第一个必须为字母,后两个为数字。3.测试数据要求:用户输入字母时,输入大写或小写,都可以被该程序识别,正常运行。但要求用户输入数据时,三个数据项之间必须用逗号相分隔开。三概要设计 为了实现上述功能,该程序以栈模拟停车场以及临时停放为给要离去的汽车让路而从停车场退出来的汽车的场地,以队列模拟车场外的便道,因此需要栈和队列这两个抽象数据类型。1.栈抽象数据类
2、型定义:ADT SqStack 数据对象:D=, i=1,2,3.,n,n 数据关系:R=()|D, struct car; 基本操作: Judge_Output(s,q,r);列抽象数据类型定义:ADT LinkQueueQnode *,Qnode *, ,i=1,2,3.,n,n; 数据关系:R=;要算法流程图:Judge_Output算法流程图:A_cars算法流程图:D_cars算法流程图:4.本程序保护模块:主函数模块栈单元模块:实现栈的抽象数据类型队列单元模块:实现队列的抽象数据类型调用关系:四详细设计1.相关头文件库的调用说明:#include #define MAXSIZE 1
3、4#define n 2#define fee 102.元素类型、结点类型和结点指针类型:struct car char bb; int num; int time; ;struct rangweicarint num;typedef struct stackkstruct rangweicar HMAXSIZE; int topp;SqStackk;#define QNODE struct QnodeQNODE int data; QNODE *next; ;3.栈类型和队列类型:typedef struct stack struct car Gn; int top; SqStack;typ
4、edef struct linkqueue QNODE *front,*rear; int geshu;LinkQueue;b=E|(*r).bb=e) printf(STOP!n); else if(*r).bb=Ppprintf(The number of parking cars is %dn,(s-top)+1);else if(*r).bb=WwThe number of waiting cars is %dn,q-geshu);AaA_cars(s,q,*r);DdD_cars(s,q,*r);elseA_cars(SqStack *s,LinkQueue *q,struct ca
5、r a)QNODE *t;if(s-top!=n-1) (s-top)+; (s-Gs-top).bb=;(s-top).num=;top).time=;printf(The parking place is full! t=(QNODE *)malloc(sizeof(QNODE); t-data=;next=NULL; q-rear-next=t;rear=t;the number of the car in the access road is:%dndata);geshu+;int D_cars(SqStack *s,LinkQueue *q,struct car d)int i,j,
6、l;float x,y;QNODE *p;SqStackk *k;if=(s-top).num)x=(s-top).time;y=fee*x;The time is %.2f hours,the fee is %.2f yuann,x,y); if(q-geshu=0) printf(The queue is empty! return 0; else p=q-front-next;next=p-top).num=p-data; free(p);geshu-; if(q-next=NULL)rear=q-front; return 1; for(i=0;iGi).num!= continue;
7、 else break; if(i=(s-top)! return -1; x=(s-Gi).time; y=fee*x; k=(SqStackk *)malloc(sizeof(SqStackk); k-topp=-1; for(j=(s-ji;j-) k-topp+; (k-Hk-topp).num=(s-Gj).num;topp).time=(s-Gj).time; s-top-; for(l=0;ltopp);l+)the information(number and time) in the new stack is:%d,%dn,(k-Hl).num,(k-Hl).time); w
8、hile(k-topp=0) s-top+;top).bb=;top).num=(k-topp).num;top).time=(k-topp).time;topp-;The access road is empty! return 2; p=q- return 3;4.主函数的伪码:main() SqStack *s; LinkQueue *q; QNODE *p; struct car aaMAXSIZE; int i; s=(SqStack *)malloc(sizeof(SqStack);top=-1; q=(LinkQueue *)malloc(sizeof(LinkQueue); p
9、=(QNODE *)malloc(sizeof(QNODE); p-front=q-rear=p;geshu=0;*n* *n* 停车场管理系统 *n for(i=0;MAXSIZE;Please input the state,number and time of the car: scanf(%c,%d,%d,&(aai.bb),&(aai.num),&(aai.time); getchar(); Judge_Output(s,q,&aai); if(aai.bb=|aai.bb=) break;5.函数调用关系:五测试分析:1.出现问题及解决办法:该程序是四个程序调试中最顺利的一个,只在
10、一个地方上出了问题,就是输入字符时由于回车键也是字符,回车键总会被读入,导致经常输出“ERROR!”。后来找到原因后在scanf函数后紧接着加了一个getchar();语句后就恢复了正常。2.方法优缺点分析:优点:用栈和队列来模拟停车场让整个问题显得简单,易于实现;缺点:栈和队列这两个数学模型用在停车场管理上还是有失妥当的,现实中停车场出口入口不可能为同一处,不可能当一辆车要离开,在它后面进来的车必须为它让路,因此无法用栈的“后进先出”原则来模拟;而且没有考虑便道上的车在等待过程中可以中途开走等情况,而这些都无法用队列的“先进先出”原则来模拟。3.主要算法的时间和空间复杂度分析:(1)由于算法
11、Judge_Output函数根据判断条件,每次只选择一个程序段执行,所以其时间复杂度是O(1);(2)由于算法A_cars函数根据判断条件,将数据入栈或入队列,所以其时间复杂度也是O(1);(3)由于算法D_cars函数在出栈数据不在最顶端时需将n个数据先出该栈,再入新栈,再回旧栈的操作,故其时间复杂度是O(n);(4)所有算法的空间复杂度都是O(1)。六使用说明程序运行后用户根据提示一次输入车辆的状态信息,车牌编号,时间,程序会根据车辆的状态信息调用相应的函数,并输出用户想得到的信息。七调试结果输入数据:(A,1,5),(A,2,10),(D,1,15),(A,3, 20),(A,4,25)
12、,(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),程序结束。运行结果截屏:八附录源程序文件清单: /*调用的头文件库声明*/ struct car /*用该结构
13、体来存放车的状态,编号和时间信息 */typedef struct stack /*用该栈来模拟停车场*/struct rangweicar /*用该结构体来存放临时让出的车辆的编号以及时间信息*/typedef struct stack /*用该栈来模拟临时让出的车辆的停靠场地*/ /*链队结点的类型*/ QNODE *next;typedef struct linkqueue /*用该链队来模拟便道*/ LinkQueue;void Judge_Output(SqStack *s,LinkQueue *q,struct car *r) /*该算法通过传递来的车辆信息调 用相关函数实现操作*
14、/ if(*r).bb=) /*若车辆状态为E,终止程序*/) /*若车辆状态为P,输出停车场车辆数*/) /*若车辆状态为W,输出便道车辆数*/) /*若车辆状态为A,调用A_cars函数*/ A_cars(s,q,*r);) /*若车辆状态为D,调用D_cars函数*/ D_cars(s,q,*r); /*若车辆状态为其他字母,报错*/A_cars(SqStack *s,LinkQueue *q,struct car a) /*该算法实现对车辆状态为到达的车辆的操 作*/ if(s-=n-1) /*若停车场还没有满,则车进停车场,并存入车辆的状态,车牌编 号和到达时间信息*/ /*若停车场
15、已满,车进便道,并显示该车的车牌编 号,同时记录便道车辆数目*/int D_cars(SqStack *s,LinkQueue *q,struct car d) /*该算法实现车辆状态为离开的车 辆的操作*/ float x,y; SqStackk *k; if=(s-top).num) /*若待离开车为最后进停车场的车的情况*/ x=(s- /*直接计算停车时间,费用并离去*/geshu=0) /*若便道上无车,函数返回*/ Else /*若便道上有车,第一辆车进停车场*/ /*并存入其车牌编号及进停车场的时间*/next=NULL) /*若此时便道上无车,返回1*/ Else /*待离开的车不是最后进停车场的那辆车的情况*/i+) /*先找到待离开车在停车场中的位置*/ /*计算待离开车的停车时间并计算费用*/ /*设立一个新栈临时停放为该车离开而让 路的车辆*/ /*显示在新栈中的车辆信息*/=0) /*将新栈中的车重新开入停车场中*/geshu=0) /*若便道上无车,则返回2,无车开入停车场中*/ Else /*若便道上有车,则第一辆车开入停车场中*/next=
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1