1. 程式人生 > >20172308《程序設計與數據結構》第五周學習總結

20172308《程序設計與數據結構》第五周學習總結

bubuko 數據結構 ava 註意 進度 偶數 http 實現 驅動程序

20172308 2017-2018-2 《Java程序設計》第五周學習總結

教材學習內容總結

  • 1.條件判斷
    a.if語句: 如果條件表達式的運算結果是true,則執行if中的語句,然後執行if後面的語句
    b.if-else語句:如果條件成立執行第一條語句,不成立則執行else語句。
    c.switch語句:先計算表達式,與幾個可能的case子句取值進行匹配,控制會跳轉到第一條匹配的case子句執行。無匹配則執行default。

  • 2.循環
    a.while:先執行表達式計算,循環體執行完後再次計算表達式,直到為false,退出循環。接著執行循環體後的語句。
    b.do:將循環條件放到循環體的尾部,使先運行循環體,再對控制條件進行計算,以確保do循環體至少會執行一次
    c.for:適用於循環執行前已經確切知道具體的循環次數(循環頭內聲明的變量在循環體外部不能用)

教材學習中的問題和解決過程

  • 問題1:如果兩個字符串,長度不同,多個對應位置索引處的字符不同,compareTo如何比較?
  • 問題1解決過程:字符和字符串的比較以Unicode字符集為基礎。這種比較稱為字典順序比較。而其只比較第一個字符,如果不同則其後不再比較。

  • 問題2:for循環的方式好像與其他循環語句有些不同之處
  • 問題2解決過程:首先是for循環特別適用於執行前已經確切知道具體循環次數的情況。
    形式上的不同:for語句有個控制頭,分為三部分。執行初始化的第一部分只執行一次:這裏有個需要註意的地方,就是控制頭裏聲明的變量在循環體外不能被使用也不能被修改。
    然後執行循環體前要先計算布爾表達式,結果為true之後執行循環體。最後才執行第三部分的增量。如果布爾表達式結果為false,則不執行循環體,也不執行增量增加。for循環的控制頭的形式很容易讓人覺得它是判斷後就執行第三部分增量增加,再執行循環體

代碼調試中的問題和解決過程

  • 問題1:這個編程項目要求輸入一個任意長度的整型數值,然後分別輸出其中的奇數,偶數,零的個數。編譯的時候出現如圖錯誤:
    技術分享圖片

  • 問題1解決過程:錯誤的大概意思是說什麽超出了邊界,結合出錯的位置,發現了原因:while的條件判斷出現了問題,第一次都無法執行,也就是循環體一次也執行不了。這也體現了do語句的特點:循環體至少執行一次。修改了條件判斷之後,就正常運行了。
    另外要記錄的是:一開始受書上例題判斷一個字符串是否為回文的影響,先入為主,也從用戶輸入的數值左右同時判斷,但產生了一個問題就是:如果你輸入的是有奇數個數字的數值,會有中間的那個數字無法被判斷。後來發現完全沒必要,從左邊一個數字一個數字地判斷就都能保證都能夠被判斷,直到最後一個數字結束循環。
    我用的是判斷拿出來的字符是不是2、4、6、8、0中的一個,就可以了,用上邏輯或的話,代碼也不是很長。當然用取余等其他方法也能簡單的做出來。

  • 問題2:一個編程項目要求輸出12x12的乘法口訣表,第一次做出來的運行結果如圖:
    技術分享圖片

  • 問題2解決過程:從這個程序的編寫過程發現了很多問題和收獲:
    1.截圖的最上方出現的就是一個無限循環,這也是編寫修改的過程中出現的一個錯誤,對於條件判斷語句的界限設置很模糊,一不小心就會造成循環體執行一次或者就是無限循環,要不就是不執行。所以我認為,條件和循環語句的最重要的部分就是條件表達式的書寫,也是一個比較難的東西(對於我自己來說)
    2.下面的情況就是:修改了一下判斷語句,最後結果就只輸出了12x12乘法表的第一列,很明顯這是循環體裏出現的問題。部分代碼如下:
    技術分享圖片
    上圖中的是最後的正確代碼。
    首先,這是參考了書上輸出星星的那個例題,如果是要我直接去編寫這個程序,很難相信我能像乘法表那樣輸出出來。
    再有就是,這個程序如果在一開始學Java時也能做出來,直接算出來,然後用輸出語句輸出出來就行了。但是,這裏很顯然要用循環語句輸出。從代碼行也能看出來16行就解決了問題。而且只要修改了行數,幾乘幾的乘法表都能夠階梯狀地輸出出來。甚至用上Scanner類,可以與用戶交互。
    一開始做了很多修改,主要是不清楚這個循環的結構,後來試了幾次,再結合書上的例題。先搞清楚這個循環結構的原理:第一個for循環是限制了要計算的乘法口訣的行數;內嵌的for循環:百度了一張九x九乘法表,發現主要想操作的就是“x”左右的操作數,第二個數就是行數,不用再另外聲明變量。第一個操作數在每一行都呈現出規律,從左向右從1依次增加到行數。然後跳出循環。這個時候想要另起一行輸出,只要在內嵌循環的外面加一條可以換行的空白輸出語句println,但是他還是要在最外邊的循環裏邊,因為每一次輸出完一行都得換行。最後達到要輸出的行數,於是跳出循環,結束。
    如圖是輸出的運行效果:
    技術分享圖片

  • 問題3:一個編程項目要求輸入一個年份,根據條件判斷其是否為閏年,如圖是我第一次寫的代碼:
    技術分享圖片
    這個代碼是能夠運行的。但存在的問題是它無法按照條件語句準確地判斷一個數是否為閏年,輸出的結果總是“不是閏年”。按照我本來的判斷方法,思路是:如果一個數不能被4整除,那它必然會有小數,而我只要判斷這個數字和這個數字除以4再取整乘4的結果比較就行了。如果整除,兩數一定相等。從而產生兩個結果,達到判斷目的。但是很顯然,這個代碼很難看,很多,並且輸出的結果沒有達到預期。

  • 問題3解決過程:首先分析了一下這種判斷方法,理論上是可以的。一開始考慮到的是算數運算符與取整的先後級問題,所以加了很多括號。但結果依然不行,條件的嵌套也是沒問題的。最後想到的原因可能是整數的除法之後取整與原數的比較存在問題。書上說過浮點數的比較是要計算差的絕對值與誤差標準比較的。
    其實解決這個問題的編程方式有很多,只要能達到區分的目的就行了。也借鑒了其他同學的方法---“取余”。這個計算就非常簡單了,代碼也很清晰。
    這也為我提供了一個思路: 有的時候,一種方法產生的錯誤如果始終找不到修正的方法,換個方法思路也許會更容易更簡單地去解決問題。

代碼托管

技術分享圖片

上周考試錯題總結

  • 錯題1:
    技術分享圖片

  • 錯題1分析:保留字“new”用於實例化一個對象,即創建類的實例。語句new後面跟著類名。這調用類的構造函數。

  • 錯題2:
    技術分享圖片

  • 錯題2分析:封裝意味著類包含操作數據所需的數據和方法。為了正確地保存封裝,實例數據不應該從類外部直接訪問,所以實例數據是私有的,方法被定義為訪問和操作實例數據。此外,訪問和操作實例數據的方法被公開,以便其他類可以使用該對象。
  • 錯題3:
    技術分享圖片

  • 錯題3分析:所有的方法都隱含返回某個東西,因此必須有一個返回語句。但是,如果程序員希望編寫一個不返回任何內容的方法,因此不需要返回語句,那麽它就必須是void方法

  • 錯題4:
    技術分享圖片

  • 錯題4分析:一旦方法終止,用調用該方法的方法控制簡歷。在這種情況下,m2調用m4,因此當m4終止時,m2恢復。

  • 錯題5:
    技術分享圖片

  • 錯題5分析:實例數據是組成類的實體,可能是任何類型的實體,無論是原始的還是對象的,並且可能是公共的或私有的。通過使用對象作為實例數據,它允許在其他類上構建類。類具有其他類的實例數據的關系稱為has-a關系。

  • 錯題6:
    技術分享圖片

  • 錯題6分析:它是一個語法違例,聲明任何類型的構造函數都是無效的,因此會收到一個語法錯誤。

  • 錯題7:
    技術分享圖片

  • 錯題7分析:只有驅動程序需要一個主方法。驅動程序是第一個在任何Java程序中執行的程序(除了applet),但是它可以根據需要調用其他類,而這些其他類不需要主要方法。

  • 錯題8:
    技術分享圖片

  • 錯題8分析:所有的Java方法都返回一個單獨的項,不管它是一個原始數據類型的對象,還是void。保留字continue用於退出循環的其余部分並再次測試該條件。

  • 錯題9:
    技術分享圖片

錯題9分析:靜態方法是類本身的一部分,而不是實例化的對象,因此靜態方法在類的所有實例化對象中共享。
由於靜態方法是共享的,因此不能訪問非靜態實例數據,因為所有非靜態實例數據都是特定於實例化對象的。靜態方法可以訪問靜態實例數據,因為與方法一樣,實例數據在類的所有對象中共享。靜態方法也可以訪問傳遞給它的參數。

  • 錯題10:
    技術分享圖片

  • 錯題10分析:測試是必需的,因為所有的軟件都會有錯誤。復雜系統在發布之前尤其需要測試。所尋找的錯誤類型是邏輯錯誤和運行時錯誤。在實現過程中,所有語法錯誤都將被識別和修復。

  • 錯題11:
    技術分享圖片

  • 錯題11分析:任何類都可以擴展,無論是接口、實現接口,還是兩者都沒有。唯一的例外是,如果類被顯式地修改為“final”,在這種情況下它不能被擴展。

  • 錯題12:
    技術分享圖片

  • 錯題12分析:在黑盒測試中,測試人員不應該知道軟件是如何實現的。本質上,軟件是一個黑盒,它有輸入和輸出,程序的機制是不透明的。如果測試人員確實了解程序是如何工作的,那麽測試人員的測試用例可能會有偏差。如果測試人員知道程序是如何工作的,那麽測試就稱為“玻璃盒測試”。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 309/309 1/1 20/20
第二周 269/578 1/2 18/38
第三周 236/776 1/3 22/60
第四周 507/1283 2/5
第五周 631/1914 1/6

參考資料

  • Java學習筆記(第8版)

20172308《程序設計與數據結構》第五周學習總結