题集7-8的总结

news/2025/3/10 22:09:47/文章来源:https://www.cnblogs.com/zero1223/p/18637556

一:前言:

1.知识点:主要包括类和对象的使用、数据封装、方法的定义和使用、继承、多态、泛型、抽象类,集合框架,异常处理,字符串处理、以及基本的输入输出操作。
2.题量:现在的题目集都是一道题了,题量没什么说的。
3.难度:每次题集的难度都较大,每次都要7.8小时及以上,第七次的电路题增加了互斥开关和受控窗帘,互斥开关需要记录接入的引脚是1,2或者1,3,然后再判断开关的状态,受控窗帘
只需要和之前的受控元件一样处理即可。第八次的电路题难度很大,需要改变的逻辑很多,之前的电路题我的思路都是先判断电路的通路,短路和断路,然后通过计算每个元件的电阻和总
电阻来得到每个元件的分压,但是这一次还需要给出每个引脚的电压,而且电路更加复杂,需要考虑右边引脚的电位可能大于左边引脚的电位等许多难以考虑到的情况,难度很大。

二:设计与分析:

第七次作业:
家居强电电路模拟程序-3:模拟了一个电路系统中设备的操作,包括开关、调速器和受控设备(如灯具和风扇等),在之前的基础上互斥开关和受控窗帘。
类的详细设计

  1. Device(抽象类)
    属性:
    id:设备的唯一标识符。
    pin1 和 pin2:记录接入的引脚是1,2或者1,3,再判断开关的状态
    vd:电压差。
    resistance:设备的总电阻。
    方法:
    构造函数:初始化设备ID。
    getResistance():抽象方法,用于获取设备的总电阻。

  2. ControlDevice(抽象类)
    继承自:Device
    属性:
    继承自Device的所有属性。
    resistance:初始化为0,表示控制设备的电阻。
    方法:
    构造函数:初始化设备ID和电阻。
    OutVoltage(double v):抽象方法,根据输入电压计算输出电压。
    getResistance():返回设备的电阻。

  3. ControlledDevice(抽象类)
    继承自:Device
    方法:
    构造函数:初始化设备ID。
    setState(double v):抽象方法,根据电压差设置设备的状态。

  4. SerialCircuit(类)
    继承自:Device
    属性:
    继承自Device的所有属性。
    rnn:表示接入互斥开关的哪个口,2或者3。
    flag:标志位。
    flat:用于标记电路的连接状态。
    devices:存储串联电路中的设备列表。
    totalResistance:计算得到的总电阻。
    方法:
    构造函数:初始化设备ID。
    addDevice(Device device):添加设备到电路。
    getResistance():返回计算得到的总电阻。
    calculateVoltage(double inputVoltage):计算电路中每个设备的电压。

  5. ParallelCircuit(类)
    继承自:Device
    属性:
    继承自Device的所有属性。
    rnn:表示接入互斥开关的哪个口,2或者3。
    flat:用于标记电路的连接状态。
    circuits:存储并联电路中的串联电路列表。
    totalResistance:计算得到的总电阻。
    方法:
    构造函数:初始化设备ID。
    addCircuit(SerialCircuit circuit):添加串联电路到并联电路。
    updateResistance():更新并联电路的总电阻。
    getResistance():返回计算得到的总电阻。
    calculateVoltage(double inputVoltage):计算并联电路中每个串联电路的电压。

  6. MutualSwitch(类)
    继承自:ControlDevice
    属性:
    继承自ControlDevice的所有属性。
    pin12Resistance:12之间默认电阻。
    pin13Resistance:13之间默认电阻。
    state:互斥开关的状态。
    方法:
    构造函数:初始化设备ID。
    OutVoltage(double v):根据互斥开关状态返回输入电压或0。
    getState():返回互斥开关的状态字符串。
    control():切换互斥开关状态。
    getResistance(int pin):根据引脚返回互斥开关的电阻。

  7. Switch(类)
    继承自:ControlDevice
    属性:
    继承自ControlDevice的所有属性。
    state:开关的状态。
    方法:
    构造函数:初始化设备ID和状态。
    OutVoltage(double v):根据开关状态返回输入电压或0。
    getState():返回开关的状态字符串。
    control():切换开关状态。

  8. GearSpeedRegulator(类)
    继承自:ControlDevice
    属性:
    继承自ControlDevice的所有属性。
    flag:用于控制齿轮速度。
    方法:
    构造函数:初始化设备ID。
    changeGear(boolean increase):根据传入的布尔值增加或减少齿轮速度。
    OutVoltage(double v):根据齿轮速度计算输出电压。

  9. ContinuousSpeedRegulator(类)
    继承自:ControlDevice
    属性:
    继承自ControlDevice的所有属性。
    parameter:用于控制连续速度。
    方法:
    构造函数:初始化设备ID。
    OutVoltage(double v):根据参数计算输出电压。

  10. IncandescentLamp(类)
    继承自:ControlledDevice
    属性:
    继承自ControlledDevice的所有属性。
    light:表示灯的亮度。
    resistance:固定为10。
    方法:
    构造函数:初始化设备ID和电阻。
    setState(double v):根据电压差设置灯的亮度。
    getResistance():返回设备的电阻。

  11. FluorescentLamp(类)
    继承自:ControlledDevice
    属性:
    继承自ControlledDevice的所有属性。
    light:表示灯的亮度。
    resistance:固定为5。
    方法:
    构造函数:初始化设备ID和电阻。
    setState(double v):根据电压差设置灯的亮度。
    getResistance():返回设备的电阻。

  12. CeilingFan(类)
    继承自:ControlledDevice
    属性:
    继承自ControlledDevice的所有属性。
    speed:表示风扇的速度。
    resistance:固定为20。
    方法:
    构造函数:初始化设备ID和电阻。
    setState(double v):根据电压差设置风扇的速度。
    getResistance():返回设备的电阻。

  13. FloorFan(类)
    继承自:ControlledDevice
    属性:
    继承自ControlledDevice的所有属性。
    speed:表示风扇的速度。
    resistance:固定为20。
    方法:
    构造函数:初始化设备ID和电阻。
    setState(double v):根据电压差设置风扇的速度。
    getResistance():返回设备的电阻。

  14. Curtain(类)
    继承自:ControlledDevice
    属性:
    继承自ControlledDevice的所有属性。
    openRatio:窗帘开合比例。
    resistance:固定为15。
    方法:
    构造函数:初始化设备ID和电阻。
    setState(double v):根据电压差设置窗帘的开合比例。
    calculateTotalLux():计算总光照强度。
    getResistance():返回设备的电阻。

  15. Main(类)
    属性:
    deviceMap:存储所有设备的映射。
    allDevices:存储所有设备。
    serialCircuits:存储所有串联电路。
    parallelCircuits:存储所有并联电路。
    lines:存储输入的指令。
    方法:
    main(String[] args):程序的主入口,处理输入,设置电阻,计算电压,打印结果。
    handleLines(List lines):处理输入的每一行指令。
    setResistance():设置电路的电阻。
    processCircuit(String line):处理电路定义的指令。
    getOrCreateDevice(String deviceId):获取或创建设备。
    printResults():打印所有设备的结果。

数据处理:
使用 handleLines 方法处理输入的每一行数据,根据数据类型执行相应的操作,如控制设备状态或处理电路定义。
使用 setResistance 方法遍历所有设备和电路,计算并设置设备的电阻和电路的总电阻。
使用 processCircuit 方法处理电路定义,创建串联电路(SerialCircuit)和并联电路(ParallelCircuit)的实例,并根据连接定义添加设备。
使用 getOrCreateDevice 方法根据输入数据获取或创建设备实例,如开关(Switch)、调速器(GearSpeedRegulator 和 ContinuousSpeedRegulator)、灯具(IncandescentLamp 和 FluorescentLamp)、风扇(CeilingFan 和 FloorFan)以及窗帘(Curtain)。

计算电压:
使用 calculateVoltage 方法计算每个电路的电压差,该方法会根据电路的总电阻和输入电压计算每个设备的电压差(vd)。

类图:

第八次作业:
总体的设计思路和第七题类似,主要增加了对每个元件引脚的电位的计算方法,
主要思路:元器件的输入电压等于上一个的输出电压,输出电压 = 输入电压 - 电压差;

增加了一个List,用于将最近的一次输出电压存入

点击查看代码
Lsit,List<Double> voltages = new ArrayList<>();

增加一个方法用于获取最近一次的输出的电压

点击查看代码
    public static double getRecentVoltage(List<Double> voltages){return voltages.get(voltages.size() - 1);}

类图:

三:采坑心得:

第七次作业:
在计算完分压和得到所有受控元件状态输出时,按照id的顺序输出,但是我考虑到的id为int类型,而题目中id应该为String类型,也就是说id为11的应该在id为2的设备之前输出。
修改排序的代码,因为当时如果是将int类型改为String类型需要改变很多地方,所以我就想到了只改排序,按照字典序的id排序即可

点击查看代码
        // 对每类设备按ID排序Comparator<Device> byId = Comparator.comparing(d -> String.valueOf(d.id));switches.sort(byId);gearRegulators.sort(byId);continuousRegulators.sort(byId);incandescentLamps.sort(byId);fluorescentLamps.sort(byId);ceilingFans.sort(byId);floorFans.sort(byId);mutualSwitches.sort(byId); // 互斥开关排序curtains.sort(byId);

第八次作业:
考虑右边的引脚的电位可能大于左边的引脚,左边为断路时,通过并联的其他路将电流传到右边的引脚,这样左边的引脚就为0,
但是右边的引脚却不为零。

四:改进建议:

第七次作业:

关键指标分析
语句数 (Statements): 435条语句,这个数量表明代码文件中包含了较多的操作。
分支语句百分比 (Percent Branch Statements): 29.4%,这个比例相对较高,表明代码中包含了不少条件判断,可能会影响代码的可读性和可维护性。
方法调用语句 (Method Call Statements): 159,这表明代码中方法调用较为频繁,这通常是好的实践,但如果方法调用链过长,可能会影响性能。
注释率 (Percent Lines with Comments): 8.2%,注释率较低,这可能影响代码的可读性和可维护性。
类和接口数量 (Classes and Interfaces): 14,这个数量表明项目中包含多个类和接口,需要确保每个类和接口都有清晰的职责和设计。

方法复杂度
最复杂方法 (Name of Most Complex Method): Mutua,位于第104行,最大复杂度为81,这表明该方法可能包含复杂的逻辑,需要进一步分析和可能的重构。
平均方法复杂度 (Average Complexity): 4.35,这个平均值表明大部分方法的复杂度处于中等水平。

代码块深度
最深代码块行号 (Line Number of Deepest Block): 290,最大代码块深度为8,这可能表明存在深层嵌套的代码块,这通常不是一个好的实践,因为它降低了代码的可读性。
平均代码块深度 (Average Block Depth): 3.03,这个平均值表明代码块深度总体上是可以接受的,但仍需注意深层嵌套的代码块。

改进建议
重构代码: 考虑将Main.java文件中的代码重构为更小的模块,每个模块负责一个单一职责,以降低复杂度。
增加注释: 为代码添加更多的注释,特别是对于复杂的逻辑和方法,以提高代码的可读性。
简化复杂方法: 尝试简化最复杂的方法Mutua,可能通过提取子方法或重构逻辑来实现。
减少深层嵌套: 检查并重构深层嵌套的代码块,以提高代码的可读性和可维护性。

五:总结:

本阶段的题目集涵盖了Java编程的多个方面,包括面向对象编程、数据结构、异常处理、正则表达式、输入输出处理等。
通过题集,我学会了Java集合框架,了解它们的用途和性能特点,还学会了对字符串的处理,采用split,trim,substring,indexof等方法,学会了面向对象的思想,
接下来应该深入学习异常处理:学习如何自定义异常,并在代码中合理使用try-catch-finally块来处理异常,以及一些java模型,如装饰模型,桥接模型等,在写代码时可以启到事半功倍的效果,便于迭代。
学习心得:在写题时不能看个大概就直接开始写,应该在反复阅读题目设计好解题思路,画出简易的类图后开始写。
不然在后面调试代码改错时会花费大量时间
建议及意见:建议能够给出大作业中测试点的提示信息更加详细一点,有的时候一个测试点需要猜几个小时。

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

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

相关文章

『联合省选2025集训』『图的连通性进阶』 知识点 总结

若有长风绕旗,那便是我在想你了。前言若有长风绕旗,那便是我在想你了。这周讲了个图论连通性板块的一些进阶知识,周六全国第一给我们讲了一些树上的问题,感觉树剖板块实现难度较大,后面几道偏思维的题会有些许好转。 这里就先写写连通性相关的进阶的一些知识点吧。 主要涵…

『联合省选2025集训』『耳分解,双极定向,三连通分量』 知识点 总结

若有长风绕旗,那便是我在想你了。前言若有长风绕旗,那便是我在想你了。这周讲了个图论连通性板块的一些进阶知识,周六全国第一给我们讲了一些树上的问题,感觉树剖板块实现难度较大,后面几道偏思维的题会有些许好转。 这里就先写写连通性相关的进阶的一些知识点吧。 主要涵…

第七-八次作业总结

一、前言 该系列题目均为设计与实现一个家居强电电路模拟程序,题目难度复杂度逐步提升,题目数量和输入信息也逐步增加。以下是对这两道题的总结: 1. 知识点家居强电电路模拟程序-3 受控窗帘设备的模拟 多个并联电路串联在一起的情况 串联电路中包含其他串联电路的情况 家居强…

AD 原理图如何进行DRC检查

如果画到PCB才发现原理图画错了,那么就为时太晚了。 画完或者后期修改PCB应该及时进行原理图的DRC检查。 1. 右下角Panels打开工程: 2. 然后我们选中整个工程的工程处,点击右键: 3. 然后左键点击compile PCB Project......... : 参考资料: https://www.fanyedu.com/content…

Vue3甘特图 - dhtmlx-gantt

Vue3甘特图 <template><div style="height:100%; background-color: white"><div id="gantt_here" style="width:100%; height:100%;"></div></div> </template><script setup> import { onMounted }…

恍恍惚惚,走到了尾声

课程链接 https://edu.cnblogs.com/campus/fzu/SE2024/作业链接 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315作业目标 回顾自己的软工实践课程学号 102202157一、学期回顾 1.1 回顾你对于软件工程课程的想象在课程开始前,我一直以为软件工程课程会聚焦于各种编…

转正了!!!!!!!!

近期&感受、问题: 1.版本优化描述:秘境排行榜;一键探险功能的顺序;背包随机类宝箱一键开启;美食家一键合成闪光美食;电玩活动跳过动画功能;许愿池自动投币;结晶一键熔炼 感受/反思:感觉自己菜菜的QAQ,各种版本的本地数据处理错误(删早了删晚了/先notify后notify…

Navicat密码导出解密导入到DataGrip中

使用Navicat导出密码:目前使用Navicat17亲测有效使用php解密代码 <?php class NavicatPassword {protected $version = 0;protected $aesKey = libcckeylibcckey;protected $aesIv = libcciv libcciv ;protected $blowString = 3DC5CA39;protected $blowKey = null;protec…

鸿蒙原生页面高性能解决方案上线OpenHarmony社区 助力打造高性能原生应用

随着HarmonyOS NEXT的正式推出,鸿蒙原生应用开发热度高涨,数量激增。但在三方应用鸿蒙化进程中,性能问题频出。为此,HarmonyOS NEXT推出了一整套原生页面高性能解决方案,包括Nodepool、HMrouter和DataCache 三大解决方案,并上架OpenHarmony开源社区,分别针对应用页面滑动…

数值计算方法(2) 数值积分方法

+++ date = 2024-12-21T13:49:00+08:00 draft = true title = 数值计算方法(2) 数值积分方法 +++ 初次发布于我的个人文档 上一期讲了插值方法,这一次自然是要运用一下插值方法了。所以这一期的主题是用插值方法计算定积分。 机械求积方法 下面我们来介绍一下怎么用插值法来得…

AI烟雾监测识别摄像机

AI烟雾监测识别摄像机的应用范围广泛,不仅可以安装在家庭、商业建筑、工厂等场所,还可以应用于地铁、火车站等公共场所,为人们的生命财产安全提供全方位的保障。总的来说,AI烟雾监测识别摄像机作为智能化安全防范的重要工具,具有广阔的应用前景和社会意义。通过提高火灾预…

Omnissa Horizon Clients 2412 发布 - 虚拟桌面基础架构 (VDI) 和应用软件

Omnissa Horizon Clients 2412 发布 - 虚拟桌面基础架构 (VDI) 和应用软件Omnissa Horizon Clients 2412 发布 - 虚拟桌面基础架构 (VDI) 和应用软件 Omnissa Horizon,之前称为 VMware Horizon, 通过高效、安全的虚拟桌面交付增强您的工作空间 请访问原文链接:https://sysin.…