面向對象課程第一單元的做業在上週完成,然而這三次做業完成得並非太簡單。一方面既要學習java的語法;另外一方面,又要思考怎樣將面向對象的思想體如今本身的代碼中。更別提還有不太熟悉的git的使用。可是做業的難度與收穫是成正比的。雖不說這三次做業能讓個人面向對象思想提升多少,但至少仍是有收穫。
java
首先是第一次做業的類圖和結構分析git
(類圖)正則表達式
(結構分析)ubuntu
第一次做業有三個類,Poly類讀入字符串,判斷合法性,並將合法的字符串轉化爲兩個Arrylist。一個表示係數,一個表示指數。Derivative類是求導類,讀入係數與指數數組。求導並輸出。數組
第一次做業過程當中的難點及解決方法:
(1)正則表達式的應用,因爲是第一次接觸正則表達式,因此如何用正則表達式去識別並分析字符串是我遇到的第一個問題。個人方法是,對於每個無符號整數、每個冪函數創建正則表達式。再在以上正則表達式的基礎上創建每個單項的正則表達式。將每個單項的正則表達式經過運算符鏈接成整個多項式的正則表達式。相較直接完成整個正則表達式,這樣處理正則表達式相對簡單。sass
(2)合併同類項,解決這個問題並不算難,用Map就能很容易的解決。因爲後兩次做業仍有Map相關問題,故這裏很少作贅述。bash
(3)最簡輸出,第一次做業要得到最簡輸出其實比較簡單。須要保證 不要有多餘的符號;不要有重複項;在有正係數狀況下,首項爲正;1不輸出。ide
因爲第一次做業在公測以及互測中本身並無遇到bug(雖然不能保證沒有bug),故略去第一次的bug分析函數
發現別人bug所採用的策略:學習
在第一次做業互測中,我並沒有藉助任何腳本工具,建了6個項目來進行互測,故效率比較低
(1)空白字符的判斷,這是第一次做業中最容易發現的bug。
(2)採用大規模數據進行測試
(3)採用邊緣數據進行測試
(4)嘗試相似x*、*1等等WF數據
相比第一次做業,第二次做業新增了三角函數的求導需求,以及合併指數的需求。一下是類圖和結構分析
(類圖)
(結構分析)
在第二次做業中,我建了7個類。Poly類與Derivitive類與第一次類似。Getstring類從控制檯讀入數據,判斷數據合法性。Key類包含x、sin(x)cos(x)的指數。Item類對單項進行合併。Shorter類用於最後的化簡。
第二次做業過程當中的難點及解決方法:
由於有第一次做業的經驗,第二次做業在正則表達式方面並無太大問題,所用的方法與第一次相同。但也出現了其它問題
(1)Object類方法重載的問題,由於以Key類做爲hashMap的鍵,那麼Key類中的equals方法和hashCode方法就須要重載,同時,考慮到Key類須要複製的問題,還須要重載clone方法
(2)結果化簡,這是本次做業的得分點同時也是失分點。
類型 | 優化前 | 優化後 | ||||||
係數 | x指數 | sinx指數 | cosx指數 | 係數 | x指數 | sinx指數 | cosx指數 | |
1 | a | b | c+2 | d | a | b | c | d |
a | b | c | d+2 | |||||
2 | a | b | c | d | a | b | c+2 | d |
-a | b | c | d+2 |
表格中是我在本次做業中用到的兩種優化方式,有不少沒考慮到的狀況。
第二次做業bug分析
第二次做業中我有一個bug在公測和互測中被hack,出現bug的緣由是未對變量進行初始化。
發現別人bug所採用的策略:
經過參考討論區裏大佬的發言,我在這一次做業中採用了腳本的方式進行互測。用idea自帶的功能將每個項目生成.jar文件,將這些文件放在同一目錄下。使用git-bash(win10下的ubuntu子系統的java環境好像要重裝?)寫好腳本以後,就能一次對7我的的代碼進行互測。在參考大佬腳本以後完成的腳本。
#!/bin/bash
echo $1 | java -jar archer.jar | sed -n '1p' > output.md
echo $1 | java -jar assassin.jar | sed -n "1p" >> output.md
echo $1 | java -jar berserker.jar | sed -n "1p" >> output.md
echo $1 | java -jar caster.jar | sed -n "1p" >> output.md
echo $1 | java -jar lancer.jar | sed -n "1p" >> output.md
echo $1 | java -jar rider.jar | sed -n "1p" >> output.md
echo $1 | java -jar altergo.jar | sed -n "1p" >> output.md
關於尋找bug的策略與第一次相似。
第三次做業引入了嵌套。難度增長了不少。
(類圖)
(結構分析)
我對此次做業的Poly類進行了更改,Poly類讀入字符串,生成表達式樹,表達式樹中的沒一個表達式與第二次做業中相似。這樣就能較大程度上覆用第二次的代碼。同時因爲此次做業的化簡難度大,因此我並無在化簡上花太大功夫。
第三次做業過程當中的難點及解決方法:
在第三次做業中,我將全部括號內的內容視爲表達式,將其替換爲另外一個與x相關的變量y。替換後的表達式如圖
經過對每個表達式求導。再用求導後的結果替換表達式的變量獲得最終結果。
第三次做業bug分析:
在本次做業中,我一共出現了一個bug,且由於這個bug被hack了6次。bug緣由是將y = f(y)錯誤的寫爲了y+=f(y)。是真正的由於粗心致使的bug。
這一個月面向對象的學習,仍是有很多收穫。從對java一竅不通到漸漸熟悉。從徹底沒有面向對象的思想,到嘗試封裝、繼承。也再一次體會了bug虐我千百遍的感受。雖然依然存在不少問題,但相信剩下的大半學期會有更多收穫。