重生之我在男航学Java-3(完结)

news/2024/7/3 15:05:52/文章来源:https://www.cnblogs.com/TCxiaoli/p/18275060

一、前言

  • 家居强电电路模拟程序-3
  • 考查内容:类的设计(适应迭代以及合理的类间关系的设计),正则表达式的应用(如何正确解析输入),java中集合框架的熟悉与使用并且选择合理的集合框架(存储数据并且方便数据的增删改查)
  • 新增内容:互斥开关,落地窗帘
  • 本次PTA由于自身的原因未能拿下它,所以在后续的内容中,我将以大体的形式来阐述我的整体思路,以及我对这个题目自己的理解。考虑到题目之间的迭代性,我将优先在之前的代码之上进行更改。
  • 家居强电电路模拟程序-4
  • 考查内容:在家居强电电路模拟程序-3中的基础上增加了我对电路的理解(高中物理电学就不好),并且考虑特殊情况的短路问题(我没想到...)
  • 新增内容:二极管,管脚电压的显示,电流限制,短路检测,并联电路中包含并联
  • 在新增如此多内容的前提下,对于我来说是个巨大的挑战,由于我自身的时间分配出现问题,导致我没有用足够的时间来对新增内容进行分析导致我没有拿到一个期望的分数,并且由于我的在家居强电电路模拟程序-2正则表达式在家居强电电路模拟程序-3并不能完美适用,甚至于有些样例根本没办法用,我不得不重新设计我的正则表达式,并且由于我的第3次没拿到满分的原因没被我找到,我不得不重新整理了在Main方法中的程序设计以此方便进行输出和迭代。

二、设计与分析:

  • 家居强电电路模拟程序-3
  • 类图分析:
  • 首先,由于新增了互斥开关和落地窗帘俩个类,我们分别让互斥开关(Mutex)和落地窗帘(Curtain)分别继承控制设备(Control)和受控设备(Controlled),并在其中分别重写printf方法。
  • 其次,由于在一条串联电路中包含其他串联电路所以在对正则表达式进行设计时要更具备一般性,在存储数据时也需要考虑到一条串联电路中包含其他串联电路的这种情况,能够正确的对存储的数据进行访问,避免出现非零返回的情况。
  • 另外,考虑到对输入信息的匹配过于复杂,专门设计一个Matcher类来对字符串进行匹配,里面的属性主要是ArrayList inputs;ArrayList circuitArrayList = new ArrayList<>();一个用来储存输入的信息,另一个则是对分析处理后的信息进行存储,同时在Matcher类中写入public void buildCircuit(){(略)};方法,完成对电路设备的写入以及分析结果的存储。
  • 最后在Matcher类中的public void buildCircuit(){(略)};方法中写入对每一个信息进行输出即可。
  • 实现如下:
  • Device(所有设备的父类,将线路也视为一种设备)
  • 属性如下:
  • protected String number;
  • protected double pd;
  • protected double resistance;
  • 方法:构造方法,以及对应的get,set方法,以及需要复写的printf方法
  • Control继承于Device,同时是所有控制设备的父类
  • 属性和方法均继承于Device
  • T(串联电路)继承于Device
  • 属性如下:
  • protected boolean isOn = false;(判断该串联电路是否连通)
  • protected ArrayList<Device> deviceArrayList = new ArrayList<>();
  • 方法:构造方法,以及对应的get,set方法
  • public void judgeResistance(){};用来计算串联电路的总电阻
  • M(并联电路)继承于Device
  • 属性如下:
  • protected ArrayList deviceArrayList;
  • 方法:构造方法,以及对应的get,set方法
  • public void judgeResistance(){};用来计算并联电路的总电阻
  • K(开关)继承于Control
  • 属性如下:
  • private int state = 0;(开关状态,默认为关,即为0)
  • 方法:构造方法,以及对应的get,set方法,以及需要复写的printf方法
  • public void changeState(){};用来开开关和关开关
  • F(分档调速器)继承于Control
  • 属性如下:
  • private double gear = 0;(初始化为0档)
  • 方法:构造方法,以及对应的get,set方法,以及需要复写的printf方法
  • public void upGear(){};升档;
  • public void downGear(){};降档;
  • public double judgeVoltage();判断输出电压
  • L(连续调速器)继承于Control
  • 属性如下:
  • private double gear;
  • 方法:构造方法,以及对应的get,set方法,以及需要复写的printf方法
  • public double judgeVoltage();判断输出电压
  • B(白炽灯)继承于Controlled
  • 属性如下:
  • private double brightness;(亮度)
  • 方法:构造方法,以及对应的get,set方法,以及需要复写的printf方法
  • public void judgeBrightness(){};判断亮度
  • R(日光灯)继承于Controlled
  • 属性如下:
  • private double brightness;(亮度)
  • 方法:构造方法,以及对应的get,set方法,以及需要复写的printf方法
  • public void judgeBrightness(){};判断亮度
  • D(吊扇)继承于Controlled
  • 属性如下:
  • private double speed;(转速)
  • 方法:构造方法,以及对应的get,set方法,以及需要复写的printf方法
  • public void judgespeed(){};判断转速
  • A(落地扇)继承于Controlled
  • 属性如下:
  • private double speed;(转速)
  • 方法:构造方法,以及对应的get,set方法,以及需要复写的printf方法
  • public void judgespeed(){};判断转速
  • Match(用来匹配输入)
  • 属性如下:
  • ArrayList inputs = new ArrayList<>();
  • private ArrayList<K> kArrayList = new ArrayList<>();
  • private ArrayList<F> fArrayList = new ArrayList<>();
  • private ArrayList<L> lArrayList = new ArrayList<>();
  • private ArrayList<B> bArrayList = new ArrayList<>();
  • private ArrayList<R> rArrayList = new ArrayList<>();
  • private ArrayList<D> dArrayList = new ArrayList<>();
  • private ArrayList<A> aArrayList = new ArrayList<>();
  • private ArrayList<Device> deviceArrayList = new ArrayList<>();
    以上均用来存储和分析数据;
  • 方法:构造方法,以及对应的get,set方法
  • Print(用来输出)
  • 属性如下:
  • ArrayList<String> inputs = new ArrayList<>();
  • private ArrayList<K> kArrayList = new ArrayList<>();
  • private ArrayList<F> fArrayList = new ArrayList<>();
  • private ArrayList<L> lArrayList = new ArrayList<>();
  • private ArrayList<B> bArrayList = new ArrayList<>();
  • private ArrayList<R> rArrayList = new ArrayList<>();
  • private ArrayList<D> dArrayList = new ArrayList<>();
  • private ArrayList<A> aArrayList = new ArrayList<>();
  • private ArrayList<Device> deviceArrayList = new ArrayList<>();
    以上均用来存储输出
  • 方法:构造方法,以及对应的get,set方法,以及需要复写的printf方法
  • Sort(排序每个ArrayList中的数据,因为输出对此有要求)
  • 属性如下:
  • ArrayList<String> inputs = new ArrayList<>();
  • private ArrayList<K> kArrayList = new ArrayList<>();
  • private ArrayList<F> fArrayList = new ArrayList<>();
  • private ArrayList<L> lArrayList = new ArrayList<>();
  • private ArrayList<B> bArrayList = new ArrayList<>();
  • private ArrayList<R> rArrayList = new ArrayList<>();
  • private ArrayList<D> dArrayList = new ArrayList<>();
  • private ArrayList<A> aArrayList = new ArrayList<>();
  • private ArrayList<Device> deviceArrayList = new ArrayList<>();
  • 方法:构造方法,以及对应的get,set方法
  • public void sort(){};排序
  • 家居强电电路模拟程序-4
  • 类图分析:

  • 由于新增的内容太多,导致我前面的类设计出现了巨大的漏洞,因此我将直接陈述此次新增内容该如何设计。
  • 首先,由于新增管脚电压的显示,我需要对之前的printf函数的输出进行修改
  • 其次,新增电流限制,我需要在所有受控设备在输出前都对电流进行一次判断,来判断它是否超出了电流限制在对其进行合法的输出
  • 考虑短路时电流无穷大的情况也需要加入到printf中进行判断(事实上我忘了...)
  • 并联中包含并联,这其实非常的不好进行实现,即使我读取了并联中的并联电路还要对其进行合理的设置以及读取操作,由于重复遍历相当于是进行俩层for循环的遍历,同时在遍历过程中还可能会出现强转类型失败的情况,以及出现非零返回,在对其进行处理时需要考虑的袭击非常多,以及合理的类间关系的设计(因为我之前的类间关系以及不合理了...)

三、采坑心得

  • 家居强电电路模拟程序-3
  • 一开始没注意,我以为受控开关电阻都一样,导致在计算结果上老是出现偏差;后来在调试时发现电阻计算出现偏差,仔细阅读题目后发现12引脚之间默认电阻为5,13引脚之间默认电阻为10,对电阻的初始化进行修改。
  • 没有考虑一条串联电路中包含其他串联电路,在一条串联电路中包含其它串联电路时,由于我的正则表达式不具有一般性,直接出现了非零返回,在对正则表达式进行修改后,出现了类型强转异常的情况,检查后发现时在强转时,将串联中的串联考虑了串联中的并联,复制粘贴时忘记了修改,导致我将串联转成了并联,所以出现了这种错误,将其进行修改后即可,但是在遍历时又出现了越界的情况,检查后发现是写循环时细节出问题多写了个=,修改后无大问题。
  • 家居强电电路模拟程序-4
  • 在最开始进行输出信息时,我以为可以将电流限制和短路放在同一个if...else里面,结果导致了俩个的同时输出,最后使我不得不多次使用if...else来对输出进行合理的判断
  • 在判断电流短路时,出现了由于开关没闭合我就将其判断为短路的情况,后面对电路的判断新增一个变量,专门用来记录电路中的电流大小来判断电流有多大,但是在判断时又出现了无法判断短路的情况,于是再次增加一个判断电路是否短路的布尔变量,在判断输出的时候对电路中的电流进行判断,但是在用电器中同时也得标记该电路时否短路,否则在分析电路时就会出现断路时电流仍然存在的尴尬情况。
  • 并联电路中包含并联电路的正则表达式的修改,使其我的正则表达式可以读取到,但仍需要增加一个强转的判断来向下转型,否则有些方法无法正常调用,同时双重循环中读取并联中并联的数据使得极易出现逻辑混乱的情况,并且由于其中包含多重if...else使得我的代码极其冗长,在调试时非常的痛苦...

四、改进建议:

  • 家居强电电路模拟程序-3
  • 对正则表达式的优化,由于正则表达式的特殊性,导致每次新增一个特殊情况或者新增一个类的时候我都得在原有基础上在写一个正则表达式,违背了开闭原则。
  • 在对电路进行分析时,要进行多重if...else判断,可以将判断写成一个方法,然后利用switch进行优化,这样既可以使冗长的代码大大缩短,同时对其进行了解耦,没必要每次新增个什么东西都要写一个if...else
  • 在Print类中可以将print写成一个方法,这样就没必要对每一个集合都进行遍历,Sort同理
  • 家居强电电路模拟程序-4
  • 由于新增的二极管的属性的判断一开始丢进了电路分析中,导致又要增加if...else,一个将对正向导通,反向截止的判断做成一个函数,这样就可以减少if...else的使用
  • 其次,在对输出进行判断时可以将多重if...else进行优化,因为本质上是因为要实现的类别太多,可以考虑做成接口

五、总结

  • 1.学到了什么
  • 最终要的就是对正则表达式的一般性的思考,如何设计一个一般性的正则表达式使得我在后续面对新增的输入的时候就犹有余力,duan老师常说的自己常常做设计都要做5.6个小时,我写代码基本上都是看完题目就写,导致我缺乏了面向对象的编程思考,以及编程最重要的思维,对一个东西的抽象化程度有多厉害,比如看到一个电器就会衍生出冰箱和洗衣机的迭代,这种思维还没有根深蒂固的扎进我的脑子里面。其次,就是类间关系的考虑,以及对类间关系的实现到底如何实现,选择合理的数据结构作为地基常常能事半功倍。最后,感谢duan老师在课堂上给我们补充的其它小知识,让我认清了软件工程的实质以及在后续该如何学习(比较计算机大部分东西都靠自学...)。
  • 2.我该学什么
  • 我对类设计相关的知识仍有所欠缺,应该丢哦复习复习老师上课所讲的设计模式的原理,以及我该如何去合理的使用(实话,到现在没有用过)...然后,对数据结构也不够熟悉,毕竟合理的选择数据结构可以让对于数据的增删改查事半功倍,我还不够熟悉他们的特性,趁着暑假我一定要好好学习一下他们的特性

六、对课程的看法

  • 说实话,给人一种上课听着没什么难度但是一旦要自己动手去实现就变得异常困难,一是感觉自己缺乏面向对象这种编程思维,另外就是作业确实存在一定的难度,毕竟以后工作了会遇到什么困难也不好说,总不能知难而退吧...哈哈,在此由衷的感谢我的任课老师,duan老师,不仅教我们学习以及未来工作上的事情,还教育大家做一个诚实的人,发自内心的对其感到敬畏!

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

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

相关文章

嵌入式计算和视觉加速的开放标准

嵌入式计算和视觉加速的开放标准 https://www.khronos.org/assets/uploads/developers/presentations/Khronos_Embedded_Compute_and_Vision_Overview_Jun24.pdf Khronos将软件连接到硅 开放、免版税的互操作性标准,以利用GPU、XR和多处理器硬件的力量3D图形、增强和虚拟现实、…

第三次Blog作业

题目集6-7的总结性Blog 一、前言 题目集总结 第六次题目集 知识点:控制理论、电路设计、设备工作原理 题量:中等 难度:中等偏上控制设备部分涉及对开关、分档调速器、连续调速器三种设备的理解和操作。需要理解开关的两种状态,分档调速器的档位变化以及连续调速器的连续调节…

第三次blog

第三次blog感悟 随着知识越学越多,任务也越来越繁重,难度也是与日俱增,也许是时间花得还不够也不够认真导致最近的一些pta作业都完成得差强人意,我认为java的学习最重要的是写作业的认真、严谨的逻辑以及大把的时间。nchu-software-oop-2024-上-6 本次作业题目大致内容 1、…

第三次PTA作业总结

一.第七和第八次PTA作业总结 1.第七次PTA作业的分析 (1).设计思路: 设计电路设备类(如ControlDevice, AdjustableDevice, ExclusiveSwitch)和受控设备类(Light, Fan, Curtain)来封装设备的属性和行为。 电路类(SequentialCircuit, ParallelCircuit)用于表示电路结构,…

在WPF中使用着色器

概念类比范畴 CPU GPU二进制文件 .exe .cso / .ps二进制指令 机器码 CSO(shader指令)助记符 汇编 SL高级语言 C# HLSL高级语言文件 .cs .hlsl / .fx高级语言编译器 csc.exe fxc.exeAPI .NET API DirectX API运行时环境 CLR DirectX调试工具 Visual Studio Debugger RenderDoc着…

OOP第三次博客作业

目录前言:设计与分析:opp-7-家居强电电路模拟程序-2opp-8-家居强电电路模拟程序-2踩坑心得:opp-5-家居强电电路模拟程序-3踩坑和心得:opp-5-家居强电电路模拟程序-4踩坑和心得:总结: 前言: oop-7相比与oop-6仅增加了两个电子元件,一个互斥开关,一个受控窗帘,除了优化…

《DNK210使用指南 -CanMV版 V1.0》第五章 编译CanMV固件

第五章 编译CanMV固件 1)实验平台:正点原子DNK210开发板 2) 章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-…

第三次PTA总结

前言 本阶段面向对象程序设计进行了两次PTA训练,两次都是关于电路设计的迭代。迭代次数越多难度越大,后期事情较多,作业和考试任务重、题目的难度也较大,所以没有拿到每次作业的满分,但是都根据题目的变化对自己的设计进行了一定的改变和优化。 知识点类的设计; 数组、链…

防火墙部署案例

通过引流方式实现防火墙旁挂部署并且实现安全防护功能案例 一、项目背景 1、客户有购买了一台某公司由于性能问题和服务器直连核心交换机原因,决定采取旁挂方式部署,但是又希望实现安全防护,因此决定通过引流方式(QOS的流量重定向)把需要防护的流量引到防火墙,防火墙做路…

6月29日

# 模板引用 $template=file_get_contents("1.php");之后可以引用page_title变量来替换html内容

Alertmanager抑制、静默、路由、告警分组

1、抑制机制 Alertmanager的抑制机制可以避免当某种问题告警产生之后用户接收到大量由此问题导致的一系列的其它告警通知。例如当集群不可用时,用户可能只希望接收到一条告警,告诉他这时候集群出现了问题,而不是大量的如集群中的应用异常、中间件服务异常的告警通知。 在Ale…

GBJ406-ASEMI无人机专用整流桥GBJ406

GBJ406-ASEMI无人机专用整流桥GBJ406编辑:ll GBJ406-ASEMI无人机专用整流桥GBJ406 型号:GBJ406 品牌:ASEMI 封装:GBJ-4 最大重复峰值反向电压:600V 最大正向平均整流电流(Vdss):4A 功率(Pd):中小功率 芯片个数:4 引脚数量:4 类型:整流扁桥、整流桥 正向浪涌电流:120…

数据分析 | 整合数据

拼接与合并 1. 纵向或横向拼接:pd.concat()# 纵向拼接,在函数中放入列表,里面是想拼接的两个df # 如果列名一致,直接对齐;如果列名不一致,则各列都会保留,空值为NaN pd.concat([df1, df2], ignore_index = True) # >>> 此时索引是各自保留的,所以要忽略索引…

DCT-Net - 一键图片、视频转卡通动漫风格工具,本地一键整合包下载

只需要输入一张人物图像或者一段视频,就可以实现端到端全图卡、视频通化转换,生成二次元虚拟形象,返回卡通化后的结果图像或视频。 开发者叫menyi Fang,来自阿里巴巴通义实验室的的技术女大佬,国内大佬集成到webui,支持CPU和GPU,CPU处理速度也很快,需要的可以自行下载测…

ProPainter – AI视频去水印工具,可以去除视频中的静态水印、动态物体/人物等 本地一键整合包下载

ProPainter是一个基于E2FGVI实现的AI视频编辑工具,它可以一键移除视频内的移动物体和水印。这个开源项目提供了一个简单而强大的解决方案,帮助用户轻松编辑和改善视频内容。项目地址:https://github.com/sczhou/ProPainter 一键整合包下载:https://deepface.cc/thread-254-…

Rocky Linux捣鼓记录(六):JDK安装、配置环境变量

一、下载 A方法:我们可以直接去oracle官网下载jdk17安装包,直接安装,安装完会生成JDK主目录在/usr/lib/jvm/jdk-17-oracle-x64 B方法:su使用root用户操作,创建并进入一个便于管理JDK文件的目录 mkdir /usr/lib/jvm cd /usr/lib/jvm #下载jdk wget https://download.oracle…

川普真会说中文?连嘴型都同步,VideoReTalking AI数字人下载介绍

你能想到这种画面吗?霉霉在节目中用普通话接受采访,特朗普在老家用中文脱口秀,蔡明老师操着一口流利的英文调侃潘长江老师.. 这听起来似乎很魔幻,可如今全部由VideoReTalking实现了 你只需要传入一个视频文件和音频文件,它会生成一个新的视频,在这个视频里,不仅人物的嘴…

QR与DM码的识别

1.QR码与DM码QR码(Quick Response Code)是一种矩阵条码,能够快速被扫描设备识别。它是由日本Denso Wave公司在1994年发明的,用于追踪汽车零件。QR码可以存储更多的数据,并且可以包含文本、URL、图片等信息。QR码的特点是快速识别,因此得名。它们广泛应用于广告、产品追踪…

FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作

​《FFmpeg开发实战:从零基础到短视频上线》一书的“3.4.3 把原始的H264文件封装为MP4格式”介绍了如何把H.264裸流封装为MP4文件。那么在网络上传输的H.264裸流是怎样被接收端获取视频格式的呢?前文指出H.264流必定以“SPS帧→PPS帧→IDR帧”开头,接下来就来验证是否确实如…