首页 > 其他分享 >我的第三次oop

我的第三次oop

时间:2024-07-06 10:30:13浏览次数:6  
标签:Java 第三次 aSwitches ArrayList resistance 电路 oop device

阅读目录

前言

第七次PTA

第八次PTA

总结

前言

一:对于java的最后认识

Java是一种功能强大且广泛使用的编程语言,它以其独特的优势在软件开发领域占据了重要地位。以下是关于Java更详细的认知:
跨平台性:Java的“一次编写,到处运行”的能力是其最显著的特点。通过Java虚拟机(JVM),Java程序可以在任何安装了JVM的操作系统上运行,这使得Java成为了跨平台开发的首选语言。
面向对象:Java是完全面向对象的语言,支持类和对象的概念,这使得代码更加模块化、易于维护和扩展。通过继承、封装和多态等特性,Java能够实现代码的高内聚、低耦合,提高软件的可重用性。
自动内存管理:Java具有垃圾回收机制,能够自动管理内存,减少了内存泄漏和内存溢出的风险。程序员无需手动分配和释放内存,从而降低了出错的可能性。
丰富的API:Java标准库(JDK)提供了大量的API,这些API覆盖了从基本的数据结构到复杂的网络编程、图形用户界面(GUI)开发等各个方面。这些API使得Java程序员能够高效地开发出各种类型的应用程序。
安全性:Java是一种安全性很高的编程语言,具有很多安全特性。它支持访问控制、异常处理、字节码验证等机制,可以确保程序的稳定性和安全性。这使得Java成为开发安全敏感应用(如银行系统、电子商务网站等)的理想选择。
多线程支持:Java内置了对多线程的支持,这使得开发并发应用变得更加容易。Java提供了多种同步机制,如synchronized关键字、Lock接口等,以确保线程安全。多线程编程在现代软件开发中越来越重要,Java的多线程支持使得程序员能够充分利用多核处理器的性能。
广泛的应用领域:Java在各个领域都有广泛的应用,包括企业应用、Web开发、移动开发、大数据、云计算等。许多知名的企业和项目都选择Java作为主要的开发语言,如Google的Android操作系统、Amazon的AWS云计算平台等。
庞大的开发社区和丰富的资源:Java拥有庞大的开发者社区和丰富的资源支持,如开源项目、教程、书籍、论坛等。这些资源为Java的学习和使用提供了极大的便利,使得Java成为易于学习和掌握的语言。
持续更新与演进:Java语言本身也在不断地更新和演进,以适应不断变化的市场需求。新的Java版本会引入新的特性和改进,以提高语言的表达能力和开发效率。例如,Java 8引入了Lambda表达式和函数式接口等特性,极大地提高了代码的简洁性和可读性。
总的来说,Java以其独特的优势在软件开发领域具有举足轻重的地位。无论是初学者还是经验丰富的开发者,Java都是一个值得学习和掌握的重要编程语言。

二:对于这两次PTA的理解

这两次的pta的难度都很大,导致了许多人所得的分十分不理想,特别是最后一次的pta作业,那更是难上加难,许多之前分一直很高的同学也在这里绊倒了,就比如我的一个室友,在之前的陪pta一直都是满的,但是也栽在最后一次上了,但是我们老师说过,坚持到这里就已经很不错了,就已经成功了

第七次PTA

设计与分析

以下是类的分析
Device类:(抽象类)

ElectricalAppliance类:(抽象类)

Control类:(抽象类)

Switch类:


Fan类:

IncandescentLamp类:

FluorescentLamp类:

BinningGovernor类:

ContinuousGovernor类:

Mian类。
分析:
其中ElectricalAppliance类和Control类是Device类的子类;
Switch类、BinningGovernor类和ContinuousGovernor类是Control类的子类;
最后FluorescentLamp类、IncandescentLamp类和Fan类是ElectricalAppliance类的子类。
PowerDesigner输出例如:

接下来的是SourceMonitor的测试结果:

思路分析:

定义设备类:
电路设备类:包含所有电路设备的公共特征,如电阻、电流、电压等属性。
受控设备类:包含受控设备的特性和行为,如灯、风扇等。
控制设备类:包含控制设备的特性和行为,如开关、调速器等。
实现设备类的方法:
为每个设备实现计算电压、电流、电阻等的方法。
为受控设备实现根据电压计算亮度或转速的方法。
为控制设备实现切换状态或调节档位的方法。
设计电路结构:
串联电路类:表示电路中元件的串联关系,包括计算整个电路的电压、电流等。
并联电路类:表示电路中元件的并联关系,包括计算各个分支的电压、电流等。
实现电路结构:
使用类的方法来计算并返回电路的各个参数。
确保电路的输入输出符合题目的要求。
输入输出设计:
设计输入信息的格式,如设备标识符、编号、引脚编号等。
设计输出信息的格式,如设备标识、编号、状态或参数值等。
异常处理:
确保系统能够处理非法输入,如错误的设备标识符、不合理的连接信息等。
避免系统因短路等异常情况而损坏。
测试:
开发测试用例,确保系统能够正确地处理各种输入,并输出正确的结果。
进行边界测试、异常测试等,确保系统的鲁棒性。

踩坑心得

1.电路模拟过程中可能会出现小数,如果处理不当,可能会导致模拟精度问题。
2.用户输入的电路连接信息可能存在错误,如引脚接错、设备型号错误等。
3.并联电路中包含串联电路,或者多个并联电路相互包含,会增加电路分析的复杂性。
4.电路模拟系统的正确性需要通过广泛的测试来验证,测试用例的设计和执行非常重要。

改进建议

1.使用合适的数据类型(如double)进行计算,并在输出时按照规定的截尾规则处理小数部分,确保模拟的准确性。
2.设计输入验证机制,确保输入的信息符合格式要求和物理规律,如检查电源和地线的连接是否正确。
3.在进行智能家居强电电路模拟系统的设计和开发时,持续的学习和实践是非常重要的。面对挑战,要保持耐心和毅力,不断探索和尝试新的解决方案。同时,团队成员之间的沟通和合作也是成功的关键。

第八次PTA

设计与分析

所建类分析:
Device类:(抽象类)

ElectricalAppliance类:(抽象类)

Control类:(抽象类)

Switch类:


Fan类:

IncandescentLamp类:

FluorescentLamp类:

BinningGovernor类:

ContinuousGovernor类:

FloorFan类:

Concatenation类:

点击查看代码
class Concatenation {//串联
    private ArrayList<ParallelConnection> parallelConnection ;
    private ArrayList<String> device = new ArrayList<>();

    public Concatenation() {
    }

    public Concatenation(ArrayList<ParallelConnection> parallelConnection, ArrayList<String> device) {
        this.parallelConnection = parallelConnection;
        this.device = device;
    }

    public ArrayList<String> getDevice() {
        return device;
    }

    public void setDevice(ArrayList<String> device) {
        this.device = device;
    }


    public void setParallelConnection(ArrayList<ParallelConnection> parallelConnection) {
        this.parallelConnection = parallelConnection;
    }

    public ArrayList<ParallelConnection> getParallelConnection() {
        return parallelConnection;
    }

    public double totalResistance(ArrayList<String> aSwitches,int[] num) {
        double resistance = 0;
        for (int i = 0; i < device.size(); i++) {
            switch (device.get(i).charAt(0)){
                case 'K':resistance = resistance + 0;
                    break;
                case 'B':resistance = resistance + 10;
                    break;
                case 'R':resistance = resistance + 5;
                    break;
                case 'D':resistance = resistance + 20;
                    break;
                case 'A':resistance = resistance + 20;
                    break;
                case 'M':resistance = resistance + ShuntResistance(aSwitches,num);
                break;
                default:
                    break;
            }
        }
        return resistance;
    }

    public double ShuntResistance(ArrayList<String> aSwitches,int[] num){
        double resistance = 0, resistance1 = 0;
        for (int i = 0; i < parallelConnection.size(); i++) {
            resistance += 1/parallelConnection.get(i).totalResistance(aSwitches,num);
        }
        resistance1 = 1/resistance;
        return resistance1;
    }

    public double TributaryVoltage(ArrayList<String> aSwitches,int[] num){
        double voltage = 0;
        voltage = 220*(ShuntResistance(aSwitches,num)/totalResistance(aSwitches,num));
        return voltage;
    }

    public double MainVoltage(ArrayList<String> aSwitches,int[] num){
        double voltage = 0;
        voltage = 220 - TributaryVoltage(aSwitches,num);
        return voltage;
    }

    public void ToPrintln(ArrayList<String> aSwitches,int[] num){
        ArrayList<String> device1 = new ArrayList<>();
        int i,j,k;
        for (i = 0; i < device.size(); i++) {
            if(device.get(i).charAt(0) == 'M')
                continue;
            device1.add(device.get(i));
        }
        for (j = 0; j < parallelConnection.size(); j++) {
            for (k = 0; k < parallelConnection.get(j).getDevice().size(); k++) {
                device1.add(parallelConnection.get(j).getDevice().get(k));
            }
        }
        char[] type = {'K','F','L','B','R','D','A'};
        for (int l = 0; l < type.length; l++) {
            for (int m = 0; m < device1.size(); m++) {
                if(device1.get(m).charAt(0) == type[l]){
                    
                }
            }
        }
    }
}

ParallelConnection类:

点击查看代码
class ParallelConnection{//并联类
    private ArrayList<String> device = new ArrayList<>();

    public ParallelConnection() {
    }

    public ParallelConnection(ArrayList<String> device) {
        this.device = device;
    }


    public ArrayList<String> getDevice() {
        return device;
    }

    public void setDevice(ArrayList<String> device) {
        this.device = device;
    }

    public double totalResistance(ArrayList<String> aSwitches,int[] num) {
        ArrayList<Device> devices = new ArrayList<>();
        double resistance = 0;
        int n = 0;
        for (int i = 0; i < device.size(); i++) {
            switch (device.get(i).charAt(0)){
                case 'K':
                    n = 0;
                    Switch aSwitch = new Switch();
                    for (int j = 0; j < aSwitches.size(); j++) {
                        if(device.get(i).equals(aSwitches.get(j))){
                            aSwitch = new Switch(device.get(i),1,2,num[j]);
                            resistance = resistance + 0;
                            n = 1;
                        }
                    }
                    if(n == 1){
                        aSwitch = new Switch(device.get(i),1,2,0);
                        resistance = resistance + 0;
                    }
                    devices.add(aSwitch);
                    if (aSwitch.changeState() == 0){
                        n = 2;
                    }
                break;
                case 'B': resistance = resistance + 10;
                break;
                case 'R':resistance = resistance + 5;
                break;
                case 'D':resistance = resistance + 20;
                break;
                case 'A':resistance = resistance + 20;
                break;
                default:
                    break;
            }
            if (n == 2) {
                resistance = 0;
                break;
            }
        }
        return resistance;
    }
}

Mian类。
其中ElectricalAppliance类和Control类是Device类的子类;
Switch类、BinningGovernor类和ContinuousGovernor类是Control类的子类;
最后FluorescentLamp类、IncandescentLamp类、Fan类和FloorFan类是ElectricalAppliance类的子类。
Concatenation类和ParallelConnection类是独立出来的单独类,与其他类关联,其电路作用。
PowerDesigner输出例如:

因为一部分的原因,类图看着反而更加简单了,实际上一个会更加复杂才对。
接下来的是SourceMonitor的测试结果:

输入是全部放在Main类中了,代码如下:

点击查看代码
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        ArrayList<String> aSwitches = new ArrayList<>();
        ArrayList<String> aSwitch = new ArrayList<>();
        ArrayList<String> circuit2 = new ArrayList<>();
        ArrayList<ParallelConnection> parallelConnections = new ArrayList<>();
        Concatenation concatenation = new Concatenation();
        int num1 = 0,num2 = 0;
        int n = 0,m = 0;
        double gears = 0;
        String all = "";
        while (true){
            all = sc.nextLine();
            if(all.equals("end")){
                break;
            }
            if(all.charAt(1) == 'T'){
                String circuit1 = "";
                String regex = "\\[([^\\]]+)\\]";
                Pattern pattern = Pattern.compile(regex);
                Matcher matcher = pattern.matcher(all);
                int i = 1;
                while (matcher.find()) {
                    circuit1 += matcher.group(1) + " ";
                }
                String[] circuit = circuit1.split("IN |-| OUT| ");
                circuit[0] = String.valueOf(all.charAt(2));
                ArrayList<String> device = new ArrayList<>();
                for(int j = 0; j+3< circuit.length; j=j+4){
                    device.add(circuit[j+3]);
                }
                if(circuit1.charAt(0) == 'I' ){
                    ParallelConnection temp = new ParallelConnection();
                    temp.setDevice(device);
                    parallelConnections.add(temp);
                }
                if(circuit1.charAt(0) == 'V'){
                    concatenation.setDevice(device);
                    concatenation.setParallelConnection(parallelConnections);
                }
            }
            if(all.charAt(1) == 'M'){
                Pattern pattern1 = Pattern.compile("#M1:\\[([\\S]+)\\s+([\\S]+)\\]");
                Matcher matcher1 = pattern1.matcher(all);
                if (matcher1.find()) {
                    circuit2.add(matcher1.group(1));
                    circuit2.add(matcher1.group(2));
                }
            }
            if(all.charAt(1) == 'K'){
                String[] switch1 = all.split("#");
                aSwitches.add(switch1[1]);
            }
            if(all.charAt(1) == 'F'){
                if(all.charAt(3) == '+'){
                    num2++;
                }
                else
                    num2--;
            }
            if(all.charAt(1) == 'L'){
                String[] lian = all.split("#L|:");
                gears = Double.parseDouble(lian[2]);
            }
        }
        int[] numK = new int[aSwitches.size()];
        aSwitch.add(aSwitches.get(0));
        numK[0] = 1;
        for (int i = 0; i < aSwitches.size(); ) {
            n = 1;
            for (int j = i + 1; j < aSwitches.size(); j++) {
                if(aSwitches.get(i).equals(aSwitches.get(j))){
                    for (int k = 0; k < aSwitch.size(); k++) {
                        if(aSwitch.get(k).equals(aSwitches.get(j))){
                            numK[k]++;
                            n++;
                        }
                    }
                }
                else{
                    for (int k = 0; k < aSwitch.size(); k++) {
                        if(!aSwitch.get(k).equals(aSwitches.get(j))){
                            aSwitch.add(aSwitches.get(j));
                            numK[k+1] = 1;
                            break;
                        }
                    }
                    break;
                }
            }
            if(n != 0){
                i = i + n;
            }
            else {
                i++;
            }
        }
        concatenation.ToPrintln(aSwitches,numK);
    }
思路分析

设备定义和连接:
确保所有设备都被正确地定义,包括它们的属性和连接方式。
注意设备之间的连接顺序和方式,确保串联和并联的关系被正确表示。
对于互斥开关,确保分支引脚的连接关系被正确处理。
输入信息的解析:
准确解析输入的设备信息、连接信息和控制调节信息。
确保输入的信息符合格式要求,如设备标识符、编号的正确性,引脚编号的合理性等。
电路模拟逻辑:
设计正确的电路模拟逻辑,确保电路的电压和电流计算准确无误。
对于调速器,实现正确的档位切换逻辑。
对于灯和风扇等受控设备,根据输入的电压差计算亮度或转速。
电流和电压的限制:
检查电路中的实时电流是否超过设备的最大电流限制。
对于电压,确保不超过220V的限制。
短路检测:
实现短路检测机制,当检测到短路时,输出错误信息并停止电路模拟。
二极管的特性和连接:
确保二极管的正向导通和反向截止特性被正确模拟。
注意二极管的连接方式,确保其两端电压的计算正确。
输出信息的格式:
确保输出信息格式符合要求,如设备状态和参数的显示,以及引脚电压的输出。
测试和验证:
设计全面的测试用例,包括正常情况、边界情况和异常情况。
验证电路模拟结果的正确性,确保输出信息与预期一致。
错误处理和提示:
当发生错误时,如短路、电流超过限制等,应给出明确的错误提示。

踩坑心得

1.短路可能导致电路模拟程序崩溃或设备损坏,设备的输入输出可能连接错误,导致电路模拟不准确,二极管的正向导通和反向截止特性需要正确模拟。
2.电器在工作时,过大的电流会引起电器过热,从而烧坏电路,

3.电路模拟的正确性需要通过测试来验证。

改进建议

1.短路检测是保障电路安全的重要措施,不可忽视,在模拟电路时,输入输出的连接是非常关键的,必须仔细核对,处理复杂电路结构时,清晰的逻辑和适当的抽象是非常重要的,电流限制不仅是为了安全,也是为了保护设备的正常工作。
2.在进行智能家居强电电路模拟时,需要有扎实的电子电路基础,对各种电子元件的工作原理和特性有深入的了解。同时,良好的编程习惯和清晰的逻辑思维也是必不可少的。在设计过程中,要不断地调试和优化,以确保电路模拟的准确性和稳定性。

总结

1.设计一个智能家居强电电路模拟系统是一个复杂的工程,涉及到的知识点包括但不限于电子电路原理、编程语言、数据结构、算法等
2.pta题集的难度是有目共睹的,不能像第一次一样按照自己的想法随便编写,需要严格按照要求来,有自己的想法固然是好事,但一定是要在要求下才可以,用得好是锦上添花,否则就变成了不按照规则办事,适得其反,一定要循规蹈矩的一步一步的往前走。
3.如果以后有机会遇见迭代的题时,一定要一步一步走踏实了,建好基础才可以在后面的题目中走的更远,爬的更高。
4.理论上来说一道题类建的越多就应该越简单,但是还是要根据题目来建立,不管任何盲目的建立只会使代码更加混乱。
5.类一定要履行单一职责原则这样会使代码更加清晰明了,不至于将自己写昏。

标签:Java,第三次,aSwitches,ArrayList,resistance,电路,oop,device
From: https://www.cnblogs.com/CJ-05/p/18276226

相关文章

  • hadoop添加磁盘扩容
    磁盘准备定位新磁盘使用lsblk或者sudofdisk-l命令来查看系统上已连接的磁盘,并找到你想要挂载的新磁盘的设备名称,比如/dev/sda2。lsblksudofdisk-l格式化新磁盘假设新磁盘的设备名是/dev/sda2,使用以下命令将其格式化为ext4文件系统:sudomkfs.ext4/dev/sda2......
  • Apache Hadoop完全分布式集群搭建指南
    Hadoop发行版本较多,Cloudera版本(Cloudera’sDistributionIncludingApacheHadoop,简称CDH)收费版本通常用于生产环境,这里用开源免费的ApacheHadoop原始版本。下载:ApacheHadoop版本下载:Indexof/hadoop/commonHadoop基础知识可查看本专栏其它篇章:ApacheHadoop的核心组成......
  • (必看图文)Hadoop集群安装及MapReduce应用(手把手详解版)
    前言    随着大数据时代的到来,处理和分析海量数据已成为企业和科研机构不可或缺的能力。Hadoop,作为开源的分布式计算平台,因其强大的数据处理能力和良好的可扩展性,成为大数据处理领域的佼佼者。本图文教程旨在帮助读者理解Hadoop集群的安装过程,并通过MapReduce应用实例,......
  • ThreadLoop实践学习笔记
    背景在日常工作和学习源码过程中,经常可以看到ThreadLoop的运用,发现ThreadLoop作为一个基础工具,在具体项目中有不同而又十分相似的实现,虽然核心的机制万变不离其宗(IO多路复用),但面向的业务场景不同导致了不同的实践结果,目前见过有几种ThreadLoop的实践,本文做一个分析记录和知识点的......
  • [JLU] 数据结构与算法上机题解思路分享-第三次上机
    前言首先,请务必自己尽全力尝试实现题目,直接看成品代码,思维就被拘束了,也很容易被查重。这里只是思路解析的博客,代码仓库在JLU_Data_Structures_Record希望你能在这里找到你想要的:)正文A图的创建分数10作者朱允刚单位吉林大学请编写程序创建一个有向图。有向图中包含......
  • Hadoop权威指南-读书笔记-01-初识Hadoop
    Hadoop权威指南-读书笔记记录一下读这本书的时候觉得有意思或者重要的点~第一章—初识HadoopTips:这个引例很有哲理嘻嘻......
  • BUUCTF刷题:[DDCTF 2019]homebrew event loop
    [DDCTF2019]homebreweventloop代码审计fromflaskimportFlask,session,request,Responseimporturllibimporturllib.parseapp=Flask(__name__)app.secret_key='*********************'#censoredurl_prefix='/d5afe1f66147e857'd......
  • hadoop集群部署【二】YARN & MapReduce 的部署
    提前注意:请注意路径是否和我的相同,放置的位置不同,请修改标红处 HDFS部署HDFS介绍及部署http://t.csdnimg.cn/Q3H3Y部署说明HadoopHDFS分布式文件系统,我们会启动:NameNode进程作为管理节点DataNode进程作为工作节点SecondaryNamenode作为辅助同理,HadoopYARN分布式资源......
  • Hadoop基础及安装
    Hadoop基础了解hadoop我们生活在一个数据大爆炸的时代,数据飞速的增长,急需解决海量数据的存储和计算问题Hadoop适合海量数据分布式存储和分布式计算Hadoop的作者是DougCutting,Hadoop这个名字是他的孩子给他的毛绒象玩具起的名字Hadoop3.x的细节优化Hadoop三......
  • 第三次blog
    一、前言 题目集7中只包含了一道题目,题目量较少。题目要求在题目集6中的题目的基础下进行迭代,要求对互斥开关设置限流电阻,不同的引脚之间分别设置不同的默认电阻值。同时增加模拟受控窗帘;在输入并联电路信息时考虑多个并联电路串联在一起及一条串联电路中包含其他串联电路的情......