1、编制一程序模拟该停车场的管理。2 基本要求:要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场应交纳的费用和它在停车场内停留的时间。3 测试数据:汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。例如,(A,1,5)表示1号牌照车在5这个时刻到达,而(D,5,20)表示5号牌照车在20这个时刻离去。整个程序可以在输入信息为(E,0,0)时结束。二、概要设计1、设计思想此停车场管理系统是在一个狭长的通道上的,而且只有一个大门可以供车辆进出,并且要实现停车场内某辆车要离开时,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些
2、辆再依原来的次序进场的功能,就可以设计两个堆栈,其中一个堆栈用来模拟停车场,另一个堆栈用来模拟临时停车场,该临时停车场用来存放当有车辆离开时,原来停车场内为其让路的车辆。至于当停车场已满时,需要停放车辆的通道可以用一个链队列来实现。当停车场内开走一辆车时,通道上便有一辆车进入停车场,此时只需要改变通道上车辆结点的连接方式就可以了,使通道上第一辆车进入停车场这个堆栈,并且使通道上原来的第二辆车成为通道上的第一辆车,此时只需将模拟通道的链队列的头结点连到原来的第二辆车上就可以了。2、栈的抽象数据类型定义ADT Stack数据对象:D=ai|aiElemSet,i=1,2,.,n, n0数据关系:R
3、1=|ai-1,aiD,i=2,.,n约定an端为栈顶,a1端为栈底。基本操作:InitStack(&S)操作结果:构造一个空栈S。DestroyStack(&初始条件:栈S已存在。栈S被销毁。ClearStack(&将栈S清为空栈。StackEmpty(S)若栈S为空栈,则返回TRUE,否则FALSE。StackLength(s)初始条件:返回S的元素个数,既栈的长度。GetTop(S,&e)栈S已存在且非空。用e返回S的栈顶元素。Push(&S,e)插入元素e为新的栈顶元素。Pop(&S,&删除S的栈顶元素,并用e返回其值。StackTraverse(S,visit()从栈底到栈顶依次对S
4、的每个数据元素调用函数visit()。一旦visit()失败,则操作失效。ADT Stack3、队列的抽象数据类型定义ADT QueueD=ai|aiElemSet,i=1,2,.,n,n0|ai-1,aiD,i=2,.,n约定其中a1端为队列头,an为队列尾。InitQueue(&Q)构造一个空队列Q。DestroyQueue(&队列Q已存在。队列Q被销毁,不再存在。ClearQueue(&将Q清为空队列。QueueEmpty(Q)若Q为空队列,则返回TRUE,否则FALSE。QueueLength(Q)返回Q的元素个数,即队列的长度。GetHead(Q,&Q为非空队列。用e返回的队头元素。
5、EnQueue(&Q,e)插入元素e为Q的新的队尾元素。DeQueue(&Q,&删除Q的队头元素,并用e返回其值。QueueTraverse(Q,visit()Q已存在且非空。从队头到队尾,依次对Q的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。ADT Queue 4、出现的调用的函数为:void InitStack(SeqStackCar *s);int InitQueue(LinkQueueCar *Q);int Arrival(SeqStackCar *Enter,LinkQueueCar *W);void Leave(SeqStackCar *Enter,Se
6、qStackCar *Temp,LinkQueueCar *W);void PRINT(CarNode *p);void List(SeqStackCar S,LinkQueueCar W);void List1(SeqStackCar *S);void List2(LinkQueueCar *W);5、模块间关系三、详细设计1、结构的定义typedef struct node int num; int reachtime; int leavetime; CarNode; /*车辆信息结点*/ typedef struct NODE CarNode *stackMAX+1; int top;
7、SeqStackCar; /*模拟车站*/typedef struct car CarNode *data; struct car *next; QueueNode; typedef struct Node QueueNode *head; QueueNode *rear; LinkQueueCar; /*模拟通道*/2、主菜单void main()while(1)printf(nnttt1. 车辆到达 请选择 1);nnttt2. 车辆离开 请选择 2nnttt3. 车辆信息 请选择 3nnttt4. 退出程序 请选择 4nnttt现在请选择以上信息 : switch(ch)case 1:A
8、rrival(&Enter,&Wait); break; /*车辆到达*/case 2:Leave(&Temp,& /*车辆离开*/case 3:List(Enter,Wait); /*列表打印信息*/case 4:exit(0); /*退出主程序*/default: 3、车辆到达 车辆到达时首先判断车场内是否有车满,如果没有车满则车辆进入车场,如果车满则车辆进入便道。int Arrival(SeqStackCar *Enter,LinkQueueCar *W) /*车辆到达*/if(Enter-top0) /*有车*/while(Enter-room) /*车辆离开*/*判断通道上是否有车及
9、车站是否已满*/if(W-head!=W-rear)&Enter-MAX) /*便道的车辆进入车场*/elsennttt便道里没有车.nnnttt车场里没有车. /*没车*/5、列表信息 列表显示信息中共调用2个函数,一个函数用于判断车场里是否有车,如果有车则显示车辆信息,如果没有则显示车场里没有车;另一个函数用于判断便道里是否有车,如果有车则显示车辆信息,如果没有则显示便道里没有车。void List1(SeqStackCar *S) /*列表显示车场信息*/if(S-0) /*判断车站内是否有车*/nttt车场里没有车void List2(LinkQueueCar *W) /*列表显示便道
10、信息*/if(W-rear) /*判断通道上是否有车*/nttt便道里没有车.void List(SeqStackCar S,LinkQueueCar W)while(flag)nttt请选择 1|2|3:nnttt1.车场nnttt2.便道nnttt3.返回nntttswitch(tag)List1(&S);break; /*列表显示车场信息*/List2(&W); /*列表显示便道信息*/flag=0;四、调试分析(1) 调试过程中的主要问题由于此停车场管理系统是分模块设计的,而且在程序的实现过程中又使用了清屏函数,所以,运行时用户选择任务并且执行完任务后,又会回到供用户选择功能的主界面,因此整个程序从整体上来讲结构清晰,使用方便。本程序的调试运行,总体上情况良好,但中间也出现了一些小问题。其中比较有代表性的主要问题有:当停车场已经达到最大容量,但仍有车辆进入停车场的时候,运行界面上没有出现或者说出现了但又跳掉了“停车场已满,该车辆需在便道上等待!”的提示信息。我们经过反复商量讨论,并且在查阅了多种资料后,在那一个printf语句后加了一个getch(),此时,程序运行结果就符合要求了。五、测试结果
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1