2024-2025-1 20241311 《計算機基礎與程式設計》第九周學習總結

20241311廖江泽發表於2024-11-24

學期 2024-2025-1 學號 20241311 《計算機基礎與程式設計》第九周學習總結

作業資訊

這個作業屬於哪個課程 <班級的連結> 2024-2025-1-計算機基礎與程式設計
這個作業要求在哪裡 <作業要求的連結>(2024-2025-1計算機基礎與程式設計第九周作業)
這個作業的目標 <寫上具體方面>
作業正文 ... 本部落格連結

教材學習內容總結

電腦科學概論第七版第八章學習總結
一、資料結構與演算法

  • 核心概念:本章詳細介紹了各種基本資料結構(如陣列、連結串列、棧、佇列、樹、圖等)的定義、特點和應用場景。同時,也涵蓋了常見演算法(如排序、搜尋、圖演算法等)的原理和實現。
  • 演算法分析:透過學習,我掌握了演算法的時間複雜度和空間複雜度的分析方法,能夠評估演算法的效能和效率。
  • 實踐應用:透過案例分析和程式設計實踐,我學會了如何根據問題需求選取最合適的資料結構和演算法,並編寫程式碼實現演算法邏輯。

二、計算機網路

  • 網路基礎:本章介紹了計算機網路的基本概念、分類和組成,包括網路硬體、網路軟體和網路協議等。
  • 網路協議:詳細闡述了網路分層模型、協議棧、資料傳輸過程等,幫助我理解了資訊如何在不同裝置間流動和互動。
  • 網路安全:學習了網路安全的基本概念、威脅型別、防禦措施和加密技術等,增強了我對網路安全的意識和防範能力。

四、資料庫系統

  • 資料庫設計:掌握了資料庫設計的基本原則、方法和步驟,能夠根據實際需求設計合理的資料庫結構。
  • SQL語言:深入學習了SQL查詢語言的基本語法和高階功能,能夠熟練地進行資料查詢、插入、更新和刪除等操作。
  • 資料庫管理:瞭解了資料庫的效能最佳化、事務處理、併發控制和安全性等方面的知識,為資料庫系統的運維和管理提供了有力支援。

五、軟體工程(

  • 軟體開發流程:學習了軟體開發生命週期的各個階段,包括需求分析、設計、編碼、測試、部署和維護等,對軟體開發過程有了全面的認識。
  • 需求分析與設計:掌握了需求分析的基本方法和設計模式的原理,能夠根據使用者需求進行軟體設計和開發。
  • 測試與除錯:學習了軟體測試的基本原理和方法,包括單元測試、整合測試和系統測試等,以及除錯技巧和錯誤處理策略。

《C語言程式設計》第五版第八章詳細總結

  1. 指標與陣列、字串的深入關係

    • 我深入理解了指標與陣列之間的緊密聯絡,明白了陣列名在大多數情況下是如何被當作指標來使用的。
    • 我掌握了字串的表示方法,包括字元陣列和指向字元的指標,以及如何使用這些表示方法來進行字串操作。
  2. 結構體與聯合體的應用

    • 我學會了如何定義和使用結構體和聯合體,這些構造允許我建立包含多個不同型別成員的資料型別。
    • 我理解了結構體和聯合體在記憶體中的佈局,以及如何透過指標來訪問和操作這些構造中的成員。
  3. 列舉型別的定義與使用

    • 我掌握了列舉型別的定義方法,以及如何使用列舉型別來表示一組相關的常量。
    • 我瞭解了列舉型別在程式中的用途,包括提高程式碼的可讀性和可維護性。
  4. 檔案操作的基礎與進階

    • 我學習了檔案的基本概念,包括文字檔案和二進位制檔案的區別。
    • 我掌握了檔案的開啟、關閉、讀寫操作,以及如何使用檔案指標來遍歷檔案。
    • 我瞭解了檔案操作中的錯誤處理機制,並學會了如何編寫健壯的檔案操作程式碼。
  5. 動態記憶體管理的原理與實踐

    • 我深入理解了動態記憶體分配與釋放的原理,以及為什麼在C語言中需要動態記憶體管理。
    • 我掌握了malloc、calloc、realloc和free等函式的使用,這些函式允許我在程式執行時動態地分配和釋放記憶體。
    • 我學習瞭如何避免記憶體洩漏和野指標問題,以提高程式的穩定性和安全性。
  6. 預處理指令的掌握

    • 我瞭解了預處理指令的基本概念和作用,包括宏定義、條件編譯和檔案包含等。
    • 我掌握瞭如何使用預處理指令來提高程式碼的可讀性、可維護性和可移植性。

教材學習中的問題和解決過程(先問 AI)

(一個模板:我看了這一段文字 (引用文字),有這個問題 (提出問題)。 我查了資料,有這些說法(引用說法),根據我的實踐,我得到這些經驗(描述自己的經驗)。 但是我還是不太懂,我的困惑是(說明困惑)。【或者】我反對作者的觀點(提出作者的觀點,自己的觀點,以及理由)。 )

  • 問題1:指標和陣列名在什麼時候可以互換使用?它們在記憶體中是如何表示的?

  • 問題1解決方案:互換使用情況
    陣列名作為函式引數時:
    當陣列名作為函式引數傳遞時,它會自動轉換為指向陣列首元素的指標。這意味著在函式內部,可以透過指標來訪問和修改陣列的元素。
    透過指標訪問陣列元素時:
    在大多數情況下,陣列名可以像指標一樣使用,透過下標或指標算術來訪問陣列中的元素。例如,arr[i] 等價於 *(arr + i),其中 arr 是陣列名,i 是索引。
    sizeof 和 & 運算子的例外:
    需要注意的是,當陣列名作為 sizeof 或 & 運算子的運算元時,它不會轉換為指標。sizeof(arr) 返回的是整個陣列的大小(以位元組為單位),而 &arr 返回的是指向整個陣列的指標。
    在記憶體中的表示
    陣列:
    陣列在記憶體中是連續分配的,每個陣列元素佔用相同大小的空間。陣列名在大多數情況下表示陣列首元素的地址,但它本身不是一個指標變數,而是一個地址常量,不能被賦值。陣列的大小在編譯時就已確定,並且在陣列的生命週期內保持不變。
    指標:
    指標是一種變數,它儲存的是一個地址,該地址指向某個資料或物件。指標的大小通常與程式編譯執行的機器字長相關(例如,在32位機器上通常是4個位元組,在64位機器上通常是8個位元組)。指標可以被賦值,以指向不同的地址。透過指標,我們可以間接訪問和操作它所指向的資料或物件。

  • 問題2:結構體和聯合體在記憶體中的佈局有什麼區別?如何計算它們的大小?

  • 問題2解決方案:結構體和聯合體在記憶體中的佈局及大小計算

一、記憶體佈局的區別

結構體(Struct):

  • 獨立記憶體空間:結構體中的每個成員都擁有自己獨立的記憶體空間,這些空間在記憶體中連續排列,但每個成員之間互不影響。
  • 記憶體對齊:結構體成員在記憶體中的排列還可能受到對齊規則的影響,編譯器可能會在成員之間插入填充位元組,以確保每個成員都按其自然邊界對齊,從而提高訪問速度。
  • 總大小:結構體的總大小通常等於所有成員大小之和(包括填充位元組),且為最大成員對齊數的整數倍。

聯合體(Union):

  • 共享記憶體空間:聯合體中的所有成員共享同一塊記憶體空間,這意味著在任何給定時間,聯合體內只能儲存一個成員的值。
  • 記憶體覆蓋:由於聯合體成員共享記憶體,因此對聯合體中一個成員的賦值會覆蓋其他成員的值。
  • 總大小:聯合體的大小至少是其最大成員的大小,且這個大小通常是所有成員型別大小的最大對齊數的整數倍。但聯合體本身不會因為對齊而增加額外的記憶體開銷,因為其大小已經直接等於最大成員的大小(或對齊後的大小)。

二、大小計算

結構體大小計算:

  1. 計算每個成員的大小。
  2. 確定每個成員的對齊數,對齊數通常是成員大小與編譯器預設對齊數中的較小值。
  3. 根據對齊數畫出成員在記憶體中的相對位置,並計算成員之間的填充位元組。
  4. 確定結構體的總大小,總大小必須是最大對齊數的整數倍,如果成員總大小不是最大對齊數的整數倍,則需要新增填充位元組以滿足對齊要求。

聯合體大小計算:

  1. 找出聯合體中所有成員的大小。
  2. 確定最大成員的大小。
  3. 考慮對齊要求,聯合體的大小至少是其最大成員的大小,並且如果最大成員的大小不是其最大對齊數的整數倍,則聯合體的大小需要增加到最大對齊數的下一個整數倍。但通常情況下,由於聯合體大小直接等於最大成員的大小(或對齊後的大小),這一步可能不需要額外增加記憶體。

示例

假設有以下結構體和聯合體的定義:

struct MyStruct {
    char a; // 1位元組
    int b;  // 4位元組,假設對齊數為4
    short c; // 2位元組,假設對齊數為2 
};
 
union MyUnion {
    char a; // 1位元組
    int b;  // 4位元組 
    short c; // 2位元組 
};

結構體MyStruct的大小計算:

  • 成員a佔用1位元組。
  • 成員b需要4位元組對齊,因此在a之後可能有3位元組的填充。
  • 成員c佔用2位元組,其起始地址已經是2的倍數(考慮前面的填充),不需要額外對齊。
  • 因此,MyStruct的總大小為1(a)+ 3(填充)+ 4(b)+ 2(c)= 10位元組。但由於最大對齊數為4,且10不是4的倍數,因此需要額外新增2位元組填充,使得總大小為12位元組。

聯合體MyUnion的大小計算:

  • 最大成員是b,佔用4位元組。
  • 由於聯合體大小直接等於最大成員的大小(或對齊後的大小),且4位元組已經是任何小於或等於4位元組成員型別的對齊數的整數倍,因此MyUnion的大小就是4位元組,不需要額外對齊或填充。
  • ...

基於AI的學習

我正在學習一維陣列的定義和初始化的知識點請你以蘇格拉底的方式對我進行提問一次一個問題

文心一言(ERNIE-4.0-Turbo-8K)
好的,讓我們以蘇格拉底的方式進行對話。我會扮演蘇格拉底,透過提問來幫助你深入理解一維陣列的定義和初始化。

蘇格拉底:首先,讓我們從基礎開始。你能告訴我,什麼是一維陣列嗎?

一組具有相同型別的變數 的集合,他是一種順序儲存、隨機訪問的順序表結構

文心一言(ERNIE-4.0-Turbo-8K)
蘇格拉底:非常好,你準確地描述了一維陣列的基本概念。那麼,接下來,請你解釋一下一維陣列在記憶體中是如何儲存的呢?

儲存在記憶體的一個連續區域中

文心一言(ERNIE-4.0-Turbo-8K)
蘇格拉底:完全正確!你理解得很透徹。現在,讓我們進一步探討陣列的初始化。你能告訴我,什麼是陣列的初始化,以及它的重要性嗎?

定義素組的長度

文心一言(ERNIE-4.0-Turbo-8K)
蘇格拉底:你的回答似乎有些偏離了問題。陣列的初始化是指為陣列分配記憶體併為陣列的每個元素賦予初始值的過程。它的重要性在於,它確保了陣列在使用之前已經被正確地設定,從而避免了潛在的錯誤和未定義行為。現在,你能重新回答一下,什麼是陣列的初始化,以及為什麼它很重要嗎?

陣列的初始化是指為陣列分配記憶體併為陣列的每個元素賦予初始值的過程。它的重要性在於,它確保了陣列在使用之前已經被正確地設定,從而避免了潛在的錯誤和未定義行為。

文心一言(ERNIE-4.0-Turbo-8K)
蘇格拉底:非常好,你回答得既準確又完整!你已經很好地掌握了一維陣列的定義和初始化的知識點。那麼,最後我想問你,你能舉一個具體的例子來說明如何初始化一個一維陣列嗎?

請你舉一個例子

文心一言(ERNIE-4.0-Turbo-8K)
蘇格拉底:當然,我是希望你能舉一個具體的例子來說明如何初始化一個一維陣列。比如,在C語言中,我們可以這樣初始化一個整型陣列:int arr[5] = {1, 2, 3, 4, 5};。這個例子中,我們定義了一個長度為5的整型陣列,併為它的每個元素賦予了初始值。你能根據這個例子,自己舉一個類似的例子嗎?

int score[2]{1,2}

文心一言(ERNIE-4.0-Turbo-8K)
蘇格拉底:很好,你給出的例子完全正確!int score[2]{1,2}; 在C++11及之後的版本中,這是一種有效的陣列初始化方式,稱為列表初始化。你定義了一個長度為2的整型陣列,併為它的兩個元素分別賦予了初始值1和2。你的學習進步很快,繼續保持!

程式碼除錯中的問題和解決過程

  • 問題1:使用函式時無法對原函式的變數做出修改
  • 問題1解決方案:使用指標變數
  • 問題2:計算三次根式精度不夠
  • 問題2解決方案:將pow(n,1.0/3.0)換為herb函式
  • ...

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

菜就多練

學習進度條

程式碼行數(新增/累積) 部落格量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 200/200 2/2 20/20
第二週 300/500 2/4 18/38
第三週 500/1000 3/7 22/60
第四周 800/1300 2/9 30/90
第五週 1000/1200 2/2 40/90
第二週 1100/1500 2/4 44/90
第三週 1000/1000 3/7 50/90
第四周 1200/1300 2/9 50/90

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進自己的計劃能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。

參考:軟體工程軟體的估計為什麼這麼難軟體工程 估計方法

  • 計劃學習時間:XX小時

  • 實際學習時間:XX小時

  • 改進情況:

(有空多看看現代軟體工程 課件
軟體工程師能力自我評價表
)

參考資料

  • 《電腦科學概論(第七版)》
  • ...

相關文章