PTA题目集5-7作业总结
- 前言:
(1)知识点总结:
1.类与对象:学会对类进行定义和设计,掌握了类中的对象的创建与使用。我定义了多个类,像 Circle、Coordinate、Rectangle 和 MonteCarloSimulation 等。每个类都拥有自己的属性和方法,通过这些属性和方法可以描述和实现特定的功能。在使用类时,我也掌握了对象的创建方法,通过创建对象并调用类中的方法,提高了各类功能之间的协作能力,优化了各部分代码的结构,我相较于之前只会一味的将代码算法塞到一个类中或者一个方法中,在这次题目集中学会了更多关于代码结构的使用方法,这样不仅提高了代码结构的可读性与可拓展性,也能让我更加清晰的学习代码的编写。
2.单一职责原则:一个类应该仅有一个引起它变化的原因,即一个类只负责一项职责。比如 Barrel 类专门负责管理枪管的价格信息,SalesOrder 类专注于处理销售订单相关的操作,这样设计使每个类的职责清晰明确,方便后续对代码的维护与修改。该原则由于每个类功能单一,提高了代码的可读性与可维护性,增强了其可复用性,降低了代码的耦合性,使整个程序的结构更加稳定。
3.封装:把对象的属性和行为结合成一个独立的单位,将属性设置为私有,并尽可能隐藏对象的内部细节,使外部无法直接访问,但是为私有属性编写getter和setter方法来作为接口访问和操作对象。这样有助于提高软件的安全性、可维护性、可复用性和灵活性。
4.访问修饰符:在类的设计中,我合理使用了访问修饰符。对于类中的属性,我大量使用了 private 修饰符,将这些属性设置为私有,这样就只有本类内部的方法可以访问和操作这些属性,有效避免了外部对属性的非法访问和修改,保障了数据的安全性和完整性。知识点注释:public(公共的,所有类均可访问)、private(私有的,只有本类内部可访问)、protected(受保护的,本类、同包类和子类可访问)
5.构造方法:用于在创建对象时初始化对象的属性。在创建对象时,构造方法发挥了重要作用。我使用了无参构造方法,为对象进行默认的初始化操作,确保对象在创建时具有基本的初始状态。同时,我还使用了有参构造方法,根据不同的需求为对象的成员变量赋予特定的值,从而创建出具有不同初始状态的对象。使用无参构造方法可以对对象进行默认的初始化操作。而使用有参的构造方法可以根据不同的需求为对象的成员变量赋上特定的值,从而创建出具有不同初始状态的对象,满足了程序多样化的需求。
6.方法的定义与调用:方法定义规定了方法的名称、参数、返回值和方法体。方法调用可以实现代码复用,减少重复编程,提高开发效率。在编写代码过程中,我学会了正确定义方法,明确方法的名称、参数、返回值和方法体。通过方法调用,实现了代码的复用,避免了重复编写相似功能的代码,大大提高了开发效率。如方法调用链,用一个方法调用另一个方法,也可以接着调用其他方法,大大提高了代码的复用性与可扩展性。
7.布尔类型:布尔类型只有true和false两种,用于逻辑判断。布尔类型在条件判断语句中作为重要的判断依据,通过简单而明确的逻辑判断,提高了代码的逻辑性,简化了复杂的判断过程,使程序的逻辑更加清晰易懂,便于理解和维护。
(2)题量与难度说明:
这次的PTA题目集相较于之前的c语言作业,题量更加少了,但是题目质量更高,难度也更大了。像电梯调度问题,需要较长时间的思考才能完成,对于基础较差的来说,难度较大,无法在规定时间内完成,更无法进一步完成之后的练习。但是除了电梯程序外,其他题目难度不大,可以很好的提升自己的编程能力和面向对象程序设计思维,相较于刚开学时没有学习java的我来说,学习这门课对我来说提升很大,我不仅对java编程有了新的认识,更是对自己的未来职业有了更加深入的了解,加强了我对编程的信心,因此我希望更加多的系统性学习编程知识。
2.设计与分析:
我举几个比较典型的题目的设计进行分析:
在雨刷控制系统中,我严格遵循了“单一职责原则”,如
Lever类,代表雨刷的控制杆,负责控制杆档位的管理。
Dial类,代表雨刷的刻度盘,负责刻度盘刻度的管理。
Brush类,代表雨刷,负责雨刷速度的管理。
Agent类,作为控制类,负责协调Lever、Dial和Brush类的工作,根据控制杆和刻度盘的状态计算雨刷的速度。
Main类,作为程序的入口,负责接收用户输入的指令,并根据指令调用Agent类的相应方法进行处理。

在分析蒙特卡罗方法求圆周率中,我采用了模块化处理:

这次的代码模块化设计相较于一些传统的代码架构,类的划分更加精细了,但是整体的结构更加清晰,功能也更加明确了。像 Circle 类管理圆的属性,Coordinate 类负责坐标表示,Rectangle 类处理矩形属性,MonteCarloSimulation 类主要用于模拟逻辑的运算,Main 类作为程序入口负责运行交互,这些类都需要花费一定的时间精力去设计和实现,理解和运用起来难度较大,可能无法在短时间内搭建出完善的模块化代码结构,更无法进一步进行代码的优化和扩展。
但是这种模块化设计思路的设计带来的好处是巨大的。各模块的功能清晰,更易于理解和维护,模块之间的耦合度降低,依赖关系更加明确,一个模块的修改不易影响其他模块,提高了代码的稳定性和可扩展性。而且模块具有较高的可复用性,像 Coordinate 类可在众多需要坐标表示的项目中复用,MonteCarloSimulation 类也能用于其他场景,这可以很好地提升代码的开发效率和质量。
相较于没有采用模块化设计的代码,这次的模块化设计对我来说提升很大,我不仅对模块化编程有了新的认识,更是对如何构建大型、复杂的软件系统有了更加深入的了解,加强了我对编写高质量代码的信心。因此我希望能够进行更多的系统性学习,掌握更多关于模块化设计的技巧和方法。不过,其缺点也不能忽视,部分模块功能相对单一,可能会导致类的数量较多,增加了代码的整体复杂度和管理难度。此外,模块之间的交互逻辑虽然清晰,但对于一些复杂的业务需求,可能需要多个模块之间频繁调用方法,这会在一定程度上影响程序的性能。
在电梯运行系统中,对学生的逻辑推理能力要求较高,我并没有完成这个题目,以下是我的类图设计:

以下是我的电梯程序出现的错误:

在处理短的测试用例时结果并没有出错,但是当测试用例的数量开始增加,程序就会出现错误,如运行超时,这是代码中的判断部分出现的错误,只有优化算法,减少时间复杂度才能解决。
3.踩坑心得:

分析这个报表内容可知,该文件代码结构较清晰(复杂度不高),但注释较少,Main.main() 方法相对复杂。
可能是因为ArrayList移除元素的性能问题在 Elevator的removeHandledReq方法中,使用 ArrayList 存储内部请求 innerReq 和外部请求 outerReq,并通过 remove(0) 移除列表头部元素。ArrayList 移除头部元素的时间复杂度为 (O(n)),因为需要将后面的元素依次向前移动,当请求数量较多时,会严重影响性能。
4.改进建议:
这次的PTA题目除了电梯难度较大外,其他题目都是可以解决的。所以关于电梯问题,我希望可以增加更多测试点,可以一步一步的拿分,可能有一部分原因在于,这一题提交通过才能得分,所以会有挫败感,后面的题目也失去了继续写下去的信心。但是对于其他题目,我都可以完成,这些题目对我的提升还是挺大的,尤其是与这门课程有关的设计,我在编写代码时会更加注意程序的模块化处理,以及代码的复用性和可拓展性。
5.总结:
通过本次学习,我从 "面向过程" 的编程思维逐步转向 "面向对象",理解了封装、继承、多态的核心思想,以及单一职责、模块化设计对大型项目的重要性。尽管在电梯调度等难题中遇到瓶颈,但通过分析错误、优化设计,深刻体会到编程不仅是实现功能,更是对逻辑严谨性、代码可维护性的追求。对于以后的规划,我将继续加强数据结构与算法学习,提升复杂问题拆解能力,同时注重代码规范(如增加更加详细的注释、更合理的代码设计),为构建高质量软件系统打下更坚实的基础,为我的未来职业规划作打算。

浙公网安备 33010602011771号