|這個作業屬於哪個課程|2024-2025-1-計算機基礎與程式設計|
|這個作業要求在哪裡|2024-2025-1計算機基礎與程式設計第七週作業|
|這個作業的目標|①陣列與連結串列 ②基於陣列和基於連結串列實現資料結構 ③無序表與有序表 ④樹 ⑤圖 ⑥子程式與引數|
|作業正文|https://www.cnblogs.com/songjialinsjl/p/18535982|
教材學習內容總結
① 陣列與連結串列:
陣列:一種線性資料結構,用於儲存相同型別的元素。陣列中的元素是連續儲存的,可以透過索引直接訪問。
連結串列:也是一種線性資料結構,由節點組成,每個節點包含資料部分和指向下一個節點的指標。連結串列中的元素不是連續儲存的,訪問任意元素需要從頭節點開始遍歷。
② 基於陣列和基於連結串列實現資料結構:
基於陣列的資料結構:如動態陣列、棧、佇列等,它們使用陣列作為底層儲存結構。
基於連結串列的資料結構:如單連結串列、雙連結串列、鏈式棧、鏈式佇列等,它們使用連結串列作為底層儲存結構。
③ 無序表與有序表:
無序表:資料元素之間沒有特定的順序,如雜湊表、無序連結串列等。
有序表:資料元素按照一定的順序排列,如有序陣列、二叉搜尋樹等。
④ 樹:
樹是一種非線性資料結構,由節點組成,每個節點有零個或多個子節點。樹結構用於表示具有層次關係的資料,如家族樹、檔案系統等。
⑤ 圖:
圖是一種複雜的非線性資料結構,由頂點(節點)和邊組成,邊表示頂點之間的關係。圖可以用於表示網路、交通圖、社交網路等。
⑥ 子程式與引數:
子程式:也稱為函式或方法,是一段執行特定任務的程式碼塊。子程式可以被重複呼叫,以執行相同的任務。
引數:是傳遞給子程式的值,用於定製子程式的行為。引數可以是輸入引數(傳遞給子程式的值)和輸出引數(子程式計算後返回的值)。
函式定義與宣告:
定義:函式的定義包括函式的名稱、返回型別、引數列表、函式體等。
宣告:函式的宣告告訴編譯器函式的名稱、返回型別和引數型別,但不包括函式體。宣告通常在函式定義之前,用於告知編譯器函式的存在和介面。
呼叫函式:
函式呼叫是程式執行時,請求另一個函式執行的過程。
呼叫函式時,程式會跳轉到被呼叫函式的程式碼,執行完畢後返回到呼叫點繼續執行。
引數傳遞:
傳值呼叫:引數的值被複制到函式的引數中,函式內部對引數的修改不會影響原始變數。
傳址呼叫:引數的地址被傳遞給函式,函式內部可以透過地址修改原始變數的值。
返回值:
函式可以返回一個值給呼叫者,這個值透過函式的返回型別指定。
返回值透過特定的暫存器或記憶體區域傳遞迴呼叫者。
堆疊和幀:
每次函式呼叫時,都會在呼叫棧上建立一個新的棧幀(stack frame),包含區域性變數、返回地址等資訊。
函式執行完畢後,其棧幀會被銷燬,控制權返回給呼叫者。
遞迴呼叫:
遞迴函式是呼叫自身的函式,用於解決可以分解為相似子問題的問題。
遞迴需要有明確的結束條件,否則會造成無限遞迴。
過載與覆蓋:
過載:在C++等語言中,函式名相同但引數列表不同的函式可以共存,這稱為函式過載。
覆蓋:在物件導向程式設計中,子類可以提供一個與父類同名的函式,這稱為方法覆蓋。
行內函數:
行內函數是一種特殊的函式,編譯器會在編譯時將其程式碼直接插入到呼叫點,以減少函式呼叫的開銷。
尾遞迴最佳化:
尾遞迴是一種特殊的遞迴形式,函式的返回值是另一個函式呼叫的結果,且該呼叫是函式體中的最後一個操作。
一些編譯器可以最佳化尾遞迴,避免使用額外的棧幀,從而減少棧空間的使用。
函式指標:
函式指標是指向函式的指標,可以用來儲存函式的地址,並透過指標呼叫函式。
提問:如何更改scanf的函式
回答:在C語言中,scanf
是一個標準的庫函式,用於從標準輸入(通常是鍵盤)讀取格式化輸入。由於 scanf
是定義在 <stdio.h>
標頭檔案中的庫函式,你不能直接更改其定義。但是,你可以採取以下幾種方法來實現類似的功能或者改變其行為:
-
使用
scanf
的替代函式:
你可以使用scanf
的安全版本scanf_s
(在某些編譯器中可用),它允許你指定緩衝區大小,從而避免緩衝區溢位的問題。#include <stdio.h> int main() { int num; // 使用 scanf_s 替代 scanf scanf_s("%d", &num); printf("輸入的數字是:%d\n", num); return 0; }
-
封裝
scanf
:
你可以建立一個自己的函式,內部呼叫scanf
,並在呼叫前後新增額外的邏輯,比如輸入驗證。#include <stdio.h> int myScanf(const char* format, ...) { va_list args; va_start(args, format); int result = vsscanf(stdin, format, args); va_end(args); return result; } int main() { int num; // 呼叫自定義的 myScanf 函式 if (myScanf("%d", &num) == 1) { printf("輸入的數字是:%d\n", num); } else { printf("輸入錯誤\n"); } return 0; }
-
使用其他輸入函式:
你可以使用其他輸入函式,如fgets
來讀取一行輸入,然後使用sscanf
或strtol
等函式解析輸入。#include <stdio.h> #include <stdlib.h> int main() { char buffer[100]; int num; if (fgets(buffer, sizeof(buffer), stdin) != NULL) { num = strtol(buffer, NULL, 10); printf("輸入的數字是:%d\n", num); } else { printf("讀取輸入失敗\n"); } return 0; }
-
改變
scanf
的行為:
你可以透過設定scanf
的行為,比如使用setvbuf
改變標準輸入的緩衝行為,但這通常不是推薦的做法,因為它會影響整個程式的標準輸入。
請注意,scanf
和其他標準輸入函式可能會導致安全問題,如緩衝區溢位,因此在實際程式設計中,推薦使用更安全的替代方案。
基於AI的學習
蘇格拉底方式提問一次一個問題
當然可以,蘇格拉底式提問是一種透過提問引導對方思考和自我發現的方法。我會問你一個問題,然後根據你的回答再提出下一個問題。讓我們開始吧:
第一個問題:你最近在學習或工作中遇到了哪些挑戰?
和剛剛說的有關的問題
明白了,既然你提到了與之前討論的資料結構和演算法相關的問題,那麼我問你:
你能否描述一下,在你最近遇到的程式設計問題中,是如何處理資料結構的選擇問題的?比如,你是如何決定使用陣列而不是連結串列,或者選擇樹而不是圖的?
由一到多逐級遞增用樹,不斷交錯用圖
非常好,你的描述捕捉了樹和圖在資料結構中的一些基本用途。現在,讓我們深入一步:
你能否詳細說明一下,在什麼具體場景下,你會選擇使用樹結構來處理“由一到多逐級遞增”的資料關係?同樣,對於“不斷交錯”的關係,你又是如何決定使用圖結構的?
比如大綱到具體我用樹
明白了,樹結構確實適合用來表示層次化和包含關係的資料,比如大綱到具體內容的組織。這種結構允許你有一個清晰的根節點,然後逐級展開細節。
接下來的問題:你能舉一個具體的例子嗎?比如在哪個領域或者哪種型別的應用中,你會使用樹結構來組織資訊,並且這個結構是如何幫助你解決問題的?
藥品的分類
藥品分類使用樹結構是一個非常合適的選擇,因為藥品分類本身就是一個多層次、有包含關係的體系。以下是樹結構在藥品分類中的應用:
層次性:藥品分類通常具有明顯的層次性,從大類到小類逐級細分。例如,藥品可以首先分為化學藥品、生物製品、中藥等大類,然後每個大類下又可以細分為多個小類,如化學藥品下可以分抗感染藥、抗腫瘤藥等。
包含關係:樹結構能夠很好地表示藥品之間的包含關係。每個節點代表一個分類,子節點代表更具體的子分類。這種結構使得藥品的分類和檢索變得直觀和有序。
資訊共享與合作:研究人員、醫生、製藥公司等可以根據技術分類進行資訊共享和合作,促進醫藥領域的進步和創新。
資料探勘與決策樹:在藥物選擇模型中,決策樹方法被用來從大量資料中提取有價值的資訊,幫助解決醫療診斷、風險評估等決策問題
。
臨床研究資料分析:決策樹模型在臨床研究資料分析中也有應用,它透過特徵選擇、決策樹的生成和剪枝來構建模型,幫助提升分類效果
。
藥物技術分類:藥物技術分類可以根據作用機制、分子靶點、藥物來源、化學結構、疾病治療等多個維度進行,這種多維度的分類方式非常適合用樹結構來組織。
綜上所述,樹結構在藥品分類中的應用有助於實現藥品資訊的系統化管理和快速檢索,同時也為藥品的研究、開發和使用提供了便利。
確實
.