outside_的第三次部落格作業

WenXiaowenyy發表於2024-06-30

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.要培養自己根據題目意思來想測試用例的能力

最後,希望自己下個學期能夠更加努力,同時也希望下個學期的難度稍微大一點,更能磨練自己。

相關文章