學習OO第一階段總結
(1)前言:
對學習面向物件一個多月以來所做的三次題目集進行分析。
第一個題目集涉及的知識點較為基礎,題量雖多但每道題的難度並不高,所花時間較少,主要涉及了基礎類的運用例如Scnner和java中陣列、排序函式的運用。
第二個題目集前兩題較為基礎後三題側重於類的設計,難度適中,主要考察對年份基礎知識的運用。
第三個題目集題量再次減少但難度再次增大(我是說第三題),主要考察類設計和正則表示式的運用。
(2)設計與分析:
第一次題目集7-8:主要運用了arrays類的方法,將三角的三條邊轉化為陣列來進行運算和判定,具體涉及三角形邊長的關係知識,兩邊長是否大於第三邊,兩邊是否相等構成等腰三角形以及是否構成勾股定理等情況進行依次判定即可,由於使用大量if else語句,圈複雜度十分高
在往後的作業中應儘量減少使用改為其他辦法。
第二次題目集7-4,7-5:都是屬於求某一天的題目,因此方法基本一致,對所求那一天的情況進行判斷即可,首先判斷輸入的天數的年份是否是閏年,再根據年份情況分析所求天所在的月份天數進行分析。這兩題所需方法較多,可以看出JAVA面對物件的思維,要清楚每個類的職責,而不是面向過程。
由於在判斷閏年和2月閏月平月的過程中使用了大量if else語句,所以這兩題的圈複雜度也灰常高。
第三次題目集7-2:題目目標與題目集2中的7-4相同,本題主要是將日期類的方法寫完整,增加程式碼的可讀性,減少圈複雜度,因題目已給出方法名稱及其作用,因此設計並不難。
第三次題目集7-3:是目前為止難度最大的一道題,首先要學習正則表示式的使用,首先對輸入表示式的合法性通過正則表示式進行分析,然後對求導的係數和指數進行計算,並對各種特殊情況進行判定。並且要對求導過程中出現的諸多情況進行分析,並且該題有不合乎常理邏輯的天坑點,耗時很長,提交了近20次才滿分通過。
(3)踩坑心得:
一定要注意題目要求例如相關變數的範圍,程式碼中避免出現如
if(month!=1&&month!=3&&month!=5&&month!=7&&month!=8&&month!=10&&month!=12) {//為平月 if(month==2&&isLeapYear(year)==true) { if(day<29) {day=day+1;return;}else {month+=1;day=1;return ;} } if(month==2&&isLeapYear(year)==false) { if(day<28) {day=day+1; return;} else { month+=1;day=1;System.out.println("Next date is:"+year+"-"+month+"-"+day);return; } } if(day<30) day=day+1; else { month+=1; day=1; } } else {//為閏月 if(day<31) { day+=1; } else { if(month==12) { year+=1; month=1; day=1; } else { month+=1; day=1; } } }
這麼多的if else以免出現邏輯混亂及圈複雜度極高的情況,增強可讀性。
題目集3的7-2中,day的定義,必須將其定義成long型別,如果將其定義成int型別程式就會出現報錯,由於此時的天數可能會超過int所能包含的範圍。
題目中出現的最大天坑是題目集3的7-3題目總的最後一個測試點,即如果求導結果出現常數相加的情況,加號要被自動省略,如7*x+8*x求導結果應該是78(就離譜),希望出題老師注重題目測試點的建立。並且在上課過程中和程式設計過程中,逐漸理解了面向物件設計的程式設計思維和理念,要清楚題目設計中的每個物件與其職責及其需要建立的類及其方法,這樣能夠增強程式碼的可讀性並且能夠體現面向物件的思維。
(4)改進建議:
減少使用過多的if else語句,可以使用其他方法如巢狀函式代替之。要用面向物件的思維來理解題目並進行相關設計。要多學習java中基礎類及其方法的使用,打牢基礎。要通過以上方法減少圈複雜度,增加程式碼可讀性。上課前應做好充足準備。
(5)總結:
①面向過程與面向物件的比較:
<1>.面對物件與面對過程的本質區別就是面對過程程式設計每一個函式就是一個過程執行完就啥也不剩下了,唯一可以輸出的就是return但是本質上說也還是過程的一部分,因為一旦執行完return語句本身就不再起作用了,即僅僅走了一個流程而已。所以你會發現面向過程程式設計想要儲存點東西就不得不定義一個全域性變數,而函式不過是對全域性變數按照流程步驟進行加工處理的過程而已。
<2>.面對物件程式設計不是這樣。面對物件程式設計,萬事萬物皆物件,每當建立一個新的物件,就好像建立了一個實體,它有自己的屬性和方法,如果不對其進行銷燬那麼,她將會一直存在,而不是僅僅走個過程。你可以隨時查詢它的屬性,也可以隨時交給她一些東西處理,即物件不僅僅是一個過程模組。
②面向物件設計的基本原則理解:
把構成問題的各個事務分解成各個物件,建立物件的目的不是為了完成一個步驟,而是為了描敘一個事物在整個解決問題的步驟中的行為。
③OO程式設計思維的理解:
面向物件的思維更符合人認識和思考問題的方式,面向物件的概念和應用已經超越了軟體開發和程式設計,擴充套件到多個的領域,其中一個應用的分支就是面向物件的知識表示法。這種表示法把組成客觀世界的實體抽象為資料和對資料的操作,並使用類把資料和對資料的操作封裝成為一個不可分割、互相依存的整體。
從最初的的面向過程到面向物件,從無知到懵懂再到現在的初步瞭解,一步一步的走到了現在,越是學習越是瞭解了JAVA的路還很長,看不到邊際,需要學習的東西還很多,沒有盡頭。學習JAVA的路程中學會了自學,因為寫PTA有很多的東西是要自己去深入瞭解去掌握相關的知識的,例如StringBuilder,或者是正則表示式,都是要自己去學習的,老師是不可能像高中老師一點一點都給自己講解得清清楚楚明明白白的,相信到了之後的生涯中自學也是避免不了的。
JAVA有很多內容是可以在網上搜到的,許多的語法使用是可以不需要去背單詞一樣的背誦下來的,寫多了就會了。所以要多寫,不能長期不學不寫,那樣容易手生。
要養成面向物件的思維,就是一看到問題就要在自己的腦海中構思UML類圖,需要有初步的大綱,知道大概需要分成哪些類,這些類又要執行什麼樣的功能,這些思想的培養依舊是需要多寫,畢竟實踐出真理。
經過這三次作業,主要學習了基礎類的運用例如Scnner和java中陣列、排序函式的運用,相關類設計,String,Arrays類及其方法的使用,正則表示式的使用,學習了複雜結果的情況分析,Account類和日期類的設計,理解了面向物件的思維和理念。
JAVA語言的基礎知識還需繼續學習以打牢基礎,做題思維也應進一步改善,對每一個類的職責應清楚並進行相關設計,減少使用過多的if else語句,可以使用其他方法如巢狀函式代替之。要用面向物件的思維來理解題目並進行相關設計。要多學習java中基礎類及其方法的使用,打牢基礎。要通過以上方法減少圈複雜度,增加程式碼可讀性。上課前應做好充足準備。
建議:老師上課的體驗感其實是非常好的,節奏感很好並且講課與學生實踐相結合,學生有很強烈的參與感,並且老師上課的主要內容側重與對面向物件思維的講解而不是對具體程式碼知識的講解,增加了趣味性,老師聲音音量控制的很好,不像某些老師講課語氣像我欠了他幾百萬一樣。
課程方面我認為學習所需平臺有點多了,學一門課我們需要用到U+新工科智慧雲、PTA程式設計類實驗輔助教學平臺、中國大學mooc、部落格園四個平臺,並且與其他所學學科使用的平臺並無交叉,這倒的確是有些不妥。
作業方面這個互測嘛,,大家都是同學,懂得都懂。其他目前倒沒有任何不適的說。
實驗方面目前只進行了兩次實驗,目前看來難度適中,體驗尚佳。