停车场管理系统设计.docx
- 文档编号:23053985
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:25
- 大小:131.54KB
停车场管理系统设计.docx
《停车场管理系统设计.docx》由会员分享,可在线阅读,更多相关《停车场管理系统设计.docx(25页珍藏版)》请在冰豆网上搜索。
停车场管理系统设计
1需求分析
1.1基本要求和目的
编写一个可以停放n辆汽车的停车场操作系统,该系统有汽车驶入、驶出停车场、查询停车场等功能。
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。
每一组输入数据包括三个数据项:
汽车车位、汽车牌照号码以及到达或离去的时刻。
对每一组输入数据进行操作后的输出信息为:
若是车辆到达,则输出汽车在停车场内的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。
栈以顺序结构实现,队列以链表结构实现。
1.2问题描述
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若停车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。
试为停车场编制按上述要求进行管理的模拟程序。
2总体设计
2.1停车场的设计
此系统要求停车场要需要用线性表的顺序存储,所以就要用到top,base的指针。
在停车场中的每一辆车都包含车辆的车牌号、车位和进站时间等信息,车牌号是车辆的最基本的信息,它可以准确的找寻到此车;车位是根据停车场的情况分配的,进站时间则是计算车辆费用的唯一信息。
所以停车场应该采用结构体来储存,具体方法如下:
typedefstructelem{
stringname;//
intdata;//车牌号
inttime[12];
}elem;//栈节点
typedefstruct{
elem*base;
elem*top;
intstacksize;}sqstack;
2.2函数的设计
在此程序中是通过函数调用,最终实现程序功能。
voidinitstack(sqstack&s);初始化栈;
voidpushstack(sqstack&s,queue&q);进栈;
voidpopstack(sqstack&s,intx,queue&q)出栈;
voidinitqueue(queue&q);初始化队列;
voidinputqueue(queue&q,intx);进队列
voidoutputqueue(sqstack&s,inty,queue&q);出队列
intbusmessage(sqstack&s,queue&q);
voidtime(inta[]);时间差函数
voidtime1(inta[]);获取时间函数
voidtime2(inta[]);获取时间函数
voidshow(sqstack&s,queue&q);显示信息的函数
3详细设计
程序的开始主要是利用主函数来调用各个成员函数。
首先,主函数main()是设计了一个界面显示函数,并使用initstack(sqstack&s)函数初始化栈。
其流程如下:
s.base=(elem*)malloc(size*sizeof(elem));
If(!
s.base)
exit(0);
s.top=s.base;
图3.1initstack()函数
初始化栈首先为栈申请内存空间,如果没有申请成功,就返回,如果申请成功,就令栈顶和栈底指针相等,都指向先申请的内存空间。
在此同时,令s.base->next=NULL;
Intx;//车牌号
s.base[s.stacksize-1].data=x;
s.stacksize>size
inputqueue(q,x);
s.stacksize 结束 s.top++; 图3.2输入函数pushstack()的实现 输入函数比较简单,判断刚开始时用if(s.stacksize>size)判断停车场的车位长度是否大与现在的汽车长辆数,如过大于,就把车停在便道上。 如果小于,就把车停在停车场内,并取得进入车库时的时间。 b=a[10]+60-a[4]; b=a[10]-a[4]; a1=a[11]+60-a[5]; If(a[10]>=a[4] a1=a[11]-a[5]; If(a[11]>=a[5] inta1,b,c; If(a[9]>=a[3] c=a[9]+12-a[3]; c=a[9]-a[3]; printf("相差时间为%02d: %02d: %02d",c,b,a1); 图3.3求时间差time()函数 求时间差函数比较简单,先把时间保存在一个数组中,保存的时候为把年份和月份分别保存在数组中,求时间差的时候,就用后面进入时的时间减去前面进入时的时间,在减的时候先判断一下被减数是否比减数大,如果比减数大就向前面进一位,然后加上进位数在减,这样一直减下去就得到了时间差。 printf("汽车进入"); 图3.4便道上出去popstack()函数 汽车输出函数比较简单,首先判断汽车长度是否小于栈长,如果小于,则便道上的就没有汽车,只需要将车场内的汽车开出车场,在进入即可,如果判断汽车长度大于栈长时,就先要把便道上的汽车开出去在把停车场内的汽车开出去,在把停车场的车开进来,当停车场的汽车开近来时,便道上的第一辆车要开进停车场,同时汽车的长度要减一,在对便道进行操作时,先定义一便道类型的指针,把头节点附给定义的指针,这样头节点就不会变。 q.front=(node*)malloc(sizeof(node));m)); If(q.front) exit(0); q.front->next=NULL; 图3.5初始化队列函数的实现 initqueue(queue&q)函数比较简单,先为对头申请空间,如果申请成功就令头节点的下一节点为空,然后返回,如果申请不成功,就退出。 4调试分析 4.1调试过程中遇到的问题是如何解决的 在程序过程中经常会遇到很多问题,但是在同学与老师的帮助下这写问题都解决了,在很多时后自己以为是对的,但程序根本就运行不通。 内存报告错误。 我认为时自己的知识还不够,在放假的时间里回去还要好好补一下自己的知识。 以前不懂的东西在回去之后一定要弄懂。 4.2改进设计 此程序虽然基本能达到课程设计所要求的,但程序含简单。 也不够完善,我想是因为自己的水平有限造成的。 以后一定要多看书,要赶上那些成绩好的同学。 在此程序中,没有怎么画面。 也没有较好的以些功能。 回去之后一定会实现这些功能。 4.3经验和体会 经过了两周的努力,最后终于还是把程序写出来了,虽然有同学和老师的帮助,还有就是程序比较简单。 但最后还是很高兴,现在回顾起来,也体会到了C的魅力和智慧。 C语言中文件的转换,以及一些算法都是很奇妙的。 C语言根据此特点,要求一步一步算,且要求清楚,而要将模糊变清楚具体,加在计算机上,就有了像循环,函数,选择,数组,指针……互相交织。 计算机编程看似是枯燥并且繁琐的,但是如果找到了其中的关键点和学习方法,也会找到其中的乐趣的。 在程序的设计过程中,懂的学生提高了动手实践的能力,先没懂的学生也可以更加明白其中的方法和意义。 此次课程设计报告具有相当大的含义,它是自从大学以来第3次实践性质的课程设计,是将我们从懵懂拉向认识它的一个转折点。 是培养我们对计算机编程的能力的重要环节。 5测试结果 5.1车辆驶进停车场测试结果 在屏幕上,系统会列出停车场的主要功能。 如果有车辆驶入停车场,就选择驶入停车场的选项。 系统就会先判断停车场是否有车后,在输出相应的操作到屏幕上。 具体内容如下: 图5.1主函数测试图 图5.2汽车进入车库界面 5.2车辆驶出停车场测试结果 在屏幕选项中选择车辆驶出停车场,然后输入要驶出车辆的车位号,如果停车场没有此车,系统将输出无此车的信息,否则就输入现在的时间来计算车辆的费用。 具体内容如下图: 图5.3汽车出车库界面 图5.4出车库后显示界面 5.3输出停车信息测试结果 在进行了汽车进入与离开后,显示停车信息可以显示现在的停车情况。 图5.5显示停车信息界面 总结 经过两个星期的时间完成了试验报告,在这两周的时间里我学到了很多的东西。 这设计这个程序时,自己想到了很多的问题,怎样去解决这些问题等等诸如此类的问题。 但是,在经过自己的努力后,每一个问题最后都还是解决了。 此程序主要是说明停车场管理系统的一些最简单的功能,设计程序用到了很多的知识,如结构体的使用、栈和队列的使用等等。 通过程序我又再一次巩固了我以前学的知识。 以前对结构体的使用不是很懂,更不知道结构体的很多作用,现在我知道了以前我不知道的知识。 其实结构体并不是那么的难学,而且它的功能又很大。 可以说是学的新东西马上就使用到应用中去。 现在觉得一个程序并不是那么难写,主要是自己的架构打好,这样在写好主函数后,想要增加一个函数,就可以在此基础上增加。 增加的函数只要搞清楚它的作用,算法。 用伪码将其分析后就可以很容易的写出。 在此程序中,优点就是可以很方便对停车对进行管理。 缺点就是程序太过于简单,没有很多功能。 但这些不足的地方在以后的学习过程中都会改进。 并且会更多的学习到其他知识。 通过此次软件的编写,也发现了我的许多知识欠缺之处及综合运用知识的能力。 软件也有许多缺点,希望能够通过刻苦的学习,编写出更好,功能更强的软件,这些都得靠艰苦奋斗。 致谢 在这两周内,我非常感谢我的老师和同学,他们给予了我很大的帮助,没有他们的帮助,我想在两周内我是不能完成这次程序设计任务的,并且他们教给了我很多技巧,学习到了新的知识,巩固了旧的知识,也加深了我们对编程的理解和动手能力。 当然其中的过程并不是那么容易的,我们需要同学、老师的帮助和支持才能将其完善。 就是有许多的挫折和困难,才能使我们进步,而在面对这些的时候,我们得到了同学、老师的帮助,所以在此需要对他们表达谢意。 他们也应算作完成此程序的功臣。 也希望在今后的学习生活中,能够互相帮助,互相支持。 。 我觉得这两周我收获了很多,团结就是力量。 通过两周的学习,复习了和掌握牢固了以前学的C和C++知识,并且学到了新的知识。 参考文献 [1]何钦铭,颜晖.C语言程序设计.北京: 高等教育出版设,2008. [2]严蔚敏,吴伟民.数据结构北京: 清华大学出版社,2008 [3]严蔚敏,吴伟民.数据结构(C语言版).北京: 清华大学出版社,2002.9 [4]李春葆.数据结构教程.北京: 清华大学出版社,2005.1 [5]RichardF.GilbergBehrouzA.Forouzan.数据结构的C++伪码实现(英文版).北京: 人民邮电出版社,2002.1 程序 #include #include #include #include #include #include #include #include #include #include #include usingnamespacestd; #definesize3 typedefstructelem{ stringname;// intdata;//车牌号 inttime[12]; }elem;//栈节点 typedefstruct{ elem*base; elem*top; intstacksize; }sqstack; typedefstructnode{ stringname;// intdata;//车牌号 inttime[12]; structnode*next; structnode*prior; }node;//队列节点 typedefstruct{ node*front; node*rear; }queue; voidinitstack(sqstack&s); voidpushstack(sqstack&s,queue&q); voidpopstack(sqstack&s,intx,queue&q); voidinitqueue(queue&q); voidinputqueue(queue&q,intx); voidoutputqueue(sqstack&s,inty,queue&q); intbusmessage(sqstack&s,queue&q); voidtime(inta[]); voidtime1(inta[]); voidtime2(inta[]); voidshow(sqstack&s,queue&q); cpp文件 #include"head.h" inta[12]; intf=0;intd=0; node*ptr; voidinitstack(sqstack&s) { s.base=(elem*)malloc(size*sizeof(elem)); if(! s.base) exit(0); s.top=s.base; s.stacksize=0; } voidpushstack(sqstack&s,queue&q) { intx; //elem*k; //elem**m; //k=s.top; //m=&k; //inty=*m; //node*t; //node**h; //h=&t; //*h=y; //q.front=t; //printf("%d\t",*m); printf("请输入车牌号"); scanf("%d",&x); s.stacksize++; if(s.stacksize>size) { //printf("\t%d\t",s.stacksize); inputqueue(q,x); printf("到达便道上位号为%d车牌号%d",s.stacksize,x); f++; time1(ptr->time); ptr=ptr->next; } else{ s.base[s.stacksize-1].data=x; if(s.stacksize { s.top++; } printf("到达停车场里位号为%d车牌号%d",s.stacksize,x); time1(s.base[s.stacksize-1].time); } } voidpopstack(sqstack&s,intx,queue&q) { inti=s.stacksize; intk=i; if(s.stacksize<=size)//当总长度小于栈长时 { elem*en=s.top; for(intb=0;b { Sleep(1500); printf("从车库离开位号为%d车牌号%d",i,s.base[k-1].data); if(b==size-x-1) { time2(s.base[b].time); time(s.base[b].time); inthe=s.base[b].time[11]-s.base[b].time[5]+(s.base[b].time[10]-s.base[b].time[4]+3)*30; printf("所交费用为%d",he); } printf("\n"); i--; k--; } intcn=x; for(b=0;b { s.base[cn-1].data=s.base[cn].data; s.base[cn-1].time[0,1,2,3,4,5]=s.base[cn].time[0,1,2,3,4,5]; cn++; } cn=x; for(b=0;b { printf("又进入车库位号为%d车牌号%d\n",cn,s.base[cn-1].data); cn++; } s.stacksize--; } else { intr=s.stacksize; node*w=q.rear->prior; for(i=0;i { Sleep(1500); printf("从便道离开位号为%d车牌号%d\n",r,w->data); w=w->prior; r--; } //w=w->next;//前面多出一位 node*p=w->next; q.front=p;//....... i=size; for(intb=0;b { Sleep(1500); printf("从车库离开位号为%d车牌号%d",i,s.base[i-1].data); if(b==size-x) { time2(s.base[b].time); time(s.base[b].time); inthe=s.base[b].time[11]-s.base[b].time[5]+(s.base[b].time[10]-s.base[b].time[4]+3)*30; printf("所交费用为%d",he); } printf("\n"); i--; k--; }//.......... intcn=x; for(b=0;b { s.base[cn-1].data=s.base[cn].data; s.base[cn-1].time[0,1,2,3,4,5]=s.base[cn].time[0,1,2,3,4,5]; cn++; } cn=x; for(b=0;b { Sleep(1500); printf("又进入车库位号为%d车牌号%d\n",cn,s.base[cn-1].data); cn++; }//........... s.base[size-1].data=w->data; s.base[size-1].time[0,1,2,3,4,5]=w->time[0,1,2,3,4,5]; printf("便道①进车库位号为%d车牌号%d\n",size,w->data);//....... inte=size+1; for(i=0;i { Sleep(1500); printf("又进入便道位号为%d车牌号%d\n",e,p->data); p=p->next; e++; }//........ q.front->prior=q.front;//防止第n次时便道①重复。 。 前面w要多循环一次 q.front->prior->next=q.front; s.stacksize--; } } voidinitqueue(queue&q) { q.front=(node*)malloc(sizeof(node)); q.rear=q.front; if(! q.front) exit(0); q.front->prior=q.front; q.front->prior->next=q.front; q.front->next=NULL; ptr=q.front; } voidinputqueue(queue&q,intx) { node*p; p=(node*)malloc(sizeof(node)); q.rear->data=x; //printf("\t%d\t",q.rear->data); q.rear->next=p; q.rear->next->prior=q.rear; q.rear=q.rear->next; q.rear->next=NULL; } voidoutputqueue(sqstack&s,intx,queue&q) { intr=s.stacksize; node*w=q.rear->prior; //printf("\t%d\t",s.stacksize); for(inti=0;i { Sleep(1500); printf("从便道离开位号为%d车牌号%d",r,w->data); if(i==s.stacksize-x) { time2(w->time); time(w->time); } printf("\n"); w=w->prior; r--; } w=w->next;//前面多循环了一次 node*p=w->next; if(x==size+1) { p=w; q.front=p; p=q.front; } else{ w->next->prior=w->prior; w->prior->next=w->next;//删除w节点 } inte=x; for(i=0;i { Sleep(1500); printf("又进入便道位号为%d车牌号%d\n",e,p->data); p=p->next; e++; } s.stacksize--; } intbusmessage(sqstack&s,queue&q) { inta,c=0; elemb; printf("车库共有%d个车位1汽车进入,2汽车离开,3显示停车信息,其他退出系统,\t",size); n: scanf("%d",&a); if(a==2) { printf("请输入要几号车出去"); scanf("%d",&c); if(c<=size) popstack(s,c,q); else outputqueue(s,c,q); } elseif(a==1) { pushstack(s,q); } elseif(a==3) show(s,q); else {gotom;} goton; m: return1; } voidtime(inta[])//相差时间算发 { inta1,b,c; i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 停车场 管理 系统 设计