java-BLOG-3

一.前言:
期末测验:
本次测验主要是关于谷仓的体积的计算,一个是长方体,一个是圆柱体,比较两个体积的大小。第一个题目是算这两个体积的大小,第二个题目加上了圆锥体,第三个题目是从小到大排序这三个体积,并按需输出这三个体积。本次测验计算过程是不难的,主要是要注意给出的材料长度是不同形状的周长,要先通过长度计算出半径,再通过半径算出面积,再乘以高度,得出体积。因为是测验时间有限,所以难度不大。
第七、八次题目集:
这两次题目集是在上次题目集的基础是迭代的,说实话,难度有点大,题目设计包括定义类和对象,如Switch、DimmerSwitch、ContinuousDimmer、Light、Fan、MutualSwitch、Curtain等。类的封装,包括私有属性和公共方法。继承与多态,需要定义一个基类Device,然后让其他设备类继承自它。题目要求实现多种设备的控制逻辑,每种设备都有特定的行为和状态。需要解析和处理复杂的连接信息,确保电路的正确模拟。输出格式有严格的要求,需要精确控制输出内容。难度偏高:题目涉及多个设备的模拟,需要理解设备的行为和状态转换,复杂度较高,需要处理复杂的电路连接信息,确保电路的正确模拟,输出格式有严格的要求,需要精确控制输出内容以及逻辑思维要求高:需要理解电路的工作原理,设计合理的算法来模拟电路的行为。

二.设计与分析
期末测验-1
(1)类图

(2)圈复杂度

1.代码结构
Volume类:计算立方体和圆柱体的体积。
calculateCubeVolume方法:计算立方体体积。
calculateCylinderVolume方法:计算圆柱体体积。
提供获取立方体和圆柱体体积的方法。
Input类:存储输入的长度和高度。
Output类:输出体积信息并根据体积大小建议使用哪种类型的粮仓。
Main类:程序入口,负责读取用户输入、验证输入格式、创建对象并调用输出方法。

2.主要功能:
输入处理:从控制台读取一行输入,解析出长度和高度。
输入验证:检查输入是否为两个有效的正数。
体积计算:根据输入的长度和高度计算立方体和圆柱体的体积。
结果输出:输出两种粮仓的体积,并根据体积大小建议使用哪种类型的粮仓。

3.代码逻辑:
使用Scanner类读取用户输入。
检查输入格式是否正确(是否为两个数字)。
将输入的字符串转换为double类型,并检查是否为正数。
创建Input对象存储长度和高度。
使用Input对象的值创建Volume对象,计算体积。
创建Output对象,输出体积信息并给出建议。

4.解释与心得
这代码部分主要是将输入的长度计算出相应的半径,然后再算出体积。

期末测验-2
(1)类图

(2)圈复杂度

1.代码结构
抽象类 Granary:定义了一个粮仓的基本属性 height 和一个抽象方法 calculateVolume(),用于计算粮仓的体积。
具体类 CubeGranary、CylinderGranary 和 ConeGranary:分别继承自 Granary,并实现了 calculateVolume() 方法来计算正方体、圆柱体和圆锥体粮仓的体积。
类 TotalVolume:包含两个静态方法:
createGranaries(double height, List perimeters):根据给定的高度和周长列表创建不同类型的粮仓对象,并返回一个粮仓对象列表。
calculate(List granaries):计算并返回所有粮仓的总体积。
主类 Main:程序的入口,负责从用户输入读取高度和周长列表,调用 TotalVolume 类的方法计算总体积,并输出结果。

2.主要逻辑流程
从用户输入读取粮仓的高度。
继续读取用户输入的周长列表,直到遇到无效输入或非正数。
根据周长的大小创建不同类型的粮仓对象。
计算所有粮仓的总体积。
输出总体积,保留两位小数。

3.解释与心得
方法接收两个参数:height(粮仓的高度)和 perimeters(一个包含多个周长的列表)。创建一个 Granary 对象的列表 granaries。遍历 perimeters 列表中的每个周长值 perimeter:如果 perimeter 大于等于 20,则创建一个 CylinderGranary 对象并添加到 granaries 列表。如果 perimeter 在 15 到 20 之间(包括 15,不包括 20),则创建一个 CubeGranary 对象并添加到 granaries 列表。如果 perimeter 在 5 到 15 之间(包括 5,不包括 15),则创建一个 ConeGranary 对象并添加到 granaries 列表。最后,返回包含所有创建的 Granary 对象的列表 granaries。

期末测验-3
(1)类图

(2)圈复杂度

1.代码结构
Granary:一个抽象类,表示谷仓,包含高度属性和计算体积的抽象方法。
CubeGranary:继承自Granary,表示立方体谷仓,通过周长计算边长,并实现体积计算。
CylinderGranary:继承自Granary,表示圆柱形谷仓,通过周长计算半径,并实现体积计算。
ConeGranary:继承自Granary,表示圆锥形谷仓,通过周长计算半径,并实现体积计算。
AddVolume:包含一个静态方法createGranaries,根据不同的周长创建不同类型的谷仓对象。
Sort:包含一个静态方法sort,用于对谷仓列表按照体积从小到大排序。
Output:包含一个静态方法output,用于输出排序后的谷仓体积。
Main:程序入口,负责读取用户输入的高度和周长列表,创建谷仓对象,排序并输出结果。
2.主要功能流程:
从用户输入读取谷仓的高度。
继续读取一系列周长值,直到遇到非数字或非正数。
根据每个周长值创建相应的谷仓对象(立方体、圆柱或圆锥)。
对创建的谷仓对象列表按体积进行排序。
输出排序后的谷仓体积。

3.解释与心得
Sort 类包含一个静态方法 sort,该方法接收一个 List 类型的参数,并使用 Collections.sort 方法按照谷仓容积从小到大对其进行排序。排序的依据是通过 Comparator.comparingDouble 和 Granary::calculateVolume 方法引用实现的,即根据 Granary 对象的 calculateVolume 方法返回的容积值进行比较。
Output 类包含一个静态方法 output,该方法接收一个 List 类型的参数,并输出排序后的谷仓容积。输出格式为每个容积保留两位小数,并且多个容积之间用空格分隔。最后,输出结果后换行。

第七次题目集-家居强电电路模拟程序-3
(1)类图

(2)圈复杂度

第八次题目集-家居强电电路模拟程序-4
(1)类图

(2)圈复杂度

1.代码结构
主类 Main:
当前主类中,Input 类的实例被创建,但没有调用其 processInput 方法来处理输入。因此,程序会直接输出 "short circuit error" 并结束。
建议调用 inputHandler.processInput(input); 来处理用户输入。
Input 类:
该类负责处理用户输入,包括设备连接和设备调整命令。
processConnection 方法中,createDevice 方法的调用是多余的,因为 SeriesCircuit 类的 processConnection 方法中已经调用了 createDevice。
SeriesCircuit 类:
该类管理设备及其连接关系,负责更新电压和状态。
updateVoltages 方法中,电压的传递逻辑是基于设备类型(控制设备或受控设备)来决定的。
设备类:
包括 Switch, GearSpeedRegulator, ContinuousSpeedRegulator, IncandescentLamp, FluorescentLamp, 和 CeilingFan。
每个设备类都实现了 updateState 方法,根据电压来更新设备的状态。

三.踩坑心得
(1)对于测验第一题,计算体积没问题,但是我考虑少了,缺少输入等于0的情况,这都是我请教了同学之后才发现错误在哪。

(2)输入验证:
程序首先读取一行输入并尝试将其分割为两个部分。如果输入格式不正确(即不是恰好两个数值),它会输出 "Wrong Format" 并终止执行。
使用 Double.parseDouble 将字符串转换为双精度浮点数时,可能会抛出 NumberFormatException。因此,使用了 try-catch 块来捕获这种异常,并在发生时输出 "Wrong Format"。
(3)主要是对边界问题尤为关键,一般边界要特殊处理,防止问题出现。
四.改进建议
(1)重复代码:
Input 类中的 createDevice 方法和 SeriesCircuit 类中的 createDevice 方法功能相同,可以考虑将这个方法移到一个公共的地方,比如 SeriesCircuit 类中,然后在 Input 类中调用。
(2)硬编码:
在 createDevice 方法中,设备类型的判断是通过 deviceID.charAt(0) 来实现的,这种硬编码的方式不够灵活。可以考虑使用配置文件或者枚举类型来管理设备类型。
(3)类职责:
Input 类承担了读取输入和处理输入的双重职责,可以考虑将输入读取和处理逻辑分离,提高代码的可维护性和可测试性。
(4)异常处理:
在 processAdjustment 方法中,使用了 try-catch 来捕获所有异常,但这样会隐藏潜在的问题。应该只捕获特定的异常,并且在 catch 块中提供有意义的错误信息。

五.总结
这次期末测验主要是检测我们的解决问题的效率,如何在有限的时间内处理问题,编写代码。测验的总体难度是不大的,我主要是有个问题,没有考虑到特殊情况,导致错了。而对于第七、八次题目集,我感觉难度明显提升,不仅要求我们具备扎实的基础知识,还需要灵活运用所学内容来解决复杂问题。这些题目集让我意识到自己在算法优化和逻辑推理方面还有待提高。时间限制也是一大挑战。如何在有限的时间内高效地分析问题、设计解决方案并完成编码,是我需要不断练习和改进的地方。合理分配时间,优先解决简单明确的问题,再逐步攻克难题,是未来需要加强的策略。通过这次测验,我认识到编程不仅仅是写出正确的代码,更重要的是培养严谨的思维习惯和良好的编程规范。未来的学习中,我会更加注重细节,多做练习,尤其是针对容易忽略的特殊情况,争取在下次测验中取得更好的成绩。
还有就是我希望大作业可以考虑延长时间,因为基本上是迭代编码,如果这次代码没写出来,下一次就难度就更大了,就更写不出了。可以每次大作业保证两周时间写,下一次大作业的发布是上一次发布的一周后,这样保证了每次大作业写都有两周,同时又不会耽误整体的进度。

posted @ 2024-12-28 22:33  小瑞尔威  阅读(9)  评论(0编辑  收藏  举报