班級連結 | 2024計算機基礎與程式設計 |
---|---|
作業要求 | 第十週作業 |
作業目標 | ①資訊系統 ②資料庫與SQL ③人工智慧與專家系統 ④人工神經網路 ⑤模擬與離散事件 ⑥排隊系統 ⑦天氣與地震模型 ⑧圖形影像 |
教材學習內容總結
《電腦科學概論》第12、13、14章
- 資訊系統
- 資訊系統:
幫助組織和分析資料的軟體,主要包括電子製表軟體和資料庫管理系統。 - 電子製表軟體:
使用單元格組織資料和計算新值的公式,如Excel。單元格可以透過行列標號引用,公式可以引用其他單元格的值和使用內建函式計算結果。 - 電子資料表:
具有多功能性和可擴充套件性,能夠對變化動態地做出響應,自動重新計算相關公式以生成最新結果。 - 資料庫管理系統:
包括儲存資料的物理檔案、支援資料訪問和修改的軟體以及指定資料庫邏輯佈局的資料庫模式。 - 人工智慧
- 人工智慧:
處理人類思想的建模和應用,包括圖靈測試作為衡量機器是否能像人一樣思考的方法。 - 知識表示:
包括語義網和檢索樹,語義網是知識的圖形化表示,捕捉物件間的關係;檢索樹是表示對抗性移動的知識的重要方法。 - 專家系統:
嵌入人類專家知識,採用規則定義條件以得出結論,適用於多種決策過程,如醫療診斷。 - 模擬、圖形學、遊戲和其他應用
- 模擬:
計算的一個主要領域,涉及為複雜系統構建計算機模型並用模型進行實驗。模型是真實系統的抽象,系統被表示為一組物件或特徵以及管理它們行為的規則。 - 模擬型別:
包括連續模擬和離散事件模擬。連續模擬中變化由偏微分方程表示,離散事件模擬中行為被表示為實體、屬性和事件。 - 排隊系統:
一種離散事件模擬,分析等待時間,使用隨機數字模擬事件的到達和持續。 - 計算機圖形學:
結合計算機、科學和繪畫藝術的領域,依賴數學方程模擬影像中的自然現象,生成接近真實照片的影像。 - 計算機遊戲:
玩家可以與系統及玩家之間互動的虛擬世界,開發者使用遊戲引擎建立遊戲虛擬世界。
《C語言程式設計》第9章
- 變數的記憶體地址
- 指標變數的定義和初始化:
透過*進行指標變數的宣告和初始化過程。 - 間接定址運算子:
使用間接定址運算子來訪問指標指向的值。 - 按值呼叫與模擬按引用呼叫:
解釋了函式呼叫時的按值傳遞和如何模擬按引用傳遞。 - 函式指標及其應用
教材學習中的問題與解決過程
問題1:對於指標的增加和減少操作(如p++)如何影響指標的值?
AI:
在C語言中,指標的增加和減少操作(如 p++)會影響指標的值,具體影響取決於指標指向的資料型別。這些操作實際上是基於指標指向的資料型別的大小來進行的。以下是一些關鍵點:
- 指標的增量操作(p++):
- 當你對指標 p 執行 p++ 操作時,指標的值會增加。
- 增加的量是指標指向的資料型別的大小。例如,如果 p 是指向 int 的指標,而 int 通常是4個位元組,那麼 p++ 會使 p 的值增加4個位元組(在32位系統中)或8個位元組(在64位系統中)。
- 這意味著 p 將指向下一個 int 值。
- 指標的減量操作(p--):
- 類似地,p-- 會減少指標的值。
- 減少的量同樣是指標指向的資料型別的大小。
- 這意味著 p 將指向前一個 int 值。
- 指標的算術:
- 你也可以直接對指標進行加法或減法操作,如 p += 1 或 p -= 1。
- 這些操作同樣是基於指標指向的資料型別的大小來增加或減少指標的值。
- 指標型別和大小:
- 指標增加或減少的具體位元組數取決於指標指向的資料型別的大小,這個大小可以透過 sizeof 運算子獲得。
- 對於不同型別的指標(如 char、int、float 等),增加或減少的量會不同。
5.跨型別操作: - 如果你嘗試對指向不同資料型別的指標進行增加或減少操作,可能會導致未定義行為,因為不同型別佔用的記憶體大小不同。
6.指標越界: - 增加或減少指標的值時,需要小心不要越界,即不要讓指標指向不屬於陣列或分配的記憶體區域的地址。
7.指標和陣列: - 當指標用於陣列時,p++ 會使指標移動到陣列的下一個元素。
問題2:當未知存入資料大小時,如何操作才能避免緩衝區溢位問題?
AI:
- 使用安全的函式:替代不安全的函式,如使用 strncpy()、strncat()、snprintf() 等函式代替 strcpy()、strcat()、sprintf() 等,這些函式允許指定最大操作長度,從而有效防止緩衝區溢位
- 邊界檢查:在對陣列進行訪問時,務必確保索引值在陣列的有效範圍內。在編寫程式碼時,加入明確的邊界檢查邏輯,防止陣列下標越界導致緩衝區溢位
- 記憶體操作邊界檢查:對於動態分配記憶體的操作,如使用 malloc()、calloc() 等函式分配記憶體後,在使用該記憶體區域時要進行邊界檢查,確保不會超出所分配記憶體的範圍
- 初始化變數:初始化所有變數,特別是用作陣列索引的變數,以避免未定義行為
- 避免使用不安全的函式:避免使用像 gets() 這樣已知不安全的函式,這個函式不檢查目標緩衝區的大小,容易造成溢位
- 使用高階語言特性或庫:考慮使用C++中的 std::string 和 std::vector 等容器,它們自動管理記憶體,減少了緩衝區溢位的風險
- 編譯器和工具的使用:使用編譯器的警告和錯誤檢查功能,例如GCC的 -Wall -Wextra 選項,可以幫助發現潛在的緩衝區溢位問題。使用靜態程式碼分析工具,如 Clang Static Analyzer,來檢測程式碼中的緩衝區溢位漏洞
- 程式碼審查和測試:定期進行程式碼審查,特別關注那些處理外部輸入或進行大量記憶體操作的程式碼段。編寫和執行針對緩衝區溢位的單元測試,確保程式碼在邊緣條件下也能正常工作
- 地址空間佈局隨機化:作業系統可以透過隨機化記憶體分配來增加攻擊者預測目的地址的難度,防止攻擊者直接定位攻擊程式碼位置,達到阻止溢位攻擊的目的
- 棧保護:開啟棧保護機制,如使用 -fstack-protector-strong 編譯器選項,可以幫助檢測緩衝區溢位攻擊,並在程式執行時進行防禦
基於AI的學習
學習進度條
計劃學習時間:25h
實際學習時間:25h