1. 程式人生 > >java 初學者 第一階段作業程式設計總結及心得體會

java 初學者 第一階段作業程式設計總結及心得體會

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)老師可以上課少講一下理論的,就是比如一個類的使用,可以給我們展示一下,這樣我們比較容易記住這個類的具體用