這個作業屬於哪個課程 | [2024-2025-1計算機基礎與程式設計](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP) |
---|---|
這個作業要求在哪裡 | 2024-2025-1計算機基礎與程式設計第六週作業 |
這個作業的目標 | 學習Polya如何解決問題,簡單型別與組合型別,複合資料結構,查詢與排序演算法,演算法複雜度,遞迴,程式碼安全 |
作業正文 | https://www.cnblogs.com/wangyihan604505/p/18523157 |
教材學習內容總結
《電腦科學概論》第七版第七章主要圍繞問題求解與演算法設計展開,以下是該章節的學習內容總結:
- 問題求解過程:介紹了George Pólya的問題求解方法,並將其應用於計算機問題求解。強調了分析問題、列出主要任務、編寫演算法以及重組和改寫的重要性。
- 資料結構與型別:區分了簡單型別(如整數、浮點數)和複合型別(如陣列、結構體)。介紹了複合資料結構機制,如陣列、連結串列、棧和佇列等。
- 遞迴演算法:解釋了遞迴演算法的概念,即一個演算法直接或間接地呼叫自身,並提供了遞迴演算法的例子,如計算階乘、斐波那契數列等。
- 排序演算法:介紹了常見的排序演算法,包括選擇排序、插入排序、氣泡排序和快速排序,並分析了每種排序演算法的時間複雜度和空間複雜度。
- 檢索演算法:介紹了線性檢索和二分檢索兩種基本的檢索演算法,並強調了二分檢索在有序陣列中的高效性。
- 演算法設計原則:強調了資訊隱蔽、抽象和模組化在演算法設計中的重要性,並介紹了良好的命名規範和註釋習慣對於提高演算法可讀性和可維護性的幫助。
- 測試與除錯:介紹了白盒測試和黑盒測試兩種測試方法,並強調了測試在演算法設計和實現過程中的重要性,以及除錯技巧和方法。
透過這些內容,我們更好地理解了如何有效地解決問題,設計和實現演算法,並確保演算法的正確性和效率。
《C語言程式設計》第五版第五章的學習內容總結如下: - 演算法的概念及其描述方法:
- 演算法:演算法是解決特定問題的明確、有限的步驟序列。它具有輸入、輸出、明確性、有限性、可行性等特點。
- 描述方法:演算法可以透過多種方式描述,包括自然語言、流程圖、虛擬碼和程式語言。每種方法都有其優勢,自然語言易於理解,流程圖直觀,虛擬碼介於自然語言和程式語言之間,而程式語言則可以直接實現。
- 關係運算子與關係表示式:
- 關係運算子:用於比較兩個值之間的關係,常見的關係運算子包括
==
(等於)、!=
(不等於)、>
(大於)、<
(小於)、>=
(大於等於)、<=
(小於等於)。 - 關係表示式:由關係運算子連線的表示式,用於產生布林值(真或假)。例如,
a > b
是一個關係表示式,如果a
的值大於b
的值,則表示式為真。
- 關係運算子:用於比較兩個值之間的關係,常見的關係運算子包括
- 用於單分支控制的條件語句:
- 單分支控制通常指的是
if
語句,它允許程式根據條件是否為真來執行一段程式碼。如果條件為真,則執行if
塊中的程式碼;如果條件為假,則跳過這部分程式碼。
- 單分支控制通常指的是
- 用於多分支控制的條件語句:
- 多分支控制通常指的是
if-else
語句或if-else if-else
語句鏈。這些結構允許程式根據多個條件執行不同的程式碼塊。if
語句檢查第一個條件,如果為真,則執行相應的程式碼塊;如果為假,則檢查下一個else if
條件,依此類推,直到找到為真的條件或到達else
塊(如果沒有條件為真,則執行else
塊中的程式碼)。
- 多分支控制通常指的是
- 用於多路選擇的Switch語句:
switch
語句用於根據一個變數的值選擇多個選項中的一個來執行。switch
語句包含一個表示式,該表示式的結果用於與case
標籤進行比較。如果匹配,則執行該case
塊中的程式碼,並透過break
語句退出switch
結構,以防止“穿透”到下一個case
。
- 邏輯運算子和邏輯表示式:
- 邏輯運算子:用於組合多個布林表示式,產生一個新的布林值。常見的邏輯運算子包括
&&
(邏輯與)、||
(邏輯或)、!
(邏輯非)。 - 邏輯表示式:由邏輯運算子連線的表示式,用於控制程式流程。例如,
a && b
是一個邏輯表示式,只有當a
和b
都為真時,整個表示式才為真。
- 邏輯運算子:用於組合多個布林表示式,產生一個新的布林值。常見的邏輯運算子包括
- 用於雙分支控制的條件語句:
- 雙分支控制通常指的是
if-else
語句,這是最基本的條件控制結構之一。它允許程式基於一個布林條件來選擇兩條執行路徑中的一條:- 如果條件為真(true),則執行
if
塊中的程式碼。 - 如果條件為假(false),則執行
else
塊中的程式碼。
- 如果條件為真(true),則執行
- 雙分支控制通常指的是
- 條件運算子(三元運算子):
- 條件運算子,也稱為三元運算子,是一種簡潔的條件選擇語句,其語法形式為:
條件 ? 表示式1 : 表示式2
。如果條件為真,則整個表示式的值為表示式1的值;如果條件為假,則為表示式2的值。例如:
這行程式碼的含義是:如果int max = (a > b) ? a : b;
a
大於b
,則max
的值為a
,否則為b
。
- 條件運算子,也稱為三元運算子,是一種簡潔的條件選擇語句,其語法形式為:
- 條件表示式:
- 條件表示式是使用條件運算子構建的表示式,它允許在單行內進行條件選擇。條件表示式通常用於賦值、函式返回值等場景,以簡化程式碼並提高可讀性。條件表示式依賴於條件運算子來實現。
這些控制結構和運算子是程式語言中處理條件邏輯的基礎工具,它們使得程式能夠根據不同的輸入或狀態做出決策,並執行相應的操作。透過合理使用這些工具,我們可以編寫出既靈活又高效的程式碼。
- 條件表示式是使用條件運算子構建的表示式,它允許在單行內進行條件選擇。條件表示式通常用於賦值、函式返回值等場景,以簡化程式碼並提高可讀性。條件表示式依賴於條件運算子來實現。
教材學習中的問題和解決過程
問題一:if-else語句和switch語句的區別什麼?分別在哪種情況下可用?
解決方法:AI答:if-else
語句和switch
語句都是用於條件控制的語句,但它們在用途和效率上有所不同。以下是它們的主要區別以及適用場景:
if-else
語句
特點:
- 條件多樣性:
if-else
語句可以處理任何型別的條件判斷,包括複雜的邏輯表示式。 - 靈活性:可以巢狀使用,實現多分支控制。
- 適用性:適用於需要根據多個條件執行不同程式碼塊的場景。
適用場景:
- 當需要根據多個不同的條件執行不同的程式碼塊時。
- 當條件判斷較為複雜,涉及多個變數和邏輯運算子時。
- 當需要根據條件的真假來執行不同的操作,並且這些條件不是基於單一變數的值時。
switch
語句
特點:
- 效率:
switch
語句在某些情況下比多個if-else
語句更高效,因為它透過跳轉表(在某些編譯器實現中)來實現,可以快速定位到對應的case
標籤。 - 簡潔性:
switch
語句在處理多個固定值的比較時,程式碼更加簡潔。 - 限制性:
switch
語句只能用於比較一個變數或表示式的值與多個固定值。
適用場景:
- 當需要根據單一變數的不同值執行不同的程式碼塊時。
- 當變數的可能值是離散的、有限的,並且這些值是固定的(如列舉型別或特定的常量)。
- 當程式碼的可讀性和維護性比執行效率更重要時。
區別總結
- 條件複雜度:
if-else
適用於條件判斷較為複雜的情況,而switch
適用於條件判斷基於單一變數的固定值。 - 執行效率:在某些情況下,
switch
語句可能比if-else
語句更高效,尤其是在處理大量固定值的比較時。 - 程式碼可讀性:
switch
語句在處理固定值的比較時,程式碼更加簡潔和清晰。 - 適用性:
if-else
語句適用於需要根據多個條件執行不同程式碼塊的場景,而switch
語句適用於基於單一變數值的多路選擇。
在選擇使用if-else
還是switch
時,需要根據具體的應用場景和需求來決定。
問題二:Switch語句中為什麼一定要加break?
解決方法;AI答:在switch
語句中使用break
的原因是為了終止當前case
塊的執行,並退出switch
語句。如果不加break
,會發生以下情況:
- “穿透”現象(Fall-through):如果沒有
break
,程式會繼續執行下一個case
塊的程式碼,即使該case
的條件不滿足。這種現象稱為“穿透”。這意味著,除非程式設計師明確地在每個case
塊的末尾放置一個break
,否則switch
語句的行為可能不是預期的。 - 控制流的不確定性:如果沒有
break
,程式的控制流將變得不確定,因為程式會繼續執行所有後續case
塊的程式碼,直到遇到一個break
或switch
語句結束。這可能導致程式執行錯誤的程式碼塊,或者執行更多的程式碼,從而影響程式的正確性和效率。 - 程式碼可讀性和可維護性:在每個
case
塊後新增break
可以提高程式碼的可讀性和可維護性。它明確地表明每個case
塊是獨立的,並且只執行與當前條件匹配的程式碼塊。 - 避免邏輯錯誤:在沒有
break
的情況下,程式設計師可能會錯誤地認為只有匹配的case
會被執行,而實際上所有後續的case
也會被執行,這可能導致邏輯錯誤。 - 編譯器警告:一些編譯器會警告沒有
break
的case
,因為這是一個常見的程式設計錯誤,編譯器試圖提醒開發者可能的邏輯問題。
例外情況:在某些情況下,程式設計師可能故意不使用break
來利用“穿透”現象,這通常是在所有case
塊執行相同程式碼的情況下。但是,即使在這種情況下,最好的做法是在最後一個case
塊之後放置一個break
,以避免將來新增新的case
時意外地建立了另一個穿透。
總的來說,break
在switch
語句中是確保程式按照預期執行的關鍵,它防止了意外的程式碼執行和邏輯錯誤。
基於AI的學習
程式碼除錯中的問題和解決過程
問題:實驗二中的程式碼不夠簡練,重複語句過多。
解決方案:檢視教材,詢問AI,最終把重複語句刪掉,再加了一些別的語句,程式碼變得更加簡潔有力。
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 200/200 | 2/2 | 20/20 | |
第二週 | 200/400 | 1/3 | 18/38 | |
第三週 | 300/700 | 1/4 | 20/58 | |
第四周 | 400/1100 | 1/5 | 22/80 | |
第五週 | 300/1400 | 1/6 | 22/102 | |
第六週 | 400/1800 | 1/7 | 25/127 |