java第二次部落格
前言
這次我們涉及到了許多的知識點,從一開始的農夫過河實驗中,涉及到了類,類成員的屬性,方法以及屬性的封裝,後續實驗中我們涉及到了繼承和多型,瞭解了子類與父類之間的繼承關係,在Pta大作業中,在點線形這類題目中涉及到了許多種的知識點,例如一些字串的輸入判斷,正則表示式,甚至是許多的數學知識,例如如何判斷四邊形的種類等。在期中考試的題目當中,同樣涉及到了類的設計和一些多型以及抽象類和關於列表arraylist的一些有關知識。
設計與分析
①首先進行對期中考試題目的分析:
(1)
根據類圖我們可以分析得出我們需要構造兩個類,分別是Point類和Line類,我們可以看到在Line類中,有兩個屬性是Point型別的,所以我們就只需要根據類圖對程式進行編寫即可。在兩個類的方法中,除display方法以外,都是一些簡單的get和set以及構造方法,在idea等編譯器中便可自動實現,然而display方法也沒有難度,只需要按照題目所給的要求進行print即可。
(2)
第二道題目涉及到了有關繼承和多型的知識點,根據類圖,我們可以看到我們需要建立一個Element父類,而父類中只有一個Display方法,且此方法為抽象方法,因此我們在定義這個類的時候需要將此類定義為抽象類。之後再將我們上一個題目中所定義的Point類和Line類所作修改,將其對Element類進行繼承即可,其中要對Element類中的Display方法進行重寫即可。此外我們還需額外定義一個面Plane類,同樣是繼承於Element類,它只有一個屬性也就是color。
關於多型的用法,所謂多型也就是指在父類中定義的屬性和方法被子類繼承之後,可以具有不同的資料型別或表現出不同的行為,這使得同一個屬性或方法在父類及其各個子類中具有不同的含義。因此我們需要定義一個Element類的引用,分別使用該引用呼叫以上四個物件的display()方法,從而實現多型特性。
(3)
第三題相較與第二題而言,涉及到的知識點更為全面,此題涉及到了Arraylist的有關知識,我們需要新定義一個GeometryObject類,這個類中只有一種屬性也就是ArrayList型,這個ArrayList裡面可以存放Element類的物件,這又涉及到了泛型。在這個類當中我們需要add方法以及remove方法和getlist方法,這些方法如圖所示,這個類當中可以存放Element的物件,這也同樣利用到了多型性,我們只需要呼叫這個Element的物件的相應方法就可以自動幫我們進行其子類的相應方法。我們所需要注意的是,在ArrayList容器當中,本身就擁有add(),remove(),方法,所以我們在進行GeometryObject類中add以及remove方法的編寫中,只需要呼叫ArrayList的物件的add()和remove()方法即可。
②對Pta題目的分析
關於點線形題目的分析
所有的點線形題目的共同點就是關於我們輸入的合法性檢驗根據題目要求,我們需要滿足序號:座標1 座標2 座標3 座標4的基本格式。
首先我們建立一個Point類的列表來儲存我們所輸入的點,關於Point類,在我們期中考試的題目中有所提到,與其相同,不過新增加了一個判斷是否點重疊的方法。接著,在我們將輸入的點儲存進這個列表中時,我們需要進行一個判斷,判斷是否這個點的格式輸入正確,一想到判斷格式是否輸入正確,我們首先可以想到利用正則表示式來進行判斷最為簡便。
如上圖所示,我們將輸入的資料和我們所設定的格式進行匹配比較,如果不符合格式則會直接輸出Wrong Format且結束程式。關於輸入格式的判斷,我們不僅僅知識判斷點的輸入是否正確,我們還需要判斷其他的格式,例如我們一開始的選項和冒號也就是選項+":",這一項判斷我們也可以用正則表示式來進行判斷如下圖
我們需要注意的是,既然有選擇,那麼每個選擇的需求又是不一樣的,所以我們還需要進行一個判斷,也就是說我們輸入點的個數是否符合我們所選擇的選項,如下圖:
形式引數為列表物件和一個整型,這樣判斷我們輸入的點是否符合要求,如果不符合要求則直接輸出“Wrong number of points”且直接結束程式
在我們做完了輸入的判斷以後,我們就要根據題目來編寫具體的功能了,這些功能大多都涉及到了數學的幾何知識,例如判斷點是否在由其他四個點組成的四邊形中,判斷這四個點是否可以組成四邊形,組成的是怎樣的四邊形,這些功能的基礎都是數學的幾何知識,我們可以在Csdn上尋找有關的公式進行編寫。其中我們有一個問題就是如何將資料進行格式化的輸出。我們的需求是是將得到的資料按照小數點後面保留三位進行輸出,如果不到三位則直接輸出。關於這一點,我們可以採用定義一個DecimalFormat物件,將其的格式定義為“#.000”,這樣我們在呼叫這個物件的format方法,使用Double.value()方法將其進行賦值給一個Double物件,最後將這個Double物件進行輸出既可以實現我們需要的功能,具體如下:
剩餘的一些功能都是一些與數學相關的知識。例如我們判斷輸入的三個點是否可以組成三角形,我們只需要按照上述要求正確輸入三個點後,將三個點之間的距離求出來,再根據三角形的性質,兩邊之和大於第三邊,進行判斷,這樣就可以是實現判斷三個點是否可以組成三角形,值得一提的是,由於在此類題目中,我們反覆需要用到點之間的距離,兩點構成的直線的斜率等,我們可以將其寫成一個圖形類,然後在這個類中寫好我們需要用到的方法,這樣可以極大程度上減少我們的工作量以及使得程式碼更加的簡潔。
我們在大作業四中我們需要判斷四個點是否可以組成四邊形,首先我們想到的判斷是判斷這四個點中是否由點重合,因此,在我們將一個點存入點的列表中是,我們應該將這個點與原有的點進行比較,如果沒有相同的則順利存入,如果存在相同的點則輸出“points coincide”
③對實驗題進行分析
關於農夫過河問題,我們所獲得的類圖為
根據題目要求,我們需要選擇我們所進行的操作,如農夫獨自過河或者帶著羊過河,因此在我們選擇我們所需要的操作時,我們可以用到switch語句來完成
因此我們知道我們羊或者農民類的屬性中有crossRiver屬性為布林型別。由於在主類中可以呼叫這個屬性,因此這個crossRiver為public的,這一點我們需要注意。我們知道農夫過河這個遊戲,要是單獨將狼和羊留下來或者是將羊和捲心菜留下來,羊和捲心菜會被吃掉,因此我們需要進行一個判斷,判斷當農夫的isCross與羊和狼的或者是與羊和捲心菜的相反時,羊的isAlive和捲心菜的isAlive要變成相反,也就是被吃了,最後我們每一次迴圈都要判斷是否有東西被吃了,如果有的話,遊戲結束,沒有的話遊戲繼續,知道所有的角色corssRiver都為true才是遊戲勝利。在後續的實驗中,我們先是要求將每個類中的屬性變成私有,也就是將public變成private,這我們就需要注意,因為屬性為私有,因此我們在其他類中並不能直接使用,因此,我們需要構造一個set方法來呼叫這個私有屬性
如上圖所示,利用方法訪問它的私有屬性
我們在這一次當中還新增加了一個船類,且為Cabbage,Sheep,Wolf,Famer增加了一個共同的父類Character。因此我們在過河操作的時候會進行一些改變將過河這個操作交給Boat類的物件來進行處理如下圖
在後續的實驗中,有要求我們採用多型,因此,在定義農民,兔子的時候,我們統一定義為他的父類的物件,我們在父類中還要定義一個抽象方法,在每個子類中都實現這個展現狀態的方法。我們在父類中還有吃這個方法,在兔子類和狼類中都會過載這個方法,以體現多型性。
踩坑心得
(1) 一開始在點線型題目中,關於輸入的合法性檢驗中,我所採用的並不是利用正則表示式來判斷輸入的資料是否符合格式,而是利用字串的split函式將輸入的資料分割然後利用迴圈一步一步的進行檢驗,過程十分十分的麻煩,如下圖
判斷過程十分繁瑣,這花費了我絕大多數的時間,而且還判斷的不完善!
(2) 在期中考試中在我構建Point物件和Line物件時,我在類裡面建立了兩個System.in的物件,以至於不能進行多行的輸入,在輸入所有資料時,程式中的緩衝區只能用到一部分,以至於在一次性輸入所有資料後程序不能正常執行。
(3) 我們要牢記在程式語言當中一般都是0開頭!!!就在期中考試當中,最後一題當中,我們需要構造一個容器類,也就是需要用到ArrayList類,在進行列表的新增以及移除時,沒有從列表的第0個開始,一直有在進行新增和移除操作時都無法得到正確的結果。
改進建議
(1) 在編寫程式中,我們要儘可能的少利用if-else巢狀語句
(2) 我們編寫的程式碼中,若有重複的語句功能,儘可能的提取出公共部分編寫成方法,這樣可以大大減少我們的工作量和提高程式碼的可讀性
(3) 我們要牢記自頂向下,逐步細化,編寫程式碼要有條理要根據所給的要求進行編寫,不要上一句下一句!
(4) 儘可能採用更好的想法,就像是上面採用正則表示式而不是我一開始使用的字串的判斷
總結
在這7-10週中,我們學習了許多的新知識,例如繼承與多型,還有抽象類,以及對檔案的操作和丟擲異常和捕獲異常,這些都是非常重要的知識點,對我而言,關於檔案的操作以及異常處理這兩部分需要進一步的學習。至於對老師上課的方法以及提出改進建議,我認為在我們上課簽到這一環節,是否可以適當的延長一兩分鐘呢,早上8.00是流量高峰期,進入課堂容易卡頓,有時候看著簽到乾著急卻無法簽到,希望老師可以改進一下。