1. 程式人生 > >20172301 2017-2018-2 《程序設計與數據結構》第5周學習總結

20172301 2017-2018-2 《程序設計與數據結構》第5周學習總結

有效 考試 next ring -i 方法名 也不能 com 可選

20172301 2017-2018-2 《程序設計與數據結構》第5周學習總結

教材學習內容總結

第五章

  • 運算符 (相等性運算符、關系運算符、邏輯運算符)
  • if語句、if-else語句、if語句嵌套
  • 數據比較(浮點數比較、字符比較、比較對象)
  • while語句
  • 叠代器 (完全看不懂)
  • ArrayList類 (和枚舉型有什麽區別嗎...)

第六章

  • switch語句 (break語句)
  • 條件運算符 (類似條件語句)
  • do語句
  • for語句、for-each循環

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

  • 問題1:===的區別。
    ==equals的區別。
  • 問題1解決方案:
    • 首先,我們知道=是在第二章數據與表達式
      中的內容;equals方法在String類那裏提過;==就是剛學的相等性運算符。
      ===是便於區分的,因為=是賦值運算符;==則是判斷,輸出的是結果——true、false。 這裏就不詳細舉例。
      參考資料:在java中=和==的區別
    • ==equals有什麽區別呢? ==是一個操作符,equals就是一種方法。
      ?? 在書P148 給出了一個例子:

      String str = "software";
      if (str == "software")
         System.out.println("References are the same");
      if (str.equals("software"))
         System.out.println("Characters are the same");

      因為,java在需要時只會為多次使用的一個字符串常量創建一個對象。

    • 那我們看幾個例子:

      String str1 = new String("abc");
      String str2 = new String("abc");
      System.out.println(s1.equals(s2));
      System.out.println(s1 == s2);
      判斷一下輸出的是什麽? true、false
    • 下一個:

      String s1 = "abc";
      String s2 = "abc";
      System.out.println(s1.equals(s2));
      System.out.println(s1 == s2);

      判斷一下輸出的是什麽? true、true
      為什麽同樣都是創建一個字符串對象,確實不一樣的結果。
      簡單說下我的理解,==根據書上的解釋:

      判斷這些對象是否彼此互為別名(它們是否含有相同的地址)。 

    這和equals方法判斷含有相同的字符確實是完全不同的。而第二個例子也就是所說的多次使用的一個字符串常量創建一個對象,它們就是同一個地址。第一個例子則是創建了兩個對象,地址不同了,那麽判斷就是錯嘍。

    參考資料:

    Java中==號與equals()方法的區別
    如何“記住” equals 和 == 的區別?
    equals和==的區別

  • 問題2:ArrayList類和枚舉型的區別。 怎麽說呢?這兩個裏面都可以放字符串,然後對其進行操作。所以我覺的兩個應該是差不多?
  • 問題2解決方案:這種問題只能百度了吧。從書上只能簡單了解到ArrayList類是數組。
    這裏我們參考下:枚舉 跟 數組的區別?
    通俗說:

    枚舉對象在任一時刻只能有一個常量值,數組對象在任一時刻可以有多個值.

    看下例子:

    Public Enum Enum1
      First = 1
      Second = 2
      Three = 3
        End Enum
    
    Dim e As Enum1, e_Array As Enum1(2)
    
    e = Enum1.Second
    
    e_Array(0) = Enum1.First
    e_Array(1) = Enum1.Second
    e_Array(2) = Enum1.Three  

    我們可以看出枚舉確實只有一個常量值,而數組有多個。
    大致能明白吧,因為我們馬上就學習數組,所以在這裏我先不咬文嚼字,把疑問帶下去,等以後更深學習了數組再來理解。

  • 問題3:switch語句的適用範圍。
  • 問題3的解決方案:這個問題是第一遍看書疑惑的,然而,第二遍再看的時候直接就解決了,因為書上白紙黑字寫著呢。感覺這個問題問的沒有什麽含金量吧。這裏寫出來也是為了督促自己看書認真一點
    附上有關switch語句的一些理解。

    1. switch的break語句是可選的,有時我們會利用這種特性(如上面的代碼),但是一般情況下break是不能少的。否則可能會出現意料之外的錯誤。——沒有break,程序會繼續執行後面的代碼。
    2. default語句也是可選的。相當於對應if-else語句最後的else。
    3. java語言用於匹配的選擇因子必須是整形或字符型常量。這很重要。
    4. switch語句的比較是從上往下,所以把匹配概率大的選擇因子放在前面可以提高效率。
    5. 選擇因子具有唯一性,即不能有2個相同的因子存在。
    參考資料:

    Java switch-case 語句的優點和幾點註意事項

  • 問題4:Java中幾種循環語句的系統比較。
  • 問題4解決方案:
語句 特征 備註
while語句 先判斷,後執行 不知道執行次數
do...while語句 先執行,後判斷 至少被執行一次
for語句 循環變量和循環條件在一起 分號不可省略 知道執行次數
switch語句 表達式必為整型或字符型 可讀性強

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

  • 問題1:什麽時候需要初始化?
    技術分享圖片

  • 問題1解決方案:

    成員變量在類存在的時候就已經初始化了,局部變量只有該方法被調用的時候才初始化。局部變量一定要賦初值,否則報錯,成員變量如果不賦初值,系統默認給。

?? 最好盡量都把變量初始化。

  • 問題2:在做PP5.7的時候,用戶輸入的應該是“石頭剪刀布”,但是,如果用戶隨便胡亂輸入,我有什麽辦法 難道判定他贏嗎?所以,我們需要排除用戶輸入其他的可能。
    看一下我編寫的代碼(完成後的):
    技術分享圖片

?? 我開始想用戶不輸入“剪刀石頭布”,那麽計算機就會輸出Be serious!;所以呢,我該怎麽判斷不是石頭剪刀布呢?

  • 問題2解決方案:
    首先,我想比較字符串相等用的是equals方法,那麽不相等是不是有notequals方法,或者unequals方法?我也不知道我為什麽當時腦洞這麽大。 所以,我就去API查查有沒有這種方法?!
    可惜,沒有。 怎麽辦?!

    那我只好把if和else對調。

?? 結果,我昨天晚上靈光一現,不是有邏輯運算符嗎?
!(str.equals("剪刀") || str.equals("石頭") || str.equals("布"))
Good job!

  • 問題3:nextInt和nextLine?
    技術分享圖片

  • 問題3的解決方案:編寫程序項目PP5.1的時候,我突發奇想給程序加上一個類似例5.9的while (another.equalsIgnoreCase("y"))會怎麽樣?然後我就正常的輸入,結果,它竟然跳過了我的詢問?!
    仔細一看,就發現了nextInt和nextLine,於是乎,再輸入了一遍another = scan.nextLine

代碼托管

技術分享圖片
技術分享圖片

上周考試錯題總結

  • 為了保存一個對象的封裝,除了哪一個以外,我們會做以下操作? D
    A。使實例數據為私有。
    B。定義類中的方法來訪問和操作實例數據。
    C。讓類的方法公開。
    D。使類變成final。
    E。以上都是保存封裝。
    理解:封裝的定義在書P108:

    封裝意味著類外的代碼難於甚至無法訪問和修改該類內部聲明的變量。

? ? 為了正確地保存封裝,實例數據不應該從類外部直接訪問。而保留字final,封裝對於常量基本是無意義的,final和封裝應該無關。

  • 如果一個方法沒有返回語句,那麽。 B
    A。它將在編譯時產生語法錯誤。
    B。它一定是一種void的方法。
    C。不能從定義該方法的類之外調用它。
    D。它必須被定義為一種公共方法。
    E。它必須是一個int, double, float或String方法。
    理解:好吧,題意理解的不對,一個方法是必須有返回語句的,除非是沒有返回值的void方法。

  • 訪問器和修改器提供了對被封裝的類進行受控訪問的機制。 A
    A。真
    B。假
    理解:書P109,訪問器方法名的形式為getX,同樣,修改器的方法名的形式是setX。可以對實例數據進行訪問和修改。

  • 在程序開發期間,軟件需求指定。 B
    A。程序如何完成任務?
    B。該程序必須執行的任務是什麽?
    C。如何將任務劃分為子任務?
    D。如何在程序完成後進行測試?
    E。上面所有的
    理解:在程序開發階段,我們應該明確這個程序需要幹什麽?即必須執行的任務是什麽?上面列出的其他工作是設計階段和測試階段的一部分。應該分清軟件設計的階段。

  • All objects implement Comparable. B
    A . true
    B . false
    理解:這個完全是理解錯了,有道翻譯成了“所有對象實現可比性。”我當時看的一臉懵,然後也蒙了一個。其實,Comparable是一個接口,我們必須定義compareTo方法,然後聲明實現接口,才可以。

  • 在黑盒測試中,測試人員應該已經知道程序是如何實現的,這樣他/她就可以更仔細地識別出軟件的哪個部分導致了錯誤。 B
    A。真
    B。假
    理解:黑盒測試,當然是摸黑測試了,什麽都知道的話那叫glass-box testing玻璃盒測試了。

    黑盒測試: 在測試中,把程序看作一個不能打開的黑盒子,在完全不考慮程序內部結構和內部特性的情況下,在程序接口進行測試,它只檢查程序功能是否按照需求規格說明書的規定正常使用,程序是否能適當地接收輸入數據而產生正確的輸出信息。黑盒測試著眼於程序外部結構,不考慮內部邏輯結構,主要針對軟件界面和軟件功能進行測試。

    白盒測試: 白盒指的是盒子是可視的,你清楚盒子內部的東西以及裏面是如何運作的。"白盒"法全面了解程序內部邏輯結構、對所有邏輯路徑進行測試。"白盒"法是窮舉路徑測試。在使用這一方案時,測試者必須檢查程序的內部結構,從檢查程序的邏輯著手,得出測試數據。貫穿程序的獨立路徑數是天文數字。

其他(感悟、思考等,可選)

?? 有時候,對很多概念理解不清晰不全面,在看到書146頁的時候,哎呦,別名是啥?! 又開始往前面翻,無形之中就降低了自己的效率。或許,有時候就是不求甚解,往往只理解了表面的意思。這樣的學習是沒有絲毫效果的。就好像一座千年大堤慢慢的在崩壞。我們僅僅把例子輸入上去夠嗎?能夠合理的運用while,do...while,for,switch語句嗎?能夠清晰理解循環體嗎?
?? 所以,有時候,我們稍微多花點時間,卻能夠收貨成倍的效益。
?? 越往後學就越需要系統的思維,我們在編寫的項目的時候,它會有很多很多的要求,你需要用到很多的方法和變量,那怎麽才能合理有效的編寫出來,還需要我們慢慢地摸索,一直向前努力。

?? 同樣,眼光也不能僅僅局限於課本,課本的幾個例子當中。不過總是說的時候精氣滿滿,做的時候累死累活。看過這樣的一句話,盡管可能有些刻薄:

累嗎?累就對了!舒服是留給死人的。

?? 共勉!

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 122/122 1/1 20/20
第二周 487/609 1/2 18/38
第三周 482/1091 1/3 22/60
第四周 1357/2448 1/4 20/80
第五周 628/3106 1/5 20/100

參考資料

  • 在java中=和==的區別
  • Java中==號與equals()方法的區別
  • 如何“記住” equals 和 == 的區別?
  • equals和==的區別
  • 枚舉 跟 數組的區別?
  • Java switch-case 語句的優點和幾點註意事項

20172301 2017-2018-2 《程序設計與數據結構》第5周學習總結