java 初學者 第一階段做業編程總結及心得體會

0.前言java

第一階段java做業分爲3次。程序員

第一次做業是簡單得一些語法和一些簡單得邏輯思惟,主要內容有求三角形是什麼三角形的,還有就是求座標點所在範圍的,也涉及到了數字和字母的轉換,總之相至關因而給java初學者得一次入門練習,可是這個是基於在有C語言的基礎之上;算法

第二次做業是關於日期求下n天還有上n天以及兩個日期之間相差多少天,裏面涉及得比第一次多了一點,涉及到了日期的基本邏輯判斷以及簡單算法的設計,同時還用到了方法,以及方法之間的調用;編程

第三次做業主要是對類的理解和運用,做業題目仍是跟第二次做業是同樣的,也是有一個一元二次方程解的,還有3個日期的題目,題目是同樣的,可是3個題目之間類之間的關係和類圖是不同的,根據不一樣的類圖來寫出不一樣的代碼。數組

1.做業過程總結eclipse

(1)三次做業之間的知識迭代關係學習

①.三次做業之間有明顯的迭代關係,每次做業中的每小題做業裏面也有明顯的迭代,因此作做業的時候老師也是建議咱們要一個題目一個題目按順序來。測試

②.第一次做業是最簡單的,徹底就是基於咱們大一學過的C語言,好比使用簡單的for循環,while循環,還有if判斷語句,還有一些用了swtich..case..語句就能解決,就迭代關係來講,第一次做業裏面的各個題目,是沒太大的聯繫的,第一次做業就是讓咱們經過練習來適應java裏面的一些語法,讓咱們的編程習慣從C語言轉變過來,適應適應這麼新的語言。優化

③.第二次做業相對於第一次做業來講 ,又增長了難度,不過仍是沒有涉及到面向對象思想,仍然是面向過程的思想,此次做業用到了的結構有選擇、循環、方法、數組,依然仍是方法的調用。主要是求日期類的,不過這裏面的三個日期題目之間也是有着聯繫,第一個日期題目是求某一日期是星期幾的,第二個題目是求下一天的,第三個題目是求前n天的,求下1天或者上1天其實跟求前n天或者後n天相聯繫的,搞懂了下1天,下n天也就能夠解決了,因此說做業內的題目也存在迭代關係。this

④.第三次做業仍是求關於日期的,可是此次是面向對象而不是面向過程了,涉及到了類,單一職責原則,理論上是一個類處理一個功能, 儘可能類之間關係不要太複雜。此次的日期題目一個題目裏面要實現求下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)老師能夠上課少講一下理論的,就是好比一個類的使用,能夠給咱們展現一下,這樣咱們比較容易記住這個類的具體用法。

相關文章
相關標籤/搜索