outside_的第三次博客作业

outside_的第三次博客作业

--Wenxiaowenyy

前言:

这次博客是本学期的最后一次博客,也是大一的最后篇博客,回顾这学期学习java的热情以及完成大作业的积极性比起学c语言的时候减少了许多,原因有很多,其一是自己变懒惰了,其二是这学期的java比起上学期的c语言的确难度增加了许多,不过世上没有后悔药吃,感觉都是自己作的,希望暑期的实训和下学期能够更加勤奋,更加努力,不要荒废自己,不要天天待在寝室里。好了,接下来就是对这学期最后两次大作业进行分析啦!

内容包含:
1.总结PTA大作业前三次题目集的知识点,题量,难度等
2.对题目提交的源码进行分析
3.仔细回忆自己做题时所踩的坑,总结反思,避免下次再犯
4.改进建议
5.个人总结、个人反思

题目集7

题目集7是上次博客中提到的题目集6的迭代,相比上次题目集6,这次增加了互斥开关,以及另一个电器窗帘,此次的窗帘与电灯的亮度有关联,所以输出数据的判定会与之前的用电器不同,类之间的联系也会更加紧密,难度较难,因为对于互斥开关的处理是个棘手的问题。考察的知识点有正则表达式,字符串一系列的处理操作、电器的继承、父类方法的重写以及正则表达式对输入的处理,正则表达式一如既往的还是所考察的知识点。

该题的难点有三个,其一是对于电阻的计算,因为加入互斥开关的话,要考虑总电阻的变化和哪个线路是通路,再进行计算电阻。其二是对于互斥开关的开关接在哪里的问题,它有两个接口,要如何判定互斥开关接在哪个接口上是个重要的问题。其三是灯的亮度与窗帘的开合百分比的处理,要根据灯泡的总亮度来控制窗帘开合百分比。

下面是本次迭代增加的窗帘和互斥开关的部分代码:

窗帘类:

点击查看代码
class Curtain extends Device {

    private double rate=100;
    public Curtain(String type,String num,int p1,int p2,int R)
    {
        super(type,num,p1,p2,R);
    }

    public void setV(int v1,int v2)
    {
        super.setV(v1,v2);
    }

    public double getRate(double bright)
    {
        if(super.getR()*super.getI()<50)
            this.rate=100;
        else
        {
            if(bright<50)
                this.rate=100;
            else if(bright>=50&&bright<100)
                this.rate=80;
            else if(bright>=100&&bright<200)
                this.rate=60;
            else if(bright>=200&&bright<300)
                this.rate=40;
            else if(bright>=300&&bright<400)
                this.rate=20;
            else
                this.rate=0;
        }
        return this.rate;
    }

    public void show(double bright)
    {
        if(super.getR()*super.getI()<50)
            this.rate=100;
        else
        {
            if(bright<50)
                this.rate=100;
            else if(bright>=50&&bright<100)
                this.rate=80;
            else if(bright>=100&&bright<200)
                this.rate=60;
            else if(bright>=200&&bright<300)
                this.rate=40;
            else if(bright>=300&&bright<400)
                this.rate=20;
            else
                this.rate=0;
        }
        System.out.println(String.format("@S%s:%.0f%%",super.getNum(),this.rate));
    }

}

互斥开关:

点击查看代码
class Mutex extends Device {
    private int state = 1;

    Mutex(String type,String num,int p1,int p2,int R) {
        super(type, num, p1, p2, R);
    }

    public void setV(int v1,int v2)
    {
        super.setV(v1,v2);
    }

    @Override
    public void change(double a)
    {
        if(this.state==1)
            this.state=0;
        else
            this.state=1;
    }

    public int getState()
    {
        return this.state;
    }

    @Override
    public void show(double I)
    {
        if(this.state==1)
            System.out.println("@H"+super.getNum()+":closed");
//        else
//            System.out.println("@H"+super.getNum()+":turned on");
    }

    public double getR()
    {
        return super.getR();
    }

    public void changeR(double R)
    {
        super.changeR(R);
    }

}

圈复杂度:

类图:

该题我遇到的问题:

1.互斥开关的处理 解决方案:将互斥开关拆分成为两个单独的开关处理
2.窗帘闭合度的计算 解决方案:多次测试,找出出错原因

题目集8:

题目集8是电器迭代的最后一次了,这次增加了二极管以及短路情况,还有就是输出也改了,需要使用到引脚了,前几次我都没使用到引脚,这次输出就得输出各个引脚的电压,同时也增加了电路复杂程度,难度的话可以说算是最难的一次了,毕竟是最后一次了,并且我也只拿了一点点分😂。考察的知识点有正则表达式,字符串一系列的处理操作、电器的继承、父类方法的重写以及正则表达式对输入的处理。

该题的难点有很多,一是对于新加入的电路元件二极管,如何对其导度进行判断,二是电流的计算,如何计算整体电流来判断电流是否使用电器发热过高,三是各个引脚的电压,对于各个引脚的电压计算也是一个难点,要判断这是属于用电器的哪个引脚,还要计算电压,四是对于电路情况的分析,此次的电路情况十分复杂,所以对于各个电路的处理至关重要,影响到电压和电流。

下面是新增用电器二极管的代码:

点击查看代码
public class Diode {
    private String name; // 二极管的名称
    private boolean isForward; // 是否正向接入
    private double voltage; // 二极管的电压
    private final double MAX_CURRENT = 8; // 二极管的最大电流

    public Diode(String name) {
        this.name = name;
        this.isForward = false; // 默认为反向接入
        this.voltage = 0; // 默认电压为0V
    }

    // 设置二极管为正向接入
    public void setForward() {
        this.isForward = true;
    }

    // 设置二极管为反向接入
    public void setReverse() {
        this.isForward = false;
    }

    // 设置二极管的电压
    public void setVoltage(double voltage) {
        this.voltage = voltage;
    }

    // 获取二极管的电压
    public double getVoltage() {
        return this.voltage;
    }

    // 计算二极管的电流
    public double getCurrent() {
        if (isForward) {
            // 正向接入时,电阻为0,电流由外部电路决定
            return voltage / 0; // 实际上这里会得到无穷大的电流,需要外部电路限制
        } else {
            // 反向接入时,视为断路,电流为0
            return 0;
        }
    }

    // 检查电流是否超过最大限制
    private boolean isCurrentLimited() {
        double current = getCurrent();
        return current > MAX_CURRENT;
    }

    // 输出二极管的模拟结果
    public String getOutput() {
        if (isForward) {
            return "@" + name + ":conduction " + voltage + "-0";
        } else {
            return "@" + name + ":cutoff " + voltage + "-0";
        }
    }

    // 模拟二极管的工作,返回输出结果和是否超过电流限制
    public String simulate() {
        String output = getOutput();
        if (isCurrentLimited()) {
            output += " exceeding current limit error";
        }
        return output;
    }
}

圈复杂度:

该题我遇到的问题:
1.二极管的处理 解决方案:仔细审题,分析二极管
2.电流的计算 解决方案:多次根据测试样例,看计算的电流是否正确
3.引脚电压的计算 解决方案:优化各类中的引脚方法以及数据

个人总结与反思:

1.要加强类的设计以及类与类之间关系的设计
2.要培养自己的耐心
3.要培养自己根据题目意思来想测试用例的能力

最后,希望自己下个学期能够更加努力,同时也希望下个学期的难度稍微大一点,更能磨练自己。

posted @ 2024-06-30 15:22  WenXiaowenyy  阅读(22)  评论(0)    收藏  举报