《2022停车场管理系统需求报告 (3) .doc》由会员分享,可在线阅读,更多相关《2022停车场管理系统需求报告 (3) .doc(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、停车场管理系统需求报告 重庆邮电大学计算机科学与技术学院 数据结构实验设计报告 题目:停车场管理系统姓名:*学号:2010211998班级:0491002学院:计算机科学与技术学院 1 重庆邮电大学计算机科学与技术学院 目录 一、问题描述03 二、问题分析03 三、数据结构描述04 四、算法设计04 五、程序优缺点分析及优化05 六、程序源代码07 七、程序运行结果13 八、心得体会15附 一、优化后的程序16附 二、优化后程序的运行结果23 2 重庆邮电大学计算机科学与技术学院 一、问题描述 设计一个停车场管理系统。 设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在
2、停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若停车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。【基本要求】 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车到达或离去信息、汽车牌照号码
3、以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。【选作内容】 (1)两个栈共享空间,思考应开辟数组的空间是多少。 (2)汽车可有不同种类,则他们的占地面积不同,收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。 (3)汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。 二、问题分析 该问题需要以栈和队列作为基本的存储结
4、构,以顺序栈模拟停车场,以链队列模拟车场外的便道。汽车进入停车场,即是在顺序栈上执行进栈操作,退出停车场即是在顺序栈上执行出栈操作;汽车进入便道,即是在链队列上执行入队操作,退出便道即是在链队列上执行出队操作。 当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。设要删除的元素在顺序表st中位置为i,则从i到top之间的全部元素进入到一个临时栈st1中,其次再删除该元素,然后将临栈st1的元素按照先进后出的原则重新回到st中。若链队不空,则使队头进栈st,并以当前时刻开始计费。 程序需要构造两个顺序栈st和st1,其中st用于模拟
5、停车场,st1用作临时栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车。此外还需要构 3 重庆邮电大学计算机科学与技术学院 造一个链队列qu用于模拟便道。 三、数据结构描述 /*定义顺序栈类型*/typedefstructintcarnon; /*车牌号*/intcartimen; /*进场时间*/inttop; /*栈指针*/sqstack; /*定义顺序栈类型*/ /*定义链队类型*/typedefstructqnodeintcarno; /*车牌号*/structqnode*next;qnode;typedefstructqnode*front;/*队首和队尾指针*/qnode*r
6、ear;liqueue; 四、算法设计 1.对于子函数模块,则调用顺序栈的基本操作和链队列的基本操作。如下: /*顺序栈的基本运算算法*/voidinitstack(sqstack*s) intstackempty(sqstack*s) intstackfull(sqstack*s) /*s中的插入新元素*/intpush(sqstack*s,inte1,inte2) 4 重庆邮电大学计算机科学与技术学院 /*删除s的栈顶元素,并用e1,e2返回其值*/intpop(sqstack*s,inte1,inte2) voiddispstack(sqstack*s) /*以下为链队列的基本运算算法*
7、/voidinitqueue(liqueue*q) intqueuelength(liqueue*q) intqueueempty(liqueue*q) voidenqueue(liqueue*q,inte)intdequeue(liqueue*q,inte) voiddisplayqueue(liqueue*q) 2.主程序模块voidmain初始化;do接受命令; 处理命令; while(命令。=退出); 五、程序优缺点分析及优化 1.程序的优点 在程序中设置了kind变量,用于保存车的类别,便于计算不同类别车的停车费用,如下程序段: printf(n请输入车的类别【车的类别: 1.代表小
8、汽车2.代表客车3.代表卡车】 :n);scanf(%d,kind); 其中kind可取值1,2,3;若kind取2,则表示一辆客车单位时间内的停车费用 5 重庆邮电大学计算机科学与技术学院 是一辆小汽车的2倍,若kind取3,则表示一辆卡车单位时间内的停车费用是一辆小汽车的3倍。 当然printf(n请输入车的类别【车的类别: 1.代表小汽车2.代表客车3.代表卡车】 :n);中的1.2.3也可以根据实际情况改变。比如,若实际中,一辆小汽车单位时间内的停车费用 是一辆客车的2倍,一辆卡车单位时间内的停车费用是一辆客车的4倍,则可以改成: printf(n请输入车的类别【车的类别: 1.代表客
9、车2.代表小汽车4.代表卡车】 :n); 则kind可取值1,2,4;kind取1时对应的是客车,表示计算停车费用时以一辆客车单位时间内的停车费用为基数,若kind取2,则表示一辆小汽车单位时间内的停车费用是一辆客车的2倍,若kind取4,则表示一辆卡车单位时间内的停车费用是一辆客车的4倍。 2.程序的缺点 (1)输入时间时,程序没有检测错误功能程序的输入形式如下:设n=2,输入数据为:(a,1,5),(a,2,10),(d,1,15),(a,3,20),(a,4,25),(a5,30),(d,2,35),(d,4,40),(e,0,0)。其中:a表示到达(arrival);d表示离去(dep
10、arture);e表示输出结束(end)。 设每个输入项的形式为(choose,carnumber,time),其中choose表示每个括号中的第一项数据,即a/d/e;carnumber表示每个括号中的第二项,即1/2/3;time表示每个括号中的第三项,即5/10/15。设前后两次输入的数据中的第三项分别为time1,time2;则必须满足time2time1。而在实际输入过程中用户可能会忽略这一点,所以应该在输入time是设置一个判断语句,若前后两次输入的time不满足time2time1,则要求用户重新输入,直至满足要求为止。 (2)程序的界面不够清晰,一次性输入的数据项比较多,容易出
11、错。 3.改进思想(1) 为了保证前后两次输入的time必须满足time2time1,使程序具有错误检测功能,在程序输入部分添加了如下代码: printf(输入现在的时刻:n); scanf(%d,time2); while(time2top=-1; 7 重庆邮电大学计算机科学与技术学院 intstackempty(sqstack*s)return(s-top=-1); intstackfull(sqstack*s)return(s-top=n-1); /*s中的插入新元素*/intpush(sqstack*s,inte1,inte2)if(s-top=n-1) return0;s-top+;
12、s-carnos-top=e1;s-cartimes-top=e2;return1; /*删除s的栈顶元素,并用e1,e2返回其值*/intpop(sqstack*s,inte1,inte2)if(s-top=-1) return0;e1=s-carnos-top;e2=s-cartimes-top;s-top-;return1;voiddispstack(sqstack*s)inti;for(i=0;itop;i+) printf(%d,s-carnoi);printf(n); /*以下为链队列的基本运算算法*/ 8 重庆邮电大学计算机科学与技术学院 voidinitqueue(liqueu
13、e*q)q=(liqueue*)malloc(sizeof(liqueue);q-front=q-rear=null; intqueuelength(liqueue*q)intn=0;qnode*p=q-front;while(p。=null) n+; p=p-next;return(n);intqueueempty(liqueue*q)if(q-rear=null) return1;else return0;voidenqueue(liqueue*q,inte)qnode*s;s=(qnode*)malloc(sizeof(qnode);s-carno=e;s-next=null;if(q-
14、rear=null)/*若链队为空,则新结点是队首结点又是队尾结点*/ q-front=q-rear=s;else q-rear-next=s;/*将*s结点链到队尾,rear指向它*/ q-rear=s;intdequeue(liqueue*q,inte)qnode*t;if(q-rear=null)/*队列为空*/ return0; 9 重庆邮电大学计算机科学与技术学院 if(q-front=q-rear)/*队列中只有一个结点时*/ t=q-front; q-front=q-rear=null;else /*队列中有多个结点时*/ t=q-front; q-front=q-front-n
15、ext;e=t-carno;free(t);return1; voiddisplayqueue(liqueue*q) qnode*p=q-front;while(p。=null) printf(%d,p-carno); p=p-next; voidmaincharchoose;/*用于选择命令*/intno,e1,time,e2,kind;/*用于存放车牌号、当前停车时刻*/inti,j;sqstack*st,*st1;/*临时栈st1,当停车场中间的车要推出去时,用于倒车*/liqueue*qu;initstack(st);initstack(st1);initqueue(qu);print
16、f( );printf(nXX);printf(nX欢迎使用停车场管理系统X); 10 重庆邮电大学计算机科学与技术学院 printf(nXX);printf(nX【输入提示】 :汽车状态由a、d、e表示。其中,a:表示汽车到达d:表示汽车离去,X);printf(nXe:表示输出结束。每次输入的数据由三项构成,即:(汽车状态,车牌号,当前时刻)X);printf(nX数据项之间以逗号分开。例如输入示范:a,1,5X);printf(n n);printf(n正在读取汽车信息.n); doprintf(n*);printf(n请分别输入汽车状态(a/d/e)、车牌号和当前时刻(数据之间以逗号分
17、开):n);scanf(%c,%d,%d,choose,no,time); switch(choose) /*汽车到达*/ casea: casea: if(。stackfull(st) /*停车场不满*/ push(st,no,time); printf(该车在停车场中的位置是:%dn,st-top+1); else /*停车场满*/ enqueue(qu,no); printf(n停车场已满,该车进入便道,在便道中的位置是:%dn,queuelength(qu); break;/*汽车离开*/ cased: cased: 11 重庆邮电大学计算机科学与技术学院 printf(n请输入车的类
18、别【车的类别: 1.代表小汽车2.代表客车3.代表卡车】 :n);scanf(%d,kind); for(i=0;itopst-carnoi。=no;i+); if(ist-top)/*要离开的汽车在便道上*/ /*汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾*/ while(qu-front-carno。=no) enqueue(qu,qu-front-carno); /dequeue(qu,qu-front-carno); qu-front=qu-front-next; dequeue(qu,no);printf(n便道上车牌号为%d的汽车已离开。n,no
19、); printf(n当前便道中的车辆的车牌号分别是:); displayqueue(qu); printf(n); else/*要离开的汽车在停车场中*/ for(j=i;jtop;j+) pop(st,e1,e2);/*e1,e2用来返回被删元素的车牌号和停车时刻*/ push(st1,e1,e2);/*倒车到临时栈st1中,将e1,e2插入到临时栈中*/ pop(st,e1,e2); /*该汽车离开*/ printf(n车牌号为%d的汽车停车时间为:%d。停车费用为:%dn,no,time-e2,(time-e2)*price*kind); /*对小汽车而言:当前时刻减去该车当时停车的时
20、刻,再乘以价格就是费用,而对于客车和卡车而言,就要乘以kind倍小汽车的价格*/ while(。stackempty(st1)/*将临时栈st1重新回到st中*/ pop(st1,e1,e2); push(st,e1,e2); if(。queueempty(qu)/*队不空时,将队头进栈st*/ 12 重庆邮电大学计算机科学与技术学院 dequeue(qu,e1); push(st,e1,time);/*以当前时间开始计费*/ printf(n当前停车场中的车辆的车牌号分别是:);/输出停车场中的车辆 dispstack(st); break;/*结束*/casee: casee: print
21、f(n正在退出系统.n); if(。stackempty(st)/显示停车场情况 printf(n当前停车场中的车辆的车牌号分别是:);/输出停车场中的车辆 dispstack(st); printf(n); elseprintf(n当前停车场中无车辆nn); break;/*结束*/default:/*其他情况*/ printf(输入的命令错误。n); break;while(choose。=echoose。=e); 七、程序运行结果 取n=2,即停车场内最多的停车数为2取price=2,即每单位停车费用为2输入数据为:(a,1,5),(a,2,10),(d,1,15),(a,3,20),
22、13 重庆邮电大学计算机科学与技术学院 (a,4,25),(a5,30),(d,2,35),(d,4,40),(e,0,0)。程序演示结果如下图所示: 14 重庆邮电大学计算机科学与技术学院 八、心得体会 (1)该实验涉及到顺序栈的建立、插入、删除等操作,涉及到了链队列的建立、插入、删除等操作。做这个实验,加深了我对以上知识点的认识和理解。(2)提高了c语言编程的能力。在程序设计过程中,需要经过反复地编写,调试,运行,发现问题并解决问题,在这次实验的设计中,我加深对程序的了解,提高自己的实际动手能力和独立思考的能力同时我也学会了综合以前学到的基本知识来解决较大问题的方法。 (3)一方面我养成了
23、注重程序细节的意识。例如:printf(n请分别输入汽车状态(a/d/e)、车牌号和当前时刻(数据之间以逗号分开):n);scanf(%c,%d,%d,choose,no,time); 15 重庆邮电大学计算机科学与技术学院 %c,前面必须留一个空格,否则程序在显示的时候就会有一些问题。 (4)另一方面我也深刻地认识到了数据结构这门课程的重要性。“数据结构”在计算机科学中是一门综合性的专业基础课。数据结构的研究不仅涉及到计算机硬件的研究,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。在研究信息检索时也必须考虑如何组织数据,以便使查找和
24、存取数据元素更为方便。可以认为数据结构是介于数学、计算机硬件和计算机软件三者之间的一个核心内容,是从事计算机科学研究及其应用的科技工作者必须掌握的重要内容 附 一、优化后的程序 includeXincludeXdefinen2 /*停车场内最多的停车数*/Xdefineprice2 /*每单位停车费用*/typedefstructintcarnon; /*车牌号*/intcartimen; /*进场时间*/inttop; /*栈指针*/sqstack; /*定义顺序栈类型*/ /*定义链队类型*/typedefstructqnodeintcarno;/*车牌号*/structqnode*nex
25、t;qnode;typedefstructqnode*front;/*队首和队尾指针*/qnode*rear;liqueue; /*顺序栈的基本运算算法*/voidinitstack(sqstack*s)s=(sqstack*)malloc(sizeof(sqstack);s-top=-1; 16 重庆邮电大学计算机科学与技术学院 intstackempty(sqstack*s)return(s-top=-1); intstackfull(sqstack*s)return(s-top=n-1); /*s中的插入新元素*/intpush(sqstack*s,inte1,inte2)if(s-to
26、p=n-1) return0;s-top+;s-carnos-top=e1;s-cartimes-top=e2;return1; /*删除s的栈顶元素,并用e1,e2返回其值*/intpop(sqstack*s,inte1,inte2)if(s-top=-1) return0;e1=s-carnos-top;e2=s-cartimes-top;s-top-;return1;voiddispstack(sqstack*s)inti;for(i=0;itop;i+) printf(%d,s-carnoi);printf(n); /*以下为链队列的基本运算算法*/voidinitqueue(liqu
27、eue*q)q=(liqueue*)malloc(sizeof(liqueue); 17 重庆邮电大学计算机科学与技术学院 q-front=q-rear=null; intqueuelength(liqueue*q)intn=0;qnode*p=q-front;while(p。=null) n+; p=p-next;return(n);intqueueempty(liqueue*q)if(q-rear=null) return1;else return0;voidenqueue(liqueue*q,inte)qnode*s;s=(qnode*)malloc(sizeof(qnode);s-ca
28、rno=e;s-next=null;if(q-rear=null)/*若链队为空,则新结点是队首结点又是队尾结点*/ q-front=q-rear=s;else q-rear-next=s;/*将*s结点链到队尾,rear指向它*/ q-rear=s;intdequeue(liqueue*q,inte)qnode*t;if(q-rear=null)/*队列为空*/ return0;if(q-front=q-rear)/*队列中只有一个结点时*/ t=q-front; 18 重庆邮电大学计算机科学与技术学院 q-front=q-rear=null;else /*队列中有多个结点时*/ t=q-f
29、ront; q-front=q-front-next;e=t-carno;free(t);return1; voiddisplayqueue(liqueue*q) qnode*p=q-front;while(p。=null) printf(%d,p-carno); p=p-next;printf(n); voidmainintchoose;/*用于选择命令*/intno,e1,time2,e2,no_away;/*no_away:汽车离开时输入车牌号;time2:当前停车时刻;*/staticinttime1;/*静态变量time1用于存放上次时刻*/inti,j;intkind;/*车的类别
30、*/time1=time2=0;sqstack*st,*st1;/*临时栈st1,当停车场中间的车要推出去时,用于倒车*/liqueue*qu;initstack(st);initstack(st1);initqueue(qu);printf( );printf(nXX); 19 重庆邮电大学计算机科学与技术学院 printf(n 欢迎使用停车场管理系统X);printf(nXX);printf(n n);do printf(n*主菜单*n); printf(* 1:车辆到达*n); printf(* 2:车辆离开*n); printf(* 3:显示停车场的车辆*n); printf(* 4:
31、显示便道中的车辆*n); printf(* 0:退出*n); printf(*n); printf(请选择:); scanf(%d,choose); switch(choose) case1: / 汽车到达 printf(输入输入车牌号、当前时刻(数据之间以逗号隔开):n); scanf(%d,%d,no,time2);/*依次输入车牌号、当前停车时刻*/ while(time2top+1); 20 重庆邮电大学计算机科学与技术学院 else /*停车场满*/ enqueue(qu,no); printf(n停车场已满,该车进入便道,在便道中的位置是:%dn,queuelength(qu);
32、break; case2: / 汽车离开 Xprintf(输入车牌号:n); scanf(%d,no_away); printf(请输入车的类别【车的类别: 1.代表小汽车2.代表客车3.代表卡车】 :n);scanf(%d,kind); printf(输入现在的时刻:n);/*现在的时刻time1得大于之前的时刻time1*/ scanf(%d,time2); while(time2carnoi。=no_away;i+); if(ist-top)/*汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾*/ while(qu-front-carno。=no_away)
33、 enqueue(qu,qu-front-carno); qu-front=qu-front-next; dequeue(qu,no_away);printf(n便道上车牌号为%d的汽车已离开。n,no_away); printf(n当前便道中的车辆的车牌号分别是:); displayqueue(qu); printf(n); else 21 重庆邮电大学计算机科学与技术学院 for(j=i;jtop;j+) pop(st,e1,e2);/*e1,e2用来返回被删元素的车牌号和停车时刻*/ push(st1,e1,e2);/*倒车到临时栈st1中,将e1,e2插入到临时栈中*/ pop(st,
34、e1,e2); /*该汽车离开*/ printf(n车牌号为%d的汽车停车费用为:%dn,no_away,(time2-e2)*price*kind);/*对小汽车而言:当前时刻减去该车当时停车的时刻,再乘以价格就是费用,而对于客车和卡车而言,就要乘以kind倍小汽车的价格*/ while(。stackempty(st1)/*将临时栈st1重新回到st中*/ pop(st1,e1,e2); push(st,e1,e2); if(。queueempty(qu)/*队不空时,将队头进栈st*/ dequeue(qu,e1); push(st,e1,time1);/*以当前时间开始计费*/ brea
35、k; case3: / 显示停车场情况 if(。stackempty(st) printf(当前停车场中的车辆的车牌号分别是:);/*输出停车场中的车辆*/ dispstack(st); else printf(停车场中无车辆。n); break; case4:/ 显示便道情况 if(。queueempty(qu) 22 重庆邮电大学计算机科学与技术学院 printf(当前便道中的车辆的车牌号分别是:);/*输出便道中的车辆*/ displayqueue(qu); else printf(便道中无车辆。n); break; case0: / 结束 printf(n正在退出系统.n); if(。
36、stackempty(st) printf(当前停车场中的车辆的车牌号分别是:);/*输出停车场中的车辆*/ dispstack(st); if(。queueempty(qu) printf(当前便道中的车辆的车牌号分别是:);/*输出便道中的车辆*/ displayqueue(qu); break; /*/ default:/*其他情况*/ printf(输入的命令错误。n); break; while(choose。=0); 附 二、优化后程序的运行结果 取n=2,即停车场内最多的停车数为2取price=2,即每单位停车费用为2输入数据为:(a,1,5),(a,2,10),(d,1,15)
37、,(a,3,20),(a,4,25),(a5,30),(d,2,35),(d,4,40),(e,0,0)。程序演示结果如下图所示: 23 重庆邮电大学计算机科学与技术学院 24 重庆邮电大学计算机科学与技术学院 25 重庆邮电大学计算机科学与技术学院 26 重庆邮电大学计算机科学与技术学院 27 重庆邮电大学计算机科学与技术学院 28 内容总结(1)停车场管理系统需求报告 重庆邮电大学计算机科学与技术学院 数据结构实验设计报告 题目:停车场管理系统姓名:*学号:2010211998班级:0491002学院:计算机科学与技术学院 1 重庆邮电大学计算机科学与技术学院 目录 一、问题描述(2)栈以顺序结构实现,队列以链表结构实现(3)=退出)(4)=0)