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

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

教材學習內容總結

第五章

  • 運算符
    • 相等性運算符,包括==!= ===的區別)
    • 關係運算符,算術運算符的優先級更高。
    • 邏輯運算符,優先級 ! > && >||
  • if語句、if-else語句、if語句嵌套。當輸出兩句話的時候運用語句塊。
  • 數據比較
    • 浮點數比較:絕對值和0.0001比較,接近就是相等。
    • 字符比較:比較的是Unicode中的值。誰的值大,誰就在後
    • 字符串比較:compareTo 本質就是比較字符如果正值,就後於被比較的值
    • 比較對象:經過接口來實現。
  • while語句 ( 先判斷,後執行。
  • 迭代器 (徹底看不懂)
  • ArrayList類 (和枚舉型有什麼區別嗎..

第六章

  • switch語句 。 (有關switch語句)
  • 條件運算符 ---?:(相似條件語句,而且兩個符號老是分開的。
  • do語句 ( 先執行,後判斷,至少被執行一次。
  • for語句 (知道執行的次數)
    形式: 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在須要時只會爲屢次使用的一個字符串常量建立一個對象。html

- 那咱們看幾個例子:
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);

判斷一下輸出的是什麼? true、false
- 下一個:java

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

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

判斷這些對象是否彼此互爲別名(它們是否含有相同的地址)。
這和`equals`方法判斷含有相同的字符確實是徹底不一樣的。而第二個例子也就是所說的**屢次使用的一個字符串常量建立一個對象**,它們就是同一個地址。第一個例子則是建立了兩個對象,地址不一樣了,那麼判斷就是錯嘍。  

<table><tr><td bgcolor=#D1EEEE>參考資料:  </td></tr></table>

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語句的一些理解。spa

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

Java switch-case 語句的優勢和幾點注意事項.net

  • 問題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。恍然大悟。老師曾經講過nextInt和nextLine的用法,我也在前面總結過,這裏算是嚐到了錯誤的教訓。對其理解的也更加深入。因而乎,再輸入了一遍another = scan.nextLine

    • 偶然瞭解到了第二種方法,分享一下。咱們實例化了兩個Scanner對象,一個scan和scan1,這樣nextInt和nextLine誰都不會相互影響。一樣能夠編譯成功。

代碼託管



這一週,代碼行數遠沒有上一週多,可是花在代碼編寫上的時間並很多。一方面,我這星期在研究博客園博客的格式和CSS碼設計,但願能把博客寫的更加美觀,不同凡響。固然,求分也是必定的 另外一方面,這一週的學習主要是條件判斷和循環,須要對其有必定的理解才能更好的編寫程序,因此也花了很多的時間琢磨。

上週考試錯題總結

  • 爲了保存一個對象的封裝,除了哪個之外,咱們會作如下操做? 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。上面全部的
    理解:在程序開發階段,咱們應該明確這個程序須要幹什麼?即必須執行的任務是什麼?書P193:

軟件需求指定了程序必須完成的功能,指明瞭程序應當執行的任務,而不是描述如何執行所規定的任務。

   上面列出的其餘工做是設計階段和測試階段的一部分。應該分清軟件設計的階段。書上的原話,看書不仔細

  • All objects implement Comparable. B
    A . true
    B . false
    理解:這個徹底是理解錯了,有道翻譯成了「全部對象實現可比性。」我當時看的一臉懵,而後也蒙了一個。其實,Comparable是一個接口,咱們必須定義compareTo方法,而後聲明實現接口,才能夠。

  • 若是您聲明一個類構造函數有一個void返回類型會發生什麼? D
    A。您可能會收到語法錯誤。
    B。該程序將經過一個警告進行編譯,可是您將獲得一個運行時錯誤。
    C。聲明一個構造函數爲void並無什麼錯。
    D。類的默認構造函數將被使用而不是您聲明的那個。
    E。以上都不是
    理解:一個構造函數若是有一個void返回類型而且編寫沒有錯誤,是不會收到語法錯誤的。書上P116:

編譯時,具備返回類型的構造方法(即便返回類型爲void)將被轉換爲常規方法(方法名恰與類名相同) ,從而不能做爲構造方法調用。一樣是書上的原話,卻沒有更深的理解。慚愧。

  • 靜態方法不能: B
    A。引用實例數據
    B。引用非靜態實例數據
    C。引用其餘對象
    D。調用其餘靜態方法
    E。調用非靜態方法
    理解:靜態方法不能訪問非靜態實例數據, 必須在其實例化, 也就是new以後才能夠調用。

  • 在黑盒測試中,測試人員應該已經知道程序是如何實現的,這樣他/她就能夠更仔細地識別出軟件的哪一個部分致使了錯誤。 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

參考資料

相關文章
相關標籤/搜索