首页 > 其他分享 >第三次Blog--题目集7~8的总结

第三次Blog--题目集7~8的总结

时间:2024-12-28 20:52:59浏览次数:5  
标签:题目 引脚 -- 代码 Blog 开关 电路 device 方法

一、 前言

1.前言的前言

最近辛苦啦,谢谢你在繁忙的日子来到我的博客!
马上就2025年了,祝你新年一切顺遂呀~~
image

2.知识点

面向对象编程

需要创建多个类来表示不同的设备和电路类型,例如控制设备类(开关、调速器等)、受控设备类(灯、风扇、窗帘等)、串联电路类和并联电路类。每个类应该封装自己的属性和行为。

设计模式

工厂模式用于创建对象而无需指定具体的类。这可以简化代码,并使它更容易适应变化。使用组合模式,可以灵活地构造任意复杂的电路拓扑结构,并且能够一致地对待单个设备和组合设备。

电路原理

理解基本的电路连接方式(串联和并联等),以及电压、电流、电阻之间的关系。还需要考虑短路检测、电流限制等实际问题。

数据结构

使用到列表或其他集合来存储电路中的设备信息,以及处理输入输出的数据。

算法逻辑

实现计算电压、电流、亮度、转速等功能,处理用户输入的命令,并根据这些命令调整设备状态或参数。

异常处理

对于可能出现的错误情况(如短路、超过最大电流限制),需要有适当的处理机制。

输入输出管理

解析输入格式,按照指定格式输出结果。

字符串处理

用于解析输入命令和生成输出信息。

数学运算

进行各种计算,比如比例计算、条件判断等。

3.题量

需要编写多个类和方法来完成整个系统。除了核心功能外,还需处理边界情况和错误检查,确保程序健壮性。

4.难度

比较难,特别是最后一次大作业,很多情况要考虑。加上期末周,大量作业、课设、考试,大家没有很多勇气和力量去沉下心debug了。
image

二、设计与分析

1.题目集7的家居强电电路模拟程序3

(1)题目概述

在家居强电电路模拟程序2的基础上新增控制设备互斥开关,新增受控设备窗帘。互斥开关有三个引脚,引脚与引脚之间电阻不同,还可以正反接,受控串联根据电路中光照强度打开程度不一样。线路中包含多个串联起来的并联电路。

(2)类图展示

image

(3)设计思路

整体来讲,这道题没有很大的跨越。
我之前的代码就可以处理多个串联起来的并联电路,受控串联也是比较容易实现,遍历电路中设备计算光照强度即可。关键是互斥开关的处理。
之前没有特别关心过引脚的问题,对这道题及之后的迭代产生了一些抵触。我想了两种,第一种是看成两个开关,进行一些处理和判断,也将设备加入进来,最后删除。另一种是开关里面有三个电压两个电阻,计算时判断哪个引脚哪个值。但是感觉这两个都不太优雅。最后还是决定采用两个开关的,对前面的代码有所复用。

(4)源码分析

对于受控窗帘,主要是计算亮度的方法,在总电路中遍历所有设备:


public double AllBrightness(){
        double brightness=0;
        for(ElectricalDevice device : deviceALL.values()){
            if(device instanceof Light){
                brightness+=((Light)device).getParameter();
            }
        }
        return brightness;
    }

对于互斥开关,把它看作两个Switch进行处理:

class MutexSwitches extends ControlDevice {
    boolean InState2 = true; // 闸刀位置在2
    Switch switch12; // 反向也可以直接在switch里处理
    Switch switch13;
    //省略一些方法
    @Override
    public void adjustControl(String command) {
        if (command.startsWith("#" + id)) {
            InState2 = !InState2;
            if (switch12 != null)
                switch12.setR(InState2 ? 5 : Double.POSITIVE_INFINITY);
            if (switch13 != null)
                switch13.setR(InState2 ? Double.POSITIVE_INFINITY : 10);
        }
    }
    public String getStateString() {
        return InState2 ? "closed" : "turned on";
    }
}

关键函数的顺序图如下:
image

(5)性能评估

image

该文件共有847行代码,包含261个语句。分支语句占总语句的10%,代码中存在一定的条件分支逻辑,可能影响代码的可读性和维护性。方法调用语句有79个,代码模块化较好。注释行占总行数的43%,代码有较好的说明,有助于理解和维护。

在类和接口方面,代码定义了10个类或接口,每个类平均包含7.20个方法。每个方法平均包含3.51个语句。最复杂的方法位于第188行,名为MutexSwitches.adjustControl(),其复杂度为6。最深层次的代码块位于第745行,最大嵌套深度为5。整个文件的平均块深度为1.42,平均复杂度为1.72。

尽管代码较长且包含多个类和方法,但整体代码结构较为清晰,复杂度适中。注释比例较高,有助于理解代码逻辑。然而,最复杂的方法和最深层次的代码块需要进一步优化,提高代码的整体质量和可维护性。

image

2.题目集8的家居强电电路模拟程序4

(1)题目概述

在家居强电电路模拟程序3的基础上,增加了二极管元件,要求显示电压、限制电流、判断短路。可以并联包含并联。
细节上,考虑了各类设备的并联接入,例如,K1 的输出接到 L2 的输入,L2 的输出再接其他设备属于串联接线。K1 的输出接到 L2 的输出,同时 K1 的输入接到 L2 的输入,这种情况属于并联。没有接线的引脚默认接地,电压为0V。本系列题目中元件的管脚除了互斥开关的1引脚,其他所有引脚在电路中最多只出现一次。

(2)类图展示

image

(3)设计思路

管脚电压我在前面几次已经设计好了,只需要改一下输出。
二极管也类似于开关,就是要处理一下正反接的问题,没有特意处理管脚的类或方法,也没有想到很优雅的算法,所以要写很多冗余的引脚判断。
因为要检测短路和判断过载,所以要有计算电流的方法,我用电压除以电阻的方法。
但是没有接线的引脚默认接地,电压为0V等等细节的情况没考虑得很完善,对特殊情况的处理也不够细致。

(4)源码分析

串联电路计算电流的方法:

public void computeCurrent() {
        current=differenceVoltage/getR();
        if(Double.isInfinite(getR())&&Double.isInfinite(differenceVoltage)){
            current=0;
        }
        for(ElectricalDevice device : getDevices().values()){
            if(device instanceof Circuit){
                ((Circuit)device).computeCurrent();
            }
            device.setCurrent(current);
        }
    }

并联电路计算电流的方法:

 @Override
    public void computeCurrent() {
        for (ElectricalDevice device : getDevices().values()){
            if(device instanceof  Circuit) {
                ((Circuit)device).computeCurrent();
            }
        }
    }

防反接机制:

      protected double direction=1; // 正向1或反向0

      for(ElectricalDevice device : deviceListAll){
            if(device.getDirection()==0){
                device.checkVoltageDirection();
            }
        }

(5)性能评估

image
共有 1,183 行代码,其中包含 424 个语句。分支语句占总语句的 15.6%,方法调用语句有 126 个,注释行占总行数的 38.1%。代码中有较多的注释,有助于理解代码逻辑。

项目中共有 11 个类和接口,每个类平均包含约 9 个方法。每个方法的平均语句数为 4.23,方法较为简洁,易于理解和维护。最复杂的代码段出现在第 292 行的 MutexSwitches.adjustControl() 方法中,其复杂度为 6。

最大块深度为 5,平均块深度为 1.36,代码结构相对简单,没有过多的嵌套逻辑或复杂的控制流。整体而言,平均复杂度为 1.78,说明代码整体上较为清晰,没有过多的复杂逻辑。

较高的注释比例(38.1%)表明代码具有较好的可读性和可维护性。较少的分支语句(15.6%)和较高的方法调用语句(126 个)表明代码可能采用了模块化的设计,通过调用多个方法来实现功能,而不是在一个方法中处理所有逻辑。

综上所述,该程序在代码质量和可维护性方面表现良好,具有较高的代码清晰度和较低的复杂度。
image

三、踩坑心得

1.题目集7的家居强电电路模拟程序3

(1)问题

问题:互斥开关的处理上,看做了两个开关,将这两个开关的设备也加入电路的设备中。
image
最后输出要进行删除的特别处理。
image
此时,报了以下错误:
image
解决:ConcurrentModificationException ,并发修改异常,这是由于一边对ArrayList遍历,一边操作其中的元素造成的。于是,又创建了一个这个ArrayList的副本ArrayList,进行删除,代码如下:
image

(2)问题

问题:把互斥开关看成两个开关还有一个问题,如果只连接了互斥开关的某两个引脚,又没有特殊处理的。
image
会有空指针异常。
image
解决:要在多个地方对两个开关判断非空才进行处理,感觉还是很丑陋的写法。类似下面的代码:
image

(3)问题

接下来是最后让我改了两天的三个测试点......
问题:多串联电路的一个测试点。
image
解决:测了许多的串联的样例才解决,是总电路的电压初始化有问题。

(4)问题

问题:32,33没过。
image
解决:这个是去掉了一个判断条件就可以了。
image
如图,去掉了注释中的判断条件。但是有没有这个对电阻的判断,在逻辑上似乎是相同的。我猜测是精度问题,一些数学和编程的不等同性,但是不确定。至于下面那个为了提高精度同时乘以100000的操作,是我的一些尝试,并不影响正确性也没有让我改对。
image
附上一个知识点:
在Java中,当尝试将一个浮点数(float或double)除以0时,结果不会抛出异常。相反,根据IEEE 754标准,这种操作会得到一个特殊值:
如果被除数是正数,那么结果将是正无穷大(+Infinity)。
如果被除数是负数,那么结果将是负无穷大(-Infinity)。
如果被除数是0.0,那么结果将是NaN(Not-a-Number),表示结果是未定义的。
这些特殊情况可以通过Float或Double类中的常量来表示,例如Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, 和 Double.NaN。同时,可以使用Double.isInfinite()方法来检查一个值是否为无穷大,以及用Double.isNaN()来检查一个值是否为NaN。
在Java中,如果尝试将一个整数(int或long)除以0,这会导致运行时异常。具体来说,程序会抛出一个ArithmeticException,其错误信息通常是/ by zero。这是因为对于整数类型,除以零的操作是未定义的,并且被认为是非法操作。

2.题目集8的家居强电电路模拟程序4

(1)问题

问题:输出顺序的问题,因为特殊处理,虽然反接不影响电路特性,但是影响输出的结果。
解决:设置接入反向的标记,输出前特殊处理。
image

(2)问题

问题:image
解决:输出一些数据看一看,哦,原来是无穷除以无穷会NaN啊。
image
就增加一个判断条件。但是这个好像没有在测试点内,改了分数没变。
image
同理,我想也该对0除以0的情况判断,比如并联电路一路中只有一个正接的二极管的情况。也增加了判断条件,也确实过了一部分,但是之前的一部分测试点又过不去了,反而分数更低了,花了很长时间,到最后也没想明白应该怎么改。但是也算努力过了。
image

四、改进建议

(1)降低复杂度的操作

buildInfo方法圈复杂度比较高,对其进行了降低复杂度的操作。
提取子功能:将不同的逻辑部分提取到独立的方法中,这样每个方法只负责一个特定的任务。
减少嵌套层级:通过提前返回来减少代码的嵌套层级。
简化条件判断:合并相似的条件判断,避免重复代码。

(2)避免硬编码值

将常量(如电压值、电阻值)定义为静态最终变量,这样不仅便于维护,还可以通过改变一个地方的值来影响整个系统的行为。

public static final double DEFAULT_INPUT_VOLTAGE = 220;

(3)在构造函数中初始化

MutexSwitches类中的成员变量switch12和switch13可能为空,这可能导致空指针异常。在构造函数中初始化这些成员变量,或者确保它们总是被正确赋值。这样会合适一些。

(4)改进状态管理

对于像Switch和MutexSwitches这样的控制设备,它们的状态变化可能会影响系统的整体行为。可以考虑引入状态模式来更好地管理和追踪这些设备的状态转换。

(5)使用枚举替代字符串标识

对于像引脚名称(如 "VCC" 或 "IN")这样的固定标识符,建议使用枚举类型而不是字符串常量。这不仅能减少拼写错误的风险,还可以提供更好的编译时检查和支持IDE的自动完成功能。

(6) 单一职责的重构

一些类承担了过多的责任,比如电路类,它不仅管理设备和连接,还处理电压计算、电流检查和状态打印。可以考虑将这些功能分解到不同的类或方法中,每个类或方法只负责一个具体的任务。例如,可以给管教分一个类,这样很多逻辑会清晰许多,再例如,创建一个专门用于计算电路参数(如电压和电流)的类。
image

五、总结分析

这两次大作业让我感到我的类的设计还有很多不合理的地方,代码也不够健壮,不能处理很多特殊情况。这体现了我在这方面的欠缺,不应该只习惯于上手写代码,遇到问题应该先分析和设计,思考解决方案,后续还应该多学习设计模式,多练习,多体会,多总结。

六、学期总结

在这学期的Java课程中,我受益匪浅。除了编程方面的知识,还学习了面向对象的编程思想,我觉得这给我提供一种新的思考方式,它鼓励我以更加结构化、模块化的方式来思考和解决问题。单一职责原则、开放封闭原则、里氏替换原则、迪米特法则等设计原则,不仅是设计与编程的指导,对生活也很有启发,比如,专注于做好一件事,在不破坏已有稳定状态的前提下寻求成长和发展空间,确保替代方案至少能达到原有标准等。我想,这也是理工科的浪漫之处。
调试到深夜只剩电脑微光照在脸上的孤勇,会被绞尽脑汁之后通过测试点的舒畅所抚慰。总是功利地紧张地追求分数,脆弱的心态的不断崩塌又重建,迷失在黑夜里的时候,大致无愧于心的追寻与学习就是意义本身。不管怎么样,过去的好的坏的我都可以去接受。
image

总结的总结

Java课结束了,这学期的艰巨任务还没有结束,人生一直在路上,一起继续前进吧~
最后,发自内心地感谢在Java以及其他课程的学习中帮助过我的亲爱的老师和同学!
也感谢可爱的你这么认真的读完我的博客!
image

标签:题目,引脚,--,代码,Blog,开关,电路,device,方法
From: https://www.cnblogs.com/FullOfTheJoysOfSpring/p/18637421

相关文章

  • sublimetext下载安装配置
    sublimetext下载安装配置1下载进入https://www.filehorse.com/,有很多软件的官方历史版本,可以免费下载。搜索sublimetext,点击搜到的最新版,直接下载安装即可。内网可以考虑下载一个中文免安装版本,自行百度确认好可用无毒。2安装右键安装包以管理员身份运行,确认安装位置,一......
  • Python 中使用 Matplotlib 进行多图绘制
    Python中使用Matplotlib进行多图绘制Matplotlib是Python中非常强大的数据可视化工具,它可以用来生成简单到复杂的各种图形。无论是处理单张图表还是多图并列展示,Matplotlib都能提供高效的支持。在本篇文章中,我们将介绍如何使用Matplotlib绘制多图,以便在同一画布上展示多......
  • pyhton、miniConda、pycharm下载安装配置
    pyhton、miniConda、pycharm下载安装配置以下都是在win10环境下,linux和mac或者其他win版本请百度。1.pyhton下载安装配置下载https://www.python.org/ #官网https://www.python.org/downloads/ #官网下载页https://www.python.org/downloads/windows/ #官网下载wi......
  • Python 正则表达式进阶用法:字符集与字符范围详解
    Python正则表达式进阶用法:字符集与字符范围详解正则表达式是文本处理和数据清洗中不可或缺的工具。在前面的学习中,我们已经了解了基本的正则表达式匹配,如匹配单个字符、字符串开始和结束的位置等。今天,我们将进入正则表达式的一个进阶主题:字符集(CharacterSet)和字符范围(Characte......
  • 如何免费使用 Termius Pro 版?Termius 工具下载与破解教程
    今天想和大家聊聊Termius,一款跨平台的SSH/SFTP终端工具。它不仅功能强大,还特别适合需要频繁上传文件夹和进行远程管理的小伙伴。无论你是程序员、运维工程师,还是需要远程管理服务器的爱好者,这款工具都能成为你的得力助手!为什么选择Termius?市面上的终端工具千千万,但Termius......
  • 苦乐参半
    软件工程https://edu.cnblogs.com/campus/fzu/SE2024作业要求https://edu.cnblogs.com/campus/fzu/SE2024/homework/13315作业目标总结这个学期在软件工程实践中的收获学号102201138一、学期回顾1.1我对软件工程的想象    在勤勤恳恳地为软件工程......
  • vue相关面试题整理
    一、被问到《vue2与vue3的区别》应该怎么回答 Vue 内部根据功能可以被分为三个大的模块:响应性 reactivite、运行时 runtime、编辑器 compiler,以及一些小的功能点。首先先来说响应性reactivite:vue2的响应性主要依赖Object.defineProperty进行实现,但是Object.d......
  • 2024-12-28:求出出现两次数字的 XOR 值。用go语言,给定一个数组 nums,其中的数字出现的频
    2024-12-28:求出出现两次数字的XOR值。用go语言,给定一个数组nums,其中的数字出现的频率要么是一次,要么是两次。请找出所有出现两次的数字,并计算它们的按位XOR值。如果没有数字出现两次,则返回0。1<=nums.length<=50。1<=nums[i]<=50。nums中每个数字要么出现过一......
  • 【2024年终总结】从初入博客到出入博客
    2024年已经过去了,我自己其实回头看看有的时候挺感慨的,因为我做过的事情比较多,本身我做过央国企的员工(物流管理),后来跟随初创团队去外面打拼做互联网(程序员),又到后来回运营商(还是央国企)做方案(售前售后),再往后做到央企的销售管理(班子成员),始终没想到自己的路线有这么多变数,但是也正是因......
  • java第7-8次题目集blog
    1.前言本次blog主要是题目集7-8的总和,家居强电电路模拟程序题目集7知识点:类和对象的使用,继承,正则表达式,HashMap<>,LinkedHashMap<>,List<>数据结构,电路基础理论。题量:题目数为1题。难度:难。题目集8知识点:抽象类的使用,继承,正则表达式,Map<>,二维数组,电路基础理论。题量:题目数为......