JAVA-第三次大作业blog

news/2024/12/28 0:50:18/文章来源:https://www.cnblogs.com/TuY11/p/18636839

一.前言
在深入探索Java编程的征途中,我迎来了第七、八次PTA题目集的挑战。这两次作业不仅是对我学习成果的检验,更是深化我对Java核心概念——继承理解的宝贵契机。通过亲身实践,我不仅巩固了继承在Java中的应用技巧,还跨越性地深化了对子类与父类关系的洞察。每一次编码,都是对Java世界的一次细致入微的游历。在这段旅程中,我愈发感受到继承这一机制所蕴含的强大力量与灵活性。子类如同继承父类血脉的新生力量,既保留了父类的遗传信息(即方法和属性),又能够在此基础上衍生出独特的个性与功能。这种“既继承又发展”的编程哲学,让我深刻体会到Java语言在设计上的精妙与深邃。此外,我还巧妙地运用了ArrayList这一Java集合框架中的瑰宝,实现了数组的灵活自增。ArrayList以其动态扩容的特性,为我提供了便捷且高效的数组操作方式,极大地提升了我的编程效率与代码质量。
二.设计与分析
(1)第七次PTA最后一题
7-1 家居强电电路模拟程序-3
分数 100
作者 蔡轲
单位 南昌航空大学
智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务器、影柜系统、网络家电等)连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测、暖通控制、红外转发以及可编程定时控制等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,兼备建筑、网络通信、信息家电、设备自动化,提供全方位的信息交互功能。请根据如下要去设计一个智能家居强电电路模拟系统。以下题目介绍中加粗的部分为本次迭代在“家居强电电路模拟程序-2”的基础上增加的功能要求。

本次作业增加的内容有:互斥开关和元件电阻,并且本次迭代考虑多个并联电路串联在一起的情况。
报表如下:

从报表可以看出:分支语句百分比: 23.3%,这个比例表明代码中存在一定量的分支逻辑,但不算过高。方法调用语句: 342次,这个数字需要根据代码的总体规模来判断是否合理。最大复杂度异常高。注释行百分比: 5.3%,这个比例较低,可以通过增加注释以提高代码的可读性和可维护性。类和接口数量: 15个。方法和类的分布:每个类的方法数: 6.07个,这表明类的方法分布较为均匀。每个方法的平均语句数: 5.35条,这表明方法可能较为简洁。代码结构:最深块的行数: 549行,这表明存在深层嵌套的代码块,可能需要重构以提高可读性。最大块深度: 8,这个深度较高,表明代码结构可能需要优化。

类图如下:

其中各个类的作用为:
Eletronic(抽象类):
作为所有电子元件的基类,提供了一些基本属性如名称、引脚号(Pin)、左右电压(leftvolt, rightvolt)、等级(rank)、子电压(subvolt)、亮度(lux)、转速(rpm)、电阻(rohm)和优先级(important)。
定义了一些基本方法,如获取和设置上述属性的方法,以及一些特定于电子元件行为的方法(如gainlux()计算亮度,gainrpm()计算转速,这些在基类中没有具体实现)。
K(开关类):
表示电路中的开关,用于控制电路的通断。
可以设置开关的状态,并通过amendrank()方法改变开关的等级,从而影响电路。
print()方法用于输出开关的当前状态。
F(分档调速器类):
表示分档调速器,用于控制风扇或其他设备的转速。
amendrank(String s)方法根据输入的字符串(如"+"或"-")增加或减少调速器的等级。
getOutvolt()方法返回当前等级对应的输出电压。
print()方法输出调速器的当前等级。
L(连续调速器类):
表示连续调速器,允许更精细地控制设备的速度。
amendrank(String s)方法根据输入的字符串设置调速器的等级。
print()方法输出调速器的当前等级。
B(白炽灯类):
表示白炽灯,根据电压差计算亮度。
gainlux()方法计算并设置白炽灯的亮度。
print()方法输出白炽灯的亮度。
R(日光灯类):
表示日光灯,根据电压差计算亮度。
gainlux()方法计算并设置日光灯的亮度。
print()方法输出日光灯的亮度。
D(吊扇类):
表示吊扇,根据电压差计算转速。
gainrpm()方法计算并设置吊扇的转速。
print()方法输出吊扇的转速。
A(落地扇类):
表示落地扇,与吊扇类似,但可能有不同的转速计算方式。
gainrpm()方法计算并设置落地扇的转速。
print()方法输出落地扇的转速。
H(互斥开关类):
表示互斥开关,用于控制电路中的互斥设备,确保同一时间只有一个设备工作。
amendrank()方法改变互斥开关的状态,影响电路。
print()方法输出互斥开关的当前状态。
S(受控窗帘类):
表示受控窗帘,根据环境亮度调整窗帘的开合比例。
openrate(double lux)方法根据输入的亮度值调整窗帘的开合比例。
print()方法输出窗帘的当前开合比例。
Tcircuit(串联电路类):
表示一个串联电路,包含多个Eletronic对象,可以是上述任何类型的设备。
包含方法来设置电路的ID、电阻和电子元件列表。
Mcircuit(并联电路类):
表示一个并联电路,包含多个电路的ID和描述。
用于管理和描述并联电路的结构。
function(功能类):
包含静态方法,用于执行电路的特定功能,如排序电子元件、检查开关状态、计算总亮度等。
Operation(操作类):
包含静态方法,用于处理用户输入、执行电路操作和输出结果。

对本次新增部分的互斥开关主要代码有:

点击查看代码
class H extends Eletronic {public H() {this.setImportant(7);this.setRohm(5);}public H(String name, double leftvolt, double rightvolt) {super(name, leftvolt, rightvolt);this.setRohm(5);}public void amendrank() {this.setRank((this.getRank()+1)%2);if(this.getRank() > 0) {this.setRohm(10);} else {this.setRohm(5);}}public void print() {if(this.getRank() < 1) {System.out.println("@"+this.getName()+":closed");} else {System.out.println("@"+this.getName()+":turned on");}}
}
对本次新增部分的受控窗帘主要代码有:
点击查看代码
class S extends Eletronic {//吊扇类private double rate = 100;public S() {this.setImportant(8);this.setRohm(15);}public S(String name, double leftvolt, double rightvolt) {super(name, leftvolt, rightvolt);this.setRohm(15);this.rate = 100;}public double getRate() {return rate;}public void setRate(double rate) {this.rate = rate;}public void openrate(double lux) {if(this.getSubvolt() >= 50) {if (lux < 50)setRate(100);else if (lux < 100) {setRate(80);} else if (lux < 200) {setRate(60);} else if (lux < 300) {setRate(40);} else if (lux < 400) {setRate(20);} else {setRate(0);}}}public void print() {BigDecimal rates = new BigDecimal(this.getRate());rates = rates.setScale(0, RoundingMode.DOWN);System.out.println("@" + this.getName() + ":" + rates + "%");}
}
因为在创建H时会创建两个元件,所以最后需要去重:
点击查看代码
//去重for(Tcircuit tt:t) {for(Eletronic elet:tt.tcircuit) {if(ele.size() > 0) {if(!function.rename(ele,elet)) {ele.add(elet);}} else {ele.add(elet);}}}
**提交结果**

心得:
本次难点、关键点主要有:电路模拟的复杂性:需要模拟互斥开关设备和对受控窗帘的开关以及对每条电路计算总电阻。状态管理:每个设备都有特定的状态或档位,需要正确地初始化并在模拟过程中更新这些状态特别是对互斥开关的模拟。输入信息解析:需要解析输入信息,包括设备信息、连接信息和控制设备调节信息,这涉及到复杂的字符串处理,不能简单地使用contains,而应该使用equals来更精确判断字符串是否相等。输出信息需要按照特定的格式,包括设备状态的转换(如开关的开/关状态转换为文字描述)。精度处理:在计算过程中需要使用 double 类型来避免精度误差,但在输出时需要截断小数部分,所以可以通过先*10000和/10000来增加精度。需要遵守题目中提到的约束条件,如不考虑两个输出引脚短接、、并联接入或串联接入等。

(2)第八次PTA最后一题
7-1 家居强电电路模拟程序-4
分数 100
作者 蔡轲
单位 南昌航空大学
智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务器、影柜系统、网络家电等)连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测、暖通控制、红外转发以及可编程定时控制等多种功能和手段。与普通家居相比,智能家居不仅具有传统的居住功能,兼备建筑、网络通信、信息家电、设备自动化,提供全方位的信息交互功能。请根据如下要去设计一个智能家居强电电路模拟系统。以下题目介绍中加粗的部分为本次迭代在“家居强电电路模拟程序-3”的基础上增加的功能要求。

本次题目主要是增加了元件:二极管,修改了输出的格式,在原有输出中增加了元件引脚电压的显示,以及电路有短路部分则直接结束并输出信息。
报表如下:

代码复杂度:分支语句百分比: 33.0%,这个比例表明代码中存在一定量的分支逻辑,但不算过高。方法调用语句: 978次,这个数字相对较高,意味着代码中有很多方法调用,需要检查是否有过度使用或不必要的调用。最大复杂度: 1*,这个数字较低,表明代码的复杂度控制得较好。代码质量:注释行百分比: 4.6%,这个比例非常低,需要增加注释以提高代码的可读性和可维护性。类和方法的分布:类和接口数量: 17个,这个数量适中,但需要根据项目规模和需求来判断是否合理。每个类的方法数: 6.59个,这个数字表明类的方法分布较为均匀。每个方法的平均语句数: 7.76条,这个数字表明方法可能较为简洁。最大块深度: 9+,这个深度非常高,表明代码结构可能需要优化。

类图如下:

其中,Eletronic(抽象类):作为所有电子元件的基类,提供了一些基本属性如名称、引脚(Pin1, Pin2)、电压(leftvolt, rightvolt, Pin3volt)、等级(rank)、子电压(subvolt)、亮度(lux)、转速(rpm)、电阻(rohm)和优先级(important)。定义了一些基本方法,如获取和设置上述属性的方法,以及一些特定于电子元件行为的方法(如gainlux()计算亮度,gainrpm()计算转速)。K(开关类):表示电路中的开关,用于控制电路的通断。可以设置开关的状态,并通过amendrank()方法改变开关的等级,从而影响电路。print()方法用于输出开关的当前状态,包括电压和是否超过电流限制。F(分档调速器类):表示分档调速器,用于控制风扇或其他设备的转速。amendrank(String s)方法根据输入的字符串(如"+"或"-")增加或减少调速器的等级。getOutvolt()方法返回当前等级对应的输出电压。print()方法输出调速器的当前等级和电压。L(连续调速器类):表示连续调速器,允许更精细地控制设备的速度。amendrank(String s)方法根据输入的字符串设置调速器的等级。print()方法输出调速器的当前等级和电压。B(白炽灯类):表示白炽灯,根据电压差计算亮度。gainlux()方法计算并设置白炽灯的亮度。print()方法输出白炽灯的亮度和电压。R(日光灯类):表示日光灯,根据电压差计算亮度。gainlux()方法计算并设置日光灯的亮度。print()方法输出日光灯的亮度和电压。D(吊扇类):表示吊扇,根据电压差计算转速。gainrpm()方法计算并设置吊扇的转速。print()方法输出吊扇的转速和电压。A(落地扇类):表示落地扇,与吊扇类似,但可能有不同的转速计算方式。gainrpm()方法计算并设置落地扇的转速。print()方法输出落地扇的转速和电压。H(互斥开关类):表示互斥开关,用于控制电路中的互斥设备,确保同一时间只有一个设备工作。amendrank()方法改变互斥开关的状态,影响电路。print()方法输出互斥开关的当前状态。S(受控窗帘类):表示受控窗帘,根据环境亮度调整窗帘的开合比例。openrate(double lux)方法根据输入的亮度值调整窗帘的开合比例。print()方法输出窗帘的当前开合比例。P(二极管类):表示二极管,具有单向导电性。amendrank()方法根据电压差调整二极管的状态。print()方法输出二极管的当前状态和电压。
增加的二极管代码如下:

点击查看代码
class P extends Eletronic {//吊扇类public P() {this.setImportant(9);this.setMaxi(8);this.setRohm(0);}public P(String name, double leftvolt, double rightvolt) {super(name, leftvolt, rightvolt);this.setMaxi(8);}public void setRightvolt() {this.setRightvolt(this.getLeftvolt());}public void setLeftvolt() {this.setLeftvolt(this.getRightvolt());}public void amendrank() {if(this.getLeftvolt() < this.getRightvolt()) {this.setRank(1);this.setRohm(100000);} else if (this.getLeftvolt() == this.getRightvolt()) {if(this.getPin1().equals("1")) {this.setRank(0);setRohm(0);} else {this.setRank(1);setRohm(100000);}} else {this.setRank(0);this.setRohm(0);}}public void print() {if(this.getPin1().equals("1")) {if (this.getRank() < 1) {if (this.getCurrenti() > this.getMaxi()) {System.out.println("@" + this.getName() + ":conduction" + " " + (int) this.getLeftvolt() + "-" + (int) this.getRightvolt() + " exceeding current limit error");} else {System.out.println("@" + this.getName() + ":conduction" + " " + (int) this.getLeftvolt() + "-" + (int) this.getRightvolt());}} else {System.out.println("@" + this.getName() + ":cutoff" + " " + (int) this.getLeftvolt() + "-" + (int) this.getRightvolt());}} else {if (this.getRank() < 1) {if (this.getCurrenti() > this.getMaxi()) {System.out.println("@" + this.getName() + ":conduction" + " " + (int) this.getRightvolt() + "-" + (int) this.getLeftvolt() + " exceeding current limit error");} else {System.out.println("@" + this.getName() + ":conduction" + " " + (int) this.getRightvolt() + "-" + (int) this.getLeftvolt());}} else {System.out.println("@" + this.getName() + ":cutoff" + " " + (int) this.getRightvolt() + "-" + (int) this.getLeftvolt());}}}
}
**提交结果**

心得:
本次难点、关键点主要有:二极管的模拟,以及元件引脚电压的设置。特别是在开关处引脚的电压容易出错。也因为本次的难度很大所以得分很少。而且对二极管的模拟也没有到位。通过测试点发现,在并联电路内部还有并联电路时,我的代码也有问题,但是由于二极管模拟没搞好,所以一直无法修改好。

三.踩坑心得
这两次主要踩的坑就是对错误测试点对应问题的寻找上,以及对互斥开关和二极管的模拟上。以及在匹配每条电路是否是被并联时,不能偷懒使用contains,而且应该使用equals对字符串进行精确的匹配,避免出现如D11与D1匹配到的问题。还有就是在控制精度时可以先*10000,然后再/10000,这样可以提高精度。避免因精度问题而出错。

四.改进建议
将重复的代码片段(如在Operation类中的if语句块)抽象成方法,以减少代码重复。将大型的类和方法拆分成更小的单元,以提高代码的可读性和可维护性。遵循Java的命名约定,例如类名应该以大写字母开头,方法和变量名应该以小写字母开头。避免在循环中进行不必要的计算,例如在sumRohm方法中,如果发现短路,应立即返回0,而不是继续循环。增加注释,提高代码的可读性。检查深层嵌套的代码块,考虑重构以提高可读性。如果方法调用过多,需要考虑优化代码结构,减少不必要的方法调用。

五.总结
通过这两次PTA作业的洗礼,我逐渐构建并完善了一个功能齐全的家居强电电路模拟程序。在这个过程中,我对Java继承机制的理解变得更加深入和透彻。我深刻体会到,良好的初始设计对于后续迭代的重要性,它能够大大简化开发过程,让每一步都走得更加稳健。在这些作业的实践中,我特别注重了代码的可读性和可扩展性。我增加了代码注释,以清晰地记录每个步骤和决策,这不仅有助于他人理解我的代码,也方便了我自己未来的回顾和维护。同时,我努力确保每个类都专注于其核心职责,只包含与其功能直接相关的方法,这样的单一职责原则让我的代码更加模块化,易于管理和扩展。这些宝贵的经验不仅让我在编程技艺上更进一步,也为我未来的学习和职业生涯奠定了坚实的基础。我相信,随着时间的推移,这些技能将不断发光发热,成为我编程旅途中的宝贵财富。

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

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

相关文章

Unity音频管理方案

AudioManager类的创建可以序列化,就可以在外面看到然后在Awake里面初始化一下AudioManager类的完善 写个单例:这样就可以直接在外面AudioManager.去调用比较方便 使用AudioMixer对音频进行分组使用unity自带的AudioMixer使用unity自带的AudioMixer进行音量统一处理在UI框架里…

没有xml configuration file

点击new菜单发现没有看到XML Configuration File选项。1、正确导入spring jar包,spring5.6 maven坐标<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.2.1</versi…

PostgreSQL 数据库的启动与停止管理

title: PostgreSQL 数据库的启动与停止管理 date: 2024/12/28 updated: 2024/12/28 author: cmdragon excerpt: 作为一个强大的开源关系数据库管理系统,PostgreSQL在众多应用场景中发挥着关键作用。在实际使用过程中,对于数据库的启动和停止操作至关重要。这不仅关系到数据…

人工智能Agent提示工程的六个关键要素

一个构造良好的提示封装了所有必要的信息,确保AI Agent生成准确的响应并有效地执行任务。 通过系统地组合特定组件,提示符为LLM提供了一个全面的框架,以实现最佳功能。 六个关键要素如下: 1.用户请求:这是用户提供的原始任务描述,概述了目标和期望的结果。它作为代理行为…

一个Java实现的OCR系统

一个Java实现的OCR系统 利用java17实现的一套OCR推理系统,兼容paddleocr。如下图,目前功能如下,https://github.com/jiangnanboy/JiaJiaOCR:

staticfile cdn崩了,boot cdn崩了。

背景 一天之内碰到两个cdn同时炸。 staticfile cdnboot cdn我没截图,他主站是没炸的,但是js文件访问不了,过了一段时间又好了。 后面恢复了,下面是bootcdn的速度测试,有点慢说实话。其他bootcdn太慢了,换一家用用。npmmirror 全国最nb的镜像站,无需多言。 格式如下 http…

《计算机组成及汇编语言原理》阅读笔记:p121-p122

《计算机组成及汇编语言原理》学习第 8 天,p121-p122 总结,总计 2 页。 一、技术总结 1.memory优化 (1)cache memory remove blank from "Most computers support two different kinds (levels) of cache: level one (L1) cache is built into the CPU chip itself and…

【电商系统】使用多种设计模式重构电商系统登录业务场景

一、介绍 在做业务功能开发的时候,每个程序员接触过最多的应该就是登录功能了,而一个登录功能有很多种登录交互的体现,当我们开始写登录代码的时候,前期能满足登录就行了,渐渐的系统中加入了不同业务需求的代码,以及每个登录需要特殊处理的参数,基本上我们要开发不同的接…

Android 当鸟动漫(原樱花动漫) 1.5.5.8去广告版

当鸟动漫(原樱花动漫)是许多二次元用户喜欢用的免费动漫平台,网罗了各种动漫番剧资源,新番、日漫、国漫、美漫、电影等其他内容一网打尽,应有尽有,同步更新,智能精选推荐,高清播放,自由筛选观看阅读,还支持收藏、下载、分享、反馈,好用又实用!Android 当鸟动漫:下载…

3.6背景

1.背景颜色 2.背景图片

JVM实战—3.JVM垃圾回收的算法和全流程

大纲 1.JVM内存中的对象何时会被垃圾回收 2.JVM中的垃圾回收算法及各算法的优劣 3.新生代和老年代的垃圾回收算法 4.避免本应进入S区的对象直接升入老年代 5.Stop the World问题分析 6.JVM垃圾回收的原理核心流程 7.问题汇总1.JVM内存中的对象何时会被垃圾回收 (1)什么时候会触…