第二次Blog

HTzero發表於2024-06-09

前言:
個人感覺
第四次練習是之前三次練習的總結和衍生,在前三次練習的不斷疊加的基礎上,新增了選擇題、多選題、填空題和對其他異常情況的新增的需求,回望第一次練習,從一開始的單單透過輸入題目數量和題目以及其答案輸出題目以及其對錯,透過一次又一次對一開始的原始碼的修改和功能的新增,最後實現了試卷對題目的呼叫、題目種類的新增、對異常狀況的處理.......原來的程式碼逐漸變得更實用,更偏向現實中的應用,個人感覺這是一次非常奇妙的體驗

第五次練習算是開了個新坑,結合老師的話和關於之後練習的資料,與之前練習不同的一點考的是類與類之間繼承的運用成為了本四次大作業的關鍵點,所以在完成這次練習的途中除了類的定義和類與類之間關係的運用,還得注意一下哪裡的功能方便以後的繼承類來實現和穿插

第六次練習在第五次練習的基礎上除了新增加了落地扇這一新的物件以外還增加了對並聯電路的錄入兩種方式的新增,最主要的難點還是在主電路中並聯電路電阻的獲取和分壓的計算

對這三次練習來說,整體題量雖然減少,但每題的難度是不斷增加的
設計與分析:

相前面幾次練習,這題不僅僅是增加了選擇題、多選題、填空題這些題目種類,還增添了“半對”的給分條件,除了針對這些題目的資訊錄入對原有的程式碼進行修改,還要在答案對比的時候進行一個是否符合半對條件的判斷

相對於前幾次的程式碼修改,這次的修改幅度較小,除了題目的新增條件少以外,還應該得益於之前對輸入進行錄入的較靈活程式碼作為基底

這裡要注意的有半對的條件,針對如果有錯誤字元就視為完全錯誤這一點,我從答案中從每個字元開始取答題者答案的字串長度來取得對應的字串來進行半對的判定

在電路圖這一新坑裡,因該題的總電路只有一條線,結合老師給的後面並聯的資料,打算先建立一個主線路類,之後再透過建立獨立的並聯類來實現將來對並聯電路的錄入和在主線路中的插入

這裡要特別注意的應該是電路中開關的開閉,只考慮一條線路的話只要有一個開關是開啟的整個電路就沒有電流,在對總電路的電壓進行計算時會起到舉足輕重的作用

透過把整個電路化為StringBuffer放到一個類中,對電路的修改只要透過錄入修改電路元件的字串進行對比,複雜點的再根據修改方式進行修改就搞定了

在對電路的StringBuffer進行特定的修改時,為了程式碼的簡潔性和易度性我試著加了類似於“工具類”的構造方法,但該方法在該方法屬於的類中直接使用會出現錯誤,再考慮到其他類也會使用到這些方法,我新建了一個工具類,在將其作為父類的基礎上,讓現在及以後的子類都能夠使用上該類的構造方法

跟上面所說的一樣,該題增加了並聯電路的錄入,根據題目給的資訊,我又增添了兩個總電路Line的子類T_Line和M_Line來分別儲存單獨存在的電路和引用這些電路的並聯電路,除此之外針對電路並聯的錄入還有新的輸入方式-----【電路元件1-2 電路元件2-1 電路元件3-1】,針對這裡除了採用迴圈一直讀取到下一個類似【電路元件2-2 電路元件3-2 電路元件4-1】的資料的錄入方法以外,我還採用和之前M電路(並聯電路)對主電路一樣的插入方法-----將並聯電路用括號括起來,再透過特殊符號隔離並聯中的串聯電路

因該次大作業中增加了電阻和分壓的概念,所以在最後對每個電路元件獲得分壓的計算上,針對主電路的電路元件的分壓都是由總電壓(若有調節器則乘以調節器調節倍率)乘以該電路元件的電阻再除以電路總電阻來得到的,針對並聯電路還要增加一個是否有開關斷開的判斷

在該次大作業中還增加了新的電路元件---落地扇,因它的運作方式和之前設定的電路元件吊扇相似,就直接在吊扇原始碼的基礎上修改分壓對其運作影響的部分實現了落地扇的新增

踩坑心得:

雖然之前有考慮到增加並聯電路的需求,但真正在之前思路的基礎上實現還是有不小的困難,為實現之前的思路,這程式碼是越寫越長,等回顧時那程式碼的長度都讓我不想去看。。。。。。現在想來原來的思路有點複雜,且靈活度較低,開始應該好好考慮並聯電路的實現方法再寫程式碼

因個人的做題習慣,在做該次大作業時我先粗略地把題目看一下,再把精力投到以樣例為標準的程式碼修改之中,但在每個樣例都測試透過後提交卻只得了30分不到,為此糾結了好一陣子(。_。),回頭仔細看了題目才發現還有另一種並聯輸入方法。。。。。。所以說做題前要好好看題啊(_

在BUG方面
大多是因為沒考慮到變數的資料型別或對繼承的使用不熟練所導致的

其他包括但不限於

1.迴圈尋找對應字串時因類似text.substring(i,i+2)時迴圈結束條件不應該是i<text.length(),而是i+2<text.length()的錯誤導致字串查詢失敗

2.text.substring(j,i)的呼叫多了幾個字元導致Integer.valueOf失敗

3.題目透過的條件除了和對應的輸出要求相同以外頂多允許在最後新增一個'\n',而我最後的輸出裡多了兩個'\n',

改進建議:

第四次練習的7-1

經過多次修改,在許多或是判斷,或是字串的提取等功能的實現上有一些相似的操作,程式碼短一點的還行,但一但程式碼寫得太長,在檢查程式碼功能時該部分程式碼容易導致難讀、錯讀,說白一點就是可讀性太低,複雜性太高,且在整體的程式碼長度上會起到不小的影響

修改上可以建立新的構造方法或是新的類專門來實現重複性操作,像是讀取特定字串位置,判斷字串是否符合要求的都可以透過返回int和boolean來實現相似操作,再在這些構造方法下新增註釋,這樣不僅可以避免新的只為這些操作的變數的建立,還可以使程式碼簡潔易懂,減少原始碼的長度,減少該功能裡程式碼的複雜度,以此來增加程式碼的可讀性

第五次練習的7-1

雖然一開始感覺還行,但經過重新檢查一遍,主要的Line類的構造方法還是偏多,整體的程式碼長度還是偏長

修改上可以把一些像change_D、change_K等針對字串修改的構造方法放到另一個類中,再透過引用的方式來實現這些原要求的功能

第六次練習的7-1

就如之前所說,因在對並聯電路的錄入和分壓計算上的思路不夠簡潔、靈活,並聯電路的用括號括起來,再用特殊符號隔開線路的方法雖然在這次只有一個並聯電路的大作業中行得通,但會使今後像是迭代4的包含關係等功能的實現變得較為困難

修改上可以在現有的思路上儘量往好的地方修改(感覺程式碼也已經回不去了(。_。))像是在並聯電路的開關判斷上如果一段電路的開關是斷開的,則可以直接把那段電路從並聯電路中刪除。並在此基礎上吸取教訓,避免另一個大坑的創造

總結:

雖然老師說不給太多樣例是為了讓我們體驗一下實際工作的感覺,我覺得這也蠻有道理的,但個人感覺題目還是樣例給較全點較好,數量不用太多但希望種類給全,像是第六次練習的7-1中所給出的樣例全都是關於並聯電路 M引用串聯電路 T,然後電路引用並聯電路 M的形式,另一種並聯電路錄入【電路元件1-2 電路元件2-1 電路元件3-1】的形式卻沒有相應的樣例,在不知道之後輸入形式的情況下根據自己的猜想繼續做下去(雖然最後也沒得到新的分數(_))感覺有點沒方向和信心

經過前三次大作業在第四次大作業填完之前的大坑,又在第五次大作業轉而跳入新的大坑,在對將來功能做計劃、實際功能的增添、對原始碼的修改等過程中,個人感覺無論是在繼承的使用的方面還是對java的類的使用方面都得到了不小的鍛鍊,

個人感想:

在一次又一次練習中不斷認識到自己的不足並以此為重點不斷鍛鍊自己的思路和程式設計技術,個人感覺這是一個充實,富有收穫的過程,希望今後我也能不斷改善自己的程式設計習慣和程式設計思維,在學習java這條路上走下去,走的久,走的遠