南昌航空大学-ptajava

news/2025/11/22 19:33:48/文章来源:https://www.cnblogs.com/frjavazuoye/p/19258432

前言
本次对PTA作业进行总结,共三道Java大题,为电梯调度程序的迭代开发。涉及到基础Java语言的运用,look电梯调度算法的实现,队列结构的使用,枚举类型运用,类设计,迭代开发能力等知识点。

第一次作业:单部电梯调度程序
设计一个电梯类,具体包含电梯的最大楼层数、最小楼层数(默认为1层)当前楼层、运行方向、运行状态,以及电梯内部乘客的请求队列和电梯外部楼层乘客的请求队列,其中,电梯外部请求队列需要区分上行和下行。
电梯运行规则如下:电梯默认停留在1层,状态为静止,当有乘客对电梯发起请求时(各楼层电梯外部乘客按下上行或者下行按钮或者电梯内部乘客按下想要到达的楼层数字按钮),电梯开始移动,当电梯向某个方向移动时,优先处理同方向的请求,当同方向的请求均被处理完毕然后再处理相反方向的请求。电梯运行过程中的状态包括停止、移动中、开门、关门等状态。当电梯停止时,如果有新的请求,就根据请求的方向或位置决定移动方向。电梯在运行到某一楼层时,检查当前是否有请求(访问电梯内请求队列和电梯外请求队列),然后据此决定移动方向。每次移动一个楼层,检查是否有需要停靠的请求,如果有,则开门,处理该楼层的请求,然后关门继续移动。
使用键盘模拟输入乘客的请求,此时要注意处理无效请求情况,例如无效楼层请求,比如超过大楼的最高或最低楼层。还需要考虑电梯的空闲状态,当没有请求时,电梯停留在当前楼层。
请编写一个Java程序,设计一个电梯类,包含状态管理、请求队列管理以及调度算法,并使用一些测试用例,模拟不同的请求顺序,观察电梯的行为是否符合预期,比如是否优先处理同方向的请求,是否在移动过程中处理顺路的请求等。为了降低编程难度,不考虑同时有多个乘客请求同时发生的情况,即采用串行处理乘客的请求方式(电梯只按照规则响应请求队列中当前的乘客请求,响应结束后再响应下一个请求)。

输出格式:
模拟电梯的运行过程,输出方式如下:
运行到某一楼层(不需要停留开门),输出一行文本:
Current Floor: 楼层数 Direction: 方向
运行到某一楼层(需要停留开门)输出两行文本:
Open Door # Floor 楼层数
Close Door

输入样例:
1
20
❤️,UP>
<5>
<6,DOWN>
<7>
<3>
End

输出样例:
Current Floor: 1 Direction: UP
Current Floor: 2 Direction: UP
Current Floor: 3 Direction: UP
Open Door # Floor 3
Close Door
Current Floor: 4 Direction: UP
Current Floor: 5 Direction: UP
Open Door # Floor 5
Close Door
Current Floor: 6 Direction: UP
Current Floor: 7 Direction: UP
Open Door # Floor 7
Close Door
Current Floor: 6 Direction: DOWN
Open Door # Floor 6
Close Door
Current Floor: 5 Direction: DOWN
Current Floor: 4 Direction: DOWN
Current Floor: 3 Direction: DOWN
Open Door # Floor 3
Close Door

第二次作业:单部电梯调度程序(类设计)
对之前电梯调度程序进行迭代性设计,目的为解决电梯类职责过多的问题,类设计要求遵循单一职责原则(SRP),要求必须包含但不限于设计电梯类、乘客请求类、队列类以及控制类。
电梯运行规则与前阶段单类设计相同,但要处理如下情况:
乘客请求楼层数有误,具体为高于最高楼层数或低于最低楼层数,处理方法:程序自动忽略此类输入,继续执行
乘客请求不合理,具体为输入时出现连续的相同请求,例如<3><3><3>或者<5,DOWN><5,DOWN>,处理方法:程序自动忽略相同的多余输入,继续执行,例如<3><3><3>过滤为<3>

输入格式:
第一行输入最小电梯楼层数。
第二行输入最大电梯楼层数。
从第三行开始每行输入代表一个乘客请求。
电梯内乘客请求格式:<楼层数>
电梯外乘客请求格式:<乘客所在楼层数,乘梯方向>,其中,乘梯方向用UP代表上行,用DOWN代表下行(UP、DOWN必须大写)。
当输入“end”时代表输入结束(end不区分大小写)。

输出格式:
模拟电梯的运行过程,输出方式如下:
运行到某一楼层(不需要停留开门),输出一行文本:
Current Floor: 楼层数 Direction: 方向
运行到某一楼层(需要停留开门)输出两行文本:
Open Door # Floor 楼层数
Close Door

输入样例:
1
20
❤️,UP>
<5>
<6,DOWN>
<7>
<3>
End

输出样例:
Current Floor: 1 Direction: UP
Current Floor: 2 Direction: UP
Current Floor: 3 Direction: UP
Open Door # Floor 3
Close Door
Current Floor: 4 Direction: UP
Current Floor: 5 Direction: UP
Open Door # Floor 5
Close Door
Current Floor: 6 Direction: UP
Current Floor: 7 Direction: UP
Open Door # Floor 7
Close Door
Current Floor: 6 Direction: DOWN
Open Door # Floor 6
Close Door
Current Floor: 5 Direction: DOWN
Current Floor: 4 Direction: DOWN
Current Floor: 3 Direction: DOWN
Open Door # Floor 3
Close Door

第三次作业:单部电梯调度程序(类设计-迭代)
对之前电梯调度程序再次进行迭代性设计,加入乘客类(Passenger),取消乘客请求类,类设计要求遵循单一职责原则(SRP),要求必须包含但不限于设计电梯类、乘客类、队列类以及控制类。
电梯运行规则与前阶段相同,但有如下变动情况:
乘客请求输入变动情况:外部请求由之前的<请求楼层数,请求方向>修改为<请求源楼层,请求目的楼层>
对于外部请求,当电梯处理该请求之后(该请求出队),要将<请求源楼层,请求目的楼层>中的请求目的楼层加入到请求内部队列(加到队尾)

输入格式:
第一行输入最小电梯楼层数。
第二行输入最大电梯楼层数。
从第三行开始每行输入代表一个乘客请求。
电梯内乘客请求格式:<楼层数>
电梯外乘客请求格式:<请求源楼层,请求目的楼层>,其中,请求源楼层表示乘客发起请求所在的楼层,请求目的楼层表示乘客想要到达的楼层。
当输入“end”时代表输入结束(end不区分大小写)。

输出格式:
运模拟电梯的运行过程,输出方式如下:
行到某一楼层(不需要停留开门),输出一行文本:
Current Floor: 楼层数 Direction: 方向
运行到某一楼层(需要停留开门)输出两行文本:
Open Door # Floor 楼层数
Close Door

输入样例:
1
20
<5,4>
<5>
<7>
End

输出样例:
Current Floor: 1 Direction: UP
Current Floor: 2 Direction: UP
Current Floor: 3 Direction: UP
Current Floor: 4 Direction: UP
Current Floor: 5 Direction: UP
Open Door # Floor 5
Close Door
Current Floor: 6 Direction: UP
Current Floor: 7 Direction: UP
Open Door # Floor 7
Close Door
Current Floor: 6 Direction: DOWN
Current Floor: 5 Direction: DOWN
Open Door # Floor 5
Close Door
Current Floor: 4 Direction: DOWN
Open Door # Floor 4
Close Door

设计与分析
第一次作业
测试:

863f1893ed3313397cc1616d0845af75

class Elevator {
// 属性:当前楼层、方向、状态、请求队列
// 方法:移动、处理请求、LOOK算法
}
算法可以直接实现,逻辑还是比较清晰的,但是示例过了提交不过,代码细节还是不够到位,逻辑性差而且可读性也不好。

第二次作业
类设计
4a32094075044a06567af3e3e79f87c4

测试:
46f36cf96733c7bc8d03253b30f26456

class PassengerRequest // 乘客请求类
class RequestQueue // 请求队列管理类
class Elevator // 电梯状态类
class Controller // 调度控制类
这次实验主要考察类设计,设计了请求,电梯状态,调度等,逻辑比上次更清晰,但是设计类的时候还是又小逻辑错误,不过条理清晰也方便修改。

第三次作业
类设计
bdf01bbac1bdc1b4dcc6ec2f272983dc

测试:
cf654219d0962cedd430878380f1b55d

class Passenger { // 乘客类
-Integer sourceFloor
-Integer destinationFloor
}

class RequestQueue {
-LinkedList internalRequests
-LinkedList externalRequests
+addDestinationAsInternalRequest()
}
这次依旧是示例过了提交没过,最后运行超时,题目难度对我来说还是有点高的,逻辑错误一堆,三次作业都没过,有点学艺不精了。
踩坑心得
这三次作业都想的太简单了,做的时候又绕了好几个弯子, 做第三次作业时,我想在第二次作业的基础上做简单修改,结果发现新的PASSENGER类与原有请求类结构有冲突,然后又重构整个类关系。

改进建议
别把所有功能都塞在一个类里,像调度算法应该单独抽出来,做成可以随时替换的模块。这样以后想换别的算法就不用重新大改。同时得养成边写边测试的习惯。每次改完代码跑一遍测试。而且要学会用工具帮我们管代码。比如用deeepseek等来帮助每次改动,提高代码质量。这些工具能让我们少踩很多坑,有时候报错的原因可能仅仅是符号错误或者把main打成mian这种低级错误。可维护性也很重要,多写注释、文档,但别写废话。关键是要把为什么这么设计说清楚,过几个月自己再看还能看懂。

总结
第一次作业:掌握了look电梯调度的基本逻辑,能够应用队列数据结构在调度中应用。
第二次作业:对之前电梯调度程序进行迭代性设计,目的为解决电梯类职责过多的问题,类设计要求遵循单一职责原则(SRP),设计了跟复杂的类关系,学会了请求队列的管理和无效输入处理方法。
第三次作业:对之前电梯调度程序再次进行迭代性设计,加入乘客类(Passenger),取消乘客请求类,对代码进行最新迭代,重构,对架构进行了优化。
第一次作业我把电梯怎么运行的逻辑写出来,功能都直接塞进去,虽然能跑起来,但是太过混乱。第二次作业分做了不同的类,整体代码变得更有条理,第三次迭代难度的大得多,只能把部分功能做出来,虽然最后提交不过,但是此次学习增进了对新算法编程的学习能力以及应对能力。

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

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

相关文章

sguardsvc64.exe(Anti-Cheat Expert)驱动不兼容导致无法开启“内核模式硬件强制堆栈保护”或“内存完整性”

windows安全感中心,有时候会提示无法开启“内核模式硬件强制堆栈保护”或“内存完整性”。打开详情会显示sguardsvc64.exe的原因,这个其实是腾讯反作弊系统相关的文件。大概率你是一个腾讯游戏玩家。刚开始网上搜索如…

Wi-Fi FTM 技术 10 年后展望

1. 技术成熟背景 假设 10 年后,全球 Wi-Fi AP 生态全面升级,所有 AP 都支持 IEEE 802.11mc/ax FTM 功能,同时绝大多数智能手机和平板、IoT 设备也原生支持 FTM 测距。这意味着:用户设备无需额外硬件即可实现高精度…

Docker使用【镜像】 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

20251122

在我的世界forge版本的mod开发中,虽然总体逻辑不难,但要记住的方法和类名一大堆,要是想上手得多写多看啊

2025年11月22日训练赛

F1. Cycling (Easy Version) #include<bits/stdc++.h> using namespace std; #define endl \n #define yes cout << "Yes" << endl #define no cout << "No" << en…

Python 潮流周刊#128:将 Rust 语言引入 CPython

本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 温馨提…

NCHU_单部电梯调度程序总结blogs

一、前言 这三次作业虽然都围绕着同一个主题——“单部电梯调度”,但每一次都在逼着我更深入地理解面向对象设计、系统分层思想和程序可维护性这些看似抽象但又极其实用的概念。 知识点: 基础的 面向对象编程(类、属…

AI填补核聚变传感器数据空白技术解析

普林斯顿大学开发的新型AI工具Diag2Diag通过生成合成数据填补等离子体诊断空白,该技术能减少对大型硬件的依赖,使未来聚变反应堆更紧凑可靠,同时适用于航天器和机器人手术等领域。AI填补核聚变传感器数据空白技术解…

电梯调度程序分析

一.前言本次博客将完整复盘电梯调度系统的三次迭代开发历程。第一次迭代聚焦核心功能落地,以单一电梯类封装所有状态、队列与调度逻辑,实现 “同向优先、逐层停靠” 的基础运行规则,解决 “能跑起来” 的核心问题;…

Hive动态分区怎样减少存储压力

Hive动态分区是一种根据数据量自动创建分区的功能,它可以有效地减少小文件的数量,从而提高查询性能。然而,动态分区也可能导致存储压力增加,因为它会生成大量的分区文件。为了减少存储压力,可以采取以下策略:调整…

dockers拉取redis镜像

1.修改 Docker 配置文件 vim /etc/docker/daemon.json 2.添加国内镜像源 将以下内容写入文件(选择阿里云、网易云等镜像): { "registry-mirrors": ["https://dh-mirror.gitverse.ru", "ht…

面向对象程序设计——单元总结

前言 这次的三个单部电梯调度实验是层层递进的。从第一个作业的一个“上帝类”Elevator类;到第二个作业的解决实验一中“职责过多”的问题,遵循SRP,将不同的职责拆分到不同的类中,从而引入Request类、Queue类、Con…

Linux命令绕过 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

帮同学签了个到,我发现竟然能盗光他所有账号

你的数字生活,可能正悬在一根头发上。 我们先做一个简单的灵魂拷问:你所有网络账号的密码,是不是都在用那么两三个“老伙计”轮换?或者更糟糕一点,你是不是在用同一个密码,通行于淘宝、微信、Steam 和那个不知名…

MyBatis Flex 讲解使用

目录1 MyBatis Flex1.1 简介1.2 简单操作1.2.1 配置1.2.1.1 pom.xml1.2.1.2 yml配置1.2.2 生成代码1.2.3 业务类1.2.3.1 实体1.2.3.2 实体脱敏1.2.3.3 Mapper接口1.2.3.4 Service层1.3 MyBatis-Flex 核心 API1.3.1 条件…

Catalog

东西有点杂,稍微整理一下。 Algorithm Introduction【老】Splay 浅谈

NCHU_Blog1_刘素萍_单部电梯调度程序

一、前言 经过前几周的课堂讲解与视频学习,已初步掌握 Java 的基础用法。相较于 C 语言,Java 最核心的差异在于引入了 “类” 的概念 —— 课堂上老师对此概念花了大力气进行了重点讲解。在PTA完成了前三次 Java 迭代…

同花顺通达信常用颜色图标

1)Color 自定义色格式为color+“Rrggbb”:Rr、Gg、Bb表示红蓝色、绿色和蓝色 2)Colorblack 黑色画黑色 3)Colorblue 蓝色画蓝色 4)Colorgreen 绿色画绿色 5)Colorcyan 青色画青色 6)Colorred 红色画红色 7)Col…

hive sql开发难不难

Hive SQL开发的难度因人而异,但总体来说,对于熟悉SQL的开发者来说,Hive SQL的学习曲线相对平缓,因为Hive SQL语法与标准SQL相似。以下是对Hive SQL开发难度、入门建议以及是否适合初学者的分析: Hive SQL开发难度…

数学的大厦(五):除法、有理数、等价关系

在整数这个崭新的世界里,乘法是畅通无阻的。但它的逆运算——除法,又成了新的不可能任务。6 / 3 = 2,没问题,结果还是个整数。但 3 / 6 呢?2 / 3 呢?1 / 2 呢?在整数的世界里,没有它们的容身之处。 是时候再次…