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.要培養自己根據題目意思來想測試用例的能力
最後,希望自己下個學期能夠更加努力,同時也希望下個學期的難度稍微大一點,更能磨練自己。