实验报告停车场管理.doc

上传人:jian****018 文档编号:9135619 上传时间:2020-04-03 格式:DOC 页数:11 大小:223KB
返回 下载 相关 举报
实验报告停车场管理.doc_第1页
第1页 / 共11页
实验报告停车场管理.doc_第2页
第2页 / 共11页
实验报告停车场管理.doc_第3页
第3页 / 共11页
点击查看更多>>
资源描述
实验 停车场管理姓名:曹国君 梁辰 唐琪皓 黄悦 班级:信息1班 学号:09125676 09125675 09125672 09125673 实验时间:第5周1.问题描述 设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入得车辆必须先退出车场为它让路,待该车辆开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按照它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。2. 数据结构设计 由于停车场的停车位有限,只有一个入口,且通道狭长,当停车场内某辆车要离开时,在它之后开入得车辆必须先退出车场为它让路,顺序栈的结构符合停车场的需求。若车场内已停满,车辆再外排队等候,队伍不限长度,可以使用链式队列进行模拟。输入:停车位数,停车费单价,进入或离去,车牌号,进入或离去时间输出:进入:输出停在停车场或者便道上的位置 离去:输出停留在停车场上的时间(离开时间-进入停车场的时间)及费用为了满足以上的要求,至少需要记录进入时间以及车牌号templateclass SqStack protected:/ 顺序栈的数据成员:int top;/ 栈顶指针 int maxSize; struct Set /定义一个结构体,可以存放两个数据 ElemType num; ElemType time; ;/ 栈最大容量 Set *elems; template struct Node / 数据成员:ElemType data1,data2;/ 两个数据域Node *next;/ 指针域/ 构造函数:Node();/ 无参数的构造函数Node(ElemType item1,ElemType item2 ,Node *link = NULL);/已知数数据元素值和指针建立结构;3. 程序设计(1)头文件由于数据域的改变,创建,插入,删除等函数都需要增加一个数据域的处理。顺序栈:public:/ 抽象数据类型方法声明及重载编译系统默认方法声明:SqStack(int size = DEFAULT_SIZE);/ 构造函数virtual SqStack();/ 析构函数int Length() const;/ 求栈长度 bool Empty() const;/ 判断栈是否为空void Clear();/ 将栈清空void Traverse(void (*Visit)(const ElemType &) const;/ 遍历栈Status Push(const ElemType &e,const ElemType &t);/ 入栈Status Top(ElemType &e,ElemType &t) const;/ 取顶元素Status Pop(ElemType &e,ElemType &e);/ 出栈SqStack(const SqStack ©);/ 复制构造函数SqStack &operator =(const SqStack ©); / 赋值语句重载链式队列:public:LinkQueue();/ 无参数的构造函数virtual LinkQueue();/ 析构函数int Length() const;/ 求队列长度 bool Empty() const;/ 判断队列是否为空void Clear();/ 将队列清空void Traverse(void (*Visit)(const ElemType &) const ;/ 遍历队列Status DelQueue(ElemType &e,ElemType &t);/ 出队操作Status GetHead(ElemType &e,ElemType &t) const;/ 取队头操作Status EnQueue(const ElemType &e,const ElemType &t);/ 入队操作LinkQueue(const LinkQueue ©);/ 复制构造函数LinkQueue &operator =(const LinkQueue ©);/ 赋值语句重载(2) 辅助函数 当车辆离开时,输入车牌号与离开时间,如果该车辆在停车场中,则在其之后的车辆需要暂时离开停车场为其让路,返回其进入停车场的时间,并判别为真;如果该车辆不存在停车场中,则判别为假。int depart(const int &a,const int &n,SqStack &p,bool &dans) /返回进入时间 SqStack park1(n); /建立一个临时栈int tmpn,tmpt,count=0,atime,i; dop.Pop(tmpn,tmpt); park1.Push(tmpn,tmpt); count+; /计数器用来记录让开的车数 while(tmpn!=a&!p.Empty(); /如果栈顶车牌不符合条件,而且栈不为空,把栈顶元素弹出后放入临时栈中 if(tmpn=a) /如果找到了该车 dans=1; /判别为真 park1.Pop(tmpn,tmpt); /该车辆离开 count-; else dans=0; /如果遍历仍找不到车,则判别为假 atime=tmpt; for(int i=0;icount;i+) /让路的车重新返回停车场 park1.Pop(tmpn,tmpt); p.Push(tmpn,tmpt); return atime; /返回进入时间 为了避免输入重复的车牌号,输入的离开时间小于进入时间,设计了遍历功能供使用者参考template void SqStack:Traverse(void (*Visit)(const ElemType &) const/ 操作结果:从栈顶到栈底依次对栈的每个元素调用函数(*visit)for (int Pos = top-1; Pos =0 ; Pos-)/ 从栈底到栈顶对栈的每个元素调用函数(*visit)cout车牌:;(*Visit)(elemsPos.num); cout到达时间:;(*Visit)(elemsPos.time); coutendl; (3)主程序#includeassistance.h#includesq_stack.h#includelk_queue.hint depart(const int &a,const int &n,SqStack &p,bool &dans) SqStack park1(n);int tmpn,tmpt,count=0,atime,i; dop.Pop(tmpn,tmpt); park1.Push(tmpn,tmpt); count+; while(tmpn!=a&!p.Empty(); if(tmpn=a) dans=1; park1.Pop(tmpn,tmpt); count-; else dans=0; atime=tmpt; for(int i=0;icount;i+) park1.Pop(tmpn,tmpt); p.Push(tmpn,tmpt); return atime; int main() int n=0,time,num,tmp,oldtime; double prix; /停车单价 bool si; /判别车辆是否存在 char jug=P; cout欢 迎 使 用 停 车 场 管 理 系 统endl; while(n1) cout请输入停车场的车位数:n; LinkQueue hallway; SqStack park(n); cout请输入每分钟停车费:prix; while(jug!=E) /选择界面 coutA.车辆到达endl; coutD.车辆离开endl; coutL.查看停车场情况endl; /遍历停车场情况 coutE.退出程序jug; switch(jug) case A: /进入 cout请输入车牌号与达到时间: numtime; if(park.Length()!=n) /停车场没满 park.Push(num,time); cout车牌号为 num 的车辆进入停车场时间:time分钟,位置:park.Length()endl; /进入停车场Else /停车场满 hallway.EnQueue(num,time);cout停车场已满,车牌号为 num 的车辆进入停车场外便道时间:time分钟,位置:hallway.Length()endl; /进入便道排队continue; case D: /离开 if(!park.Empty() /停车场有车辆 cout请输入车牌号与离开时间: numtime; oldtime=depart(num,n,park,si); /记录进入时间,判定其存在 if(si) /存在则输出 cout车牌号为 num 的车辆进入停车场时间:oldtime,离开时间为:time停留时间:time-oldtime分钟,费用:(time-oldtime)*prixendl; if(!hallway.Empty() /如果有车辆在便道内等候 hallway.DelQueue(num,tmp); park.Push(num,time); cout车牌号为 num 的车辆进入停车场时间:time分钟,位置:park.Length()endl; /队列的队首进入栈,并输出相关信息 else cout停车场内没有该车辆endl; /输入的车牌号不存在于栈内 else cout停车场内没有任何车辆end /栈为空时,不用输入离开车辆的信息 continue; case L: cout停车场出入口(南)endl; park.Traverse(Write); /遍历停车场占用的车位 coutendl; continue; cout再 见endl; /程序结束 system(pause); return 0;停车场管理数据测试次数输入输出车位数单价到达离去信息时刻车牌号位置停留时间费用125 A 51车位1 A 102车位2 D 1511050 A 203车位2 A 254便道位1 A 305便道位2 D 35225125 D 404525 E 00220.5 A 51车位1 A 102车位2 A 153便道位1 A 204便道位2 A 255便道位3 D 3022010 A 356便道位3 D 403105 D 4514020 E 00315 A 51车位1 A 102便道位1 D 152 A 153便道位2 D 25120100 D 25200 D 3531050 E 00451 A 43车位1 A 72车位2 A 155车位3 D 8344 A 91车位3 A 184车位4 D 2521818 A 306车位4 E 00532.785 A 51车位1 A 52车位2 A 53车位3 A 54便道位1 D 102513.925 D 10400 A 155车位3 D 1511027.85 E 006210 D A 101车位1 A 112车位2A112便道位1 D 22211110 D 33211110 D 44134340 E 00730.01 A 61车位1 A 802车位2 A 1203车位3 D 1803600.6 A 2504车位3 A 3005便道位1 D 35041001 E 00828 A 361车位1 D 482 D 451972 A 483车位1 A 554车位2 A 555便道位1 D 6031296 E 009102 A 21车位1 A 22车位2 A 43车位3 A 84车位4 D 101816 A 165车位4 D 2021836 E 0010005. 测试记录及收获由于时间紧迫,对于车牌重复,到达时间小于离开时间的情况未做进一步的限制,假定输入的车牌不重复,时间的输入依次递增。为了避免以上错误,设计了遍历停车场情况的函数,以此弥补程序的不足。通过本次实验,我们小组进一步熟悉了栈和队列的区别。无论是链式还是顺序,各有优点,灵活地运用这些结构,可以模拟许多常见的情况。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!