2024-2025-1 20241328 《計算機基礎與程式設計》第十一週學習總結
作業資訊
這個作業屬於哪個課程 | 2024-2025-1-計算機基礎與程式設計 |
---|---|
這個作業要求在哪裡 | 2024-2025-1計算機基礎與程式設計第一週作業 |
這個作業的目標 | 計算機網路,網路拓撲,雲端計算,網路安全,Web,HTML,CSS,Javascript,XML |
教材學習內容總結
電腦科學概論(第七版)和《C語言程式設計》第10章知識點總結
目錄
- 第15章:圖
- 第16章:人工智慧
- 第10章:結構化程式設計
第15章:圖
15.1 圖的基本概念
- 圖的定義:圖是由頂點(或節點)和邊組成的一種資料結構,表示物件之間的關係。
- 圖的種類:
- 無向圖:邊沒有方向,表示頂點之間的雙向關係。
- 有向圖:邊有方向,表示頂點之間的單向關係。
- 加權圖:邊上帶有權值,通常表示邊的長度、費用等。
15.2 圖的表示
-
鄰接矩陣:使用二維陣列表示圖,適合稠密圖。
- 如果兩個頂點有邊相連,則對應的元素為1(或邊的權值),否則為0。
- 優點:訪問邊的時間複雜度為O(1)。
- 缺點:空間複雜度為O(n²),不適合稀疏圖。
-
鄰接表:使用連結串列或動態陣列表示每個頂點的邊,適合稀疏圖。
- 每個頂點維護一個連結串列,儲存與其相連線的所有頂點。
- 優點:節省空間,適合表示稀疏圖。
- 缺點:訪問邊的時間複雜度為O(n)。
15.3 圖的遍歷
- 深度優先搜尋(DFS):基於棧的資料結構,儘可能深入每一個分支。
- 廣度優先搜尋(BFS):基於佇列的資料結構,逐層遍歷各個節點。
15.4 最短路徑演算法
- Dijkstra演算法:用於有向圖的最短路徑尋找,適用於非負權邊。
- Bellman-Ford演算法:適用於有向圖,可處理負權邊。
第16章:人工智慧
16.1 人工智慧的定義
- 人工智慧(AI):研究和開發智慧機器的科學,特別是智慧計算機程式。
16.2 人工智慧的領域
- 機器學習:透過經驗和資料來改善決策過程,常用演算法包括決策樹、神經網路等。
- 自然語言處理:使計算機能夠理解和生成人類語言的重要領域。
- 計算機視覺:讓計算機理解和處理影像和影片。
16.3 基礎演算法
- 啟發式演算法:透過使用啟發性規則來尋找近似解,常用於圖搜尋和最佳化問題。
- 偵測演算法:涉及影像識別、模式識別等。
16.4 人工智慧的挑戰
- 倫理問題:人工智慧的應用在隱私、安全等方面引發的倫理和法律爭議。
- 技術問題:如何處理不確定性、資料量大、複雜性高的問題。
第10章:結構化程式設計
10.1 程式設計的基礎
- 結構化程式設計:強調模組化和分治思想,增強可讀性和可維護性。
- 三大基本結構:順序、選擇、迴圈結構。
- 順序結構:語句按順序執行。
- 選擇結構:根據條件選擇不同的執行路徑,使用
if
、switch
等語句。 - 迴圈結構:用於重複執行程式碼塊,使用
for
、while
、do-while
等語句。
10.2 函式的使用
- 函式定義:包含返回型別、函式名、引數列表及函式體。
- 引數傳遞:
- 值傳遞:傳遞引數的值,函式內部對引數的改動不影響實際引數。
- 地址傳遞:傳遞引數的地址,允許函式修改實際引數的值。
- 遞迴函式:函式呼叫自身,需設定有效的終止條件。
10.3 陣列和字串
- 陣列:相同型別元素的集合,支援隨機訪問。
- 字串:在C語言中為字元陣列,以
\0
結尾表示字串的結束。
10.4 指標
- 指標的定義:儲存變數地址的變數。
- 指標運算:可以透過指標遍歷陣列及傳遞到函式等。
- 指向指標的指標:指向其他指標的指標,增加了資料結構的靈活性。
10.5 檔案操作
- 檔案的開啟和關閉:使用
fopen
和fclose
函式。 - 讀寫檔案:使用
fscanf
、fprintf
等進行資料輸入輸出。 - 檔案操作的錯誤處理:檢查返回值以確保檔案操作成功。
教材學習中的問題和解決過程(先問 AI)
-
問題1:我看了這一段文字 “圖的遍歷方式包括深度優先搜尋(DFS)和廣度優先搜尋(BFS)。”,有這個問題:這兩種遍歷方式的具體區別是什麼?在什麼情況下使用哪一種更合適?
-
我查了資料,有這些說法:“深度優先搜尋(DFS)優先深入圖中的分支,比較適合解決路徑查詢問題;廣度優先搜尋(BFS)則是逐層遍歷,更適合尋找最短路徑。”
-
根據我的實踐,我得到這些經驗:在我的專案中實現圖的遍歷時,我發現使用DFS時能找到較深的節點,但搜尋速度較慢,並且在處理較大的圖時會消耗更多的記憶體。而BFS在尋找到某個節點的最短路徑時工作得更好,但對於深層節點的搜尋效率不高。
-
但是我還是不太懂,我的困惑是:在實際應用中,如何判斷選擇使用DFS還是BFS?它們之間的效率差異如何評估?
-
-
問題2:我看了這一段文字 “人工智慧的領域包括機器學習、自然語言處理和計算機視覺。”,有這個問題:這些領域之間的實際聯絡和差異是什麼?
-
我查了資料,有這些說法:“機器學習是AI的重要方法,通常透過訓練模型來進行預測;自然語言處理則是使計算機理解和生成語言的技術,計算機視覺則是使計算機能夠理解和分析影像或影片。”
-
根據我的實踐,我得到這些經驗:我在嘗試構建一個聊天機器人時,結合了自然語言處理和機器學習技術。透過訓練模型識別人類的語句,找到了更高效的交流方式。但是,將這兩者結合得當卻是個挑戰。
-
但是我還是不太懂,我的困惑是:在具體專案中,如何有效地整合這三者的技術?有沒有一些最佳實踐可以遵循?
-
-
問題3:我看了這一段文字 “在C語言中,遞迴函式允許函式呼叫自身,並需要明確的終止條件。”,有這個問題:如何確保遞迴函式不會導致棧溢位?
-
我查了資料,有這些說法:“確保遞迴函式有有效的基準條件,防止無限遞迴;此外,可以使用遞迴深度的限制來防止過多的遞迴呼叫。”
-
根據我的實踐,我得到這些經驗:我曾嘗試使用遞迴求解斐波那契數列,初次實現時期望得到結果,但因為基準條件設定不當導致了棧溢位。我後來改為使用迭代方式解決,得到了更好的效能。
-
但是我還是不太懂,我的困惑是:有時候遞迴比較自然,但在實際專案中,如何判斷遞迴深度是否超出限制?在使用遞迴時還有哪些潛在的風險需要關注?
-
基於AI的學習
學習過程模擬:圖的基本概念
我在學圖的基本概念,請你以蘇格拉底的方式對我進行提問,一次一個問題。
問題1
GPT: 你能告訴我,什麼是圖嗎?在你的理解中,圖的基本組成部分是什麼?
我: 圖是由頂點和邊組成的一種資料結構,頂點是圖中的節點,而邊則表示節點之間的關係。
問題2
GPT: 那麼,頂點和邊之間的關係是什麼樣的?你能舉一個例子說明嗎?
我: 頂點是圖的基本單位,邊連線兩個頂點,表示它們之間的關係。例如,在社交網路中,使用者可以是頂點,而使用者之間的朋友關係是邊。
問題3
GPT: 很好。那麼,可以告訴我圖中有哪幾種型別嗎?它們之間有什麼主要區別?
我: 圖可以分為無向圖和有向圖。無向圖中,邊沒有方向,表示每個頂點之間是雙向關係;有向圖中,邊是有方向的,只能從一個頂點指向另一個頂點。
問題4
GPT: 你提到無向圖和有向圖,它們在實際應用中有什麼具體的例子嗎?
我: 在道路網路中,通常可以用無向圖來表示,因為道路是雙向的。而在計算機網路中,有向圖更適合描述資料流動方向。
問題5
GPT: 很好。那麼你覺得,在圖的資料結構中,使用鄰接矩陣和鄰接表各有什麼優缺點呢?
我: 鄰接矩陣適合稠密圖,能夠快速查詢邊的聯通性,但空間消耗較大。鄰接表適合稀疏圖,節約空間,但查詢邊的效率較低。
問題6
GPT: 除了鄰接矩陣和鄰接表,還有其他表示圖的方法嗎?你能分析一下它們的優缺點嗎?
我: 還有邊列表表示法,使用一個列表儲存所有的邊,每條邊包含兩個頂點。如果圖是稀疏圖,邊列表可以更加節省空間,但查詢某個頂點的連通性會比較慢。
問題7
GPT: 在圖的遍歷中,你瞭解深度優先搜尋(DFS)和廣度優先搜尋(BFS)嗎?你能描述它們的工作原理嗎?
我: DFS嘗試儘可能深入每個分支,使用棧資料結構實現,而BFS逐層訪問所有相鄰的頂點,使用佇列資料結構實現。
問題8
GPT: 深度優先搜尋和廣度優先搜尋在實際應用中有什麼不同的場景適合使用嗎?
我: DFS通常用於尋找路徑或解決問題時需要訪問整個圖的情況,如解決迷宮問題;而BFS適合尋找最短路徑,如在地圖中找到兩個城市之間的最短路線。
問題9
GPT: 對於最短路徑演算法,你能簡單講講Dijkstra演算法的工作原理嗎?
我: Dijkstra演算法從起始節點出發,逐步計算到其他節點的最短路徑,使用貪心演算法的思想,選取當前最近的頂點,不斷更新其鄰接頂點的路徑。
問題10
GPT: 你能解釋一下Bellman-Ford演算法和Dijkstra演算法的主要區別嗎?
我: Bellman-Ford演算法可以處理負權邊,而Dijkstra演算法只能處理非負權邊。Bellman-Ford演算法的時間複雜度更高,但能找到所有頂點的最短路徑。
問題11
GPT: 你覺得學習圖的基本概念對你以後的程式設計有幫助嗎?為什麼?
我: 我覺得學習圖的基本概念對程式設計有很大幫助,因為很多現實世界的問題可以抽象成圖模型,比如社交網路、地圖導航等,理解圖的性質和演算法會讓我能更好地解決這類問題。
問題12
GPT: 從你對圖的理解和應用中,你對圖的學習還有什麼需要繼續深入的領域嗎?
我: 我希望進一步瞭解圖的演算法最佳化技術和圖在實際應用中的複雜性分析,以便能在遇到大規模圖時,選擇更合適的演算法和資料結構。
最終總結
我: 我的回答結束了,請對我的回答進行評價總結。
GPT: 很好!你對圖的基本概念進行了一系列深入的思考,能夠清楚地區分不同型別的圖和其表示方法,理解圖的遍歷及最短路徑演算法。這表明你對圖論的基礎知識掌握得不錯。繼續保持這樣的探索精神,進一步深入圖演算法及其應用領域,將對你的程式設計能力有很大提升。
程式碼除錯中的問題和解決過程
C語言學習中的程式碼除錯問題與解決方案
- 問題1:編寫的程式輸出結果錯誤。
- 問題1解決方案:首先檢查程式的邏輯是否正確,包括迴圈條件、判斷語句等。然後使用
printf
語句輸出中間變數的值,幫助跟蹤程式執行過程中的資料流。比如,在處理陣列時,如果陣列越界,程式會輸出錯誤或者崩潰,確保訪問的陣列下標在有效範圍內。
- 問題1解決方案:首先檢查程式的邏輯是否正確,包括迴圈條件、判斷語句等。然後使用
- 問題2:使用
scanf
讀取輸入時程式崩潰。- 問題2解決方案:確保使用的格式說明符與輸入的資料型別匹配。比如,讀取整數時應使用
%d
,而讀取字串時需要保證提供的字元陣列足夠大,並使用%s
格式符。同時,檢查scanf
的返回值,判斷輸入是否成功。
- 問題2解決方案:確保使用的格式說明符與輸入的資料型別匹配。比如,讀取整數時應使用
- 問題3:動態記憶體分配後出現記憶體洩漏。
- 問題3解決方案:跟蹤每個
malloc
、calloc
或realloc
呼叫,確保每次分配的記憶體都有對應的free
呼叫在適當的地方釋放,避免記憶體洩漏。定期使用記憶體分析工具(如valgrind
)進行檢查,可以幫助檢測未釋放的記憶體塊。
- 問題3解決方案:跟蹤每個
- 問題4:使用指標時程式崩潰或產生未定義行為。
- 問題4解決方案:確保指標在使用前已被有效初始化,避免使用懸空指標。使用
malloc
分配記憶體後,確保對應的記憶體是可用的,並在不需要時釋放指標。同時,如果指標指向的區域性變數在函式返回後被釋放,應避免繼續使用。
- 問題4解決方案:確保指標在使用前已被有效初始化,避免使用懸空指標。使用
- 問題5:遞迴函式導致棧溢位。
- 問題5解決方案:確保遞迴函式有明確且有效的終止條件,以避免無限遞迴導致的棧溢位。對於遞迴深度較大的情況,可以考慮將遞迴改為迭代實現或最佳化演算法,以減少呼叫棧的使用。
其他(感悟、思考等,可選)
📚 學習感悟與思考:程式設計的藝術
在學習 C語言 和 電腦科學 的過程中,我逐漸意識到程式設計不僅僅是一個解決問題的工具,更是一種 邏輯思維 的體現。
🚀 面對挑戰的成長
每當我面對程式碼中的錯誤或挑戰時,我就意識到解決問題的過程實際上在 訓練我的分析和推理能力。透過以下的實踐,我學習到了很多:
-
耐心與細緻:除錯程式碼常常讓我感到焦慮和沮喪,尤其是遇到難以定位的錯誤時。然而,這些經歷讓我學會了在壓力下保持冷靜。
-
分析與解決:逐步分析錯誤、查閱資料、拆解問題的過程,不僅讓我找到現有問題,也培養了更加 嚴謹 的思維方式。
🌟 演算法的重要性
理解不同演算法的 時間複雜度 和 空間複雜度 使我在問題解決時更加得心應手。例如:
-
在處理簡單排序問題時,合理的演算法選擇便能顯著提高程式碼執行的 效率。
-
面對複雜資料結構的挑戰,更高效的演算法設計可以提高 可維護性,減少未來的工作量。
🔍 練習與總結的力量
學習過程中的反覆練習與總結同樣重要:
-
編寫程式碼 後,我會去思考:
- 這段程式碼的實現意圖是什麼?
- 是否存在 改進的空間?
- 是否有更適合的解決方案?
-
這種思考讓我不僅增加了 實際經驗,也不斷提升了自己的 思維能力。
🎉 對程式設計的熱情
透過這段學習之旅,我對程式設計的熱情與日俱增。我明白了:程式設計不僅是一項技能,更是一種 表達思想、解決實際問題的能力。
在未來的學習與實踐中,我希望能夠:
- 繼續保持探索精神
- 樂於分享經驗
- 不斷突破技術邊界
程式設計是一種藝術,讓我們在程式碼中追尋更美的解決方案和更高的夢想! ✨
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 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 | |
第五週 | 400/1700 | 4/13 | 25/115 | |
第六週 | 350/2050 | 3/16 | 20/135 | |
第七週 | 450/2500 | 5/21 | 28/163 | |
第八週 | 300/2800 | 4/25 | 22/185 | |
第九周 | 400/3200 | 3/28 | 30/215 | |
第十週 | 400/3600 | 4/32 | 25/240 | |
第十一週 | 400/4000 | 4/36 | 30/270 |
-
計劃學習時間: 10小時/周
-
實際學習時間: 10小時(第十一週)
-
改進情況:
- 增加了每週的學習時間,使得整體進度更接近目標。
- 保持了較穩定的部落格輸出,進一步鞏固了學習的成果。
- 程式碼行數和部落格數量都有明顯提升,繼續致力於提高學習效率和質量。