停车场管理系统及课程设计报告_第1页
停车场管理系统及课程设计报告_第2页
停车场管理系统及课程设计报告_第3页
停车场管理系统及课程设计报告_第4页
停车场管理系统及课程设计报告_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

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

文档简介

1、 课程设计课 程: 题 目: 停车场管理系统 专 业: 班 级: 姓 名: 2010 年 9 月 6 日 数据结构课程设计停车场管理系统课程设计目的通过课程设计,加深对数据结构这一课程所学内容的进一步理解与巩固。通过课程设计,加深对结构化设计思想的理解,能对系统功能进行分析,并设计合理的模块化结构。通过课程设计,提高程序开发功能,能运用合理的控制流程编写清晰高效的程序。通过课程设计,训练C程序调试能力,能将一个中小型各级组织系统联调通过。通过课程设计,开发一个中小型系统,掌握系统研发全过程。通话课程设计,培养分析问题、解决实际问题的能力。二、课程设计内容问题描述:设有一个可以停放n辆汽车的狭长

2、停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排以便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场时,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。基本要求:要求程序输出每辆车

3、到达后的停车位置(停车场或便道上),以及某辆车离开停车场应交纳的费用和它在停车场内停留的时间。实现提示:汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。例如,(A,1,5)表示1号牌照车在5这个时刻到达,而(D,5,20)表示5号牌照车在20这个时刻离去。整个程序可以在输入信息为(E,0,0)时结束。本题可用栈和队列来实现。三、概要设计1、设计思想此停车场管理系统是在一个狭长的通道上的,而且只有一个大门可以供车辆进出,并且要实现停车场内某辆车要离开时,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场的功能,就可以设计两个

4、堆栈,其中一个堆栈用来模拟停车场,另一个堆栈用来模拟临时停车场,该临时停车场用来存放当有车辆离开时,原来停车场内为其让路的车辆。至于当停车场已满时,需要停放车辆的通道可以用一个链队列来实现。当停车场内开走一辆车时,通道上便有一辆车进入停车场,此时只需要改变通道上车辆结点的连接方式就可以了,使通道上第一辆车进入停车场这个堆栈,并且使通道上原来的第二辆车成为通道上的第一辆车,此时只需将模拟通道的链队列的头结点连到原来的第二辆车上就可以了。2、实现方法对于此停车场管理系统的实现,就是用两个堆栈来分别模拟停车场以及停车场内车辆为其它车辆让路时退出停车的临时停放地点。至于通道上车辆的停放则用一个链队列来

5、实现,此时,通道上车辆的离开或者进入停车场只需改变此链队列上的结点而已。对于要对停车场内的车辆根据其停放时间收取相应的停车费用,可以记录下车辆进入以及离开停车场的时间,再用时间差乘以相应的单价并且打印出最后的费用就可以实现了。3、主要模块此停车场管理系统,主要分为以下若干模块:首先定义用来模拟停车场的堆栈以及用来模拟通道的链队列为全局变量,然后编写主函数,在此主函数中实现对其它各个模块的调用。在主函数中首先调用option()函数,出现欢迎用户使用的主界面,然后提示用户进入此停车场管理系统后,再出现一个供用户选择的界面,在用户的选择过程中,程序又分别调用车辆的到达、车辆的离开、停车场内停放车辆

6、的信息以及退出程序这四个函数模块。其中,在车辆的离开那个模块函数中又调用了打印离开车辆信息的函数,在停车场内停放车辆信息的那个模块函数中,又分别调用了显示停车场上车辆信息的函数以及显示便道上车辆信息的函数。最后,从调鼐的这四个函数中回到主函数结束整个程序的运行。在以上各个模块中,出现的调用的函数为:void InitStack(SeqStackCar *s);int InitQueue(LinkQueueCar *Q);option();int Arrival(SeqStackCar *Enter,LinkQueueCar *W);void Leave(SeqStackCar *Enter,S

7、eqStackCar *Temp,LinkQueueCar *W);void PRINT(CarNode *p);void List(SeqStackCar S,LinkQueueCar W);void List1(SeqStackCar *S);void List2(LinkQueueCar *W);4、模块间关系开始初始化两个栈Enter和Temp及一个队列Wait。进入主菜单车到达车离开退出Room前车辆进临时栈对room计费便道车信息车场内信息判便道是否有车车场是否为空列表显示栈Enter元素出栈队列中元素进栈队列Wait中元素出队元素进栈Enter便道车进车场元素进队列Wait判断栈

8、是否为满结束退出列表显示是否否是否是四、调试分析(1) 调试过程中的主要问题由于此停车场管理系统是分模块设计的,而且在程序的实现过程中又使用了清屏函数,所以,运行时用户选择任务并且执行完任务后,又会回到供用户选择功能的主界面,因此整个程序从整体上来讲结构清晰,使用方便。本程序的调试运行,总体上情况良好,但中间也出现了一些小问题。其中比较有代表性的主要问题有:当停车场已经达到最大容量,但仍有车辆进入停车场的时候,运行界面上没有出现或者说出现了但又跳掉了“停车场已满,该车辆需在便道上等待!”的提示信息。我们小组成员经过反复商量讨论,并且在查阅了多种资料后,在那一个printf语句后加了一个getc

9、h(),此时,程序运行结果就符合要求了。本程序中我使用的是VC6+进行的编译和运行!(2) 测试结果的分析与讨论欢迎界面车辆到达车辆离开车辆信息(车场)车辆信息(便道)五、用户手册这个程序用来实现对停车场内车辆的管理,整个操作界面为中文,更加符合人性化的标准,使得用户使用方便,而且每一个操作都有提示,使得初次接触该程序的用户也能很快适应程序的操作。这个程序操作简单,对于车牌号,只需输入车牌号上的数字就行,而且对于进出停车场的时间,也简化了操作,只需输入当时的时刻就行,没有具体到小时和分钟,但也许这也是该程序不足之处所在。而且该程序也给用户提供了选择的机会,当点击运行该程序后,如果想退出程序,可

10、以输入n或N退出该运行程序。至于使用过程中的更具体的问题,可以参照该报告书中调试分析那一项的屏幕截图,整个程序的运行界面大致就如上述屏幕截图的内容。六、附录1、源程序代码#include #include#include#define MAX 2 /*车库容量*/ #define price 3 /*每车每时刻费用*/typedef struct node int num; int reachtime; int leavetime; CarNode; /*车辆信息结点*/ typedef struct NODE CarNode *stackMAX+1; int top; SeqStackCar

11、; /*模拟车站*/typedef struct car CarNode *data; struct car *next; QueueNode; typedef struct Node QueueNode *head; QueueNode *rear; LinkQueueCar; /*模拟通道*/*-*/ /*函数声明部分*/ void InitStack(SeqStackCar *); /*初始化栈*/ int InitQueue(LinkQueueCar *); /*初始化便道*/ int Arrival(SeqStackCar *,LinkQueueCar *); /*车辆到达*/ vo

12、id Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); /*车辆离开*/ void List(SeqStackCar,LinkQueueCar); /*显示存车信息*/ void PRINT(CarNode *p) ;/*-*/ void option() int i; char choice; gotoxy(0,0); for(i=1;i=1&chtop=0; for(i=0;istacks-top=NULL; int InitQueue(LinkQueueCar *Q) /*初始化便道*/ Q-head=(QueueNode *)mall

13、oc(sizeof(QueueNode); if(Q-head!=NULL) Q-head-next=NULL; Q-rear=Q-head; return(1); else return(-1); void PRINT(CarNode *p) /*打印出站车的信息*/ int A1,A2; printf(nttt请输入离开时间: ); scanf(%d,&(p-leavetime); printf(nttt离开车辆的车牌号: %d,p-num); printf(nnttt离开车辆到达时间: %d ,p-reachtime); printf(nnttt离开车辆离开时间: %d,p-leavet

14、ime); A1=p-reachtime; A2=p-leavetime; printf(nnttt停车场管理费用: %d,(A2-A1)*price); free(p); int Arrival(SeqStackCar *Enter,LinkQueueCar *W) /*车辆到达*/ CarNode *p; QueueNode *t; p=(CarNode *)malloc(sizeof(CarNode); flushall(); printf(ttt请输入到达车辆车牌号: ); scanf(%d,&(p-num); if(Enter-toptop+; printf(nttt该车辆在停车场的

15、位置是: %dn,Enter-top); printf(nttt请输入该车辆到达的时间: ); scanf(%d,&(p-reachtime); Enter-stackEnter-top=p; return(1); else /*车场已满,车进便道*/ printf(nttt停车场已满 该车辆需在便道上等待!); getch(); t=(QueueNode *)malloc(sizeof(QueueNode); t-data=p; t-next=NULL; W-rear-next=t; W-rear=t; return(1); void Leave(SeqStackCar *Enter,Seq

16、StackCar *Temp,LinkQueueCar *W) /*车辆离开*/ int i, room; CarNode *p,*t; QueueNode *q; /*判断车场内是否有车*/ if(Enter-top0) /*有车*/ while(1) /*输入离开车辆的信息*/ printf(ttt停车场里停放的车辆总数: %d,Enter-top); printf(nnttt请输入要离开车辆的位置: ); scanf(%d,&room); if(room=1&roomtop) break; while(Enter-toproom) /*车辆离开*/ Temp-top+; Temp-sta

17、ckTemp-top=Enter-stackEnter-top; Enter-stackEnter-top=NULL; Enter-top-; p=Enter-stackEnter-top; 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);/*判断通道上是否有车及车站是否已满*/ if(W-head!=W-rear)&Enter-top

18、head-next; t=q-data; Enter-top+; printf(nnttt便道的%d号车进入车场第%d位置.,t-num,Enter-top); printf(nnttt请输入现在的时间:); scanf(%d,&(t-reachtime); W-head-next=q-next; if(q=W-rear) W-rear=W-head; Enter-stackEnter-top=t; free(q); else printf(nnttt便道里没有车.n); else printf(nnttt车场里没有车.); /*没车*/ void List1(SeqStackCar *S)

19、/*列表显示车场信息*/ int i; if(S-top0) /*判断车站内是否有车*/ printf(nttt车场:); printf(nnttt位置 到达时间 车牌号n); for(i=1;itop;i+) printf(%26d,i); printf(%6d,S-stacki-reachtime); printf(%10d,S-stacki-num); printf(n); else printf(nttt车场里没有车); void List2(LinkQueueCar *W) /*列表显示便道信息*/ QueueNode *p; p=W-head-next; if(W-head!=W-

20、rear) /*判断通道上是否有车*/ printf(nttt等待车辆的号码为: ); while(p!=NULL) printf(%-10d,p-data-num); p=p-next; printf(n); else printf(nttt便道里没有车.); void List(SeqStackCar S,LinkQueueCar W) int flag,tag; flag=1; while(flag) printf(nttt请选择 1|2|3:); printf(nnttt1.车场nnttt2.便道nnttt3.返回nnttt); while(1) scanf(%d,&tag); if(

21、tag=1|tag=3) break; else printf(nttt请选择 1|2|3:); switch(tag) case 1:List1(&S);break; /*列表显示车场信息*/ case 2:List2(&W);break; /*列表显示便道信息*/ case 3:flag=0;break; default: break; 2、设计体会通过这一周的课程设计,加深了我对数据结构这门课程所学内容的进一步的理解与掌握;同时,通过对停车场管理系统的开发,使得我将计算机课程所学知识与实际问题很好地相联接在了一起。在这次课程设计中,不仅培养了我开发一个中小型程序的能力,而且也培养了我的团

22、队合作能力。在这次对停车场管理系统的开发过程中,我们小组成员互相合作,互相帮助,其中有程序功能成功实现时的欣喜,也有遇到问题、解决问题时的执着以及迷茫。在这次课程设计中,使得我很好地了解了在开发程序过程中合作的重要性。在这周课程设计中,我们小组所开发的停车场管理系统,基本上可以完成每一项功能。汽车进入停车场的信息、离开停车场的信息以及通道上的信息都可以在程序上一一实现。但是,该程序也有不足的地方。主要表现在车辆的车牌号上,现实中的车牌号是一串字符,可是,在这个程序中,为了简便起见,我们就车牌号定义为了整型,这个与现实是有些不符的。还有一个可以改进的地方就是记录车辆进入停车场以及离开停车场的时间

23、,应该精确到小时以及分钟的,可是在程序中,为了简便起见,我们只是设置成了一个时刻,所以,在这方面还是有待改进的。改进的程序中,还应该增加时间的判断功能,即停车场内有可能有车辆停放的时间超过一天。还有一个很重要的问题,对于停车场内可以停放的最多车辆数,为了测试数据的方便,我在程序中,定为了2,在实际使用中,可以改变程度开头的宏定义以增加停车场的容量。总之,在这周的课程设计中,我以及我们这组的收获还是挺大的,不仅对于专业课有了更好的认识,而且在合作的过程中更加了解了团队精神的重要性。主要参考资料谭浩强. C语言程序设计(第三版). 北京:清华大学出版社,2005廖雷、罗代忠. C语言程序设计基础实

24、验教程. 北京:高等教育出版社,2005谭浩强. C程序设计解题与上机指导(第三版) . 北京:清华大学出版社,2005廖雷等. C语言程序设计基础. 北京:高等教育出版社,2004谭浩强,张基温,唐永炎. C语言程序设计教程. 北京: 高等教育出版社,2003可供选择源程序代码:一:/*停车场管理器*/#include #include #include#include /*/#define MAXSTACKSIZE 2 /*车库容量*/#define price 0.1 /*每车每分钟费用*/typedef struct time int hour;int min;Time; /*时间结点

25、*/ typedef struct char num10;Time reach; Time leave; CarNode; /*车辆信息结点*/typedef struct CarNode *base;CarNode *top;int stacksize;SqStackCar; /*模拟车站*/typedef struct car CarNode *data;struct car *next; QueueNode;typedef struct QueueNode *front;QueueNode *rear; LinkQueueCar; /*模拟通道*/ int QueueEmpty(Link

26、QueueCar Q) /*便道判空函数*/ if(Q.front=Q.rear) return 1; else return 0;/*/void InitStack(SqStackCar *s) /*初始化栈*/ s-base=(CarNode *)malloc(MAXSTACKSIZE*sizeof(CarNode); if(!s-base) exit(0);/*分配失败*/ s-top=s-base; s-stacksize=MAXSTACKSIZE;int Push(SqStackCar *s,CarNode *e) /*进站函数*/ if(s-top-s-base=s-stacksi

27、ze) return 0; else *s-top+=*e; return 1;int Pop(SqStackCar *s,CarNode *e) /*出站函数*/ if(s-top=s-base) return 0; *e=*-s-top; return 1;int StackEmpty(SqStackCar s) /*判空函数*/ if(s.base=s.top) return 1; else return 0;int InitQueue(LinkQueueCar *Q) /*初始化便道*/ Q-front=Q-rear=(QueueNode *)malloc(sizeof(QueueNo

28、de); if(!Q-front) exit(0); Q-front-next=NULL; return 1; /*/int EnQueue(LinkQueueCar *Q,CarNode *e) /*便道插入函数*/ QueueNode *p; p=(QueueNode *)malloc(sizeof(QueueNode); if(!p) exit(0); p-data=e; p-next=NULL; Q-rear-next=p; Q-rear=p; return 1;int DeQueue(LinkQueueCar *Q,CarNode *e) /*便道删除函数*/ QueueNode *

29、p; if(Q-front=Q-rear) return 0; p=Q-front-next; e=p-data; Q-front-next=p-next; if(Q-rear=p) Q-rear=Q-front; free(p); return 1;/*/int Arrive(SqStackCar *In,LinkQueueCar *Wait) /*车辆到达函数*/ CarNode *i; QueueNode *w; i=(CarNode *)malloc(sizeof(CarNode); flushall(); printf(Input the car number:); gets(i-n

30、um); if(In-top-In-basereach.hour,&i-reach.min); Push(In,i); printf(nCar in success!); sleep(1); return 1; else /*停车场已满,车进便道*/ w=(QueueNode *)malloc(sizeof(QueueNode); w-data=i; w-next=NULL; Wait-rear-next=w; Wait-rear=w; printf(The PART is full,car must wait in the road!); sleep(1); return 1; return

31、 0;/*/int Departure(SqStackCar *In,SqStackCar *temp,LinkQueueCar *Wait) /*车辆离开函数*/ int flag=0,a1,a2,b1,b2, money; CarNode *p,*t; QueueNode *q; p=(CarNode *)malloc(sizeof(CarNode); flushall(); printf(Input the out car number: ); gets(p-num); while(!StackEmpty(*In) t=(CarNode *)malloc(sizeof(CarNode);

32、 Pop(In,t); if(strcmp(p-num,t-num)=0) /*比较车场中有无这辆车,有即出站*/ printf(Input the time the car out(00:00):); scanf(%d:%d,&p-leave.hour,&p-leave.min); printf(The ); printf(%s,p-num); printf( Car out the part!); a1= p-leave.hour; a2= t-reach.hour; b1= p-leave.min; b2= t-reach.min; money = (a1-a2+24)%24*60+(b

33、1-b2+60)%60)*price; /*计算车辆需要的费用*/ printf(nThe time the car arrive: %d:%d,t-reach.hour,t-reach.min); printf(nThe time the car leave: %d:%d,p-leave.hour,p-leave.min); printf(nNeed: %d yuan,money); flag=1; getch(); free(t); break; else Push(temp,t); /*while*/ if(!flag) printf(No this car!); getch(); wh

34、ile(!StackEmpty(*temp) Pop(temp,p); Push(In,p); free(p); if(flag&Wait-front!=Wait-rear) /*车站中有空位,便道有车,车入站*/ q=(QueueNode *)malloc(sizeof(QueueNode); q=Wait-front-next; t=q-data; if(q!=NULL) Push(In,t); printf(nThe ); printf(%s,t-num); printf( car in part!); printf(nInput the time the car arrive(00:0

35、0): ); scanf(%d:%d,&t-reach.hour,&t-leave.min); Wait-front-next=q-next; if(q=Wait-rear) Wait-rear=Wait-front; free(q); return 1;/*/void Print(SqStackCar *In,SqStackCar *Temp,LinkQueueCar *Wait) /*打印函数*/ int c=0; int count=1; CarNode *p,*t; QueueNode *q; q=(QueueNode *)malloc(sizeof(QueueNode); p=(Ca

36、rNode *)malloc(sizeof(CarNode); t=(CarNode *)malloc(sizeof(CarNode); while(1&c!=3) clrscr(); gotoxy(1,10); printf(1. Print the road!); gotoxy(1,11); printf(2. Print the part!); gotoxy(1,12); printf(3. return.); do printf(nInput your choice:); c = getche(); printf(n); while(c!=1&c!=2&c!=3);if(c=2) /*

37、打印停车场*/ printf(The car in the part!n); count=1; while(!StackEmpty(*In) Pop(In,t); Push(Temp,t); while(!StackEmpty(*Temp) Pop(Temp,t); printf(The ); printf(%d,count); printf( car number is: ); count+; puts(t-num); Push(In,t); printf(Press any key to continue.); getch();if(c=1) /*打印便道*/ printf(The car

38、 in the road!n); count=1; q=Wait-front-next; if(Wait-front!=Wait-rear) /*/ while(q!=NULL) p=q-data; printf(The ); printf(%d,count); printf( Car number is: ); puts(p-num); q=q-next; count+; else printf(nNo car in the road.); printf(Press any key to continue.); getch(); /*主程序*/int Arrive(SqStackCar *I

39、n,LinkQueueCar *Wait);int Departure(SqStackCar *In,SqStackCar *temp,LinkQueueCar *Wait);void Print(SqStackCar *In,SqStackCar *temp,LinkQueueCar *Wait);void initialization();char readcommand();void interpret(char cmd);main() char cmd; SqStackCar part,temp; LinkQueueCar road; InitStack(&part); InitSta

40、ck(&temp); InitQueue(&road); printf(Press any key to continue.); getch(); while(1) initialization(); /*初始化界面*/ cmd = readcommand(); /*读取停车场状况*/ clrscr(); switch(cmd) case a: Arrive(&part,&road); break; case A: Arrive(&part,&road); break; case d: Departure(&part,&temp,&road); break; case D: Departure

41、(&part,&temp,&road); break; case p: Print(&part,&temp,&road); break; case P: Print(&part,&temp,&road); break; case e: printf(Press any to continue.);getch();exit(0); break; case E: printf(Press any to continue.);getch();exit(0); break; default : printf(ERROR!); break; /*/void initialization() /*初始函数

42、*/ int i; clrscr(); gotoxy(0,0); for(i=1;i=240;i+) printf(1); gotoxy(15,8); printf(THIS IS A CAR PART MANAGE SYSYTEM!); gotoxy(15,12); printf(NAME: GAOHE.); gotoxy(15,13); printf(NUM: 200812010205.); gotoxy(15,14); printf(GRADE: 2008.); gotoxy(15,15); printf(CLASS: INTERNET02); gotoxy(1,20); printf(

43、n*); printf(1. Car Arrive-A 2. Car Departure-D 3. Print Car-P 4.Exit-E); printf(n*); printf(Input C,D,P,E choose!n);char readcommand() /*选择函数*/ char cmd; do printf(Input your choice:); cmd = getche(); printf(n); while(cmd!=a)&(cmd!=A)&(cmd!=d)&(cmd!=D)&(cmd!=p)&(cmd!=P)&(cmd!=E)&(cmd!=e); return cmd

44、;二#include#includeusing namespace std;#define MAX_SIZE 2/停车场能够容纳的车的数量#define FARE 5/表示停车场的收费为每小时FARE元int CountForStack=0;/ 此全局变量用来计数堆栈现有的车数int CountForQueue=0;/ 此全局变量用来计数队列现有的车数typedef struct/这个节点用来保存每辆车的信息 char Condition ;/用来表示“到达”或者“离开”的状态, int ArriveTime;/用来记录到达时间,默认为-1,说明还没有到达int LeaveTime;/ 用来记

45、录离开时间,默认为-1,说明还没有离开int License;/ 记录车牌号 CarNode;typedef struct /栈的定义 CarNode *base;/栈底指针,指向0CarNode *top;/栈顶指针,如果指向0,说明栈为空int stacksize;/栈的容量大小CarStack;typedef struct QNode/队列节点的定义 char Condition ;/用来表示“到达”或者“离开”的状态, int ArriveTime;/用来记录到达时间,默认为-1,说明还没有到达int LeaveTime;/ 用来记录离开时间,默认为-1,说明还没有离开int Lice

46、nse;/ 记录车牌号QNode *next;/指向下一个节点的指针QNode;typedef struct/ 队列的定义 QNode *front;/队头指针QNode *rear;/队尾指针Queue;bool InitStack(CarStack &S)/此函数用来初始化栈 S.base =(CarNode *)malloc(MAX_SIZE*sizeof(CarNode);if(!S.base ) cout内存分配失败!endl;return false;/说明内存分配失败,返回false S.top =S.base ;S.stacksize =MAX_SIZE;return true

47、;bool InitQueue(Queue &Q)/此函数用来初始化队列 Q.front =(QNode *)malloc(sizeof(QNode);if(!Q.front ) cout内存分配失败!next =0;/下一个节点指空return true;bool EnQueue(Queue &Q,QNode &qnode)/此函数用来入队一个节点 QNode *p=(QNode *)malloc(sizeof(QNode);if(!p) cout内存分配失败!ArriveTime =qnode.ArriveTime ;p-Condition =qnode.Condition ;p-Leav

48、eTime =qnode.LeaveTime ;p-License =qnode.License ;p-next =0;Q.rear -next =p; Q.rear =p;return true;bool DeQueue(Queue &Q,QNode &t)/此函数用来出队 if(Q.front =Q.rear ) cout队列为空!next ;t.ArriveTime =p-ArriveTime ;t.Condition =p-Condition ;t.LeaveTime =p-LeaveTime ;t.License =p-License ;Q.front -next =p-next ;

49、if(Q.rear =p)/如果P是指向最后一个出队的元素Q.rear =Q.front ;free(p);return true;void InitCarNode(CarNode &C,char condition,int arrivetime,int leavetime,int license)/本函数用来初始化一个CarNode 节点 C.ArriveTime =arrivetime;C.Condition =condition;C.LeaveTime =leavetime;C.License=license;bool Push(CarStack &S,CarNode &car)/此函数

50、用来入栈一个CarNode 节点 if(S.top -S.base =S.stacksize ) cout此栈已满,不能压入新的信息endl;return false;(*S.top ).ArriveTime =car.ArriveTime ;(*S.top ).Condition =car.Condition ;(*S.top ).LeaveTime =car.LeaveTime ;(*S.top ).License =car.License ;+S.top ;/栈顶指针上移return true;bool Pop(CarStack &S,CarNode &t)/此函数用来弹出栈内元素 if

51、(S.top =S.base ) cout栈空,不能执行出栈操作!=S.stacksize )return true;else return false;bool IsStackEmputy(CarStack &S)/此函数用来判断堆栈是否为空 if(S.top =S.base )return true;else return false;bool IsQueueEmputy(Queue &Q)/此函数用来判断队列是否为空 if(Q.front =Q.rear )return true;else return false;bool SearchInStack(CarStack&S,int a)

52、 bool tag=false;if(!IsStackEmputy(S) CarNode *p=S.top-1 ;while(p!=S.base ) if(*p).License =a)tag=true;-p;if(*p).License =a)tag=true;return tag;bool SearchInQueue(Queue &Q,int a)/a表示要查找的车牌号, bool tag=false;if(!IsQueueEmputy(Q)/如果队列非空 QNode *p=Q.front-next ;while(p!=Q.rear) if(*p).License =a) tag=true

53、;/退出此while循环时p指向最后一个元素if(*p).License =a) tag=true;return tag;void InCar(CarStack &S,Queue &Q,int a1,int a2)/此函数用来表示进入车辆, 参数a1用来表示到达时间,参数a2表示车牌号码 if(SearchInStack(S,a2) cout车号a2已经存在于停车场内,输入有误endl;return ; if(SearchInQueue(Q,a2) cout车号a2已经存在于通道内,输入有误endl;return ; if(IsStackFull(S)/如果堆栈已满,说明停车场已满,需要停车在

54、通道 QNode qnode;qnode.ArriveTime =-1;/在通道时间不收费,所以不计时qnode.Condition =A;qnode.LeaveTime =-1;/定义为-1,说明还没有开始离开qnode.License =a2;EnQueue(Q,qnode);/停在通道上+CountForQueue;cout车号:qnode.License 停在通道的第CountForQueue号位置endl;else CarNode carnode;carnode.ArriveTime =a1;carnode.Condition =A;carnode.LeaveTime =-1;car

55、node.License =a2;Push(S,carnode);+CountForStack;cout车号:carnode.License 到达时间 carnode.ArriveTime 停在停车场的第CountForStack号位置endl; void OutCar(CarStack &S,Queue &Q,int a1,int a2)/此函数用来出车,参数a1用来表示离开时间,参数a2表示车牌号码 if(SearchInQueue(Q,a2) cout车号a2存在于通道内,还未进入停车场,不能离开endl;return ; if(!SearchInStack(S,a2) cout车号a2

56、不在停车场内,输入有误endl;return ; CarStack tempstack;InitStack(tempstack);/建立并且初始化用于暂存出车时让车的堆栈bool tag1=false;/标志这个停车场出车以前是否已满,默认为没有满tag1=IsStackFull(S);bool tag2=true;/标志通道是否有汽车在等待, 默认为通道为空tag2=IsQueueEmputy(Q);CarNode temp;/用来保存暂时取出的汽车bool tag3=false;/用来标志是否是离开时间小于到达时间而导致离开失败,true表示离开失败while(1)/让车离开 Pop(S,

57、temp);if(temp.License =a2) if(a1temp.ArriveTime ) cout输入有误,离开时间不能小于到达时间,离开失败endl;tag3=true;Push(tempstack,temp);elsecout车号a2现在离开停车场,所用的时间为a1-temp.ArriveTime 收费为(a1-temp.ArriveTime )*FAREendl;break; elsePush(tempstack ,temp);/进入暂存栈while(!IsStackEmputy(tempstack)/倒出的车再次进入停车场 Pop(tempstack,temp);Push(S

58、,temp);QNode tempqnode;/用来暂时保存从通道出来的汽车if(tag1=true&tag2=false&tag3=false) DeQueue(Q,tempqnode);-CountForQueue;temp.ArriveTime =a1 ;temp.Condition =tempqnode.Condition ;temp.LeaveTime =tempqnode.LeaveTime ;temp.License =tempqnode.License ;Push(S,temp); if(tag2=true&tag3=false)/ 如果停车场没有满,并且离开成功-CountF

59、orStack; void showmenu(CarStack &S,Queue &Q) cout*选择菜单*endl;cout 1: 停车endl;cout 2: 离开endl;cout 3: 退出endl;cout*请按键选择*tag;while(tag!=1&tag!=2&tag!=3) cintag;int a1;unsigned int a2;switch(tag) case 1:cout请输入到达的车号a1;cout请输入到达时间a2;InCar(S,Q,a2,a1); break;case 2:cout请输入离开的车号a1;cout请输入离开的时间a2;OutCar(S,Q,a2

60、,a1); break;case 3:return ; break; char ch;cout*按E/e退出,按任意键返回菜单*ch;if(ch!=E&ch!=e)showmenu(S,Q); int main() CarStack carstack;InitStack(carstack);/ 建立并且初始化用于停车场的堆栈Queue carqueue;InitQueue(carqueue);/建立并且初始化用于通道的队列showmenu(carstack,carqueue);三:#include#includeusing namespace std;#define MAX 2 /停车场车位数

温馨提示

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

评论

0/150

提交评论