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

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

教材學習內容總結

本週內容主要爲書的13.1-13.5的內容:

  • 第十三章

    • 1.集合的同構和異構,集合同構意味着保存類型所有相同,集合異構意味着保存各類類型的對象。php

    • 2.動態數據結構和靜態數據結構。html

      • 靜態數據結構,例如數組在內存中是連續的存儲區域,缺點是長度是固定的,新增或刪除某一數據花費的時間比較多。優勢能夠直接訪問各個數據,各個數據的地址均可以根據首地址獲得,訪問時間複雜度O(1)。
      • 動態數據結構,例如鏈表在內存中不是連續的存儲區域,每個節點包含節點數據和下一個節點的指針。缺點是不利於節點的隨機訪問。訪問節點花費時間比較多,爲O(n)。優勢是可以動態的調整容量,插入或者刪除數據方便。
      • 靜態數據結構的特色是由系統分配固定大小的存儲空間,之後在程序運行的過程當中,存儲空間的位置和容量都不會再改變。動態數據結構不肯定總的數據存儲量,而是爲現有的每個數據元素定義一個肯定的初始大小的空間,若干個數據元素分配若干個一樣大小的空間;當問題的數據量發生變化時,數據的存儲空間的大小也發生變化。
    • 3.線性數據結構和非線性數據結構。線性數據結構包括隊列和堆棧,非線性數據結構包括樹和圖。node

      • 隊列是一種以先進先出的方式管理數據的線性數據結構
      • 堆棧是一種以後進後出的方式管理數據的線性數據結構
      • 樹是一種以層次結構組織數據的非線性數據結構
      • 圖是非線性數據結構,使用常見的邊來鏈接節點
    • 4.Java集合類API。集合類存放的都是對象的引用,而非對象自己,出於表達上的便利,咱們稱集合中的對象就是指集合中對象的引用(reference)。git

      • 集合類型主要有3種:set(集)、list(列表)和map(映射)。
    • 5.泛型,泛型對象是一種集合類對象,實現泛型對象是爲了使其管理的對象的類型在某個集合類創建時也被建立,這樣就容許編譯時能控制一些加入到該集合中的對象的類型,減少這些對象從該集合清除時的類型轉換處理。程序員

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

  • 問題1:隊列、鏈表和堆棧三者的問題
  • 問題1解決方案:隊列和堆棧是兩個相似鏈表的線性數據結構,但在使用時有更多的限制。對於通常的鏈表,能夠經過鏈表的任意位置插入和刪除節點進行修改,可是隊列只能在一端加入節點(入隊)(入棧),在另外一端一處節點(出隊)(出棧),所以隊列是先進先出(FIFO)數據結構,堆棧是後進先出(LIFO)數據結構。web

  • 問題2:線性結構非線性結構
  • 問題2的解決方案:線性結構是n個數據元素的有限序列。非線性結構是一個結點元素可能有多個直接前趨和多個直接後繼。算法

    線性結構指的是數據元素之間存在着「一對一」的線性關係的數據結構;編程

    經常使用的線性結構有:線性表,棧,隊列,雙隊列,數組,串;數組

    非線性數據結構有:集合結構(沒有對應關係)、樹結構(一對多)、圖結構或網結構(多對多)數據結構

  • 問題3:數據結構
  • 問題3的解決方案:數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。一般狀況下,精心選擇的數據結構能夠帶來更高的運行或者存儲效率。數據結構每每同高效的檢索算法和索引技術有關。數據結構是指同一數據元素類中各數據元素之間存在的關係。數據結構分別爲邏輯結構、存儲結構(物理結構)和數據的運算。

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

  • 問題1:PP13.1和課堂實驗對鏈表的刪除和添加
  • 問題1解決方案:剛學完鏈表的問題就在代碼上進行實驗,更具很蒙,就開始仿着在鏈表尾部進行添加的方法進行。
    ```
    public void add(Magazine mag)
    {
    MagazineNode node = new MagazineNode(mag);
    MagazineNode current;

    if (list == null)
          list = node;
      else
      {
          current = list;
          while (current.next != null)
              current = current.next;
              current.next = node;
      }

    }
    針對刪除的方法,經過對鏈表的每個節點進行內容的比對,不是就往下進行持續到尾部。可是個人這個刪除有個缺陷,就是若是有刪除的內容在鏈表中沒有的話,沒有報錯的語句,不知道在哪裏進行添加的。
    public void delete(Magazine Node)
    {
    MagazineNode current1 = list;

    if(String.valueOf(current1.magazine).equals(String.valueOf(Node)))
      {
          list = current1.next;
      }
      else {
          while (!(String.valueOf(current1.next.magazine).equals(String.valueOf(Node))))
          {
              current1 = current1.next;
          }
          current1.next = current1.next.next;
      }

    }
    添加的方法寫的相對比較完善,針對要添加的位置超出了整個鏈表的長度的話,會報出提醒的。正常的操做就是設置兩個節點,而後在正確的位置進行加入新內容,而後把新內容的指針指向加入位置的後面鏈表,再在斷開的位置進行指向新內容的地方。
    ppublic void insert(int index, Magazine newMagazine)
    {
    MagazineNode node = new MagazineNode(newMagazine);
    MagazineNode current1, current2;

    int n = Int(list);
      if(index <=  n + 1)
      {
          if(index == 1)
          {
              node.next = list;
              list = node;
          }
          else
          {
              current2 = list;
              current1 = list.next;
              for(int a = 1; a < index - 1; a++)
              {
                  current2 = current2.next;
                  current1 = current1.next;
              }
              if(current1 != null)
              {
                  node.next = current1;
                  current2.next = node;
              }
              else if(current1 == null)
              {
                  current2.next = node;
              }
          }
      }
      else
          System.out.println("插入節點有問題!!!未進行添加!!!");

    }
    ```
    在這個方法裏面用到了一個小方法,對鏈表的擦汗年高度進行判斷,若是超了就會報錯。PP13.1的改寫則是徹底抄的課堂實踐進行的,很簡單,徹底的模仿(可能把以前的難關解決了就簡單了)

  • 問題2:PP13.3鏈表版的選擇排序法
  • 問題2解決方案:剛開始在這個問題上讀題就產生了誤區,整型數的鏈表就全是數麼?可是這樣的話,這個排序和以前的第十章的Sorting又有何區別呢?仿着那個Magazine進行編寫,在作的過程當中發現能夠對裏面的數進行比較,就仿着作一個Number類,存放數字進行比較。而後就是排完以後從新串成鏈表。因爲裏面的數是以字符串的形式保存的,還要轉爲數字進行比較。Integer.parseInt(String.valueOf(min.number)) > Integer.parseInt(String.valueOf(current.number))即進行兩個數的比較。相似「三行的原則」把大小進行一個排序,可是是要接着後鏈表後面的東西進行。
    temp = min.number; min.number = numNode.number; numNode.number = temp;
    • 運行效果

代碼託管

上週考試錯題總結

  • 錯題1:System.err is a(n)
    • A.input stream
    • B.GUI dialog box that indicates when an error has arisen
    • C.object
    • D.Error subclass
    • E.RuntimeException subclass
  • 錯誤解析:在Java中有三個默認的流,System.in, System.out, and System.err.全部這些都是系統的對象。

  • 錯題2:PrintWriter is a better output stream class that PrintStream because PrintWriter
    • A.has both print and println methods and PrintStream only has print
    • B.can output both byte and character streams and PrintStream can only output byte streams
    • C.has error checking mechanisms as part of the class and PrintStream does not
    • D.will not throw checked exceptions and PrintStream will
    • E.all of the above
  • 錯誤解析:PrintWriter類是一個Writer類,而PrintStream類是一個流類。主要的區別是PrintWriter是專門爲文件而設計的,所以有錯誤檢查機制,而不是PrintStream的一部分。以前在學習IO流的時候沒有關注不少,致使的錯誤產生。

  • 錯誤3:All run-time Errors throw Exceptions.
    • A.true
    • B.false
  • 錯誤解析:Java將任何可拋出的對象分類爲錯誤或異常,所以沒有運行時錯誤拋出異常。運行時錯誤致使程序終止。能夠處理異常,以便程序繼續執行(但只有在正確處理異常時)。

  • 錯誤4:A try statement must have at least one catch statement, but could have many catch statements, and may or may not have a finally clause.
    • A.true
    • B.false
  • 錯誤解析:全部的try語句必須至少有一個catch語句,不然沒有理由有try語句。對於可能拋出的每種類型的異常,均可以有一個catch語句。程序員能夠指定儘量多的catch語句。此外,try語句可能有一個finally子句,但不須要。

  • 錯誤5:In order to define a keyboard input object, keyboard, you could use the instruction:
    BufferedReader keyboard = new BufferedReader(System.in);
    • A.true
    • B.false
  • 錯誤解析:一個BufferedReader對象必須用Reader對象構建系統。System.in是一個輸入流對象。爲了使用上述定義,必須將BufferedReader構造函數中的對象更改成(new InputStreamReader(System.in))。一份正確聲明爲:BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));

  • 錯誤6:The following defines a new Exception called AnewException.
public Exception ANewException 
{
  public ANewException(String message)
  {
    super(message);
  }
}
- <span style="color:green">A.true
- <span style="color:red">**B.false**
  • 錯誤解析:定義幾乎是正確的,可是它必須定義一個類,而不是一個異常。異常是一個類,而ANewException應該擴展異常。類定義的標頭應該是public類的,ANewException擴展異常。

  • 第十一章和第十二章的內容主要以異常和遞歸爲主,二者相比自我感受比較難的是異常的部分,並且尚未來得及好好看就開始考試了,好在時間無限,能夠慢慢的答題,否則怕是要真的涼了。錯的這幾道題都是有關第十一章的內容,看來本身更應該側重及複習第十一章的異常內容。此外,在第十二章中的遞歸問題多是在理論上沒有太多的內容,而徹底在實踐編程項目上,纔會沒有過多的考題,以爲這部分徹底須要一個腦洞大開的思惟,因此,這部分比異常更難攻克,更應該花時間去理解漢諾塔的問題...

結對與互評

點評(方藝雯)

  • 博客中值得學習的或問題:
    • 知識點記錄的很詳細,還有配圖,圖片都很恰到好處。
    • 沒有什麼問題,很完美的博客。
  • 代碼中值得學習的或問題:
    • 問題分析的很細緻,很完美。
  • 基於評分標準,我給本博客打分:11分。
    • 得分狀況以下: - 正確使用Markdown語法(加1分)
    • 模板中的要素齊全(加1分)
    • 教材學習中的問題和解決過程, 三個問題加3分
    • 代碼調試中的問題和解決過程, 二個問題加2分
    • 感想,體會不假大空的加1分
    • 點評認真,能指出博客和代碼中的問題的加1分
    • 代碼規範加1分
    • 有動手寫新代碼的加1分

點評(王禹涵)

  • 博客中值得學習的或問題:
    • 圖片不少,很清晰的解釋了問題和相關內容
    • 版面較上次有很大的改變!
  • 代碼中值得學習的或問題:
    • 代碼的問題,沒什麼問題,但願繼續保持就行。
  • 基於評分標準,我給本博客打分:11分。
  • 得分狀況以下:
    • 正確使用Markdown語法(加1分)
    • 模板中的要素齊全(加1分)
    • 教材學習中的問題和解決過程, 三個問題加3分
    • 代碼調試中的問題和解決過程, 二個問題加2分
    • 感想,體會不假大空的加1分
    • 點評認真,能指出博客和代碼中的問題的加1分
    • 代碼規範加1分
    • 有動手寫新代碼的加1分

互評對象

  • 本週結對學習狀況
    20172304方藝雯
    20172323王禹涵

  • 結對學習內容:第十三章
    • 1.集合的同構和異構

    • 2.動態數據結構和靜態數據結構

    • 3.線性數據結構和非線性數據結構

    • 4.Java集合類API

感悟

本週感受好忙,要對四則運算的內容進行後期處理,還要學習第十三章,還要學習四個實驗。對於十三章的內容,本覺得不多,可是在編程鏈的時候遇到了很大很大的困難,書上代碼看不懂,很蒙的作這課堂做業,好在思路清晰,寫的代碼也一次就成。可是對於next的節點問題仍是不夠透徹,應該在課下好好學習。其次,對於四則運算的代碼,可以很完整輸出計算,就像老師說的那樣看到小組成功的結果,感受頗有自豪感。可是在加分項目上作的仍是不夠好,對於去重的問題一直沒有思路就放棄了,並且想過用倒計時的問題,想去嘗試,但始終沒有成果,沒有應用到四則運算上,仍是有不少的遺憾...

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 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
第六週 540/4012 1/7 30/118
第七週 826/4838 1/7 30/178
第八週 925/5763 2/9 45/223
第九周 253/6016 2/10 55/278
第十週 958/6974 1/11 55/333

參考資料

相關文章
相關標籤/搜索