題目集一總結
前言:題目集一主要涉及了java程式的基本結構,編譯器的基本使用方法,基本語法,題目7-8初次介紹了類,題目數量比較少,難度較低,主要是讓我們適應了Java的編碼習慣,
題目集二更進一步設計了字串,陣列的操作,3,4,5題層層遞進為我們引入了方法,題目中設計的方法宣告讓我初次感受到了面向物件編程,這個題目集題目數量依然比較少,難度略有提高,讓我熟悉了方法有關的各種語法,
題目集三真正涉及到了類的設計,1,2題拋磚引玉讓我體會到了類設計的思路,第三題則需要完全自己設計類,這個題目集題目數量較少,但是作業量不小,難度比較大,這個題目集讓我學會通過合理的設計類來簡化邏輯,通過重構來適應新需求,最重要的———利用不熟悉的知識來解決一定規模的問題,并且合理漸進的使用他們來避免大量未知錯誤在一開始爆發導致延誤開發,
設計與分析:
題目集1:7-8 判斷三角形型別
程式需要判斷三角形型別,要求能夠識別非三角形,等腰三角形,等邊三角形,等腰直角三角形,直角三角形,一般三角形的情況,難點在于要捋清各種三角形的邏輯包含關系,判斷三角形種類要盡可能具體,這對邏輯有一定要求,寫出優雅健壯的代碼是比較有挑戰性的,
我的方法是,先利用java提供的排序方法將三邊的長度排序,快速識別斜邊(最長的邊),先判斷是否為合法的三角形,再依次判斷是否為等邊三角形,等腰直角三角形,直角三角形,等腰三角形,即在判斷出構成三角形后,從具體到廣泛的判斷三角形,
采坑心得
計算機處理浮點數會產生誤差,在計算勾股數時判斷浮點數之間的等量關系不能直接用”==“,而應該設定誤差,將大小差別誤差范圍內的視為等于,設定誤差的程序中即要保證不會漏判,也要保證不能錯判,誤差的大小要通過對具體的情況進行具體的分析來設定,此外大量的if陳述句讓代碼難以理解更難以修改,即使寫了大量備注,可備注也要隨著代碼的更新而更新大大的增加了作業量,所以代碼書寫的程序中規避的繁雜的實作是避免bug的關鍵,代碼整體的復雜度還是偏高的,
改進建議
為了增強代碼的可讀性可以通過實作多個判斷三角形型別的方法,每種方法之對應唯一一種三角形,雖然效率上有犧牲但是卻減少了if增強了可讀性,還有一種方案是對三角形的各種性質(兩邊或三邊相等,直角)設定對應的列舉,通過檢查列舉來判斷三角形型別,這樣if陳述句的可讀性會提高,或者生成一顆邏輯上的樹,每個節點都代表一種三角形,邏輯上是子概念的三角形是下相應三角形的子節點,通過由廣泛到具體的檢查,當一個節點的所有父節點被滿足的時候該節點被滿足,這樣同樣避免使用大量帶&&復雜條件增強可讀性,也具有良好的擴展性,
題目集2:7-4 求下一天


題目要求輸出某一日期的下一天,并給出了需要實作的方法包括,判斷閏年,判斷日期合法性,求下一天,這題涉及很多特殊情況,關鍵是通過對這些特殊情況進行分析,厘定先后判斷順序,用最少的判斷來解決問題,
我的方法是先判斷日期是否合法(包括閏年和平年)再直接對日加一,再判斷日期是否變得不合法,如果變得不合法代表日期因該變成下個月一號,再判斷月是否合法,如果變得不合法則日期因該為下一年第一天,通過這樣的判斷日期是否因為加一天這個操作變得不合法,來一步一步改變日期最終得到下一天,規避了判斷閏年平年和每個月不同天數的復雜判斷,而是反復利用日期是否合法來一步一步得到結果大大減少了邏輯復雜度,
采坑心得
判斷閏年的情況比較復雜,如果直接判斷閏年,那么涉及的條件比較多,復雜的代碼是bug的溫床,在這里我選擇不去判斷是否為閏年,而是去判斷是否不是平年,結果代碼大大的變簡潔了給我后來的debug作業帶來了很多方便,很多正面判斷比較難的條件,可以考慮通過判斷反例來解決,合理的利用陣列來代替switch是非常好的做法,讓陣列的下標帶有意義(比如代表月份)也是非常優雅的,
改進建議
利用陣列來儲存每個月最大天數從而規避switch來判斷日期合法性,也可以準備兩個陣列分別代表閏年和平年的天數,用列舉來代表閏年和平年,可以大大增強代碼的可讀性,利用列舉來代替下標,讓下標具有意義也是值得嘗試的做法.
題目集2:7-5 求前n天
題目要求程式求出某一天的前n天,并自己設計類來處理,同樣涉及日期處理關于每月最大天數的陣列,和判斷日期合法性以及求閏年,這些部分大體上可以直接使用7-4的代碼,
我的方法是將7-4求下一天的代碼改寫成求前一天,邏輯基本不變,日期先見一再判斷日期是否合法,如果不合法,則日期變為月份減一的最后一天,再判斷日期是否合法,如不合法則變為上一年最后一天,重復n次,如果n為負數則直接求下一天重復n'的絕對值次,
采坑心得
相對于下個月第一天,上個月最后一天更具有不確定性,搞不好會導致儲存月份最大日的陣列越界,適當的為陣列留白,是避免bug選擇之一,雖然現在并不那么強調軟體的效率,而是重視開發速度,但是這種會提升復雜度的演算法應該在細致的研判資料再謹慎的使用,或者盡量避免,
改進建議
實作求前n天改為求前一天n次雖然極大的利用了已有的代碼,但是卻將原來常數復雜度的演算法變成了復雜度n的演算法,這種操作是有風險的,在資料比較大的情況下可能會超時,導致軟體質量不合格,通過把n超過一年的部分直接計算,再把超過一月的部分直接計算,甚至把超過400年的部分一次性計算來控制n的大小,管理復雜度.保證軟體質量,
題目集3:7-2 定義日期類
題目要求實作一個日期類并給出了類圖,根據類圖按圖索驥并且合理的利用之前題目的代碼,很快便得到結果,
通過改變回傳值和引數利用編譯器功能自動生成屬性,來簡化編碼程序,
采坑心得
通過體會和實作類圖,我對類中各個方法的耦合和屬性的設定有了粗略的體驗,對于方法會用到的資料,而對類沒有意義的可以選擇將其作用域限制在方法內部以簡化類的簽名,方法只能嚴格實作方法名所代表的功能,類的屬性的和方法的設定最好符合直覺,通過方法間的呼叫來簡化邏輯,
改進建議
區分一個欄位應該是類所有的還是物件所有的,區分的結果因該符合直覺,比如儲存每月最大日期的陣列因該屬于類,設定成靜態,這樣既可以節約空間也更符合直覺,
題目集3:7-3 一元多項式求導(類設計)
題目要求對冪函式多項式進行求導,冪函式有多種省略寫法,研判這寫發并且進行求導是難點所在,
我的方法是利用正則運算式"[+-]?[0-9]*[*]?x(?:[\\^][+-]?[0-9]*)?"來提取所有帶x的項,只有帶x的項需要求導,對于每一項用Pattern來分別提取每一項開首的數字和結尾的數字,如果提取不到就代表是省略的寫法,結果就是1或者-1.再對系數指數進行計算,通過對計算后的值進行研判來進行項的輸出,最后去掉開首的+得到結果,
采坑心得
通過把一個大問題轉化為小問題,來解決問題有時候會有奇效,關鍵是抓住問題不變的地方,對于每個需要求導的項必然有x通過這一點就可以寫出提取所有項的正則運算式,此外每一項分開求導再拼接,大大簡化了問題,通過最后1步去除開頭的+,避免了討論首項也簡化了解決方案,處理問題的時候相應的條件對應相應的部分也是否關鍵,對于系數的條件判斷之影響系數部分,而指數部分則影響是否結果中含x以及是否有顯式的指數,這樣降低不同代碼塊之間的耦合,給我debug和重構帶來了很多方便,
改進建議
題目中的正則運算式之并不能完全保證提取出正確的項,沒有體現符號和系數之間的邏輯關系,這是非常大的隱患,每一次用回圈中字串的覆寫讓宣告和內容顯得臃腫,利用list生成待處理的項串,再一次性處理拼接,把讀取和處理分開來,避免一個代碼塊過于復雜影響程式的可讀性和維護性,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272453.html
標籤:其他
上一篇:SIP (Session Initiation Protocol) 協議
下一篇:WebGPU[4] 紋理三角形








