《C语言数据结构停车场管理系统-课题设计报告书.docx》由会员分享,可在线阅读,更多相关《C语言数据结构停车场管理系统-课题设计报告书.docx(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、一 需求分析(1).任务:设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内,按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端)。若车场内已停满n辆汽车,则后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出班车场为它让路,待该车开出大门后。其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用(在变道上停留的时间不收费)。(2).基本要求:以栈模拟停车场,以队列模拟车场外的便道。从终端读入汽车到达或
2、离去的数据,每组包括三项:1 是“到达”还是“离去”;2 汽车牌照号码;3 “到达”或“离去”的时刻;(3).市场需求:这个软件可以合理的安排停车场车辆的存放,查询目前在停车辆,以及计费。同时当停车场内部车辆方满之后,我们可以根据在外部等待的车辆的先来后到的顺序,当车场空闲之后,再安排等待的车辆进入。同时在计费的反面,是按分钟计费的,较为公平。最后收费,将小于0.1元部分四舍五入。二 概要设计模块大致划分:界面:main函数;Memu函数(主要界面)计算函数1.进入函数GoIn();2离开函数GoOut().; 查看函数3.查看车场LookChang();4.查看变道LookDao();遇到的
3、疑难问题1. 根据题目要求,停车场需要用栈,而变道要用的是列队。由于变道的原则是先到先离开,这和列队的原理是一样的,所以变道的建立是方便的,只要实现变道(列队)和停车场(栈)之间的数据连接即可。但是栈是后入先出的,而停车场呢的车辆的离开时没有规律的,这样删除数据是十分不方便的2. 同时在车辆的离去方面有,根据题目的要求,我们要计算出车俩的停车费用。由于时间是60进制,而车辆的停车的费用是同过车辆的的停车时长来求的,那么便是通过离去的时间减去进入的时间来得出中间的时间,最后求出来的。可是由于60进制的退位十分被方便,这也是后面的一个人那题。注意:其中上述的最难的两个问题全部集中到了第二个离开函数
4、,离开函数是整个程序的重重之重.三 详细分析(1).重点疑难问题解决思路的描述在整个程序当中,取车Goout函数是最复杂的一个,我面临的最难的两个问题都在这个函数当中实现。关于第一个问题如何顺利的取车就是在停车场栈S1和便道Q之间建立一个虚拟的栈S2。我将压在我要取的车上面的车辆先放到S2当中,将车顺利的提出后,再从S2放回到S1当中。这是后S1空,我就可以将便道Q中的车辆放入的停车场S1当中。关于第二个问题,时间的问题。我将时间转化为一个四位数,前两位为小时,后两位为分钟。用前面两个数乘以60,加上后两位,用着个办法求时间车计费。(2).模块划分 1.主函数和界面Memu函数intmain(
5、)InitStack(S1);/初始化S1InitStack(S2); /初始化S2InitQueue(Q); /初始化Qprintf(停车场管理系统n);printf(注意:7点10分(0710),14点09(1409),下午6点整(1800));while(1)Memu(); /获取按键(主菜单)char i = getchar(); if(i = 10)i = getchar();char i2 = getchar();while(i2 != 10)i2 = getchar();switch(i)case 1:GoIn();break;case 2:GoOut();break;case
6、3:LookChang();break;case 4:LookDao();break;case 5:printf(程序已退出!谢谢使用!nn);exit(0);break;default:printf(您必须选择15之间的数字!n);DestroyStack(S1);DestroyStack(S2);DestroyQueue(Q);return0;主函数主要起到了集成各个模块的作用,首先建立栈S1和S2,S1成为停车场,S2起到辅助的作用,队列Q作为便道。void Memu()printf(请选择以下功能:n);printf(1. 车辆到达n);printf(2. 车辆离去n);printf(
7、3. 查看停车场内情况n);printf(4. 查看便道情况n);printf(5. 退出n);printf(注意:请输入15之间的数字选择相应功能:);Memu函数这要负责生成界面图像(菜单)2.存车Goin函数void GoIn()Care;printf(您选择的是 1.车辆到达n);printf(请输入车号:);scanf(%d,&e.number);printf(请输入到达时间(格式:HHMM):);scanf(%d,&e.inTime);inti = StackLength(S1);if(i = MAXSIZE) printf(n停车场内已满,请在便道内等待!nn);EnQueue(
8、Q,e);else Push(S1,e);printf(n车辆%d已于%d时%d分停放在第%d位。nn,e.number,e.inTime/100,e.inTime-e.inTime/100*100,i+1); 在goin函数中,输入了车辆的车牌号,输入了车俩的存车时间。按照车辆的信息,将这些信息依次放入栈S1当中。注意if(i = MAXSIZE)其中在这里,我再源程序当中设置成了MAXSIZE设置成了5,所以在我目前的系统当中,停车场最多可以放五辆车。但是我可以更改MAXSIZE的大小,MAXSIZE的最大值可以改为我设置的栈的容量的最大值100,所以我也可以将停车场的容量改为100。变道
9、没有专门设置,所以容量一直是100。停车场容量是5:#define MAXSIZE5停车场容量是6:#define MAXSIZE63.取车Goout函数 intGoOut()intCarNum; SElemType*CarID; printf(您选择的是 2.车辆离去n);if(StackEmpty(S1) = TRUE)printf(停车场内没有车辆!nn); elseprintf(请输入要离开的车辆的车号:);scanf(%d,&CarNum);for(CarID = S1.base; CarID number = CarNum)break;if(CarID = S1.top) prin
10、tf(对不起,没有这辆车!请检查您输入的车号:%dnn,CarNum);elseprintf(车辆%d进入停车场的时间是(格式:HHMM):%d时%d分n,CarID-number,CarID-inTime/100,CarID-inTime-CarID-inTime/100*100);printf(请输入车辆离开的时间(格式:HHMM):);scanf(%d,&CarID-outTime);if(CarID-outTime inTime)printf(n时间不正确,离开时间居然会早于到达时间?!nn);return 0; inthh1,hh2,mm1,mm2;floatmoney; hh1 =
11、 CarID-inTime / 100;mm1 = CarID-inTime - hh1 * 100;hh2 = CarID-outTime / 100;mm2 = CarID-outTime - hh2 * 100;money = (float)(hh2 * 60 + mm2)-(hh1 * 60 + mm1) * FEIYONG);printf(您本次的停车费用为 %2.1f 元。谢谢使用。nn, money);SElemTypee;Pop(S1,e);while(e.number != CarID-number | e.inTime != CarID-inTime)Push(S2,e);
12、Pop(S1,e);while(!StackEmpty(S2)Pop(S2,e);Push(S1,e);if(!QueueEmpty(Q)DeQueue(Q,e);e.inTime = hh2 * 100 + mm2;Push(S1,e);printf(便道中的第一辆车%d于%d时%d分进入停车场!nn,e.number,hh2,mm2);return0;1。那么我们设计的时候首先设计两个栈(S1和S2)和一个队列(Q)。其中S1用来做真正的停车场,我们这时假设停车场有5个停车位,并且全都已经停满了。停车场内从前往后车牌号依次为:1.2.3.4.5变道内部还有车辆在等待。突然3号车要离开,为了
13、保证程序的顺利运行,我们这时引入了另外的一个栈。将5号从S1中提出,放入S2中,在将4号从S1提出,放入S2中。此时3号便是S1的栈顶,3号便可以顺利的提出(车辆离开)。而此时S2中得车牌号为:5.4我们在将他们依次冲S2中提出,放到S1中间。这时S1中得顺序为:1.2.4.5。S1栈(停车场)空,队列(变道)的车辆可以进入。由于变道的等待的规则是:先进入变道等待的车辆,当停车场空是先停车。所以变道设计成先入先出的队列十分方便,可以直接使用。2.在时间的计算方面,由于计算机有一个强制格式转化的问题。所以可以利用这个情况,将时间设置为一个四位数的的方式,例如:(7点10分(0710),14点09
14、(1409),下午6点整(1800),其中将千位和百位用HH表示,各位和十位用MM表示。将时间先除以100得到HH,时间减去HH得到了MM。这样HH乘以60加上MM算出第一个时间,最后两个时间相减,求出存放的分钟数。这样我将进入时间转换成了是今天零点之后的第几分钟,同理求出了离开的时间是今天的第几分钟。这样我就讲60进制转换为了10进制。求时间差计费,计费。4.查看停车场Lookchang函数voidLookChang()printf(您选择的是 3.查看停车场内情况n);StackTraverse(S1);printf(n);5.查看便道Lookdao函数voidLookDao() prin
15、tf(您选择的是 4.查看便道情况n);QueueTraverse(Q);printf(n);四 调试分析与测试结果假使在9点9分开入了这牌号依次为111,112,113,114,115。113号车于10点11分离开显示停车场内的情况116,1017(输错,原本117),118在10点17分到达停车场停车场的情况便道的情况五 总结如果说这次对于数据结构课题设计的最大的感悟,那就是我以前总是觉得数据结构就是和最初学习C语言一样拿它们来起到函数的作用。上课时候老师讲的内容可以听懂,我知道现在黑板上的东西是干啥,下课以后如果说将上课讲的东西放到一个我想编写的程序当中就不知道怎么用了。而且在第一学期的
16、学习当中,我本来对于指针的使用一直不能很好的使用,总是想办法避开,在程序的编写当中走了许多的弯路。通过这次的课题设计,我终于明白了像栈、队列这些东西的巧妙之处。或许说,这些东西在实际的生活当中许多的情况不能直接使用。就比如这次在停车场栈的建立当中,由于已经停好的车辆几乎不会是后入先出的情况,所以在使用的时候对于数据的处理十分不便。这样我们就可以额外建立一个栈,来存放要挪动的数据。同样我们对于我们所使用的东西应该灵活的使用,而不是只拘泥于东西本来的要求。最后就是在我以前的程序编译当中,总是将一个有一个模块放入到主函数当中,将主函数弄十分繁杂,而且有了错误也十分不好修正。而这一次,我将一个个模块放到了主函数外,起到了单独的作用。看上去又省事,修改起来也十分方便。