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

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM