# 目錄 - [CH1 計算機簡介](#CH1-計算機簡介) - [CH2 數位資料表示法](#CH2-數位資料表示法) - [CH3 計算機組織](#CH3-計算機組織) - [CH4 作業系統](#CH4-作業系統) - [CH5 電腦網路](#CH5-電腦網路) - [CH6 網際網路](#CH6-網際網路) - [CH7 網路應用](#CH7-網路應用) - [CH8 網路安全](#CH8-網路安全) - [CH9 程式語言](#CH9-程式語言) - [CH10 資料結構](#CH10-資料結構) ## CH1 計算機簡介 - IBM 1924年 - IEEE 1963年 國際電機電子工程師學會 - IEEE 802.11 無線網路wifi標準 - Turing Award 1966年 --- ### 圖靈獎得主 | 高德納 | Donald Knuth | | | - | - | - | | 姚期智 | Chi-Chin Yao | 2000年 華人 | | 羅納德林 | ==Ronald Rivest== | RSA加密 | | 薩莫爾 | ==Shamir== | RSA加密 | | 阿德曼 | ==Adlemon== | RSA加密 | | 惠特菲爾德 | Whitfield | 公開金鑰加密 | | 馬丁赫爾曼 | Martin Hellman | 公開金鑰加密 | | 辛頓 | Hinton | 2018年 物理獎 AI | | 楊立昆 | Yann Lecun | AI | | 班吉歐 | Bengio | AI | --- ### 馮紐曼架構 John von Neumann 1945年 介紹儲存程式 | 記憶體 | Memory | | - | - | | 算數邏輯單元 | ALU (Arithmetic Logic Unit) | | 控制單元 | CU (Control Unit) | | 輸入/輸出 | I/O | >[!Important] >中央處理器CPU (Central Processing Unit) >由算數邏輯單元及控制單元組成 >==CPU = ALU + CU== ![圖片](https://hackmd.io/_uploads/BJb7Q6Um-g.png) ### 電腦四大時期 1. 真空管 2. 電晶體 3. 積體電路 4. 超大型積體電路 --- ### 摩爾定律 積體電路上可容納的電晶體數目,約18~24個月會增加一倍。 ## CH2 數位資料表示法 - 數位 Digital 不連續變化 - 類比 Analogy 連續變化 | 十進位 | Decimal | | - | - | | 二進位 | Binary | | 八進位 | Octal | | 十六進位 | Hexadecimal | --- ### 位元 Bit Byte : 位元組 bit : 位元 - ==1Byte = 8bits== - KB < MB < GB < TB - 2^30^KB = 2^20^MB = 2^10^GB = 1TB --- ### 一補數1's Complement - 範圍 : -127 ~ ±0 ~ 127 >[!Note]範例 >(40)~10~ -> (00101000)~2~ >(-40)~10~ 取反-> (11010111)~2~ --- ### 二補數 2's Complement - 範圍 : -128 ~ +0 ~ 127 >[!Note]範例 >(40)~10~ -> (00101000)~2~ >(-40)~10~ 取反-> (11010111)~2~ 再加1-> (11011000)~2~ >[!Tip]速解 > (-40)~10~ 右邊第一個1當分界線,==左邊0轉1、1轉0,右邊不變== > (00101000)~2~ -> (11011000)~2~ --- ### 溢位 Overflow - 兩==正數==相加,符號位元為1 - 兩==負數==相加,符號位元為0 --- ### 浮點數表示法 - IEEE 754 - ==過剩127==方式 1. 單精度 32位元 -> 1個符號,==8==個指數,23個尾數 2. 雙精度 64位元 -> 1格符號,==11==個指數,55個尾數 >[!Note]範例 >10110.100011 標準化-> 1.0110100011x2^4^ >過剩127 -> 4 + 127 = ==131== >(131)~10~ -> (10000011)~2~ >最終 -> 0 ==10000011== 01101000110...000 --- ### ASCII - A = 65 - a = 97 ## CH3 計算機組織 ### 中央處理器 CPU (Central Processing Unit) - 電腦的大腦。 - 由==算數邏輯單元 ALU 和控制單元 CU== 組成。 --- ### 暫存器 Register - 速度比主記憶體快 ![圖片](https://hackmd.io/_uploads/rJE1zTIQ-l.png) --- ### 控制單元 CU (Control Unit) 控制電腦執行程式的流程 --- ### 算術邏輯單元 ALU (Arithmetic Logic Unit) 負責計算加法、減法、乘法、除法等數學運算。 >[!Note]XOR資料遮罩範例 >DATA為==11010110== >MASK為00101100 >做XOR運算後為11111010 >再做一次可回復資料==11010110== --- ### 匯流排 Bus - 系統匯流排 (CPU與記憶體間的資料傳送) - 控制匯流排 Control bus - 位址匯流排 address bus - 資料匯流排 data bus - 擴充匯流排 (使用者彈性使用) - USB、PCI... >[!Warning] >USB最多支援127台設備 --- ### 記憶體 Memory #### RAM (隨機存取記憶體) 斷電後資料會消失 - SRAM (靜態隨機存取記憶體) - 速度快、價錢高 - 不需做更新動作 - 正反器 - DRAM (動態隨機存取記憶體) - 速度慢、價錢低 - 需做週期更新 - 電容器 --- #### ROM (唯讀記憶體) 斷電後資料會保存,可用來儲存開機程序。 --- #### Main Memory (主記憶體) 速度比快取記憶體慢,但比硬碟快。 ![圖片](https://hackmd.io/_uploads/BkdeGpLQWe.png) --- ### 執行程式 fetch -> decode -> execute - 擷取 (fetch) - 解碼 (decode) - 執行 (execute) >[!Tip]生產線技術 ![圖片](https://hackmd.io/_uploads/Bk1GzaUmZx.png) ## CH4 作業系統 扮演使用者與電腦硬體的中間人 ### 功能 - CPU排班 (Scheduling) - 記憶體管理 (Memory Management) - 檔案管理 (File Management) - I/O 管理 --- ### 操作介面 - 圖形介面 (TUI) - 操作簡單 - 效能較差 - 文字介面 (GUI) - 操作較困難 - 效能較好 --- ### 常見作業系統 - Windows - MasOS - Linux - DOS --- ### 演進 - 批次處理 (Batch Processing) - 一次處理整批資料,CPU閒置長。 - 多程式規劃 (Multiprogramming) - 記憶體載入多個程式,當等待IO時切換。 - 可能造==死結== (Deadlock) - ==分時系統== (Time-sharing) - 將CPU時間切成==許多微小片段==,造成==多工==假象。 --- ### CPU 排班演算法 - 先到先處理 (FCFS) - 最短工作先處理 (SJF) - ==平均等待時間最短== - ==可能造成飢餓 (Starvation)== - 優先權排班 (Priority) - ==可能造成飢餓 (Starvation)== - 依序循環 (Round Robin) - 每個程式分配固定時間片段 - 時間到將內容及狀態寫進程序控制表 (PCB) - 適合==分時系統== - 二八原則 >[!Tip]二八原則 >20%程序所需時間大於間隔時間 >80%程序所需時間小於間隔時間 >[!Note]平均等待時間計算 >範例為==最短工作先處理== >執行順序為 P2 -> P3 -> P1 >平均等待時間 (8 + 3) / 3 = 3.67 表1 | 程序 | 所需時間 | | - | - | | P1 | 7 | | P2 | 3 | | P3 | 5 | 表2 | 程序 | 等待時間 | 平均等待時間 | | - | - | - | | P1 | 8 | | | P2 | 0 | | | P3 | 3 | 3.67 | --- ### 程序生命週期 1. 新產生 2. 執行 3. 等待 I/O 4. 就緒 5. 結束 ![圖片](https://hackmd.io/_uploads/S1u4MT8X-e.png) --- ### 動態載入 Dynamic Loading 常式在被呼叫時才會載入,先檢查使否存在記憶體,若沒有再從硬碟載入記憶體。 --- ### 覆蓋 Overlay 讓超過記憶體容量的程式能夠執行。 >[!Note]範例 >- 程式碼A : 80KB >- 程式碼B : 70KB >- 符號表 : 20KB >- 呼叫到的常式 : 30KB >- 覆蓋驅動程式 : 10KB >一共 200KB,假設記憶體 150KB >1. 載入符號表、常式、程式碼A、覆蓋驅動程式共 140KB >2. 載入程式碼B覆蓋掉A,共130KB ![圖片](https://hackmd.io/_uploads/S1bUzT8QWe.png) --- ### 檔案位置 - 絕對路徑 - 從==根目錄==開始 - 相對路徑 - 從當前目錄開始 >[!Note]路徑範例 (user3 -> hw1.docx) ![圖片](https://hackmd.io/_uploads/B1XvG6IQbx.png) >絕對路徑 : root/user1/Home-Work/hw1.docx >相對路徑 : ../user1/Home-Work/hw1.docx ## CH5 電腦網路 ### 網路類型 - 區域網路 (LAN) - 範圍小 - 速度快 - 廣域網路 (WAN) - 範圍大 - 跨國 --- ### 網路拓樸 Topologies - 匯流排 (Bus) - 共用一條線 - 一次只能一台傳輸 - 容易發生==碰撞== - ==CSMA/CD== 機制 (解決碰撞發生的情況) - 星狀 (Star) - 透過==交換器==連接 - 常見 - 容易除錯 - 環狀 (Ring) - ==單向傳輸== - 故障難找問題點 - 網狀 (Mesh) - 最常見的區網架構 - 所有訊息需透過==中心點==傳輸 --- ### 域名系統 DNS 將網址轉換成對應IP --- ### 傳輸媒介 - 電話線 - ==RJ-11== - 傳輸速率慢 - 須配合數據機 - 同軸電纜 - 匯流排架構 - 傳輸速度快 - 雙絞線 - ==RJ-45== - 順序標準 - 568-A 白綠、綠、白橙、藍、白藍、橙、白棕、棕 - 568-B ==白橙、橙、白綠、藍、白藍、綠、白棕、棕== - 跳線 - 一端使用568A、另一端568B - 連結兩種同裝置 - 光纎 - 速度最快 - 距離長 - 不受干擾 - ==單向傳輸== - 電磁波 - 不需線路 - 頻段有嚴格規範 - 2.4GHz、5GHz --- ### ==OSI七層模型== 封包傳輸會進行封裝,每一層會對其增加標頭 傳送資料 應用層 -> 實體層 接收資料 實體層 -> 應用層 1. 實體層 Physical - 將資料轉硬體訊號 - 傳送單位 : bit 2. 資料連結層 Data link - 處理區域網路內的連線 - ==IEEE 802.11== - 硬體位址 Mac Address - 由 6 ==組 8-bit 的十六進位數字組成==,用以識別硬體裝置 >[!Note]查詢所有網路卡位址 >==ipconfig /all== 3. 網路層 Network - 資料切割 - 辨識網路位址 - 傳送單位 : 封包 - ==IPv4、IPv6== - IP位址種類 : A、B、C、D、E >[!Note]私有 IP 範圍 >Class A : 10.0.0.0 ~ 10.255.255.255 >Class B : 172.16.0.0 ~ 172.31.255.255 >Class C : 192.168.0.0 ~ 192.168.255.255 >[!Tip]路由機制 >路由器透過路徑演算法計算最佳路徑 4. 傳輸層 Transport - 流量控制 - ==TCP、UDP== - 多工處理 >[!Tip]TCP / UDP >TCP >- 連接導向 >- 三向交握 >- ==可靠傳輸== > >UDP >- 非連接導向 >- 速度快 >- ==不可靠== >[!Note]常見 port 號 >- FTP : 21 >- SSH : 22 >- DNS : 53 >- HTTP : 80 >- POP3 : 110 5. 會議層 Session - RPC 允許使用者執行遠端不同的函式呼叫 - RTSP 建立多通道分別傳輸聲音及影像 - SSL 建立多通道傳輸需要加密的文件 6. 表達層 Presentation - 標準化方式處理使用者資料 - 解碼、解壓縮、加密... 7. 應用層 Application - 常見通訊協定 - 最貼近使用者 >[!Tip]Email 通訊協定 >- ==SMTP== >- ==POP3== >- ==IMAP== ![圖片](https://hackmd.io/_uploads/H1mtz6Im-x.png) --- ### TCP/IP 簡化的OSI模型,只有四層。 1. 網路存取層 2. 網際網路層 3. 傳輸層 4. 應用層 ![圖片](https://hackmd.io/_uploads/BkUqMaLXWe.png) --- ### 網路設備 - 網路卡 Network interface card - 第二層 - 有才能上網 - 中繼器 Repeater - 第一層 - ==延長網路線長度== - 增強訊號 - 集線器 Hub - 第一層 - 匯流排 - 有==碰撞問題== - 橋接器 Bridge - 第二層 - ==有線網路 802.3== - ==無線網路 802.11== - 交換器 Switch - 第二層 - 可以建立==硬體實體位址與網路孔連接埠關係== - 可==減少碰撞發生== - 路由器 Router - 第三層 - 封包傳送轉發 - 無線網路存取點 Wireless AP - 第二層 - 橋接無線網路 --- ### 電信網路 - 電話網路 - 線路交換 Circuit Switching - 電腦網路 - ==封包交換 Packet Switching== >[!Tip]POTS / PSTN >市內電話 : POTS (Plain Old Telephone Service) >公共電話 : PSTN (Public Switch Telephone Network) --- ### 無線射頻技術 RFID 透過特殊讀取裝置,用無線方式讀取。 >[!Note]常見使用 >- 一維碼 >- 二維碼 >- RFID >- 門禁卡 >- 悠遊卡 >[!Tip]NFC >基於RFID技術 >短距離、非接觸式通訊 ## CH6 網際網路 ### [OSI 七層模型](#OSI七層模型) 已補充於CH5 --- ### 基本設定與除錯工具 - 連線四要素 - ==IP位址== - ==網路遮罩 Netmask== - ==預設閘道 Gateway== - ==名稱伺服器 DNS Server== >[!Tip]常用指令 >==ipconfig /all== : 檢查 IP 設定與 MAC 位址 >==ping== : 檢查網路有沒有通 >==nslookup== : 檢查 DNS 解析是否正常 >==tracert== : 追蹤封包路徑 >==netstat -na== : 檢查目前網路連線狀態 >[!Note]網路遮罩範例 >IP : 192.168.001.234 >Netmask : 255.255.255.255 >換成二進位後做 ==AND== 運算 >結果 : ==192.168.001.000== --- ### 網路模擬工具 - Cisco Packet Tracer - 視覺化呈現[網路拓樸](#網路拓樸-Topologies)與線上學習 - GNS3 - 可模擬複雜的[網路拓樸](#網路拓樸-Topologies)與 VLAN 設定 - 主要以 Emulation 為主,==仿真模擬== - ==Wireshark== - 封包分析 - 封包攔截 ## CH7 網路應用 ## CH8 資訊安全 ### 基本原則 : CIA - 資料機密性 ( Confidentiality ) - ==防止第三人取得資料== - 資料完整性 ( Integrity ) - ==防止資料被竄改== - 系統可用性 ( Availability ) - ==確保資料和系統可即時取得== ### 加密 ( Encryption ) 把讀取的資料(本文)加以處理,轉為無法讀懂的方法 >[!Important] >#### 保障「資料機密性」 ### 加密可分為 [對稱式密碼 ( symmetric )](#對稱式密碼-(-symmetric-)) 和 [非對稱式密碼 ( asymmetric )](#非對稱式密碼-(-asymmetric-)) --- ### 對稱式密碼 ( symmetric ) **加解密用同一組密碼** #### 範例一 : 位移法 加密時每個字母向前移 N 位 解密時,改往後位移 N 位 >[!Note]範例 >凱薩加密法,即為 N = 3 #### 範例二 : 查表法 密碼有一個對照表,加解密用同一張表 >[!Caution] >若表被知道,就完了 #### 範例三 : 使用 XOR 運算 文字先轉 ASCII 後再轉二進位,並和密碼做 XOR 運算 >[!Tip] >XOR 運算 : >0 * 0 = 0 >0 * 1 = 1 >1 * 0 = 1 >1 * 1 = 0 >[!Note] >對稱式加密還有更多應用 >1. IDEA >2. DES ( 被破解 ) >3. AES ( 目前主流 ) >4. RCS --- ### 非對稱式密碼 ( asymmetric ) **加解密用不同密碼** #### 範例一 : RSA 演算法 ==( 圖靈獎 )== 用質數的因數分解做加解密 ==( Factorization )== >[!Important]RSA 的算法 >1. 先選兩質數 p , q,算 N = p * q >2. 算 φ = ( p - 1 ) ( q - 1 ) >3. 從 1 ~ φ ( N ) 中挑一數 e ,需和 φ ( N ) 互質 >4. 找出 d ,滿足「d * e ≡ 1 ( mod φ ( N ) )」 >[!Note]範例 >取 φ ( N ) = 40,e = 7 >→ 7 * d ≡ 1 ( mod 40 ) >→ 找 d = 23,7 * 23 = 161 ≡ 1 ( mod 40 ) >[!Important] >RSA 的發明人 : ==Ron Rivest==、==Adi Shamir==、==Leonard Adleman== #### 範例二 : 雜湊函數 ( Hash Function ) 將任意字串進行雜湊運算後,得到一固定長度的雜湊值 > [!Note]常見的雜湊函數 > - MD5 ( message digest 5 ) : 產生 128 - bit 的雜湊值 > - SHA - 1 ( secure hash algorithm 1 ) : 產生 160 - bit 的雜湊值 > - SHA - 256 ( secure hash algorithm 2 with 256 - bit digest ) : 產生256 - bit 的雜湊值 **雜湊函數的特性** 1. ==輸出的長度固定== 2. ==任一微小變化,結果完全不同== ( 雪崩效應 ) 3. ==單向函數== 4. ==不易發生碰撞 ( collision )== >[!Tip]應用 >目前大部分的 login 密碼幾乎以 hash function 存在 data base #### 數位簽章 ( Digital Signature ) 1. 不論原始資料長度為何,將要簽章的資料用 hash function 計算 2. 把雜湊值用數位簽章保護 >[!Important] >1. 能把資料長度縮短至 128 ~ 512 bit >2. 只需要針對 16 ~ 64 位元資料做保護 --- ### 網路攻擊 **目的 :** 1. 取得未授權的資訊 2. 中斷網路的正常運作 --- ### 常見的網路攻擊 ( 紅隊 ) #### 範例一 : 阻斷網路攻擊 ( ==Dos== ) > [!Important] > ==破壞可用性== 攻擊者會產生大量網路流量,耗盡目標的網路頻寬 >[!Note]Ex >產生大量 ping 封包、TCP 連線要求、UDP 封包 #### 範例一的進階 : 分散式阻斷網路攻擊 ( DDOS ) 透過一大群機器進行阻斷服務攻擊 ( 比 DOS 還要更多 IP,所以更難防 ) #### 範例二 : 主機入侵 ( ==Host-based intrusion== ) 通常是利用系統上的漏洞,且入侵後可再嘗試取得系統操作權限 >[!Note]常見 >- 網頁置換 **目的 :** 1. 竊取主機內的各種資料 2. 建置 「 釣魚網站 」 ( ==社交工程== ) #### 範例三 : 電腦病毒 ( ==Virus== ) 帶有惡意的程式碼 >[!Important]種類 >- 病毒 ( ==Virus== ) : 不斷自我複製並感染 >- 蠕蟲 ( ==Worm== ) : 透過網路傳播 >- 特洛伊木馬程式 ( ==Trojan Horse== ) : 植入後門進而竊取資訊 ### 網路防護 ( 藍隊 ) #### 範例一 : 防毒軟體 ( ==Antivirus Software== ) 選擇多樣 >[!Note]偵測方式 >- 病毒的定義檔 >- 「 啟發式 」的偵測方式 #### 範例二 : 防火牆 ( ==Firewall== ) 過濾規格可針對 OSI 協定的各層設定 >[!Tip] >防火牆通常置於 LAN 通往 WAN 的路上 ### 區塊鏈 **區塊鏈的目的為保護有相依性的紀錄不被修改** 把須被保護的紀錄 ( 區塊 ) 按關聯性串在一起,並用 Hash Function 對鏈上相鄰的資料進行完整性的驗證 ![圖片](https://hackmd.io/_uploads/HJ32MaLQWl.png) ### POW ( Proof - Of - Work ) 方法 若給定一個要新增到鏈結裡的區塊鏈資料以 X 表示,在驗證程序中,必須找出一個數值 k ,計算雜湊值 V = hash ( X , k ) ,並使 V 值前面 n 位數的值為 0 >[!Important] >比特幣的主要運作原理 ### 比特幣運作 ![圖片](https://hackmd.io/_uploads/H1qaM6IQbg.png) #### Miner ( 礦工 ) : 會把很多個交易打包成一個區塊 >[!Important] >主要用 hash 算出區塊,並讓每個交易加入區塊 >區塊被發現後有獎勵金,且區塊內的交易要給礦工交易費 **每個用戶都有一個 ==地址==、==公鑰==、==私鑰==** **比特幣的運作流程** ##### 1. 新的交易廣播給所有節點知道 ##### 2. 節點把收到的交易蒐集好,準備放入一個新的區塊 ##### 3. 針對新的區塊,每個節點開始進行 POW 驗證 ##### 4. 一旦完成 POW,完成 POW 的節點將這個區塊的結果廣播給網路中的其他節點 ##### 5. 收到通知的節點可以驗證區塊中的交易內容和 POW 結果是否正確,並接收他 ##### 6. 一旦新的區塊通過驗證並被接受,節點們重複這個流程和產生新的區塊 >[!Warning] >- 如果有人假冒 A ? ==不可能被假冒 ( 沒有私鑰 )== >- 每個區塊的交易量是否唯一 ? ==否== >- 會不會有交易,沒有礦工打包 ? ==通常不會 ( 可以賺錢 )== >- 礦工算出下一個區塊但不發布 ? ==通常不會 ( 怕被搶先 )== --- ### 後量子密碼學 希望在不依靠量子電腦的情況下,也可以設計抵抗量子電腦破解密碼的方法 ## CH9 程式語言 - [FORTRAN](#FORTRAN) - [LISP](#LISP) - [COBOL](#COBOL) - [BASIC](#BASIC) - [PASCAL](#PASCAL) - [C 語言](#C-語言) - [PROLOG](#PROLOG) - [ADA](#ADA) - [C++](#C++) - [Python](#python) - [Java](#Java) - [Javascript 和 ASP.NET](#Javascript-和-ASP.NET) - [Kotlin 和 Swift](#Kotlin-和-Swift) --- ### FORTRAN **第一個高階語言** **程式敘述像==數學式子==** --- ### LISP **不強調運算速率,提供彈性的==符號==和==運算式==** --- ### COBOL **專為商業資料處理而設計的語言** **有==便利的檔案描述==、重視==資料的定義==** --- ### BASIC **DOS作業系統有內建開發環境** **微軟推出 Visual Basic** **不須明確==指出資料型態==** --- ### PASCAL **完備的==資料型態==和結構化的==控制結構==,很有效率** **==可讀性高==** --- ### C 語言 **高階的==結構化敘述==** **具備類似低階語言的==硬體控制能力==** #include <stdio.h> int main(void) { printf("Hello, world!"); return 0; } --- ### PROLOG **==邏輯化程式設計==的代表** **專門設計邏輯推論,專家系統** **和 LISP 一樣是 AI 的重要工具** --- ### ADA **原先是希望結合所有語言的特性,但後來發現過於困難且實際上語法很難,所以不普及** --- ### C++ **==物件導向程式語言==的代表** **強調==物件==的設計、==訊息的傳送==** **更有==模組化==的概念、更易維護** **C 語言為 C++ 的子集合** --- ### Python **==可擴充==、提供多種==API==和==模組==** **==開源==** **==簡單==、高度可讀性、彈性** --- ### Java **和 C++ 一樣是==物件導向==** **提供==跨平台==功能** >[!Note]跨平台功能 >同程式可在不同環境運行 --- ### Javascript 和 ASP.NET **Javascript 可直接編寫在網頁標記中** **微軟提出一系列「 .NET 」,其中包括 ASP.NET 的開發平台,將程式分成 HTML 和 Script 的區塊,==物件導向==** --- ### Kotlin 和 Swift **Swift 比 C 語言==更快==、==現代==、==安全==、更有==互動性==** **Kotlin 和 Java 的標準程式庫的==環境相容==,可在 Android 上運行,且沒有專利** --- ### 以上的程式語言比較 | 類型 | 語言 | 描述 | | - | - | - | | 程序式 | FORTRAN、COBOL、BASIC、PASCAL、C 語言、ADA | 程式由==有順序==的指令組成 | | 物件導向程式語言 | C++、Python、Java、Javascript、ASP.NET、Kotlin、Swift | 有==封裝性的物件==為核心 | | 函數式 | LISP | 程式由==運算式==組成 | | 邏輯式 | PROLOG | ==邏輯判斷==寫法 | --- ### 資料類型 #### 數 : **整數 ( int ) : 32 bits** **長整數 ( long int ) : 32 bits** **短整數 ( short int ) : 16 bits** **浮點數 ( float ) : 32 bits** **雙精準數 ( double ) : 64 bits** >[!Warning] >在 ==32 - bit 系統==中,整數和長整數都是 32 bits 且表示範圍都是 - 2^31^ ~ 2^31^ - 1,但在 ==64 - bit 系統==中,長整數的大小是 64 bits,整數是 32 bits #### 文字 : **字元 ( char ) : 8 bits** **字串 ( string )** >[!Important] >編譯器會檢查該變數在任何地方出現是否恰當 ## CH10 資料結構 - [陣列](#陣列) - [鏈結串列 ( link list )](#鏈結串列-(-link-list-)) - [堆疊 ( stack )](#堆疊-(-stack-)) - [佇列 ( Queue )](#佇列-(-Queue-)) - [樹狀結構 ( Tree )](#樹狀結構-(-Tree-)) --- ## 陣列 **一系列相同型態的資料** >[!Warning] >陣列裡,第一個元素位置是0 **陣列可以很快的決定某個註標在記憶體的位置** int array[5]; array[0] = 1; array[1] = 2; arrat[2] = 3; array[3] = 4; array[4] = 5; ### 二維陣列 **int array [ i ][ j ];** **i : 有幾列** **j : 有幾行** >[!Important]陣列的儲存方式 >陣列在記憶體內是先存第一列再存第二列,以此類推 int array2[2][3] = {{0,1,2}, {3,4,5}}; ## 鏈結串列 ( link list ) **利用指標建立鏈結串列,來表示不確定大小或會動態增減的資料** >[!Note]優點 >**1. 可以避免需要預先知道資料大小的缺點,能靈活運用記憶體空間** >**2. 鏈結串列無法隨機讀取** >[!Warning]缺點 >**每個節點需要較大記憶體空間,程式執行較容易出錯** void insert(struct node *p, int new_item) { struct node *temp = malloc(sizeof (struct node)); temp -> data = new_item; temp -> next = p; p = temp; }; ## 堆疊 ( stack ) **採用==後進先出 ( LIFO )==、==先進後出==** >[!Tip] >類似網球桶式的堆疊 ==push : 加入== ==pop : 丟出來== push : void push (int data) { top = top + 1; stack[ top ] = data; } pop : int pop() { top = top - 1; return stack[ top + 1 ]; } ## 佇列 ( Queue ) **採用==先進先出 ( FCFS )==** >[!Tip] >**佇列可以想成一根水管** ==put : 加入 ( 對應 push )== ==get : 拿出 ( 對應 pop )== put : void put (int data) { rear = rear + 1; queue[ rear ] = data; } get : int get() { front = front + 1; return queue[ front ]; } ## 樹狀結構 ( Tree ) **樹由 ==node ( 節點 )== 和 ==edge ( 邊 )== 組成** >[!Note] >external node ( 外節點 ) : 樹的最下層 >internal node ( 內節點 ) : 樹的中間層 >樹的高度 ( height ) : 根節點 ~ 葉節點的最長距離 ### 樹的探訪 + / \ * * / \ / \ A B C D #### 前序法 ( preorder ) **==+ * AB * CD==** >[!Important] >先把父節點印出,再用遞迴印出左子節點,最後再用一樣方法處理右子樹 #### 中序法 ( inorder ) **==A * B + C * D==** >[!Important] >先把左子樹印出後,再印父節點,最後處理右子樹 #### 後序法 ( postorder ) **==AB * CD * +==** >[!Important] >先用 2 個遞迴把左子樹和右子樹都印出,再處理父節點