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

20172305 2017-2018-2 《程序設計與數據結構》第五週學習總結

教材學習內容總結

本週內容主要爲書的5.1-5.6以及6.1-6.4的內容

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

  • 問題1:邏輯運算符和關係運算符
  • 問題1解決方案:在看第五章以前,經過老師在藍墨雲班課上發佈的是視頻中,對邏輯運算符和關係運算符有必定的認識,加之數學上也學過「或且非」(且即與之意)三者,一個是取對立的,一個則「一真則真」,一個則「一假則假」,並且在班課上還學習到運算符異或「^」、左移右移等運算符,並且經過異或運算符,能夠進行簡單的加密,是數據變化。極大的下降了運算符學習的困難。數據結構

    • 在三種邏輯運算符中,邏輯非具備最高的優先級,其次是邏輯與,最後是邏輯或。
    • 相等性運算符和關係運算符的優先級比算術運算符的優先級低
  • 問題2: if語句的運用
  • 問題2解決方案:if語句在以往的數學課上學過,對於if條件句,在沒有看過本章的內容前,認爲if語句是對承接上來的內容進行判斷,對了經過一條語句,不對再經過一條語句,就是一種「分叉」的感受,以前的學習是停留在紙上,如今的學習是用在電腦上,因此和以前的還有必定的不一樣,就好比說縮進格式,對於理解if裏面的條件和語句有很大幫助,還有用到語句塊的時候,應用到「{」、「}」是避免錯誤理解的有效方法,if-else的運用在代碼調試中進行分析。編程語言

    • 縮進格式只對程序閱讀者有意義,沒有正確的分塊縮進書寫的語句,會是程序閱讀者對代碼的執行邏輯產生誤解。
  • 問題3:浮點數的比較和字符的比較
  • 問題3的解決辦法:
    • (1)浮點數的比較,我認爲能夠經過除法後與1進行比較,或者減法後與0比較,而書上所說的浮點數的比較,實在給定偏差標準的狀況下進行比較二者是否相等。

      • 計算兩個數差的絕對值並將差和某個偏差標準相比較
    • (2)字符的比較,能夠理解爲Unicode字符集內各個字符的排列順序,若是字符a在字符b前面,那麼字符a小於字符b。

  • 問題4: do、while、for語句
  • 問題4的解決辦法:while語句是先判斷,true則執行語句運算,false則跳過。do語句是先執行一次語句運算,再進行判斷,true則返回執行語句,false則跳過。for語句是一種適用於循環執行前知道循環次數的狀況。三者的嵌套和運用在代碼調試中進行分析。

  • 問題5: 迭代器和ArrayList類
  • 問題5的解決方法: 迭代器的問題早在第七章就有所遇到,而第五章的系統性的學習,對迭代器有了更多的認識。對於迭代器的理解還不是很明白,有些問題在上網找過以後,仍有較大疑惑。

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

  • 問題1:PP5.1
  • 問題1解決方案: 對於問題中「年份可以被4整除且不能被100整除,或者同時可以被100和400整除」的理解,我在最初用邏輯運算符((years%4= =0&&years%100!=0)||(years%100= = years%400)) 來表示,結果就是特別神奇的邏輯錯誤,後來換了一種思路,用if的嵌套問題解決了。

  • 問題2:PP5.3
  • 問題2解決方案:在解決這個問題以前,我經過提早看第六章的示例代碼,經過運用例6.2的運用,利用求餘的辦法不斷從後面一位一位的判斷數字,利用while中嵌套if語句解決的,也第一次真正運用到自增運算符,全程自主研發的代碼,適用於正數和負數,可是經過後來給別人講解過程當中,他人提出「0」的問題,在個人1.0版上倒是無做用的,可是「0」做爲偶數,也是要算在內的,因此有自主研發出2.0版,經過加if語句進行判斷來解決的。

  • 問題3:PP5.7
  • 問題3解決方案:剛接觸到問題的時候感受濛濛的,什麼石頭剪刀布啊,還要機器隨機產生,還得比較並記錄結果。這個時候,忽然感受本身有一個愛因斯坦的腦殼就行了,惋惜本身只能經過寫僞代碼的方式進行,不過** 經過寫僞代碼,能夠很清楚的知道本身這步要作什麼,下步要幹什麼的問題,能過寫僞代碼的方式把問題劃分爲幾個部分去解決,就像第七章的軟件活動開發要先肯定軟件需求同樣,明確了方向。**對於石頭剪子布的隨機,個人想法是經過隨機數產生,一個數對應一個,就確保了隨機性。其次,我就想經過if條件句進行數字和字符串的對應,但經過看同窗的代碼,發現能夠用ArrayList類,把石頭剪刀布裝進去,再經過每個的索引值來取,算是完成了。接下來就是規則的編寫,石頭贏剪子,剪子贏布,布贏石頭,感受就像一個烏比莫斯環同樣,環環相扣,想用if語句,就嵌套一個並列式的if,結果就是找不到else,轉而換爲一大長串的邏輯符,進行表述((s1.equals("stone")&&s2.equals("scissors")||(s1.equals("scissors")&&s2.equals("cloth"))||(s1.equals("cloth"))&&s2.equals("stone"))。結果覺得和PP5.1同樣,然而卻成功了。沒有邏輯錯誤。

  • 問題4:PP6.3和PP6.7
  • 問題4解決方案:兩個代碼的編寫,使PPP6.3的階梯式12×12的乘法表,弄成一行一個的乘法表,結果校對了好幾遍的代碼,最後發現是本身的print打成了println致使一行一個的問題。PP6.7的嘗試是本身陷入到無限循環裏面,每一次的java後就是滿屏的*,快絕望了。對照了幾遍本身的for語句,沒有問題,結果高手的幫助,發現本身的「}」加錯地方致使的。


代碼託管

上週考試錯題總結

  • 錯題1 The behavior of an object is defined by the object's(對象的行爲是由對象定義的。)methods(方法)
  • 錯誤解析: 方法指示對象在傳遞消息時如何反應。每一個消息都做爲一個方法實現,而方法是在傳遞消息時執行的代碼。構造函數是這些方法中的一種,可是全部的方法組合都決定了行爲。可見性修飾符會間接地影響對象的性能。錯誤的把構造方法定義對象的行爲,忽略了構造方法只不過是衆多方法中的一個。
  • 錯題2 In order to preserve encapsulation of an object, we would do all of the following except for which one?(爲了保存一個對象的封裝,除了哪個之外,咱們會作如下全部操做?)Make the class final
  • 錯誤解析:封裝意味着類包含操做數據所需的數據和方法。爲了正確地保存封裝,實例數據不該該從類外部直接訪問,因此實例數據是私有的,方法被定義爲訪問和操做實例數據。此外,訪問和操做實例數據的方法被公開,以便其餘類可使用該對象。保留字「final」用於控制繼承,與封裝無關。public變量是違反封裝性,final修飾符用於定義常量的。

    封裝這個解釋,能夠用CPU做爲例子:
    CPU把全部的電阻電容門電路等都封裝起來,只留出一些管腳(接口)讓用戶使用,CPU能暴露什麼,不能暴露什麼,是生產商設計決定的,用戶不能直接操做CPU的電阻電容等等,但能夠經過給管腳適當的電壓來控制電阻電容等,也就是說用戶不能直接訪問CPU的屬性,可是能夠經過方法修改CPU的屬性的值

  • 錯題3 If a method does not have a return statement, then(若是一個方法沒有返回語句,那麼)it must be a void method(它必定是一種無效的方法。)
  • 錯誤解析: 全部的方法都隱含返回某個東西,所以必須有一個返回語句。可是,若是程序員但願編寫一個不返回任何內容的方法,所以不須要返回語句,那麼它就必須是void方法(該方法的頭有「void」做爲返回類型).任何語句都要有返回值的,這個是我忽略了,沒有考慮到是無效的方法,自覺得是會有語法錯誤的。
  • 錯題4 Consider a sequence of method invocations as follows: main calls m1, m1 calls m2, m2 calls m3 and then m2 calls m4, m3 calls m5. If m4 has just terminated, what method will resume execution?(考慮一系列方法調用:主要調用m1, m1調用m2, m2調用m3,而後m2調用m4, m3調用m5。若是m4剛剛終止,什麼方法將繼續執行?)m2
  • 錯誤解析: 一旦方法終止,用調用該方法的方法控制簡歷。在這種狀況下,m2調用m4,所以當m4終止時,m2恢復。本道題理解,感受很蒙,徹底的一頭霧水。在看過答案後也不是很懂,隨着答案的解釋能夠理解,但徹底不知道緣由爲什麼。
  • 錯題5 Instance data for a Java class(Java類的實例數據。)may be primitive types or objects(多是原始類型或對象)
  • 錯題解析: 實例數據是組成類的實體,多是任何類型的實體,不管是原始的仍是對象的,而且多是公共的或私有的。經過使用對象做爲實例數據,它容許在其餘類上構建類。類具備其餘類的實例數據的關係稱爲has-a關係。就像RationalNumber類中的減法方法同樣。
  • 錯題6 Consider a Rational class designed to represent rational numbers as a pair of int's, along with methods reduce (to reduce the rational to simplest form), gcd (to find the greatest common divisor of two int's), as well as methods for addition, subtraction, multiplication, and division. Why should the reduce and gcd methods be declared to be private.(考慮一個Rational類,它的目的是將Rational的數字表示爲一對int,以及方法減小(將Rational簡化爲最簡單的形式),gcd(找到兩個整數的最大公約數),以及加法、減法、乘法和除法的方法。爲何要將reduce和gcd方法聲明爲私有的。)Because they will only be called from methods inside of Rational(由於它們只能從理性內部的方法中調用。)
  • 錯題解析: 全部被聲明爲私有的類的全部項只能訪問該類中的實體,無論它們是實例數據仍是方法。在這種狀況下,因爲這兩種方法只從Rational的其餘方法(包括構造函數)調用,所以它們被聲明爲私有,以提升信息隱藏的程度。注意,答案C不是一個正確的答案,由於reduce方法調用了gcd方法,因此其中一個方法是從構造函數之外的方法調用的。忽略了reduced方法是調用gcd方法的。
  • 錯題7 Java methods can return more than one item if they are modified with the reserved word continue, as in public continue int foo( ) { ... }
    (若是使用保留字進行修改,Java方法能夠返回多個項,如在public continue int foo(){…})false
  • 錯題解析: 全部的Java方法都返回一個單獨的項,無論它是一個原始數據類型的對象,仍是void。保留字continue用於退出循環的其他部分並再次測試該條件。作的時候很混亂,仔細想一想每個方法都只能返回單獨的項,書上的例子就是最好的證實,每用一個方法都只能改變一個變量什麼的。
  • 錯題8 A method defined in a class can access the class' instance data without needing to pass them as parameters or declare them as local variables.(在類中定義的方法能夠訪問類的實例數據,而無需將它們做爲參數傳遞或聲明爲局部變量。)true
  • 錯誤解析: 實例數據在全局上可用於全部類的方法,所以方法不須要做爲參數接收它們,或者在本地聲明它們。若是在方法中聲明瞭與實例數據相同名稱的變量,那麼該方法中的實例數據將被「隱藏」,由於引用將是本地變量。
  • 錯題9 During program development, software requirements specify(在程序開發期間,軟件需求指定)what the task is that the program must perform(該程序必須執行的任務是什麼?)
  • 錯誤解析: 規範階段是理解手頭的問題,這樣程序員就能夠肯定須要作什麼來解決問題。上面列出的其餘工做是設計階段(A程序如何完成任務?, C如何將任務劃分爲子任務?)和測試階段(D如何在程序完成後進行測試?)的一部分。個人想法是明確該程序是作什麼的,就錯誤的選擇A,是本身想表達的意思不夠準確,沒有準確理解題意。
  • 錯題10 Static methods cannot(靜態方法不能)reference non-static instance data(引用非靜態實例數據)
  • 錯誤解析: 靜態方法是類自己的一部分,而不是實例化的對象,所以靜態方法在類的全部實例化對象中共享。因爲靜態方法是共享的,所以不能訪問非靜態實例數據,由於全部非靜態實例數據都是特定於實例化對象的。靜態方法能夠訪問靜態實例數據,由於與方法同樣,實例數據在類的全部對象中共享。靜態方法也能夠訪問傳遞給它的參數。
  • 錯題11 Java does not support multiple inheritance, but some of the abilities of multiple inheritance are available by(Java不支持多重繼承,可是有一些多重繼承的能力。)implementing interfaces(實現接口)
  • 錯誤解析:因爲類能夠實現任意數量的接口,因此該類本質上是使用接口類,就像在這個類中定義了這些接口同樣。所以,這個類繼承了接口的方法和常量。此外,該類能夠擴展另外一個類,從而直接和間接地從多個類繼承。這與多重繼承不徹底相同,但它與Java的概念同樣接近。對於繼承的概念,沒有好好理解

    • 繼承是面嚮對象語言的一個重要機制,
      經過繼承能夠在一個通常類的基礎上創建新類,被繼承的類稱爲基類,
      在基類上創建的新類稱爲派生類。
      繼承和派生其實都是一回事,只是說法不一樣.
  • 錯題12 In which phase of program development would you expect the programmer(s) to create the pseudocode?(在程序開發的哪一個階段,您但願程序員(s)建立僞代碼?)Software design(軟件設計)
  • 錯誤解析:僞代碼是用相似英語的方式編寫的算法的描述,而不是用特定的編程語言編寫的。這是程序設計的一部分。在實現階段,程序員將僞代碼轉換爲正在使用的編程語言。一直錯誤的理解爲要在肯定軟件需求上進行寫僞代碼,實則要在軟件設計上進行。

    • 軟件需求用一個稱爲功能說明的文檔來描述。
  • 錯題13 Interface classes cannot be extended but classes that implement interfaces can be extended.(接口類不能被擴展,可是實現接口的類能夠被擴展。)false
  • 錯誤解析:任何類均可以擴展,不管是接口、實現接口,仍是二者都沒有。惟一的例外是,若是類被顯式地修改成「final」,在這種狀況下它不能被擴展。
  • 錯題14 All objects implement Comparable.(全部對象實現可比性。)false
  • 錯誤解析:可比較的是一個接口,該類必須定義compareTo方法,並顯式地聲明它實現可與之相比較的實現。大多數類都沒有實現可比較的。這道題糾正了我對比較的認識,一直覺得全部類,只要是相同的進行比較就能夠的錯誤觀念。

  • 本週的考試題數較多,並且本身期間還不當心把界面關了,致使本身作過的題又從從新作一遍,儘管這樣,仍是有不少是不會的,甚至是「無從下手」去點擊選項。感受本身對書本的內容已經有所瞭解,可是仍是本考試所戰勝。無奈

感悟

第五章和第六章的內容幾乎都要是邏輯思考,邏輯運算,靠着之前的直接在腦裏進行編譯的方式,已經不行了。寫一個代碼,開始動用筆寫寫草稿了,感受這種方法不錯,很適合對於這些剛開始感受蒙的項目。兩章的內容和第四章、第七章相比,相對輕鬆,可是感受時間較短,學起來有點吃不消,還要應對其餘事情。並且本週進行的5.7的編寫雖然有部分是借鑑的,可是感受本身和電腦進行人機對抗,(想設計一個bug可讓人一直贏的方式)玩了好幾把,幾乎是平局和機器贏,僅有少數幾局是人贏得,感受本身造出的東西快要戰勝我了,有點像*復仇者聯盟*裏的奧創,快要把鋼鐵俠打垮了同樣。哈哈,就像白巖鬆的一部書名《痛並快樂着》,最枯燥的字符之間,也會有最快樂的因子;最無趣的代碼面前,也會創造出鮮活的生命(就像那個石頭剪刀布同樣)。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 136/136 1/1 15/15
第二週 570/706 1/2 20/35
第三週 613/1319 1/3 23/58
第四周 1249/2568 1/5 30/88
第五週 904/3472 1/6 30/118

參考資料

相關文章
相關標籤/搜索