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

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

學期(2024-2025-1) 學號(20241311) 《計算機基礎與程式設計》第六週學習總結

作業資訊

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

教材學習內容總結

以下是《C語言程式設計》第五版第五章的學習總結:

一、演算法相關

  • 演算法的概念與特性
    • 演算法具有明確性,即每個步驟都清晰、無歧義;有限性,在有限步驟內結束並給出結果;有輸入(演算法開始所需的初始資料或條件)和輸出(演算法執行完畢後的結果)等特點。
    • 演算法的描述方式有多種,自然語言是用普通語言描述演算法的每一步驟;流程圖透過圖形化方式表示演算法的步驟和流程;虛擬碼是介於自然語言和程式語言之間的描述方式,易於理解且便於程式設計實現;程式語言則是直接用程式語言實現演算法以便計算機執行。
  • 關係運算子與關係表示式
    • 關係運算子(比較運算子):關係表示式是用關係運算子把兩個表示式聯絡起來的式子。關係表示式成立其值為真(用1代表),否則為假(用0代表)。例如“n%2!=0”可表示n為奇數。

二、條件語句相關

  • 單分支控制的條件語句
    • 單分支選擇結構常用於比較大小類程式。例如透過判斷“if(a > b)”來確定最大值,如程式碼示例:
#include <stdio.h>
int main(void) {
    int a, b, max;
    printf("Input a, b:");
    scanf("%d, %d", &a, &b);
    if (a > b)
        max = a;
    if (a = b)
        max = b;
    printf("max=%d\n", max);
    return 0;
}
  • 當問題所需考慮的方面不止一種簡單情況時,單分支結構可能不適用。
  • 雙分支控制的條件語句
    • 雙分支結構使用“if - else”語句。例如:
#include <stdio.h>
int main(void) {
    int a, b, max;
    printf("Input a, b:");
    scanf("%d, %d", &a, &b);
    if (a > b)
        max = a;
    else
        max = b;
    printf("max=%d\n", max);
    return 0;
}
  • 多分支控制的條件語句
    • 這種語句允許根據多個條件判斷執行不同的程式碼塊。在這中間會涉及到條件運算子(C語言唯一的三元運算子),例如“表示式1?表示式2:表示式3”,可用於求取兩數的最大值等操作。

透過第五章的學習,對C語言中的演算法描述、關係運算以及不同分支結構的條件語句有了更深入的理解,這些內容是編寫複雜邏輯程式的重要基礎。
電腦科學概論第七版第五章學習總結
作業系統基礎

  1. 作業系統的角色
    系統軟體與應用軟體:系統軟體如作業系統,直接與硬體互動,管理計算機資源;應用軟體解決具體問題,執行於作業系統之上。
    作業系統(Operating System, OS):最基本的系統軟體,管理計算機資源併為使用者和其他軟體提供互動介面。
  2. 資源管理
    記憶體管理:涉及多道程式設計、記憶體分配與回收、地址轉換等。
    程序管理:包括程序建立、執行、同步、通訊和排程。
    CPU排程:決定哪個程序可以訪問CPU以便執行。
  3. 批處理與分時系統
    批處理系統:無使用者互動,作業成批處理。
    分時系統:多使用者同時使用計算機,系統快速在使用者作業間切換。
    資料結構基礎
  4. 資料結構的重要性
    資料組織方式:影響演算法效率,合理的資料結構選擇可以提高效能。
  5. 線性與非線性資料結構
    線性資料結構:如陣列、連結串列,資料元素之間存在一對一關係。
    非線性資料結構:如樹、圖,資料元素之間存在一對多或多對多關係。
  6. 常見資料結構
    陣列:連續儲存的相同型別資料元素集合。
    連結串列:由節點組成的資料結構,節點包含資料和指向下一個節點的指標。
    棧和佇列:先進後出和先進先出的資料結構。
    樹和圖:層次和網路結構的資料組織方式。
    程式語言基礎
  7. 程式語言的發展
    低階語言到高階語言:從機器語言到C、Java等高階語言的發展。
  8. 程式設計正規化
    程序導向、物件導向、函數語言程式設計:不同的程式設計正規化適用於不同的問題解決和程式設計。

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

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

  • 問題1:如何使用前處理器建立條件編譯程式碼?
  • 問題1解決方案:在C語言中,前處理器提供了一系列的指令,允許在編譯之前對程式碼進行處理,其中包括條件編譯。條件編譯可以讓開發者根據不同的條件包含或排除程式碼塊,這在處理不同平臺相容性或功能開關時非常有用。以下是如何使用前處理器建立條件編譯程式碼的基本方法:
  1. #ifdef#ifndef 指令
  • #ifdef 識別符號:如果宏(識別符號)已經定義,則編譯下面的程式碼塊。
  • #ifndef 識別符號:如果宏(識別符號)沒有定義,則編譯下面的程式碼塊。
#ifdef DEBUG 
    printf("Debug information: variable x = %d\n", x);
#endif 
 
#ifndef RELEASE 
    printf("Release mode is not active.\n");
#endif 
  1. #if#endif 指令
  • #if 條件:如果條件為真(非零),則編譯下面的程式碼塊。
  • #elif:類似於C語言中的else if,用於多個條件的判斷。
  • #else:如果前面的#if#elif條件都不滿足,則編譯#else下的程式碼塊。
#if defined(UNIX)
    // UNIX-specific code here 
#elif defined(WINDOWS)
    // Windows-specific code here 
#else 
    #error "Unknown operating system"
#endif 
  1. #define 指令
  • #define 識別符號:定義一個宏(識別符號),在預處理階段,前處理器會將程式碼中所有出現的該識別符號替換為特定的值或程式碼。
#define USE_FEATURE_X 
 
#if defined(USE_FEATURE_X)
    // Code that uses feature X 
#endif 
  1. #undef 指令
  • #undef 識別符號:取消定義一個宏(識別符號)。
#define DEBUG 
 
#ifdef DEBUG 
    // Debug-specific code 
#endif 
 
#undef DEBUG 
 
#ifndef DEBUG 
    // Code that does not use debug features 
#endif 
  1. #pragma 指令
  • #pragma 是一種特定於編譯器的預處理指令,可以用來實現編譯器特定的條件編譯。
#pragma once  // Prevents multiple inclusions of the same header file 
 
#ifdef _MSC_VER  // Microsoft Visual C Compiler 
    // Microsoft-specific code 
#elif defined(__GNUC__)  // GNU Compiler Collection 
    // GCC-specific code 
#endif 

使用這些前處理器指令,你可以建立靈活的條件編譯程式碼,以適應不同的編譯環境和需求。

  • 問題2:結構體和聯合(Union)有什麼區別?
  • 問題2解決方案:結構體(struct)和聯合(union)在C語言中都是複合資料型別,它們用於將多個不同型別的資料項組合成一個單一的型別。儘管它們有相似之處,但它們之間存在一些關鍵的區別:

結構體(struct)

  1. 記憶體分配:結構體為每個成員分配獨立的記憶體空間。結構體的總大小是所有成員大小的總和,同時還要滿足對齊要求。
  2. 成員訪問:結構體的所有成員可以同時存在,並且可以被同時訪問。
  3. 記憶體效率:由於每個成員都有其自己的記憶體空間,結構體可能不如聯合那樣節省空間。
  4. 使用場景:結構體適用於需要儲存多個不同型別資料項的情況,且這些資料項需要同時被訪問。

聯合(Union)

  1. 記憶體分配:聯合的所有成員共享同一塊記憶體空間。無論聯合有多少個成員,只分配足夠的記憶體來存放最大的那個成員。
  2. 成員訪問:在任何時候,聯合只能儲存一個成員的值。對一個成員的訪問會覆蓋其他成員的值。
  3. 記憶體效率:由於所有成員共享記憶體空間,聯合在空間利用上比結構體更高效,特別是在只需要訪問一個成員時。
  4. 使用場景:聯合適用於當多個資料項不需要同時被訪問,且只關心其中一個資料項的大小時。

總結

  • 佔用空間:結構體為每個成員分配空間,而聯合只分配足夠的空間給最大的成員。
  • 資料永續性:結構體的所有成員值都可以持久儲存,而聯合的成員值在新的賦值後會被覆蓋。
  • 訪問限制:結構體可以同時訪問所有成員,聯合在任何時刻只能訪問一個成員。

選擇使用結構體還是聯合取決於具體的應用需求。如果需要儲存多個資料項並且它們都需要被獨立訪問,結構體是更好的選擇。如果只需要在任何時刻儲存一個資料項,並且想要節省空間,則聯合是更合適的選擇。

  • ...

基於AI的學習

我正在學習用於單分支控制的知識點請你以蘇格拉底的方式對我進行提問,一次一個問題

Kimi(moonshot-v1-128k)
當然可以,讓我們以蘇格拉底式的提問法來探討單分支控制的知識點。

問題1:你能告訴我什麼是單分支控制結構嗎?

表示當條件p成立時,執行A操作,否則執行b操作;如果b操作為空則不執行

Kimi(moonshot-v1-128k)
問題2: 那麼,你能否描述一下,在程式設計中我們如何表達這種“當條件P成立時執行A操作”的邏輯?

if(表示式p)語句a

Kimi(moonshot-v1-128k)
問題3: 很好,你已經描述了條件成立時執行的操作。那麼,如果條件P不成立時,我們通常希望程式做些什麼呢?

不執行任何操作直接執行後面的語句

Kimi(moonshot-v1-128k)
問題4: 我明白了,如果條件P不成立,程式將不執行任何操作並繼續執行後續的語句。那麼,你能描述一下在這種情況下,程式的控制流程是如何變化的嗎?

跳過該語句執行下一步

Kimi(moonshot-v1-128k)
問題5: 你提到了“跳過該語句執行下一步”,這是否意味著在單分支控制結構中,如果條件不滿足,程式會忽略掉if語句塊中的程式碼,直接執行if語句塊之後的程式碼?

Kimi(moonshot-v1-128k)
問題6: 既然如此,你能給我一個簡單的例子來說明這種單分支控制結構是如何在實際程式碼中工作的嗎?

if(a>b)max=a;該語句中如果滿足a>b則將a的值賦值

Kimi(moonshot-v1-128k)
問題7: 非常好,你提供了一個實際的例子。那麼,如果a不大於b,根據你的程式碼,會發生什麼呢?max會被賦什麼值?

無如何值

Kimi(moonshot-v1-128k)
問題8: 既然當a不大於b時,max不會被賦予任何值,那麼在這種情況下,我們如何確保max總是被賦予一個確定的值,無論a和b的關係如何?

再加一個語句

Kimi(moonshot-v1-128k)
問題9: 我明白了,你提到了“再加一個語句”。那麼,這個額外的語句應該放在if語句的哪裡,以確保無論a和b的關係如何,max都能被正確賦值?

後面

Kimi(moonshot-v1-128k)
問題10: 那麼,你能否具體說明這個額外的語句應該是什麼,以及它如何確保max在任何情況下都被賦值?

一個新的if語句

Kimi(moonshot-v1-128k)
問題11: 很好,你提到了使用一個新的if語句。那麼,這個新的if語句應該如何編寫,以確保當a不大於b時,max也能被正確賦值?

if(a<=b)max=b

Kimi(moonshot-v1-128k)
問題12: 現在我們有兩個if語句,一個處理a > b的情況,另一個處理a <= b的情況。那麼,這樣設計的目的是什麼?我們為什麼不能只用一個if語句來實現同樣的功能?

為了使全部情況max都有確定的值;一個語句只能表示單分支

Kimi(moonshot-v1-128k)
問題13: 你正確地指出了一個if語句只能處理單分支的情況,並且透過兩個if語句確保了max在所有情況下都有確定的值。那麼,如果我們想要更簡潔地處理這種情況,有沒有其他控制結構可以只用一個條件判斷來實現同樣的功能?

雙分支語句if else

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

  • 問題1:使用scanf函式時報錯
  • 問題1解決方案:未使用取地址符&
  • 問題2:函式冗餘,重複程式碼多
  • 問題2解決方案:修改多分支語句的表達,精簡語句
  • ...

程式碼託管

(statistics.sh指令碼的執行結果截圖)

上週考試錯題總結

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

菜就多練

學習進度條

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

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

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

  • 計劃學習時間:XX小時

  • 實際學習時間:XX小時

  • 改進情況:

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

參考資料

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

相關文章