學期(如2024-2025-1) 學號(如:20241300) 《計算機基礎與程式設計》第X周學習總結
作業資訊
這個作業屬於哪個課程 | 2024-2025-1-計算機基礎與程式設計 |
---|---|
這個作業要求在哪裡 | 2024-2025-1計算機基礎與程式設計第十週作業 |
這個作業的目標 | 資訊系統,資料庫與SQL,人工智慧與專家系統,人工神經網路,模擬與離散事件,排隊系統,天氣與地震模型,圖形影像 |
作業正文 | https://www.cnblogs.com/zhaoshaoning/p/18579622 |
教材學習內容總結
資訊系統
一、定義
資訊系統(Information System,IS)是一個由人、硬體、軟體、網路和資料資源等構成的人機互動系統,目的是及時、正確地收集、加工、儲存、傳遞和提供資訊,實現組織中各項活動的管理、調節和控制。
例如,一個企業的資源規劃(ERP)系統,它涵蓋了採購管理、銷售管理、庫存管理等多個模組。透過硬體(伺服器、計算機終端等)、軟體(ERP軟體),相關人員(如採購人員、倉庫管理人員等)利用網路進行資料的傳輸,對企業內的各種資源資訊進行收集、儲存和處理,從而幫助企業管理者做出合理的決策。
二、組成部分
- 硬體
- 包括計算機裝置(伺服器、桌上型電腦、膝上型電腦等)、儲存裝置(硬碟、磁帶庫等)、輸入輸出裝置(鍵盤、滑鼠、印表機、掃描器等)。這些硬體是資訊系統的物理基礎,例如,伺服器用於儲存和處理大量的資料,是企業資訊系統資料中心的核心裝置;而掃描器則可以將紙質文件中的資訊轉化為數字格式,方便系統進行儲存和處理。
- 軟體
- 分為系統軟體(如作業系統、資料庫管理系統)和應用軟體(如辦公軟體、財務管理軟體等)。系統軟體提供了一個基礎的執行環境,資料庫管理系統可以有效地組織和管理資料。以銀行的資訊系統為例,資料庫管理系統儲存著客戶的賬戶資訊、交易記錄等海量資料。應用軟體則是針對具體的業務需求開發的,銀行櫃員使用的業務辦理軟體就是一種應用軟體,用於處理客戶的存款、取款等業務操作。
- 資料
- 是資訊系統的核心內容,包括各種結構化(如關係型資料庫中的表格資料)、半結構化(如XML檔案)和非結構化資料(如文件、影像、音訊等)。例如,在一個醫療資訊系統中,患者的病歷文字屬於非結構化資料,而患者的基本資訊(姓名、年齡、性別等)以表格形式儲存在資料庫中,屬於結構化資料。這些資料經過收集、整理後用於支援組織的決策和業務流程。
- 人員
- 包括系統的使用者(如企業的員工、管理人員等)、系統開發人員(程式設計師、系統分析師等)和系統維護人員。使用者是資訊系統的最終受益者,他們透過操作資訊系統完成各種業務任務。系統開發人員負責設計和開發資訊系統,根據使用者的需求構建軟體和硬體的組合。系統維護人員則保障資訊系統的正常執行,及時處理系統出現的故障和問題。
- 網路通訊
- 它使得資訊能夠在不同的硬體裝置之間進行傳輸,包括區域網(LAN)、廣域網(WAN)、網際網路等。例如,一家跨國公司透過廣域網將分佈在世界各地的分支機構的資訊系統連線起來,實現資料的共享和業務的協同。公司總部可以透過網路實時獲取各分支機構的銷售資料、庫存資料等,從而進行統一的管理和決策。
三、功能
- 資料收集和輸入
- 從各種來源(如感測器、人工錄入等)獲取資料,並將其轉換為資訊系統能夠處理的格式。例如,超市的收銀系統透過掃描商品條碼收集商品銷售資訊,這些資訊包括商品編號、價格、銷售時間等,然後將這些資料輸入到系統中進行後續處理。
- 資料儲存和管理
- 利用資料庫等技術對資料進行儲存和組織,以便於查詢、更新和維護。如電商平臺的資料庫儲存著海量的商品資訊(商品名稱、描述、圖片等)、使用者資訊(使用者註冊資訊、購買歷史等)以及訂單資訊。透過合理的資料庫設計,可以高效地管理這些資料,為使用者提供快速的商品搜尋和訂單查詢服務。
- 資料處理和分析
- 對儲存的資料進行加工,如計算、分類、彙總等操作,並透過資料分析技術(如資料探勘、機器學習等)提取有價值的資訊。例如,電信公司透過分析使用者的通話記錄、流量使用資料等,挖掘使用者的消費習慣,從而制定更精準的營銷策略,如為高流量使用者推薦更合適的流量套餐。
- 資訊輸出和展示
- 將處理後的資訊以合適的形式(如報表、圖表、網頁等)呈現給使用者。例如,企業的財務資訊系統可以生成財務報表,以表格和圖形的形式展示企業的收入、成本、利潤等資訊,方便企業管理者和投資者瞭解企業的財務狀況。
四、型別
- 事務處理系統(TPS)
- 主要用於處理組織的日常事務,如訂單處理、庫存管理等。它注重資料的準確性和及時性,能夠高效地處理大量的重複性事務。例如,航空公司的訂票系統,它可以實時處理旅客的訂票請求、座位分配、票價計算等事務,確保旅客能夠順利地預訂機票。
- 管理資訊系統(MIS)
- 為管理人員提供資訊支援,它對事務處理系統收集的資料進行彙總、分析等處理,生成各種報表和統計資訊。例如,一個生產企業的管理資訊系統可以根據車間的生產資料,生成生產報表,包括產量、質量、裝置利用率等資訊,幫助管理人員監控生產過程,做出合理的生產決策。
- 決策支援系統(DSS)
- 輔助管理人員進行決策,它透過建立模型和資料分析,為決策者提供多種決策方案和建議。例如,在城市規劃中,決策支援系統可以根據城市的人口資料、土地利用資料、交通流量資料等,透過建立數學模型,模擬不同的城市建設方案(如新建地鐵線路、開發新的住宅區等)對城市發展的影響,為城市規劃者提供決策參考。
- 專家系統(ES)
- 是一種模擬人類專家知識和經驗的計算機系統,它可以根據使用者輸入的問題,利用知識庫中的知識進行推理和判斷,給出解決方案。例如,醫療專家系統可以根據患者的症狀、檢查結果等資訊,參考醫學知識庫中的知識,為醫生提供診斷建議和治療方案。
資料庫與SQL
一、資料庫(Database)
-
定義
- 資料庫是按照資料結構來組織、儲存和管理資料的倉庫。它可以高效地儲存大量的資料,並方便使用者進行資料的查詢、插入、更新和刪除等操作。資料庫中的資料是有組織的,例如關係型資料庫透過表格(Table)的形式來儲存資料,每個表格包含多個列(Column)和行(Row)。就像一個圖書館是書籍的倉庫一樣,資料庫是資料的倉庫,並且它有一套規則來管理這些資料。
-
型別
- 關係型資料庫(RDBMS - Relational Database Management System):
- 是最常見的資料庫型別,它以關係模型為基礎,透過表來儲存資料,表與表之間透過主鍵(Primary Key)和外來鍵(Foreign Key)建立關聯。例如,在一個學校的資料庫中,有“學生”表和“課程”表。“學生”表可能包含學生的學號、姓名、年齡等列,“課程”表包含課程編號、課程名稱等列。透過在“選課”表中設定學生學號(來自“學生”表的主鍵)和課程編號(來自“課程”表的主鍵)作為外來鍵,可以建立學生和課程之間的選課關係。常見的關係型資料庫有MySQL、Oracle、SQL Server等。
- 非關係型資料庫(NoSQL - Not Only SQL):
- 主要用於處理非結構化和半結構化的資料,它不遵循傳統的關係模型。例如,文件型資料庫(如MongoDB)儲存的資料是以文件(類似JSON格式)為單位的,一個文件可以包含不同型別的資料。這種資料庫適合儲存如部落格文章、使用者評論等內容。還有鍵 - 值(Key - Value)儲存資料庫(如Redis),它透過鍵和值來儲存資料,就像字典一樣,適用於儲存簡單的配置資訊、快取資料等。圖形資料庫(如Neo4j)則用於儲存節點和邊,適用於處理複雜的關係網路,如社交網路中的使用者關係。
- 關係型資料庫(RDBMS - Relational Database Management System):
-
資料庫的優勢
- 資料共享性高:多個使用者或應用程式可以同時訪問和使用資料庫中的資料。例如,在一個企業中,銷售部門和財務部門可以同時訪問客戶資料庫,銷售部門獲取客戶訂單資訊,財務部門獲取客戶付款資訊。
- 資料獨立性好:資料的儲存結構和應用程式是相互獨立的。這意味著當資料庫的儲存結構發生變化時(如增加新的列、修改表結構等),應用程式不需要進行大量的修改。例如,在一個電商網站中,即使資料庫中產品表增加了一個新的屬性(如產品的環保指標),只要介面保持一致,網站的前端展示和後端處理邏輯可以基本不變。
- 資料冗餘度低:透過合理的設計,可以減少資料的重複儲存。例如,在關係型資料庫中,透過建立表之間的關聯,可以避免在多個地方重複儲存相同的資料,從而節省儲存空間,並且保證資料的一致性。
二、SQL(Structured Query Language)
-
定義
- SQL是用於管理關係型資料庫的標準語言,它可以讓使用者對資料庫進行資料定義(建立、修改、刪除表等)、資料操作(插入、查詢、更新、刪除資料)和資料控制(管理使用者許可權等)。SQL語句就像是與資料庫溝通的語言,透過它可以告訴資料庫要做什麼。
-
分類
- 資料定義語言(DDL - Data Definition Language):
- 用於定義資料庫的結構,包括建立表(CREATE TABLE)、修改表結構(ALTER TABLE)、刪除表(DROP TABLE)等操作。例如,要建立一個名為“employees”的員工表,可以使用以下SQL語句:
CREATE TABLE employees ( employee_id INT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50), department VARCHAR(50) );
- 這條語句建立了一個名為“employees”的表,其中包含員工編號(employee_id)作為主鍵,名字(first_name)、姓氏(last_name)和部門(department)等列,並且規定了每列的資料型別(如INT表示整數,VARCHAR表示可變長度的字元型資料)。
- 用於定義資料庫的結構,包括建立表(CREATE TABLE)、修改表結構(ALTER TABLE)、刪除表(DROP TABLE)等操作。例如,要建立一個名為“employees”的員工表,可以使用以下SQL語句:
- 資料操作語言(DML - Data Manipulation Language):
- 用於對資料庫中的資料進行操作。主要包括插入資料(INSERT)、查詢資料(SELECT)、更新資料(UPDATE)和刪除資料(DELETE)。例如,要向“employees”表中插入一條員工記錄,可以使用以下語句:
INSERT INTO employees (employee_id, first_name, last_name, department) VALUES (1, 'John', 'Doe', 'IT');
- 這就將一個員工編號為1,名字為“John”,姓氏為“Doe”,部門為“IT”的員工記錄插入到了表中。查詢語句如:
SELECT * FROM employees WHERE department = 'IT';
- 這條語句將查詢出“employees”表中所有部門為“IT”的員工記錄。“*”表示選擇所有列。
- 用於對資料庫中的資料進行操作。主要包括插入資料(INSERT)、查詢資料(SELECT)、更新資料(UPDATE)和刪除資料(DELETE)。例如,要向“employees”表中插入一條員工記錄,可以使用以下語句:
- 資料控制語言(DCL - Data Control Language):
- 用於管理資料庫的訪問許可權和安全。包括授權(GRANT)和收回許可權(REVOKE)等操作。例如,要授予一個使用者對“employees”表的查詢許可權,可以使用以下語句:
GRANT SELECT ON employees TO user1;
- 這樣使用者“user1”就可以對“employees”表進行查詢操作了。
- 用於管理資料庫的訪問許可權和安全。包括授權(GRANT)和收回許可權(REVOKE)等操作。例如,要授予一個使用者對“employees”表的查詢許可權,可以使用以下語句:
- 資料定義語言(DDL - Data Definition Language):
-
SQL的特點
- 通用性強:幾乎所有的關係型資料庫都支援SQL,雖然不同的資料庫可能會有一些細微的語法差異,但基本的操作(如查詢、插入等)是相似的。這使得開發人員可以使用相同的語言在不同的資料庫系統中進行開發。
- 功能強大:可以實現從簡單的資料查詢到複雜的資料關聯查詢和資料分析。例如,可以透過多個表的連線(JOIN)操作,查詢出複雜的業務關係資料。如查詢出每個部門的員工人數和平均工資等複雜資訊。
- 易於學習和使用:SQL的語法相對簡單,有一定的邏輯性。它的基本語句結構清晰,對於有程式設計基礎的人來說很容易上手,對於沒有程式設計基礎的人,透過簡單的培訓也可以掌握基本的查詢操作。
人工智慧與專家系統
一、人工智慧(Artificial Intelligence,AI)
- 定義
- 人工智慧是一門研究、開發用於模擬、延伸和擴充套件人的智慧的理論、方法、技術及應用系統的技術科學。其目標是讓機器能夠像人一樣思考、學習、推理和解決問題。例如,智慧語音助手,它可以理解人類的語音指令,進行文字翻譯、查詢資訊等操作,這就是人工智慧在自然語言處理領域的一種應用。
- 主要技術和方法
- 機器學習(Machine Learning):
- 機器學習是人工智慧的核心技術之一,它讓計算機系統能夠從資料中自動學習模式和規律。例如,在影像識別領域,透過大量的標記影像(如貓、狗的照片)來訓練機器學習模型。模型會學習到貓和狗的不同特徵,之後就能對新的影像進行分類,判斷是貓還是狗。機器學習又分為監督學習(有標記的資料,如分類任務)、無監督學習(無標記的資料,如聚類任務)和強化學習(透過獎勵機制來學習最優策略,如機器人在環境中學習行走的最優路徑)。
- 深度學習(Deep Learning):
- 深度學習是機器學習的一個分支,它使用深度神經網路(由多個神經元層組成的網路)來處理資料。例如,在語音識別中,深度學習模型可以處理語音訊號,將其轉換為文字。像Transformer架構的模型在自然語言處理領域取得了巨大的成功,能夠生成高質量的文字、進行機器翻譯等複雜任務。
- 自然語言處理(Natural Language Processing,NLP):
- 它使計算機能夠理解、生成和處理人類語言。例如,情感分析應用可以判斷一段文字是正面、負面還是中性的情感。智慧問答系統可以理解使用者的問題,並從知識庫中找到合適的答案來回答使用者。
- 機器學習(Machine Learning):
- 應用領域
- 醫療領域:人工智慧可以幫助醫生進行疾病診斷。例如,透過分析醫學影像(如X光、CT等)來檢測腫瘤等病變。一些智慧診斷系統可以結合患者的症狀、病史等資訊,提供可能的疾病診斷建議,輔助醫生做出更準確的判斷。
- 交通領域:自動駕駛技術是人工智慧的重要應用。車輛透過感測器(如攝像頭、雷達等)感知周圍環境,利用機器學習和深度學習演算法來識別道路、交通標誌和其他車輛,從而實現自動轉向、加速和剎車等操作,提高交通的安全性和效率。
- 金融領域:用於風險評估和欺詐檢測。透過分析客戶的財務資料、交易歷史等資訊,人工智慧模型可以預測客戶的信用風險,識別異常交易,防範金融欺詐。
二、專家系統(Expert System,ES)
- 定義
- 專家系統是一種人工智慧的應用程式,它模擬人類專家的知識和經驗,透過推理和判斷來解決特定領域的複雜問題。它包含知識庫(Knowledge Base)和推理機(Inference Engine)兩個核心部分。例如,在一個植物病害診斷專家系統中,知識庫儲存了各種植物病害的症狀、發病原因、防治方法等知識,推理機則根據使用者輸入的植物病害症狀,在知識庫中尋找匹配的知識,推理出可能的病害型別和防治建議。
- 組成部分
- 知識庫:
- 知識庫是專家系統的知識儲存庫,包含事實知識(如某種植物的生長習性)和規則知識(如如果植物葉子發黃且根部腐爛,那麼可能是某種病菌感染)。這些知識通常是從人類專家那裡獲取,並以合適的形式(如產生式規則)儲存。知識庫的質量直接影響專家系統的效能,需要不斷地更新和完善,以適應新的知識和情況。
- 推理機:
- 推理機是專家系統的核心控制部件,它根據使用者提供的初始資訊和知識庫中的知識進行推理。推理方式主要有正向推理(從已知事實出發,逐步推匯出結論)、反向推理(從假設的結論出發,尋找支援該結論的證據)和混合推理。例如,在一個醫療專家系統中,若已知患者的症狀,推理機可以透過正向推理,從知識庫中找到可能對應的疾病診斷;若要驗證某個疾病診斷是否正確,也可以透過反向推理,檢查是否存在支援該診斷的症狀。
- 人機介面(User Interface):
- 人機介面負責使用者和專家系統之間的資訊互動。它要設計得簡單易用,使使用者能夠方便地輸入問題和獲取答案。例如,在一個法律諮詢專家系統中,使用者可以透過簡單的文字輸入框輸入自己的法律問題,系統透過介面以通俗易懂的文字向使用者輸出法律建議。
- 知識庫:
- 特點和優勢
- 高效性:專家系統能夠快速地處理問題,一旦知識庫和推理機構建完成,它可以在短時間內對問題做出響應。例如,在一個複雜的化工生產故障診斷專家系統中,當生產過程出現問題時,它可以迅速根據感測器收集的資料和知識庫中的故障模型,推斷出可能的故障原因,而不需要等待人類專家的到來。
- 穩定性:它不受情緒、疲勞等因素的影響,能夠始終如一地提供高質量的服務。與人類專家可能會因為疲勞、壓力等因素導致判斷失誤不同,專家系統只要硬體、軟體環境正常,就可以穩定地進行推理和判斷。
- 知識傳承性:可以將人類專家的知識和經驗以一種系統的方式儲存下來,並不斷積累和傳播。例如,在一些傳統技藝領域,專家系統可以記錄老藝人的知識和經驗,使得這些寶貴的知識不會因為人的逝去而丟失,並且可以為後人學習和傳承提供幫助。
- 與人工智慧的關係
- 專家系統是人工智慧的一個重要應用方向。它是人工智慧在知識表示和推理領域的典型體現,利用人工智慧的知識表示方法來構建知識庫,使用人工智慧的推理演算法來驅動推理機。然而,專家系統相對較為侷限,通常只針對特定領域的問題,而人工智慧的範疇更廣泛,涵蓋了從感知、學習到推理等多個方面的技術和應用,並且在不斷地擴充和創新。
教材學習中的問題和解決過程
- 問題1:SQL有什麼缺點?
- 問題1解決方案:
- 複雜性隨應用場景提升
- 多表關聯複雜:當需要處理涉及多個表的複雜查詢時,SQL的語句可能會變得非常複雜。例如,在一個包含客戶表、訂單表、產品表、發貨表等多個相關表的電商資料庫中,要查詢出每個客戶購買的產品名稱、訂單金額、發貨時間等資訊,就需要使用多表連線(如內連線、外連線等)操作。連線條件的設定如果不準確,很容易導致錯誤的結果。而且隨著表的數量增加和關聯關係的複雜,SQL語句會變得冗長且難以理解和維護。
- 巢狀子查詢難度大:SQL支援子查詢,即一個查詢語句巢狀在另一個查詢語句之中。當子查詢巢狀層數較多時,程式碼的可讀性會急劇下降。例如,要查詢出購買了某一特定產品且訂單金額高於平均訂單金額的客戶資訊,可能需要在一個查詢客戶和訂單資訊的外層查詢中巢狀一個計算平均訂單金額的子查詢,再巢狀一個查詢特定產品訂單的子查詢。這種多層巢狀的結構對於開發人員的邏輯思維要求較高,也容易出現邏輯錯誤。
- 可擴充套件性問題
- 分散式資料處理困難:在處理大規模分散式資料時,傳統SQL的表現可能會受到限制。例如,在一個跨多個資料中心儲存資料的大型網際網路公司資料庫中,使用SQL進行資料查詢和處理可能需要複雜的配置和最佳化。雖然有一些分散式資料庫支援SQL介面,但在分散式環境下實現高效的SQL查詢(如跨資料中心的表連線)仍然面臨諸多挑戰,如資料一致性問題、網路延遲對查詢效能的影響等。
- 對大資料型別支援有限:隨著非結構化和半結構化資料(如社交媒體資料、物聯網感測器資料等)的大量湧現,SQL在處理這些資料型別時存在一定的侷限性。關係型資料庫中的SQL主要是針對結構化資料設計的,對於像影像、音訊、影片等非結構化資料,需要將其轉換為合適的結構化形式(如透過提取後設資料)才能儲存和處理,這增加了資料處理的複雜性和成本。
- 缺乏靈活性
- 資料結構變更復雜:當需要對資料庫的表結構進行更改時,例如新增新的列、修改列的資料型別或刪除列,可能會遇到很多問題。如果表之間存在關聯關係,那麼修改一個表的結構可能會影響到其他相關表。而且在大型資料庫系統中,這種結構的變更可能需要對大量的SQL程式碼(如儲存過程、檢視等)進行重新檢查和修改,以確保它們仍然能夠正常工作。
- 程式設計正規化限制:SQL是一種宣告式語言,它主要關注的是“做什麼”,而不是“怎麼做”。這與傳統的程式語言(如Python、Java等)的指令式程式設計正規化不同。在某些複雜的業務場景中,這種程式設計方式可能會限制開發人員的創造力和靈活性。例如,在實現一些複雜的業務邏輯(如實時資料處理和動態決策)時,可能需要將SQL與其他程式語言結合使用,這增加了系統開發的複雜性。
- 效能調優難度大
- 查詢最佳化複雜:SQL的效能很大程度上依賴於查詢最佳化器的工作。然而,理解和控制查詢最佳化器的行為是比較困難的。不同的資料庫管理系統有不同的查詢最佳化策略,即使是經驗豐富的開發人員也很難預測一個複雜查詢的執行時間和資源消耗。例如,在一個大型企業資源規劃(ERP)資料庫中,一個看似合理的SQL查詢可能由於索引使用不當、表連線順序不合理等因素而導致效能不佳,而要找到這些問題並進行最佳化需要對資料庫的內部機制(如索引結構、查詢執行計劃等)有深入的瞭解。
- 硬體資源利用不充分:在某些情況下,SQL可能無法充分利用現代硬體(如多核處理器、高速固態硬碟等)的優勢。例如,在處理大規模資料並行處理時,SQL可能無法有效地將任務分配到多個處理器核心上,導致硬體資源的浪費,從而影響查詢的速度和系統的整體效能。
- 問題2:指標的優越性
- 問題2解決方案:
- 高效的記憶體訪問
- 直接記憶體操作:在C語言中,指標允許直接訪問記憶體地址。這對於需要對記憶體進行精細控制的操作非常有用。例如,在嵌入式系統開發中,程式設計師可能需要直接讀寫特定的硬體暫存器。透過將暫存器的地址賦值給指標,就可以方便地對其進行讀寫操作。假設某個硬體裝置的控制暫存器地址為
0x1000
,可以定義一個指標volatile unsigned int *reg_ptr = (volatile unsigned int *)0x1000;
,然後透過*reg_ptr = value;
(寫操作)和value = *reg_ptr;
(讀操作)來與硬體暫存器進行互動。這種直接的記憶體訪問方式能夠高效地實現對硬體的控制。 - 陣列訪問最佳化:指標可以更高效地訪問陣列元素。對於一個陣列
int arr[100];
,使用指標int *p = arr;
訪問陣列元素*(p + i)
在某些情況下比使用下標訪問arr[i]
更高效。這是因為下標訪問實際上是隱式地透過指標算術運算來實現的(arr[i]
等價於*(arr + i)
),但使用指標可以避免一些額外的計算和檢查。在對陣列進行頻繁的遍歷操作時,這種效率優勢可能會更加明顯。例如,在一個迴圈中對陣列元素進行求和運算,使用指標可以減少計算開銷。
- 直接記憶體操作:在C語言中,指標允許直接訪問記憶體地址。這對於需要對記憶體進行精細控制的操作非常有用。例如,在嵌入式系統開發中,程式設計師可能需要直接讀寫特定的硬體暫存器。透過將暫存器的地址賦值給指標,就可以方便地對其進行讀寫操作。假設某個硬體裝置的控制暫存器地址為
- 動態記憶體分配與管理
- 靈活的記憶體分配:C語言中的
malloc
、calloc
和realloc
函式用於動態記憶體分配,這些函式返回的是指向所分配記憶體塊的指標。透過指標,程式可以根據執行時的實際需求靈活地分配記憶體。例如,當需要儲存使用者輸入的一系列資料,但不知道資料的具體數量時,可以先分配一個較小的記憶體塊,然後根據輸入的情況動態地調整記憶體大小。假設要實現一個簡單的字串儲存功能,可以這樣做:char *str; str = (char *)malloc(10 * sizeof(char)); // 讀取使用者輸入的字串,若長度超過初始分配的大小,使用realloc進行重新分配
- 構建複雜資料結構:指標是構建複雜資料結構(如連結串列、樹和圖)的基礎。以連結串列為例,連結串列節點通常定義為包含資料成員和指向下一個節點的指標的結構體。例如:
透過操作這些指標,可以實現連結串列的建立、插入、刪除等操作。在構建樹結構時,指標可以用來表示節點之間的父子關係,如二叉樹節點定義:struct Node { int data; struct Node *next; };
struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; };
- 靈活的記憶體分配:C語言中的
- 函式間的資料共享與修改
- 修改函式外部變數:指標可以作為函式引數,使函式能夠修改呼叫者傳遞進來的變數的值。如果只是傳遞普通變數,函式只能獲取變數的副本,對副本的修改不會影響到原始變數。但透過指標傳遞變數的地址,函式就可以直接修改原始變數。例如,函式
void swap(int *a, int *b)
可以交換兩個整數的值:
在主函式中呼叫void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; }
int x = 5, y = 10; swap(&x, &y);
就可以交換x
和y
的值。 - 傳遞大型資料結構:當傳遞大型資料結構(如結構體或陣列)給函式時,傳遞指標比傳遞整個資料結構更高效。傳遞指標只需要傳遞記憶體地址,而不是複製整個資料結構的內容。例如,對於一個大型結構體
struct ComplexData { int a[100]; char b[200]; };
,如果將其指標struct ComplexData *pData
傳遞給函式,函式可以透過指標訪問結構體的成員,避免了大量的資料複製開銷。
- 修改函式外部變數:指標可以作為函式引數,使函式能夠修改呼叫者傳遞進來的變數的值。如果只是傳遞普通變數,函式只能獲取變數的副本,對副本的修改不會影響到原始變數。但透過指標傳遞變數的地址,函式就可以直接修改原始變數。例如,函式
- 實現多型性(在一定程度上)
- 函式指標實現回撥機制:在C語言中,函式指標可以用來實現回撥機制,這在一定程度上類似於其他語言中的多型性。函式指標指向函式的入口地址,透過函式指標可以在執行時動態地選擇要呼叫的函式。例如,在一個排序演算法中,可以使用函式指標來指定比較函式。假設我們有一個通用的排序函式
void sort(int *arr, int size, int (*compare)(int, int))
,其中compare
是一個函式指標。可以根據不同的排序需求提供不同的比較函式,如升序比較函式int ascending(int a, int b) { return a - b; }
和降序比較函式int descending(int a, int b) { return b - a; }
。這樣,透過傳遞不同的函式指標,排序函式就可以實現不同的排序方式,增加了程式碼的靈活性。
- 函式指標實現回撥機制:在C語言中,函式指標可以用來實現回撥機制,這在一定程度上類似於其他語言中的多型性。函式指標指向函式的入口地址,透過函式指標可以在執行時動態地選擇要呼叫的函式。例如,在一個排序演算法中,可以使用函式指標來指定比較函式。假設我們有一個通用的排序函式
基於AI的學習