java 初學者 第一階段作業編程總結及心得體會
- 2020 年 4 月 4 日
- 筆記
0.前言
第一階段java作業分為3次。
第一次作業是簡單得一些語法和一些簡單得邏輯思維,主要內容有求三角形是什麼三角形的,還有就是求坐標點所在範圍的,也涉及到了數字和字母的轉換,總之相相當於是給java初學者得一次入門練習,但是這個是基於在有C語言的基礎之上;
第二次作業是關於日期求下n天還有上n天以及兩個日期之間相差多少天,裏面涉及得比第一次多了一點,涉及到了日期的基本邏輯判斷以及簡單算法的設計,同時還用到了方法,以及方法之間的調用;
第三次作業主要是對類的理解和運用,作業題目還是跟第二次作業是一樣的,也是有一個一元二次方程解的,還有3個日期的題目,題目是一樣的,但是3個題目之間類之間的關係和類圖是不一樣的,根據不同的類圖來寫出不同的代碼。
1.作業過程總結
(1)三次作業之間的知識迭代關係
①.三次作業之間有明顯的迭代關係,每次作業中的每小題作業裏面也有明顯的迭代,所以做作業的時候老師也是建議我們要一個題目一個題目按順序來。
②.第一次作業是最簡單的,完全就是基於我們大一學過的C語言,比如使用簡單的for循環,while循環,還有if判斷語句,還有一些用了swtich..case..語句就能解決,就迭代關係來說,第一次作業裏面的各個題目,是沒太大的聯繫的,第一次作業就是讓我們通過練習來適應java裏面的一些語法,讓我們的編程習慣從C語言轉變過來,適應適應這麼新的語言。
③.第二次作業相對於第一次作業來說 ,又增加了難度,不過還是沒有涉及到面向對象思想,仍然是面向過程的思想,這次作業用到了的結構有選擇、循環、方法、數組,依然還是方法的調用。主要是求日期類的,不過這裏面的三個日期題目之間也是有着聯繫,第一個日期題目是求某一日期是星期幾的,第二個題目是求下一天的,第三個題目是求前n天的,求下1天或者上1天其實跟求前n天或者後n天相聯繫的,搞懂了下1天,下n天也就可以解決了,所以說作業內的題目也存在迭代關係。
④.第三次作業還是求關於日期的,但是這次是面向對象而不是面向過程了,涉及到了類,單一職責原則,理論上是一個類處理一個功能, 盡量類之間關係不要太複雜。這次的日期題目一個題目裏面要實現求下n天,上n天,以及兩個日期之間相差多少天的功能。3個題目測試的功能都是同一個,但是之間的區別是類的區分不同。
第一個日期題是只有一個類DateUtil,全部寫在這個類DateUtil裏面;
第二題日期題是設計了4個類DateUtil、Year、Month、Day,類之間有着聚合的關係,並且關係比較複雜,是DateUtil包含Day類,Day類包含Month類,Month包含Year類,關係複雜,並不是一個好的設計,耦合性比較高。
第三題日期題也是同樣的是類之間聚合的關係,也是有4個類DateUtil、Year、Month、Day這個但是相當於是Year,Day,Month這個3個類圍着DateUtil這個類,也是一種聚合,這種聚合比第二題的那種聚合好多了,數據參數的調用沒有那麼複雜,不用通過一層一層的類調用再去拿來數據用,代碼會更簡單,編程人員的思路也更簡單;
這3題之間就是屬於迭代的關係,是3種不同的設計,3種設計裏面可以說各有優點,但總的來說最後一個設計是更好的。
(2)如何通過作業逐步從面向過程過渡到面向對象
剛開始接觸java,寫java作業完全還是按照C語言的路子來,就是寫一大段代碼,然後把代碼弄到相應的方法裏面去,結果正確就ok了,但是後來因為老師的要求,以及這門語言本來就是面向對象的語言,我開始看bilibili裏面的視頻,知道了對象這個東西,知道了new 的用法,寫代碼的時候慢慢發現了面向過程雖然寫起來思路不複雜(這是相對於寫代碼本人來說),但是如果你把這個代碼給另一個人,可能別人就理解不了你代碼是用來幹嘛的,而面向對象裏面的類,剛好可以滿足這個需求,比如一個類就只有一個功能,這樣使用這個代碼的人員(對象)就能比較容易的得出你這個代碼的具體功能是用來幹嘛的。開始慢慢的開始寫類,去new 對象,以及慢慢的去學會用對象去調用類裏面的屬性和方法,作業裏面的要求也是要用到類,然後就通過寫作業 ,來完成作業的要求來慢慢的理解了一點面向對象的皮毛。
(3)作業過程中自己的思路和遇到的問題及解決方法
第一次作業
思路:題目剛出來把5道題目都看了一遍,於是大概判斷了難度和代碼量,果斷把稅率計算的放到了最後,因為代碼量比較大,其次就是把判斷三角形類型放到倒數第二,因為雖然這個邏輯比較多,要考慮到很多種情況,其他的就可以按照順序來了。
遇到的問題:
①最基礎的問題,pta裏面的主方法要寫成Main而不能是main。
②沒有注意代碼的嚴謹性,一些空格輸出沒有控制好,導致一系列格式錯誤。
③電話鍵盤複製模數字轉換題目裏面沒有把字母強制類型轉換,導致運行結果錯誤。
解決方法:在char類型變量前面加(int),強制轉換為數字,然後通過if ..else..語句來控制輸出。
④做三角形判斷類型題目中出現double類型的a*a+b*b==c*c來判斷直角三角形會出現誤差,然後導致測試點會通過不了。
解決方法:百度了沒找到,諮詢了同學,發現我們可以用把誤差範圍減少到很小其實也可以約等於==,也可以達到判斷直角三角形的效果,比如a*a+b*b-c*c<=1e-10,然後發現就解決了問題。
第一次作業比較簡單,一般錯的都是比較基礎的錯誤,加上eclipse 有自動糾錯功能,一般語法錯誤不會出現,算法這次作業也沒有,所以算得上是入門的java“面向過程”。
第二次作業
思路:剛出題目就看了一下全部題目,把第一題一元二次方程做了,這個屬於級別為1的題目,然後發現後面3個題目都是跟日期有關的,並且題目說了不準用日期有關的類,所以肯定是要先把這些算法想出來,再進行敲代碼。
遇到的問題:
①一元二次方程b,c均為0的情況沒有考慮到,因為我以為這個包含在1個實數根這個測試點裏面了。
解決方法:在代碼 裏面多加了一個if(b==0&&c==0)語句,在運行就解決了問題。
②計算求當前日期距離1年1月1日的天數出了問題,當時沒有取解決這個問題,只得到了該題的27分。
③求下一天的時候出現跨年的情況沒有考慮清楚導致出現13月的情況,閏年29非閏年28的這種錯誤並沒有出現
解決方法:加上了if(month==12&&day==31),就有year++;使得年份可以加1,然後月和日複位到1。
④剛看到第四題求下n天的時候思路是跟第三題求下一天的思路是一樣的,但是又不太一樣,當時遇到的問題是n天,我要解決的同樣還是跨月,跨年問題,不同於一天,而是n天(n是有範圍的,屬於(-10,10),顯然,負數跟正數的算法是不太一樣的,當時就卡在那裡了。
解決方法:考慮到這種算法的抽象想像是比較難想得,於是我打算用幾個具體的例子來設計算法,於是我就想到了用2月29(閏年),12月31日,這個來設計求n為正數的情況,還有1月1日用來求n為負數的情況,然後我假定n為一個具體的數,然後找出day跟n的關係,然後有些是day=day+n,有些是需要day=31-(day-n)的,大概就是這些類型的,然後就還是把代碼給補全就ok了。
第三次作業
遇到的問題:
①首先類的傳參數問題,我不知道怎麼傳參數,不會構造有參方法。
解決方法:我百度,然後解決了,就是將this.屬性 = 特定的參數。
②第一次提交第二題的作業,發現只有10分,只有邊界測試和非法數據的測試過了測試點,求下n天,求上n天,求兩個日期之間間隔多少天都沒有通過測試點。
解決方法:發現這裡的n不像第二次作業的那樣有範圍,這裡的n可以是很大,所以我就發現我之前的那個算法出現了問題,之前的那個算法並沒有考慮n過大的情況,於是我重新設計了算法,就是從i = 0一直加到n,這樣一天一天的算,遇到跨月跨年,就按照之間的算法來,發現最後前n天,後n天的答案是正確的。
③運行超時問題。
解決方法:運行超時是因為我循環的次數太多了,所以我就想到了如果n大於366天,我是不是可以按照一年一年的減少或者增加來算,然後我就設計了如果n大於366的時候,就每一次減少365或者366,year-1或者year+1,當n小於了366的時候,就按照之前那個一天一天啊的算的算法,發現運行沒有超時了,成功通過了 。
④不知道怎麼從其他類裏面調用方法,也不知道怎麼把屬性傳到其他類裏面去。
解決方法:諮詢了同學,舉個例子,可以year = new Year(y);這樣,然後調用方法後來我發現了如果你打了一個點(.),他後面會出現提示,然後我就是這樣摸索摸索完成了第四題和第三題。
(4)每次作業花費的時間比例
第一次作業:花費時長大概一共是2個小時,第一題:0.8h;第二題:0.3h;第三題:0.3h;第四題:0.3h;第五題:0.3h;
第二次作業:花費時長大概一共是12個小時,第一題:0.5h;第二題:4h;第三題:3.5h;第四題:4h;
第三次作業:花費時長大概一共是30小時,第一題:1h;第二題:23h;第三題:2h;第四題:4h;(我先做第四題,做第三題發現簡單了許多,錯誤也少了許多)
(5)對編程過程的邏輯嚴謹性的認識及教訓
①首先字母的拼寫要注意,尤其是方法的命名,不然你發現方法不一致,代碼很長的情況下,你會比較麻煩。
②java輸出格式要特別注意規範,多一個空格少一個空格都要注意,還有標點符號也是要注意,血一般的教訓。
③算法的優越性和實用性,設計一個算法,要儘可能完美一點,不然可能代碼換一個地方,換一個題目就不能用了,就是算法的適用範圍可以廣一點。
④類之間的關係要注意,盡量不要出現空指針異常的情況。
2.OO設計心得
(1)面向過程與面向對象的比較
我覺得面向過程就是簡單得把一大串代碼放在一起,雖然小分工有方法來承擔但是大分工不是很明確。
面向對象則是用到了類,一個類有一個大分工,使得代碼更加清楚明了,不同得程序員看這段代碼更容易看得懂,這就是面向對象得一個優點之一,單一職責原則。
(2)面向對象設計的基本原則理解
暫時了解的就只有單一職責原則:就是每一個類一般來說就執行相對應的功能,不要加其他別的功能,比如我計算Day的 就是計算day有關的,不要計算year或者month的,盡量不要在一個類裏面把功能搞得這麼複雜。
(3)OO編程思維的理解
我覺得oo編程思維主要體現在類的設計,類之間的關係上,是聚合還是其他的什麼,同時類之間的耦合度高低都是跟類的設計有關,我們就是要想辦法把類設計得好,讓單一職責原則體現出來,同時程序能很容易被讀懂。
3.測試的理解與實踐
(1)測試對於編碼質量的重要性
測試對於編碼質量是非常重要的,就相當於測試遊戲的bug一樣,如果一個代碼,你不去測試的話,那可能別人用你的代碼都不放心,你的代碼功能這樣也是不完全的,很容易出現得到錯誤的結論的情況,所以測試是非常有必要的。
(2)假如讓你設計測試用例,你會如何做
比如這個的作業日期類的,首先我會設計一個閏年的2月29日,非閏年的2月28日;超出了時間範圍的例子;非閏年的2月28日,2月29日;輸入n是5000的情況還有n是int類型最大值的情況
總之,不管是什麼題目的測試,我們在設置測試用例的時候,一定要考慮到普通和特殊的情況,只要把普通和特殊這些情況都考慮到了,其實測試用例也就差不多了。
4.課程收穫
這一個階段下來,還是學到了一些東西,一開始學的C語言學的並不是特別好,現在經過這一階段的補習相當於,算法設計能力提高了,編程的速度也提高了,同時還知道了面向過程和面向對象的一點點區別,知道了類和對象這個東西,知道了類之間的調用,明白了算法優化的重要性,不然會出現超時的情況,也懂了我們編寫的代碼要儘可能好一點,確保能在多處地方用得上,同時,知道了怎麼去通過單步調試去改進自己的代碼,通過測試用例來知道自己那裡的代碼出現了問題,算是培養了一個小小的整體大局觀吧。
5.對課程的建議
(1)希望老師能更多的講一些例子,我覺得通過講例子能更好得幫助我們來學習java,這樣學起來沒有這麼抽象。
(2)老師可以多講一下下次作業有關得內容,這樣下次作業做起來不會這麼吃力。
(3)老師可以上課少講一下理論的,就是比如一個類的使用,可以給我們展示一下,這樣我們比較容易記住這個類的具體用法。