OO第三次blog作業
前言
這次blog是本學期最後一次回顧總結,本次blog的範圍是“家居強電電路模擬程式”的第三和第四次迭代,分別加入了互斥開關、窗簾的概念、多個串聯起來的並聯電路、串聯電路中包含其他串聯電路的情況和串聯電路中包含串聯電路的情況和二極體。因此這兩次P他的難度都不算低。
兩次作業分析
第一次作業
本次迭代中加入了一種新的控制元件互斥開關,一種新的受控裝置窗簾。加入了串聯電路中包含多個並聯電路的情況,串聯電路中含有串聯電路的情況。
互斥開關:
互斥開關有3個引腳:1個是彙總引腳,另兩個是分支引腳。
開關電路示意圖如圖1所示,左邊是彙總引腳,編號為1;右邊兩個是分支引腳,右上的輸出引腳為2,右下輸出引腳為3。圖中1、2、3引腳均可以是輸入引腳,當1為輸入引腳時,2、3引腳為輸出引腳;1為輸出引腳時,2、3引腳為輸入引腳。
互斥開關只有兩種狀態:開關接往上面的2號引腳、接往下面的3號引腳。開關每次只能接通其中一個分支引腳,而另一個分支引腳處於斷開狀態。
互斥開關的預設狀態為1、2引腳接通,1、3引腳斷開。
圖1中所示的互斥開關可以反過來接入電路,即彙總引腳接往接地端,兩個分支引腳接往電源端。
圖1 互斥開關
為避免短路,互斥開關設定了限流電阻,12引腳之間預設電阻為5,13引腳之間預設電阻為10。
受控窗簾:
受控窗簾的電路符號為S,其最低工作電壓為50V,電壓達到或超過50V,窗簾即可正常工作,不考慮室外光照強度和室內空間大小等因素,窗簾受室內燈光的光照強度控制。
當電路中所有燈光的光照強度總和在[0,50)lux範圍內,窗簾全開;
在[50,100)lux範圍內,窗簾開啟比例為0.8;
在[100,200)lux範圍內,窗簾開啟比例為0.6;
在[200,300)lux範圍內,窗簾開啟比例為0.4;
在[300,400)lux範圍內,窗簾開啟比例為0.2;
在400lux及以上範圍內,窗簾關閉。
當電壓低於50V,窗簾不工作,預設為全開狀態。
如果電路中沒有燈或者燈全部關閉,光照強度為0,窗簾處於全開狀態。
受控裝置電阻:白熾燈的電阻為 10,日光燈的電阻為 5,吊扇的電阻為 20,落地扇的電阻為 20,窗簾電阻為15。
本次迭代考慮多個並聯電路串聯在一起的情況。
本題考慮一條串聯電路中包含其他串聯電路的情況。例如:
#T3:[VCC K1-1] [K1-2 T2-IN] [T2-OUT K2-1] [K2-2 T1-IN] [T1-OUT GND]
本例中T1\T2兩條串聯電路T3的一個部分,本題考慮這種型別的輸入。
本次程式碼大致情況如下:
仍然採用Agent類作為代理類對所有資料進行處理。
加入了Curtain類、RepelSwitch類。同樣分別繼承自Electric類和Control類。
修改了Skewer類以實現在串聯電路中包含其他串聯電路的情況。
修改了Agent類中對於串聯電路資訊的獲取和串聯電路的建立、串聯電路的輸入等有關串聯電路內部元件的操作以適應串聯電路中有多個並聯電路的情況。
使用來計算各條並聯電路電阻。
SourceMontor的生成報表內容如下
易見還是同樣的問題,程式碼的最大深度較大,但本次程式碼複雜度較上次有些許降低。
第二次作業
本次迭代中加入了一種新的元件二極體,增加了管腳電壓的顯示,新增電流限制的要求、短路情況檢測。加入串聯電路中含有串聯電路的情況。
二極體:
增加二極體元件,其電路特性為:正向導通,反向截止;其電器符號如圖4所示,當電流從左至右流過時,二極體導通”conduction”,電阻為0;電流從右至左流動時,二極體截止”cutoff”,電阻無窮大,相當於開關開啟。
圖2 二極體符號
二極體的識別符號為’P’,左側管腳編號為1,右側管腳編號為2。
二極體如果兩端電壓相等,沒有電流流過,分以下兩種情況輸出:
1、如果兩端電壓為0,二極體的導通/截止狀態由接入方向決定,1號引腳靠近電源則狀態為導通,反之為截止。
2、如果兩端電壓不為0,二極體導通。
輸出格式:
@裝置標識+裝置編號+":" +裝置引數值(控制開關的檔位或狀態、燈的亮度、風扇的轉速,只輸出值,不輸出單位)+" "+裝置所有引腳的電壓(按編號從小到大順序依次輸出,電壓的小數部分直接丟棄,保留整數輸出,電壓之間用”-”分隔)
短路檢測:
如果電路出現無窮大的電流造成短路,所有元器件資訊不輸出,僅輸出提示“short circuit error”
並聯電路中包含並聯
本次迭代考慮並聯電路中包含並聯電路的情況,即構成並聯電路的串聯電路可以包含別的並聯電路。例如如下輸入的電路,並聯電路M2的其中一條串聯電路T4中包含了另一條並聯電路M1:
#T1:[IN D2-1] [D2-2 H1-2] [H1-1 OUT]
#T2:[IN D1-1] [D1-2 H1-3] [H1-1 OUT]
#M1:[T1 T2]
#T4:[IN K3-1] [K3-2 M1-IN] [M1-OUT OUT]
#T5:[IN K1-1] [K1-2 B1-1] [B1-2 OUT]
#M2:[T4 T5]
本次程式碼的構造過程中,由於之前的程式碼實在難以處理串聯電路中含有串聯電路的情款,在思索再三後發現,其實本題運用的思想跟遞迴類似,在串聯電路中含有並聯電路,串聯電路中又會包含串聯電路。這不就是遞迴的思想嗎。但由於轉變思維較晚,並且程式碼需要重構。再加上臨近考試周,多方debuff的加成導致程式碼沒能改完。在遞迴的地方仍存在一些問題導致程式碼對電路的構建也有問題。
除此之外對於管腳電壓的方面也是程式碼亟須重構的一個原因,在先前的幾次程式碼中採用的都是先計算各部分電阻,隨後對各元件採取電阻分壓的形式計算電壓,並沒有管腳電壓的建立。但此處難度不大,也可以根據原方法計算出的電壓結合220V的工作電壓計算得到。
本次迭代還需計算電流的大小,因此在完成了電壓和電阻的計算後在Agent類中還續加入一個judge方法以判定是否有電流超限和短路的情況出現。
總結與收穫
怎麼說呢,這也是這個學期最後的PTA了。難度還是大的,尤其是最後一次。在剛開始的時候實在是讓我有種無從下手的感覺。最後還是選擇了全部推倒重來。這也是我前期設計上存在的問題。讓我深刻體會到了老師說的設計比碼程式碼重要是什麼意思。
對於演算法的學習還是不夠深入,比如這次題目中蘊含的遞迴思想就沒能看出來,直到最後一次迭代中才看出一絲端倪來,因此浪費了大量寶貴的時間。
但總的來看,每一次的PTA都會讓人有所收穫,尤其是對於複雜邏輯的處理方面。每寫一次都感覺是一次頭腦風暴。
雖然說P他的作業是結束了,但從中也是看出自己有很多的不足,還需要繼續學習。