基于C++实现(控制台)停车场管理系统【100010020】

news2024/11/15 17:23:48

停车场管理系统

1 需求分析

1.1问题描述

停车场内只有一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。

汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若车场内已停满 n 辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入。

当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开车场时必须按它停留的时间长短交纳费用。

试为停车场编制按上述要求进行管理的模拟程序。

1.2基本要求

以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理;

每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费);

栈以顺序结构实现,队列以链表实现。

2 概要设计

2.1数据结构

2.1.1时间类

时间是进行收费的依据,此处假定时间在一天之内。时间类既可以表示一个时刻,也可以表示一段时间长度。

时间类数据成员:

  • hour:指示时钟
  • minute:指示分钟

时间类成员函数:

  • Time:构造函数
  • operator+=:进行时间的复合加法,即将相加后的结果赋给当前对象,并返回当前对象
  • operator-=:进行时间的复合减法,即将相减后的结果赋给当前对象,并返回当前对象
Time

+ hour: int

+ minute: int

+ Time()

+ Time(hour: int, minute: int)

<> operator+(left: const Time&, right: const Time&): Time

+ operator+=(right: const Time&): Time

<> operator-(left: const Time&, right: const Time&): Time

+ operator-=(right: const Time&): Time

<> operator==(left: const Time&, right: const Time&): bool

<> operator<(left: const Time&, right: const Time&): bool

<> operator<=(left: const Time&, right: const Time&): bool

<> operator>(left: const Time&, right: const Time&): bool

<> operator>=(left: const Time&, right: const Time&): bool

<> operator<<(os: ostream&, t: const Time&): ostream&

时间类非成员函数:

  • operator+:时间加法

  • operator-:时间减法

  • operator==:判断时间是否相等

  • operator<:判断前一个时间是否小于后一个时间

  • operator<=:判断前一个时间是否小于等于后一个时间

  • operator>:判断前一个时间是否大于后一个时间

  • operator>=:判断前一个时间是否大于等于后一个时间

  • operator<<:将时间输出到输出流中

    2.1.2汽车类

汽车是后续操作的基础元素,结合题目要求,汽车应包含牌照号码、停车时间等数据。汽车类数据成员:

  • number:汽车牌照号码
  • lastTime:最后一次在停车场(栈)内的时刻
  • parking: 停车时间

lastTime 和 parking 并非实时更新,而是当有车辆到达或离去时才会做相应的改变。

Car

- number: string

- lastTime: Time

- parking: Time

+ Car()

+ Car(number: string)

+ operation==(car: const Car&): bool

+ updateLastTime(time: const Time&)

+ setLastTime(time: const Time&)

+ getLastTime(): Time

+ addParkingTime(time: const Time&)

<> operator<<(os: ostream&, t: const Car&): ostream&

汽车类成员函数:

  • Car:构造函数
  • operation==:判断是否为同一辆汽车(只判断牌照号码)
  • updateLastTime:设置最后一次在停车场(栈)内的时刻,并增加停车时间
  • setLastTime:设置最后一次在停车场(栈)内的时刻
  • getLastTime:获取最后一次在停车场(栈)内的时刻
  • addParkingTime:增加停车时间
  • getParingTime:获取停车时间

汽车类非成员函数:

  • operator<<:将汽车信息输出到输出流中

2.1.3栈类模板

栈是一种“先进后出”的数据结构,此处用于组织停车场内汽车的停放。我们选用线性结构实现栈,并进行模板化,以便下次复用。

模板参数 T1,表示基础元素类型,在编写代码时,可设为 Car。

从模板参数 T,定义出以下几种嵌套类型:

  1. T −→ value_type,基础元素类型
  2. T∗ −→ pointer,指针
  3. const T∗ −→ const_pointer,常指针
  4. T & −→ reference,引用
  5. const T & −→ const_reference,常引用
Stack

- _top: pointer

- _base: pointer

- _cap: pointer

+ Stack()

Stack()

+ operator[](pos: size_type): reference

+ operator[](pos: size_type): const_reference

+ top(): reference

+ top(): const_reference

+ empty(): bool

+ size(): size_type

+ capacity(): size_type

+ push(data: const_reference)

+ pop()

+ index(data: const_reference): size_type

+ print()

+ reserve(newCapacity: size_type)

栈类数据成员:

  • _top 栈顶
  • _base 栈底
  • _cap 当前栈存储空间的尾部

特别指出,栈顶指针 _top,其初值指向栈底,即 _top == _base 可作为栈空的标记,每当插入新的栈顶元素时,指针 _top 增 1;删除栈顶元素时,指针 _top 减 1,因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。

_cap 指针则仅指示当前栈存储空间的尾部,其真实地址则是尾部的下一个位置。这两种设计都是为了方便程序的编写。

栈类成员函数:

  • Stack:构造函数
  • Stack:析构函数
  • operator[]:访问器
  • top:访问栈顶

size_type 是无符号超长整型,源于 std::size_t。

设置访问器仅用于方便本次项目的代码编写,破坏了栈的设计原则,在编写一般程序时,不应在栈中设置访问器。

  • empty:判断栈是否为空
  • size:获取栈长
  • capacity:获取栈的存储容量
  • push:入栈
  • pop:出栈
  • index:寻找元素的第一个位置
  • print:打印栈
  • reserve:重新分配存储空间容量

2.1.4队列类模板

队列,是一种“先进先出”的数据结构,此处可用于模拟停车场外的便道。我们选用链式结构实现队列,并进行模板化,以便下次复用。

模板参数 T1,表示基础元素类型,在编写代码时,可设为 Car。

首先设计一个队列节点类,与链表节点类似:

QNode

- _data: value_type

- _next: node_ptr

+ QNode()

+ QNode(data: const_reference, next = nullptr: const_node_ptr)

+ data(): reference

+ data(): const_reference

+ setData(data: const_reference)

+ next(): node_ptr

+ next(): const_node_ptr

+ setNext(next: const_node_ptr)

队列节点类数据成员:

_data:数据域

从模板参数 T 定义出的嵌套类型与 Stack 类相似,但增加了 4 个嵌套定义:

  • QNode < T > ∗ −→ node*_ptr,节点指针
  • const QNode < T > ∗ −→ const*_node_ptr,节点常指针
  • QNode < T > & −→ node_ref ,节点引用
  • const QNode < T >* & −→ const_node_ref ,节点常引用

_next:指针域,指向下一节点

队列节点类成员函数:

  • QNode:构造函数
  • data:返回数据域
  • setData:设置数据域
  • next:返回下一节点
  • setNext:设置下一节点

然后以队列节点为基础设计队列类模板:

Queue

- _front: node_ptr

- _back: node_ptr

+ Queue()

Queue()

+ front(): reference

+ front(): const_reference

+ back(): reference

+ back(): const_reference

+ empty(): bool

+ size(): size_type

+ push(data: const_reference)

+ pop()

+ erase(data: const_reference)

+ print()

队列类数据成员:

  • _front:队头指针
  • _back:队尾指针

队列类成员函数:

  • Queue:构造函数
  • ∼* Queue:析构函数
  • front:返回队头
  • back:返回队尾
  • empty:返回队列是否为空
  • size:返回队列的大小
  • push:入队列
  • pop:出队列
  • erase:直接擦除第一个值为 data 的节点1
  • print:打印队列

2.1.5停车场类

依据题意,整个停车场包含一个有限容量的停车场(栈)和场外的便道(队列)。将栈和队列综合,封装成一个停车场类。

ParkLot

- s: Stack

- q: Queue

- size: size_t

+ ParkLot()

+ ParkLot(size: size_t)

+ add(carNumber: const string&, arriveTime: const Time&)

+ reduce(carNumber: const string&, leaveTime: const Time&)

+ print()

停车场类数据成员:

  • s:停车场 (栈)
  • q:便道 (队列)
  • size:停车场容量 (栈最大大小)

停车场类函数成员:

  • ParkLot:构造函数
  • add:到达汽车
  • reduce:离开汽车
  • print:打印停车场

设计此函数仅用于方便本项目代码的编写,破坏了队列的设计原则,在编写一般程序时,不应在队列中设置此函数。

4测试分析

使用 G++ 编译器编译本实例,运行测试。
在这里插入图片描述

图 1: 初始化及菜单

在这里插入图片描述

图 2: 到达停车场

在这里插入图片描述

图 3: 到达便道

在这里插入图片描述

图 4: 从停车场离去车辆

在这里插入图片描述

图 5: 没有找到车辆

在这里插入图片描述

图 6: 从便道离去车辆

在这里插入图片描述

图 7: 显示停车情况

5总结

通过本次项目实践,熟练地掌握了栈、队列这两种数据结构,并实现了顺序栈、链队列模板的编写,增强了编码能力。

结合栈、队列设计停车场管理系统,使得栈和队列得到实际应用。在实践过程中,需要借助栈和队列对停车场内以及便道上的车辆进行有序地调度,增强了离散事件问题的模拟算法设计与求解的能力。同时,设计入栈、出栈、入队列、出队列、计时收费等系列算法的设计,对计算机如何模拟实际问题有了较好的感性理解。

♻️ 资源

在这里插入图片描述

大小: 6.42MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87248068

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vite3+vue3二次封装antdvue组件方法

有时候,第三方的组件库不能满足我们的业务需求,就有必要对别人的组件进行再次的封装,下面我们以antdvue里面的button组件二次封装为例,研究下封装的过程 最后效果 基础代码 <template><div><a-button type="primary" v

网络爬虫urllib库常用函数解析

文章目录前言urllib介绍urllib发送请求urllib编码与解码urllib异常处理urllib使用IP代理urllib使用cookie前言 快期末了&#xff0c;有个数据挖掘的大作业需要用到python的相关知识&#xff08;这太难为我这个以前主学C的人了&#xff0c;不过没办法还是得学&#x1f602;&…

我的周刊(第069期)

我的信息周刊&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。&#x1f3af; 项目ChatGPT[1]本周最火爆的项目是 ChatGPT 应该没有意义…

ChatGPT使用初体验

ChatGPT使用初体验 注册chatGPT ChatGPT官网&#xff1a;https://openai.com/blog/chatgpt/ 登录官网进行账号注册&#xff1a; 我相信以各位小伙伴的能力是可以成功注册到账号的。 ChatGPT使用 自从在抖音上、CSDN上看到众多大佬对ChatGPT的一致好评&#xff0c;顿时我就…

论文笔记-时序分类-Rocket

论文标题&#xff1a; ROCKET: exceptionally fast and accurate time series classification using random convolutional kernels 论文链接&#xff1a; https://www.xueshufan.com/publication/3042807565 代码链接&#xff1a; https://github.com/angus924/rocket 发表年份…

Linux系统网络编程——第十九节 多路复用(1)(概念、select、poll)

目录 概念引出 select select的特点 select缺点 poll 概念引出 我们来思考一个问题&#xff1a; 什么叫IO(input output)? 读取或者写入&#xff08;IO&#xff09;本质就是&#xff1a;等拷贝。 读&#xff1a;等将数据从内核空间&#xff08;缓冲区&#xff09;拷贝…

C++(第十一篇):继承(基类与派生类、菱形继承和菱形虚拟继承问题)

&#x1f4d2;博客主页&#xff1a;Morning_Yang丶 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4cc;本文所属专栏&#xff1a;【C拒绝从入门到跑路】 &#x1f64f;作者水平有限&#xff0c;如果发现错误&#xff0c;敬请指正&am…

虚拟机||后续1:使用Virtual Box7.0.4安装Ubuntu20.04图文教程+解决时间显示乱码问题

这个博主超爱碎碎念&#xff1a;&#xff09; 哈喽&#xff0c;四海八方的友友们&#xff0c;我胡汉三又回来啦&#xff08;&#xffe3;︶&#xffe3;&#xff09;↗ 有挺长一段时间没更新了&#xff0c;转眼间12月了&#xff0c;又到年底冲业绩的时候啦ψ(&#xff40;∇)ψ…

【大数据入门核心技术-Hadoop】(七)Hadoop基本Shell命令行

目录 一、 三种shell命令方式 二、常见Shell操作命令 1、创建文件夹 2、查看指定目录下内容 3、上传文件到HDFS指定目录下 4、查看HDFS文件内容 5、下载HDFS文件 6、拷贝HDFS文件 7、追加数据到HDFS文件中 8、HDFS数据移动操作 9、创建文件 10、查看磁盘使用情况 1…

金融信创与云化转型|基金超融合架构转型与场景探索合集

随着数字化经济的蓬勃发展&#xff0c;基金数字化转型作为金融行业发展的重点被提上日程。其中&#xff0c;证监会于 2022 年 4 月发布的《关于加快推进公募基金行业高质量发展的意见》中强调&#xff0c;基金行业应强化行业基础设施建设&#xff0c;以拥抱数字化金融市场&…

MySQL内置函数

MySQL内置函数1 .日期函数2.字符串函数3.数学函数4.其它函数5.综合练习题1 .日期函数 current_date() 当前日期获得年月日 mysql> select current_date(); ---------------- | current_date() | ---------------- | 2022-12-10 | ---------------- 1 row in set (0.0…

C语言基础—程序创建过程和编译过程

C程序的创建过程 4️⃣ C 程序的创建过程有4️⃣个基本步骤&#xff1a; 编写、编译、链接和运行。 编写&#xff1a;用文本编辑器或IDE编写源代码。源代码包含程序所需的所有命令和语句。编译&#xff1a;使用编译器对源代码进行编译&#xff0c;生成可执行文件。 - .o 文件…

gyp ERR find Python 解决方案

命令行报错如下 E:\vue-admin\node_modules\fibers>if not defined npm_config_node_gyp (node "D:\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild --releas e ) else (node "…

Java项目:SSM物流快递管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 仓库管理员角色包含以下功能&#xff1a; 仓库管理员操作,入库操作,员工查看,揽收快件,新建员工等功能。 快递员角色包含以下功能&#xff1a; …

Nacos服务注册解析

服务注册就是在微服务启动时自动注册进nacos注册中心&#xff0c;核心逻辑就是在启动时调用nacos-server端的http接口:/nacos/v1/ns/instance&#xff0c;具体参考nacos官方文档。 我们打开nacos源码结构查看 上图为Nacos2.2的源码结构.其中比较核心的就是这几个包&#xff1…

墨者学院 PHP代码分析溯源(第4题) 详解

今天继续给大家介绍CTF通关writeup&#xff0c;本文主要内容是墨者学院 PHP代码分析溯源(第4题)。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严…

尝试使用CubeMX做stm32开发之十四:FatFs的基础知识

一、文件系统概念 文件系统&#xff1a;在存储介质中建立一种组织架构&#xff0c;以更好地储存和管理数据 文件系统一般包含&#xff1a;操作系统引导区、目录、文件等 文件系统中数据以文件的形式存储 文件系统中数据的存取需要遵循特定的格式 与直接操作存储介质相比&a…

[附源码]计算机毕业设计基于SpringBt的演唱会购票系统论文2022Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

C++ MySQL Error 1366 incorrect string value引发的认识

C MySQL Error 1366 incorrect string value引发的认识 前言 在使用MySQL C API编写程序时&#xff0c;由于用到了中文&#xff0c;导致出现了MySQL error 1366 incorrect string value 问题&#xff0c;但令我同样不解的是我用同样的语句在cmd下可以正常执行。&#xff08;M…

【算法】动态规划 ⑤ ( LeetCode 63.不同路径 II | 问题分析 | 动态规划算法设计 | 代码示例 )

文章目录一、问题分析二、动态规划算法设计1、动态规划状态 State2、动态规划初始化 Initialize3、动态规划方程 Function4、动态规划答案 Answer三、代码示例LeetCode 63. 不同路径 II : https://leetcode.cn/problems/unique-paths-ii/ 一个机器人位于一个 m x n 网格的左上…