Contents 前前前言言言 xix 關關關於於於「「「批批批改改改娘娘娘」」」 xxiii 1 程程程式式式設設設計計計 1 1.1 程式 ..........................................1 1.1.1 高階語言 ....................................1 1.1.2 編譯器 .....................................2 1.2 設計 ..........................................2 1.2.1 流程圖 .....................................2 1.2.2 編輯 .......................................2 1.2.3 編譯 .......................................3 1.2.4 執行 .......................................5 2 基基基本本本程程程式式式架架架構構構 9 2.1 程式骨架 ........................................9 2.2 變數 ..........................................9 2.3 輸出 ..........................................11 2.4 輸入 ..........................................13 3 運運運算算算 15 3.1 指定 ..........................................15 3.1.1 交換變數值 ...................................16 3.1.2 指定敘述算式 .................................17 3.2 運算 ..........................................18 3.2.1 算術運算 ....................................18 3.2.2 比較運算 ....................................27 3.2.3 邏輯運算 ....................................30 4 判判判斷斷斷 35 4.1 if 判斷 ........................................35 4.1.1 if 語意 .....................................35 4.1.2 ifthenelse 語意 ..............................37 4.1.3 巢狀 if.....................................41 4.2 判斷式值 ........................................43 4.2.1 絕對值 .....................................44 4.2.2 三者最大值 ...................................44 i i
4.2.3 面積周長 ....................................45 4.3 switch 判斷 .....................................45 4.3.1 計算次方 ....................................47 4.3.2 計算天數 ....................................48 4.3.3 算數運算 ....................................49 4.3.4 #define ....................................50 4.3.5 比較運算 ....................................51 5 迴 迴 迴圈 圈 53 5.1 while 迴圈 ......................................53 5.1.1 複合敘述 ....................................54 5.1.2 數列和 .....................................54 5.1.3 最大公因數 ...................................55 5.2 for 迴圈 .......................................56 5.2.1 固定次數迴圈 .................................57 5.2.2 質數判斷 ....................................58 5.2.3 複合敘述 ....................................59 5.2.4 長除法模擬 ...................................60 5.2.5 檢查 11 的倍數 .................................61 5.3 dowhile 迴圈 ....................................62 5.3.1 複合敘述 ....................................63 5.4 break .........................................64 5.5 continue .......................................66 5.6 巢狀迴圈 ........................................68 6 標 標 標準 準輸 輸入 入輸 輸出 出 69 6.1 輸入資料 ........................................69 6.1.1 長除法模擬 ...................................70 6.1.2 檢查 11 的倍數 .................................71 6.2 輸出訊息 ........................................72 6.2.1 輸出中加入空白及換行 ............................72 6.2.2 輸出中加入字串 ................................73 6.3 多變數輸出入 .....................................74 6.4 格式輸出入操控子 ..................................76 7 陣 陣 陣列 列 79 7.1 屬性 ..........................................79 7.2 維陣列 ........................................80 7.2.1 初始化 .....................................80 7.2.2 迴圈處理 ....................................81 7.3 assert ........................................83 7.4 一維陣列應用 .....................................84 7.4.1 尋找特定值 ...................................84 7.4.2 計算內積 ....................................85 7.4.3 費伯納西數 ...................................86 7.4.4 質數判定 ....................................87 7.4.5 泡沫排序法 ...................................89 i
7.4.6 記憶體配置 ...................................90 7.5 多維陣列 ........................................93 7.5.1 用法 .......................................93 7.5.2 初始化 .....................................93 7.5.3 矩陣相乘 ....................................95 7.5.4 質數 .......................................98 7.5.5 記憶體配置 ...................................99 7.6 多維陣列應用 .....................................105 7.6.1 生命遊戲 ....................................105 7.6.2 鏡子房間 ....................................107 7.6.3 繞圈 .......................................109 7.6.4 井字遊戲 ....................................111 8 浮 浮點 點數 數 113 8.1 宣告 ..........................................113 8.2 位元組數 ........................................113 8.3 輸出與輸入 ......................................114 8.4 類別轉換 ........................................114 8.4.1 靜態轉型 ....................................115 8.4.2 計算平均 ....................................116 8.5 泰勒展開式 ......................................117 8.5.1 float 計算級數 ................................117 8.5.2 double 計算級數 ...............................118 8.5.3 不直接算階乘 .................................119 8.6 開平方根 ........................................119 9 函 函式 式 121 9.1 呼叫函式 ........................................121 9.1.1 標頭檔 .....................................123 9.1.2 函式原型 ....................................123 9.1.3 檢查函式回傳值 ................................124 9.1.4 程式庫 .....................................125 9.2 定義有回傳值的函式 .................................125 9.2.1 回傳值 .....................................125 9.2.2 主程式 .....................................125 9.2.3 決定閏年 ....................................126 9.3 定義無回傳值的函式 .................................130 9.3.1 將各位數分別印出 ...............................130 9.4 多個參數的函式 ....................................132 9.4.1 計算天數 ....................................132 9.4.2 印出連續整數 .................................133 9.4.3 算式判斷 ....................................134 9.4.4 比較判斷 ....................................135 9.5 參數傳遞 ........................................137 9.5.1 形式與實際參數 ................................137 9.5.2 陣列參數傳遞 .................................139 9.5.3 多維陣列參數 .................................145 v
9.5.4 預設參數值 ...................................146 9.6 生命遊戲 ........................................148 9.6.1 readLife ...................................148 9.6.2 evolve ....................................149 9.6.3 printLife ..................................149 9.6.4 main ......................................150 9.7 鏡子房間 ........................................151 9.7.1 init ......................................151 9.7.2 setDir、setRow、setCol .........................151 9.7.3 inRoom ....................................152 9.7.4 windowIndex .................................152 9.7.5 main ......................................153 9.8 井字遊戲 ........................................154 9.8.1 init ......................................154 9.8.2 playerToMove ................................154 9.8.3 play ......................................155 9.8.4 win .......................................155 9.8.5 main ......................................156 9.9 結語 ..........................................157 10 指 指 指標 標 159 10.1 指標變數 ........................................159 10.1.1 宣告 .......................................159 10.1.2 大小 .......................................160 10.1.3 取值 .......................................160 10.1.4 nullptr ....................................161 10.1.5 綜合說明範例 .................................162 10.1.6 取記憶體位址 .................................163 10.2 指標參數傳遞 .....................................165 10.2.1 藉由指標交換變數值 ..............................165 10.2.2 藉由指標改變變數值 ..............................166 10.3 指標與陣列 ......................................169 10.3.1 利用指標改陣列元素 ..............................170 10.3.2 指標的陣列語法 ................................171 10.3.3 指標算術 ....................................173 10.3.4 多維陣列指標 .................................174 10.4 指標回傳值 ......................................176 10.5 用途與限制 ......................................178 10.5.1 用途 .......................................178 10.5.2 限制 .......................................179 11 參 參 參考 考類 類別 別 181 11.1 宣告及初始 ......................................181 11.1.1 語法 .......................................181 11.1.2 位元組數 ....................................182 11.1.3 指定 .......................................182 11.1.4 參考變數範例 .................................183 v
11.2 參數傳遞 ........................................184 11.2.1 交換變數值 ...................................185 11.2.2 參考參數傳遞 .................................186 11.3 參考回傳值 ......................................189 11.4 參考應用 ........................................193 12 字 字元 元 195 12.1 宣告 ..........................................195 12.2 輸出 ..........................................195 12.3 字元常數 ........................................197 12.4 輸入 ..........................................200 12.4.1 get 及 put ..................................200 12.4.2 eof .......................................202 12.5 常用函式 ........................................204 12.5.1 字元分類函式 .................................204 12.5.2 字元轉換函式 .................................207 13 宣 宣告 告修 修 飾 飾 209 13.1 修飾大小 ........................................209 13.1.1 位元組數 ....................................209 13.1.2 輸出格式 ....................................210 13.1.3 溢位 .......................................211 13.2 有號及無號 ......................................211 13.3C++11 標準類別 ...................................212 13.3.1C++11 有號整數 ...............................212 13.3.2C++11 無號整數 ...............................213 13.3.3 溢位 .......................................214 13.4 常數 ..........................................214 13.4.1 常數參數 ....................................216 13.4.2 常數陣列 ....................................217 13.4.3 常數指標 ....................................218 13.4.4 常數參考 ....................................219 13.5 靜態宣告 ........................................221 13.5.1 靜態變數 ....................................222 13.6 auto ..........................................223 14 字 字串 串 225 14.1 宣告及輸出入 .....................................225 14.1.1 輸出入 .....................................226 14.1.2 eof .......................................227 14.1.3 getline ....................................228 14.2 串接 ..........................................230 14.3 字串常數 ........................................231 14.4 操作函式 ........................................232 14.4.1 empty 及 clear ...............................232 14.4.2 length ....................................233 14.4.3 複製 .......................................234 v
14.4.4 連結 .......................................235 14.4.5 修改 .......................................236 14.4.6 比較 .......................................238 14.4.7 部分字串 ....................................241 14.4.8 部分字串 substr ...............................243 14.5C-style 字串 ......................................244 14.5.1 位元組數 ....................................244 14.5.2 初始化 .....................................245 14.5.3 慣例結尾 ....................................245 14.5.4 輸入 .......................................246 14.6 簡易 BASIC 解譯器 .................................249 14.6.1BASIC.....................................250 14.6.2 函式說明 ....................................250 14.6.3 readVariable ................................251 14.6.4 processCode .................................251 14.6.5 runCode ....................................254 14.6.6 用 BASIC 求質數的程式 ...........................254 15 位 位 位元 元 元運 運算 算 261 15.1 宣告 ..........................................261 15.2 檢查位元 ........................................262 15.2.1 [] 語法 .....................................262 15.2.2 set 及 reset .................................263 15.3 位元且 .........................................264 15.4 位元或 .........................................265 15.5 位元互斥或 ......................................266 15.5.1 位元互斥互換 .................................267 15.6 位元互補 ........................................268 15.7 位元數目排序 .....................................268 15.7.1 bitset 排序 .................................269 16 結 結構 構 271 16.1 結構宣告 ........................................271 16.2 結構欄位 ........................................272 16.3 表列初始 ........................................273 16.4 結構指標 ........................................274 16.4.1 -> 取欄位 ...................................275 16.5 記憶體位址 ......................................276 16.5.1 結構大小 ....................................276 16.5.2 欄位擺放與對齊 ................................277 16.6 參數傳遞 ........................................279 16.6.1 有理數範例 ...................................279 16.6.2 指標傳遞 ....................................282 16.6.3 參考傳遞 ....................................284 16.7 標頭檔 .........................................286 16.7.1 有理數 .....................................286 16.7.2 日期 .......................................289 v
16.7.3 學生 .......................................290 16.8 生命遊戲 ........................................292 16.8.1 標頭檔 .....................................292 16.8.2 操作函式 ....................................292 16.9 鏡子房間 ........................................295 16.9.1 initRoom ...................................295 16.9.2 setDir ....................................295 16.9.3 setMovement .................................296 16.9.4 changeDir 及 oneStep ...........................296 16.9.5 inRoom 及 windowIndex ..........................297 16.9.6 hasMirror ..................................297 16.9.7 主程式 .....................................298 16.10 繞圈 ..........................................298 16.10.1 initBoard ..................................299 16.10.2 printBoard .................................299 16.10.3 changeDir 及 oneStep ...........................300 16.10.4 主程式 .....................................300 16.11 位元數目排序 .....................................301 16.11.1 readNumberComputeOnes .........................301 16.11.2 sortNumberSet ...............................302 16.11.3 printNumberSet ..............................302 16.11.4 主程式 .....................................303 16.12 井字遊戲 ........................................304 16.12.1 init ......................................304 16.12.2 playerToMove 及 playerMoved .....................304 16.12.3 play ......................................305 16.12.4 win .......................................305 16.12.5 主程式 .....................................306 16.13 簡易 BASIC 解譯器 .................................307 16.13.1 結構宣告 ....................................307 16.13.2 操作函式 ....................................308 16.13.3 readVariable ................................309 16.13.4 processCode .................................310 16.13.5 runCode ....................................313 16.13.6 主程式 .....................................314 16.14 結語 ..........................................315 17 模 模組 組 化 化 317 17.1 vector ........................................317 17.1.1 初始化 .....................................317 17.1.2 調整大小 ....................................317 17.1.3 存取 .......................................318 17.1.4 存取範例 ....................................319 17.1.5 批次初始 ....................................320 17.1.6 搜尋 .......................................321 17.2 生命遊戲 ........................................322 i
17.2.1 個別檔案 ....................................323 17.2.2 個別編譯檔案 .................................325 17.2.3 聯結個別目的檔 ................................326 17.2.4 優點 .......................................326 17.3 井字遊戲 ........................................327 17.3.1 個別檔案 ....................................327 17.3.2 個別編譯檔案 .................................330 17.4 鏡子房間 ........................................330 17.4.1 標頭檔 .....................................331 17.4.2 操作函式 ....................................332 17.4.3 movement.cc .................................332 17.4.4 room.cc ....................................332 17.4.5 主程式 .....................................334 17.4.6 個別編譯並聯結 ................................335 17.5 繞圈 ..........................................335 17.5.1 標頭檔 .....................................336 17.5.2 操作函式 ....................................336 17.5.3 主程式 .....................................337 17.5.4 個別編譯並聯結 ................................338 17.5.5 重複標頭檔 ...................................338 17.6BASIC.........................................339 17.6.1 標頭檔 .....................................339 17.6.2 操作函式 ....................................340 17.6.3 主程式 .....................................345 17.6.4 個別編譯並聯結 ................................346 18 類 類別 別 347 18.1 井字遊戲 ........................................347 18.1.1 TicTacToe 類別宣告 .............................347 18.1.2 TicTacToe 實作 ...............................349 18.2 權限 ..........................................351 18.3 類別與結構 ......................................354 18.4 建構子 .........................................354 18.5 常數成員函式 .....................................355 18.6 類別與實體 ......................................356 18.6.1 Position ...................................356 18.6.2 初始列 .....................................358 18.6.3 實體 .......................................360 18.7 類別成員 ........................................360 18.7.1 Movement ...................................360 18.7.2 實作 .......................................361 18.7.3 類別成員範例 .................................363 18.8 鏡子房間 ........................................364 18.8.1 Room ......................................364 18.8.2 Room 實作 ...................................365 18.8.3 主程式 .....................................366 x
18.9 繞圈 ..........................................368 18.9.1 Board .....................................368 18.9.2 主程式 .....................................369 18.10 生命遊戲 ........................................371 18.10.1 Life ......................................371 18.10.2 Life 實作 ...................................371 18.10.3 主程式 .....................................373 18.11BASIC.........................................374 18.11.1 Variable ...................................374 18.11.2 VariableSet .................................375 18.11.3 Statement ..................................376 18.11.4 Program ....................................380 18.12 有理數 .........................................382 18.12.1 轉換建構子 ...................................385 19 遞 遞迴 迴 387 19.1 定義 ..........................................387 19.1.1 自然數判定 ...................................387 19.2 費伯納西數 ......................................389 19.2.1 遞迴實作 ....................................389 19.3 計算時間 ........................................390 19.4 constexpr ......................................392 19.4.1 使用 constexpr ...............................392 19.4.2 不使用 constexpr ..............................394 19.5 最大公因數 ......................................395 19.6 遞迴實作 ........................................395 19.7 三位撇節法 ......................................397 19.7.1 字串遞迴實作 .................................397 19.7.2 數字遞迴實作 .................................398 19.8 河內塔 .........................................399 19.8.1 遞迴解 .....................................399 19.8.2 遞迴實作 ....................................400 19.9 八后問題 ........................................403 19.9.1 遞迴窮舉解 ...................................403 19.9.2 遞迴實作 ....................................403 19.9.3 列出遞迴過程 .................................407 19.10 老鼠走迷宮 ......................................410 19.10.1 Maze ......................................411 19.10.2 Maze 操作函式 ................................411 19.10.3 主程式 .....................................413 19.11 數獨 ..........................................414 19.11.1 Sudoku ....................................415 19.11.2 Sudoku 成員函式 ...............................416 19.11.3 窮舉流程 ....................................418 19.11.4 主程式 .....................................419 19.12 疊紙片 .........................................420 x
20.5.2 衍生類別使用基礎類別功能 ..........................439
20.5.3 衍生類別增加基礎類別沒有的功能
20.5.4 數獨主程式
20.6 井字遊戲 ........................................441
20.6.1 TicTacToe 函式成員
20.6.2 衍生類別使用基礎類別功能
20.6.3 衍生類別增加基礎類別沒有的功能
20.6.4 主程式
19.12.1 Paper .....................................420 19.12.2 Solution ...................................421 19.12.3 PaperStack .................................422 19.12.4 主程式 .....................................423 19.13 效能考量 ........................................425 20 繼 繼 繼承 承 427 20.1 基礎類別 ........................................427 20.1.1 頂層函式 ....................................428 20.1.2 函式成員 ....................................429 20.2 多載 ..........................................430 20.3 繞圈 ..........................................430 20.4 老鼠走迷宮 ......................................431 20.4.1 Maze 函式成員 ................................432 20.4.2 衍生類別使用基礎類別功能 ..........................433 20.4.3 衍生類別增加基礎類別沒有的功能 ......................434 20.4.4 衍生
..........................435
...............................435 20.5
..........................................436
...............................437
類別改寫基礎類別功能
20.4.5 老鼠走迷宮主程式
數獨
20.5.1 Sudoku 函式成員
......................440
...................................440
.............................442
..........................444
......................444
.....................................444 20.7 生命遊戲 ........................................446 20.7.1 衍生類別使用基礎類別的功能 ........................446 20.7.2 Life 函式成員 ................................446 20.7.3 衍生類別增加基礎類別沒有的功能 ......................447 20.7.4 主程式 .....................................447 20.8 鏡子房間 ........................................449 20.8.1 Room 函式成員 ................................449 20.8.2 衍生類別使用基礎類別的功能 ........................451 20.8.3 衍生類別增加基礎類別沒有的功能 ......................451 20.8.4 鏡子房間主程式 ................................451 21 運 運算 算子 子 453 21.1 運算子函式 ......................................453 21.2 位元數目排序 .....................................453 21.2.1 實作 .......................................454 21.2.2 主程式 .....................................455 21.3 有理數 .........................................456 21.3.1 實作 .......................................456 21.3.2 運算子測試 ...................................458 x
21.3.3 泡沫排序 ....................................459 21.3.4 演算法程式庫 .................................461 21.3.5 自定比較函式 .................................462 21.4 比較 1 位元個數 ...................................463 21.5lambdafunction ...................................465 21.5.1capture.....................................465 21.5.2 有理數排序 ...................................465 21.6 位元數目排序重構 ..................................467 21.7 頂層運算子函式 ....................................469 21.7.1 實作 .......................................469 21.7.2 測試 .......................................471 21.8 錯誤處理 ........................................472 21.8.1 例外 .......................................472 21.8.2 機制 .......................................473 21.8.3 運算元函式例外 ................................474 21.8.4 讀入 Rational ................................475 21.8.5 讀入所有 Rational .............................476 21.9 隱藏類別轉換 .....................................478 21.9.1 隱藏類別轉換分類 ...............................479 21.9.2 有理數 .....................................479 21.9.3 函式參數 ....................................481 21.10 explicit .......................................484 22 鏈 鏈結 結序 序 列 列 487 22.1 資料結構 ........................................487 22.2 記憶體配置 ......................................487 22.2.1 區域變數 ....................................487 22.2.2 動態記憶體配置 ................................489 22.3 名稱空間 ........................................490 22.3.1 宣告名稱空間 .................................491 22.3.2 名稱空間用法 .................................491 22.4 鏈結序列 ........................................492 22.4.1 鏈結序列及節點 ................................492 22.4.2 函式成員 ....................................494 22.4.3 函式成員實作 .................................496 22.4.4 鏈結序列操作 .................................498 22.5 鏈結序列遞迴實作 ..................................499 22.6 排序鏈結序列 .....................................502 22.6.1 insert 函式成員 ...............................503 22.6.2 函式成員實作 .................................505 22.6.3 SortedList 操作 ..............................506 22.6.4 函式成員實作 .................................507 22.6.5 遞迴實作測試 .................................508 22.6.6 刪除節點 ....................................509 22.7 鏈結序列範例 .....................................512 22.7.1 記憶體管理 ...................................512 x
22.7.2 合併鏈結序列 .................................519 22.8 堆疊 ..........................................524 22.8.1 費伯納西數 ...................................524 23 移 移 移動 動與 與深 深度 度複 複 製 製 527 23.1 指標物件問題 .....................................528 23.1.1 Integer ....................................528 23.1.2 鏈結序列 ....................................532 23.2 移動 ..........................................535 23.2.1 左值與右值 ...................................536 23.2.2 移動機制 ....................................536 23.2.3 Integer ....................................536 23.2.4 LinkedList .................................539 23.3 深度複製 ........................................541 23.3.1 Integer ....................................541 23.3.2 LinkedList .................................545 23.4 建構子 .........................................548 24 智 智 智慧 慧指 指標 標 549 24.1 共享指標 ........................................550 24.1.1 鏈結序列 ....................................552 24.2 唯 指標 ........................................555 24.2.1 鏈結序列 ....................................557 25 二 二 二元 元樹 樹 561 25.1 節點類別 ........................................561 25.1.1 別名 .......................................562 25.1.2 名稱空間 ....................................562 25.1.3 函式成員 ....................................562 25.2 二元樹 .........................................563 25.2.1 函式成員 ....................................564 25.2.2 遍歷 .......................................565 25.2.3 搜尋 .......................................566 25.2.4 範例 .......................................566 25.3 二元搜尋樹 ......................................568 25.3.1 類別 .......................................568 25.3.2 函式成員 ....................................569 25.3.3 範例 .......................................571 25.3.4 由大到小 ....................................573 25.4 重建二元樹 ......................................575 25.4.1 實作 .......................................575 25.4.2 範例 .......................................578 25.5 二元樹交集及聯集 ..................................580 25.5.1 遞迴定義 ....................................582 25.5.2 頂層函式實作 .................................582 25.5.3 頂層函式測試 .................................583 25.5.4 繼承類別實作 .................................589 xi
25.5.5 繼承類別測試 .................................590 25.5.6 新類別實作 ...................................593 25.5.7 新類別測試 ...................................596 25.5.8 比較 .......................................603 26 多 多型 型與 與 虛 虛 擬 擬 函 函 式 式 式 605 26.1 函式綁定 ........................................605 26.1.1 靜態綁定 ....................................605 26.1.2 動態綁定 ....................................608 26.2 多型 ..........................................612 26.3BASIC.........................................613 26.3.1 Statement.h .................................614 26.3.2 statement.cc ................................618 26.3.3 program.h ..................................620 26.3.4 program.cc .................................621 26.3.5BASIC 主程式 .................................622 27 檔 檔案 案處 處 理 理 625 27.1 開啟與關閉檔案 ....................................626 27.1.1 開啟檔案 ....................................626 27.1.2 關閉檔案 ....................................627 27.2 標準檔案指標 .....................................627 27.3 文字檔案處理 .....................................627 27.3.1 以字元為單位 .................................627 27.3.2 以行為單位 ...................................635 27.3.3 以變數為單位 .................................637 27.4 二進制檔案處理 ....................................638 27.4.1 印出檔案內容 .................................638 27.4.2 輸出入緩衝區 .................................639 27.4.3 結構陣列 ....................................641 27.5 移動讀寫位置 .....................................644 27.5.1 輸入檔 .....................................644 27.5.2 輸入檔 .....................................645 27.5.3 應用 .......................................645 27.6 EOF ..........................................650 28 運 運算 算 子 子 及 及 多 多 載 載 載 653 28.1 運算子 .........................................653 28.2 二元樹交集聯集 ....................................653 28.2.1 聯集交集實作 .................................654 28.2.2 實作測試 ....................................655 28.3 函數 ..........................................659 28.3.1 樹狀結構 ....................................659 28.3.2 Function 基礎類別 .............................660 28.3.3 Function 衍生類別 .............................663 28.3.4 變數與常數 ...................................663 28.3.5 二元運算子 ...................................665 xv
28.3.6 元運算子 ...................................671 28.3.7 Function 主程式 ...............................675 28.3.8 檔案關係 ....................................677 28.3.9 動態轉型 ....................................678 28.4 檔案輸入 ........................................679 28.4.1 檔案輸出 ....................................682 29 模 模 模板 板 685 29.1 類別模板 ........................................685 29.1.1 Stack 模板 ..................................686 29.1.2 括號平衡 ....................................688 29.1.3 費伯納西數 ...................................691 29.1.4 深度優先搜尋 .................................693 29.1.5 河內塔 .....................................693 29.1.6 八后問題 ....................................696 29.1.7 類別模板優點 .................................698 29.2 函式模板 ........................................699 29.2.1 輸出模板 ....................................699 29.2.2 深度優先搜尋模板 ...............................702 29.2.3 合併 .......................................711 29.2.4 彈性合併 ....................................718 29.2.5 函式模板優點 .................................724 29.3 別名模板 ........................................724 30 前 前 前置 置處 處理 理 727 30.1 引入 ..........................................727 30.2 定義 ..........................................727 30.3 條件編譯 ........................................728 30.3.1 命令列選項 ...................................729 30.3.2 重複定義 ....................................729 30.3.3 是否定義 ....................................730 30.4 巨集函數 ........................................730 30.5 #、 LINE 、 FILE ...............................732 30.6 ## ...........................................733 30.7 應用 ..........................................737 31 不 不 不想 想教 教的 的東 東西 西 739 31.1 goto ..........................................739 31.1.1 問題 .......................................739 31.2 全域變數 ........................................742 31.2.1 問題 .......................................742 31.3 多重繼承 ........................................744 31.4 保護及私有繼承 ....................................744 31.5 朋友類別及函式 ....................................745 31.6 輸出格式 ........................................745 31.7 指標技巧 ........................................745 31.8 修改記憶體 ......................................745 xv
31.9 征服銀河系 ......................................745 徵徵徵引引引書書書目目目 747 Index xv 749
發 表 了一些 論 文 [1,2,3]。 這 些 論 文 的 程 式 都 是 用 C++ 開 發的 , 使 用 的 C++ 也 都 是 偏 應
用。 回台灣後又在中正大學教過五年的物件導向程式設計。 這時才開始對 C++ 有比較學理上 的探討,瞭解也比較全面。
以上 說 的 都 是 傳 統 C++。 現 代 C++ 從 C++11 開 始 就 引 入 大 量 的 改 變 , 使 得 程 式 的 表 達 能 力 更 強 大 , 機 制 也 更 加 有 彈 性 , 但 是 也 更 加 複 雜 , 對 初 學 者 有 相 當 的 難 度 。 這 本 書 針 對 的 讀
者 是 高 中 及 大 學 剛 開 始 學 C++ 的 初 學 者 , 以 及 所 有 想 學 好 程 式 設計 的 朋 友 。 希 望 讀 者 讀 完 這 本 書 後 , 對 C++11 能 有 初 步 的 認識 。 我 特 地 用 中 文 寫 , 這 樣 可 以 避 免 語言 障 礙 , 希 望 高 中 生 也 能 看 得 懂 。 正 因 為 是 給 初 學 者 看 的 書 , 所 以 簡 化 了 很 多 地 方 , 這 些 都 是 針 對 初 學 者 做 調 整 ,
對 C++ 熟練的讀者可能需要瞭解這點。
這 本 書 的 寫 法 是 以 重 重 重 構 構 (refactor) 為 中 心 , 也 就 是 以一 再 改 寫 來 引 導 初 學 者 。 這 本 書 分 為 兩 個 部 分 , 第 個 部 分到第 7 章 為 止 講 述 C++ 基 本 觀 念 , 為 重 構 做 準 備 。 第 二 個 部 分 是 這 本 書 的 主 要 核 心 , 藉 由 重 構 逐 一介 紹 C++ 的 進 階 觀 念 。 在 我 教 程 式 語言 的 經 驗 中 , 學 生 往往 知 道 一 個 機 制 , 但 是 卻 不 會 實 際 運 用 , 這 在 C++ 這 種 複 雜 的 程 式 語言 尤 其 明 顯 。 我 覺 得 原 因 在 於教學的時候往往著重機制的規則,而不瞭解機制的原理及應用。 那麼要如何改進? 這本書是 以 重 構 為 中 心 。 程 式 本 來 是 這 樣 寫 , 今 天 我 增 加 了一 個 機 制 , 我 就 可 以 這 樣 寫 , 而 這 樣 寫 有 什
麼好處? 我希望用不斷的重構,讓學生能瞭解機制的應用,才能將機制應用在自己的程式。 就
好像修改文章 樣, 修再修,越修越好,而且要知道為什麼這樣修比較好。
本 書 重 構 的 例 子 及 順 序 請 見 表 1, 這 個 順 序 主 導 各 章 出 現 的 順 序 。 請 注 意 本 書 以 重 構 為 順 序,並不拘泥一般的章節分類。 只要重構需要,有的觀念會提早出現。 例如 #define 雖然是
前置處理,但是只要重構需要,就會提早介紹。 本書各章的關係另見圖 1。
前 前 前言 言 編寫這本書緣起於我對現代 C++ 的興趣。 我最早接觸 C++ 是在唸博士班的時候。 那時在 寫 天 文 物 理 模 擬 的 程 式 , 常 需 要 建 立 大 量 類 似 的 資 料 結 構 進 行 相 似 的 處 理 。 我 本 來 自 大 學 開 始 就 是 習 慣 用 C 開 發 , 所 以 博 士 班 也 是 如 此 。 但 是 程 式 越 來 越 複 雜 , 維 護 就 越 來 越 困 難 。 那 時 合 作 計 畫 的 MarinaChen 教 授 就 問 說 , 你 要 不 要 試 著 用 C++ 整 理 你 的 程 式 ? 我 開 始 用 C++ 後 ,
還
整 個 計 畫 的 程 式 維 護 就 比 較 簡 單 了 。 後 來 為 了 在 平 行 計 算 機 上 實 作 複 雜 資 料 結 構 及 計 算 ,
i
費 伯 納 西 生 命 遊 戲 鏡 子 房 間 繞 圈 井 字 遊 戲 解 譯 器 河 內 塔 八 后 數 獨 老 鼠 迷 宮 有 理 數 位 元 排 序 鏈 結 序 列 二 元 樹 陣列 函式 字串 位元 結構 模組化 類別 遞迴 繼承 運算子 鏈結序列 移動語意 智慧指標 二元樹 運算子多載 虛擬函式 模版 表 1: 重構例子及順序 x
alias ones student life rational life parameter sudoku parameter gcd for eof BASIC c unsigned length singleinclusion life life stack pure_virtual 運 circle life b division de ne catch catch 圖 1: 各章關係 x i
這本書裡除了大量的重構程式外,還有以下三個要項:
• 學學學習習習要要要點點點 是把我認為重要的觀念強調 次。請務必理解所有的學習要點。
• 風風風格格格要要要點點點 是關於如何寫出易於閱讀、理解及維護的程式。請在寫程式時 確實遵守,養成良好的寫程 式習慣。
• 特特特殊殊殊字字字元元元 C++ 中 大 量 使 用 了 特 殊 字 元 , 這 些 特 殊 字 元 遠 比 我 們 習 慣 的 標 點 符 號 複 雜 。 在 遇 到 特 別 的字元時,我會整理成特殊字元項目,提醒讀者注意。
這本書在字體編排上有以下原則:
• 直接與電腦程式有關的英文名詞使用打字機字型,例如程式列表、變數名稱、檔案名稱、 指令名稱等。 例如變數名稱使用 counter。
• 與電腦程式無直接關係的英文名詞使用 TimesRoman 字型。 例如編譯器 (compiler)。
• 方程式按照一般慣例使用斜體。例如 a2 + b2 = c2 。
• 數字除非出現在方程式內均使用 TimesRoman 字型。例如 1234。
由於程式語言的系統相關部分會隨著時間而改變,所以我另外成立了一個網站。
https://sites.google.com/view/cplusplusrefactor/home。 任 何 有 關 這 本 書 的 資
訊都會放在這裡,歡迎參觀指教。
關於第 31 章最後的部分我個人考慮再三最 後還是放進去了。 當然作為一本嚴謹的教科書這 可 能 會 讓 一些 老 師 覺 得 有 待 斟 酌 , 但 個 人以 為 , 教 書是 一件 有 趣 的 事 , 在 無 傷 大 雅 的 情 況 下 結
。我的電子郵件信箱是 pangfeng.liu@gmail.com。
束
謝
劉
xx
本書和我堅持做有趣的事的信念不謀而合。 如果有老師覺得不妥,可以跳過最後 頁。 本書經過仔細校對,但 定還是有一些錯誤。 如果您找到任何錯誤,歡迎寄信給我,無比感
邦鋒,西元2022年12月23日。
本 書 的 封 面 是 「 批 改 娘 」(JudgeGirl), 是 我 在 2003 年 為 臺 大 資 訊 系 所 開 發的 程 式 批 改 系 統 。 為 什 麼 要 有 這 套 線 上 批 改 系 統 ? 由 於 當 時 並 沒 有 任 何 簡 單 好 用 的 線 上 批 改 系 統 。 學 生 交
了 作 業 , 也不 知 道 對 錯 。 考 試 都 是 在 考 卷 上 寫 程 式 , 老 師
就 是 「 答 錯 就斬除」的鐮刀女巫。 對資訊系的學生而言,批改娘就是青春的回憶和象徵,具有重大意義。 批改娘的設定有許多意涵。 鐮刀彎曲的形狀就像是字母 C,代表 C 程式語言。 鐮刀是死神 的武器,可以斬除 WA 妖魔程式。 第一代的批改娘還戴著一串真珠項鍊,代表第一代系統使用
的 Perlscript。 批改娘身後的龍是召喚獸,肩負著系統負荷過大時協助批改的任務。 這隻召喚
獸 當 初 是 架 在 臺 Inteli7 四 核 心 伺 服 器 上 , 所 以 是 隻 有 四 顆 心 臟 、i7 藍 色 調 的 龍 。 雖 然 隨 著 伺 服 器 的 進 步 以 及 核 心 數 目的 增 加 , 目 前 批 改 娘 已 經 不 需 要 召 喚 獸 幫 忙 了 , 但 我 們 還 是 把 召 喚 獸留在此系統圖象中作為紀念。
從 2003 年一直到現在,批改娘默默的陪伴著臺大資訊系學生學習程式。 現在的批改娘系統
早已不是當初我建立的陽春版本。 經過歷代助教的整理改良,她已經成為一個在 github 上的 開源軟體項目。「批改娘」圖像也在 2010 年經由學生競圖選出,進化成為目前大家所看到的,
臺 大 電 信 所 施 光 祖 博 士 創 作 的 第 二代 。 無 論 如 何 演 進 , 批 改 娘 就 是 臺 大 資 訊 系 學 生 大 生 活 的 部分。 不管程式寫的對或不對,不變的是臺大資訊系同學們對程式設計的熱情與投入。 今天
我 決 定 在 封 面 上 放 批 改 娘 , 就 是 要 紀 念 這 段歷 史 , 也 是 對 臺 大 資 訊 系 同 學 們 努力 付 出 時 間 、 學
習程式的最高致敬。
我 想 藉 這 個 機 會 感 謝 所 有 批 改 娘 系 統 的 參 與 人 員 。 首 先 感 謝 歷 代 助 教 上 官 林 傑 、 陳 映 睿 、 王 尹 、 蕭 俊 宏 、 鍾 以 千 、 曹 佐 碩 、 黃 易 、 李 宗 翰 、 許 祐 程 、 王 盛 平 、 曹 又 霖 、 楊 翔 雲 的 整 理 改
良。 感謝第一代原畫江昌鴻、第二代原畫施光祖。 最後要感謝臺大出版中心的編輯團隊,很有
耐 心 的 傾 聽 批 改 娘 的 背 景 故 事 。 讓 批 改 娘 能 站 上 臺 大 出 版 書 籍 的 封 面 , 見 證 這 段 批 改 系 統 在 臺
大由無到有的歷史。 身為這本書的作者,能得到這麼多朋友的幫助,我感到十分榮幸。 劉邦鋒,西元2021年8月31日。
關 關 關於 於「 「 批 批 批改 改娘 娘 娘」 」
也不 知 道 對 不 對 。 有 鑒 於 此 , 我 在 2003 年 寫 了 第 版 的 批 改 娘 系 統 。 學 生 可 以 將 程 式 提 交 給 批 改 娘 系 統 , 然 後 系 統 會 立 即 計 算 作 業 或 是 考 試 的 得 分 。 學 生 的 反 應 很 正 面 , 因 為 他 們 可 以 立 即 就 知 道 作 業 或 是 考 試 答 案 是 否 正 確 , 這 對 學 習 程 式 非 常 有 幫 助 。 臺 大 資 訊 系 也 成 為 國 內 第 個 在 程 式 課 程 中 , 捨 棄 紙 筆 考 卷 , 使用上機實測考試的系所。 為了說明方便,我開始使用「批改娘」稱呼這個批改系統。「批改娘」也成為臺大資訊系的 學 生 , 在 學 習 程 式 設計 過 程 中不 可 磨 滅 的 回 憶 。 所 以 從 第 一代 批 改 娘 開 始 , 其 設 定
xx
在 的 樣 子 。 至 於 她 身 後 的 龍 召 喚 獸 , 當 初 是 以 四 核 心 中 央 處 理 器 的 概 念 設計 的 , 有 四 顆 心
臟 。 另 外 , 在 視覺 的 考 量 上 , 加 上 這 隻 龍 召 喚 獸 也 可 以 讓 視 線 更 流 暢 與 集 中 。 希 望 大 家 都 能 支
持 並 愛 護 可 愛 的 批 改 娘
•
• Pixiv頁面 https://www.pixiv.net/member.php?id=259227
投 稿 幫 劉 邦 鋒 老 師 設計 批 改 系 統 的 形 象 人 物 ( 通 稱 批 改 娘 ) 是 在 大 約 2010 年 , 想想 也 過 了 好 長 段 時 間 。 這 次 能 夠 讓 她 登 上 教 科 書 的 封 面 , 我 作 為 角 色 設計 者 實 在 是 非 常 榮 幸 。 在 構 思 批 改 娘 的 設計 時 , 參 考 了 前 版 設計 的 重 點 : 首 先 鐮 刀 是 必 備 的 , 其 次 就 是 連 帽 衣 服 。 以 這 兩 項 特 徵 作 為 發 想 起 點 , 腦 中 就 很 自 然 出 現 了 死 神 少 女 這 樣 的 形 象 。 形 象 確 立 後 , 為 了
覺
現
增 加 視
上 的 對 比 度 , 再 於 手 臂 配 置 一些 黑 色 物 件 、 於 腳 上 配 置 黑 白相 間 的 褲襪 等等 , 大 致 上 就 成 了
以 及 她 的 召 喚 獸 。 最 後 再 次 感 謝 劉 老 師 的 努力 , 讓 批 改 娘 有 機 會 登 上 教 科 書 的 封 面 。 若 讀 者 們 有 興 趣 看看 我 其 他 的 作 品 , 或 聊聊 動 漫 畫 等 話 題 , 也 歡 迎 來 我 的 噗 浪 或 是Pixiv頁面逛逛。
頁
噗浪
面 https://www.plurk.com/tdk4
施光祖 (Dafei) xxi
Chapter1
程 程 程式 式設 設 設計 計 計
本書介紹 C++ 程式設計。 程式設計是什麼?我們可以從兩個層面來看,一個是程式,一個
是設計。首先我們介紹什麼是程式。
1.1 程 程 程式 式
程 式 英 文 是 program, 簡 單 地 說 就 是 劇 本 。 這 個 劇 本 是 給 計 算 機 (computer) 看 的 , 劇 本 裡 包
含 條條 的 指 指 指 令 令 (command)。 當 計 算 機 看 到 這 條條 的 指 令 , 就 會 執 行 這 些 指 令 所 要 求 的 動
作。 於是藉由設計這 條 條的指令,我們就可以命令計算機執行我們想要做的事情。 這些事
情 可 能 是 聽 MP3 音 樂 , 上 網 查 火 車 時 刻 , 或 是 玩 線 上 遊 戲 。 藉 由 設計 不 同 的 計 算 機 程 式 , 我 們就可以命令計算機執行我們想要做的不同事情。
1.1.1 高 高 階 階 語 語 語言 言 言 計 算 機 所 能 看 懂 的 指 令 是 非 常 原 始 的 , 例 如 是 「 將 某 個 暫 存 器 的 數 值 加 3」 之 類 的 。 這 種 計 算
機 所 能 看 懂 的 原 始 指 令 就 稱 為 機 機 器 器 語 語 語言 言 (machinelanguage)。 使 用 機 器 語言 組 合 成我 們 想 要
的 計 算 機 程 式 是 非 常 費 力 的 , 不 但 要 花 大 量 的 開 發 時 間 與 費 用 , 這 種 機 器 語言 的 程 式 也不 符 合 人類的閱讀習慣,程式也難以維護。
為 了 解 決 機 器 語言 開 發 程 式 的 困 難 , 於 是 就 有 人 想 到 為 何 不 發 明 套 比 較 符 合 人 類 閱 讀 習 慣 的 語言 , 並且 用 這 種 所 謂 高 高 階 階 語 語言 言 言 (high-levelprogramminglanguage) 來 組 成 計 算 機 程 式。 如此 來可以縮減開發程式的時間與成本,也讓程式容易維護。 本書就是要介紹如何使用
高階語言開發程
式。 我 們 舉 一 個 例 子 。 如 果 我 們 要 計 算 兩 個 數 字 的 和 , 而 這 兩 個 數 字 分別 存 在 記 憶 體 的 兩 個 位 置,則機器語言的表示方法可能如下。 1. 將一個數字由記憶體載入到一個暫存器 A。 2. 將另 個數字由記憶體載入到另 個暫存器 B。 3. 兩個暫存器 A 、B 的值相加,將結果存到另外 個暫存器 C 。 4. 將暫存器 C 的值存回記憶體。 用機器語言寫程式實在很麻煩。 如果用高階語言就只需要寫 i=j+k。 由這個例子就可 看出使用高階語言的便利性。 我 們 使 用 的 高 階 語言 稱 為 C++。 C++ 程 式 語言 是 現 代 高 階 語言 非 常 重 要 的 支 。 C++ 程 式 語言 有 標 準 的 語 法 和 語 意 , 使 開 發 出 的 程 式 具 有 極 大 的 可 攜 性 (portability)。 意 即 在 一 種 1
計 算 機 平 臺 上 開 發的 程 式 可 以 在 另 種 計 算 機 平 臺 上 執 行 。 C++ 程 式 語言 也 有 豐 富 的 程 式 庫
(library),可讓開發者重複利用。 C++ 程式語言也是 個具備物 物件 件 導 導 向 向 (objectoriented) 的
高階語言,對實作大型軟體系統非常重要。
1.1.2 編 編 譯 譯 譯器 器 器
由 於 計 算 機 無 法
的 編 譯 器 是 g++ (GNUC++Compiler)。 我 們 會 使 用 g++ 將高階語言程式翻成機器語言,然後才能在計算機上執行,如圖 1.1 所示。
C++program machinecode g++
1.1: 編譯器將高階語言程式翻譯成機器語言
結以上,計算機程式就是給計算機看的指令劇本。 本書要介紹的就是藉由以 C++ 程式語 言編寫計算機程式,讓計算機幫我們處理我們想要解決的問題。
1.2 設 設 設計 計 知 道 程 式 是 什 麼 之 後 , 我 們 就 可 以介 紹 程 式 的 設計 流 程 。 程 式 設計 大 致 可 以 分 為 三 個 流 程 : 編 輯、編譯、執行。 我們接下來會以流程圖的方式說明這三個過程。
1.2.1 流 流 程 程 程圖 圖 圖 流 流 流程 程圖 圖 (flowchart) 顧名思義就是描述 個流程的圖形。 本書會採用這個方法描述流程。 個
流 程 圖 由 堆 格 子 和 箭 頭 組 成 , 格 子 有 兩 種 , 方 形 的 和 菱 形 的 。 方 形 的 格 子 代 表 處 處 理 理 , 意 思 是
我 們 在 這 裡 要 做 一些事 情 。 菱 形 的 格 子 代 表 判 判 判 斷 斷 , 意 思 是 我 們 在 這 裡 要 做 個 判 斷 , 決 定 接 下
來要怎麼走。 箭頭代表流程的方向,代表做完一件事接下來要做哪件事。 所以方形的格子後面
有 一 個 箭 頭 , 代 表 做 完 這 個 格 子 , 接 下 來 要 去 哪 個 格 子 。 菱 形 的 格 子 後 面 有 兩 個 箭 頭 , 代 表 做
完這個判斷,依照判斷的結果再下來要去哪個格子。
圖 1.2 以 流 程 圖 的 方 式 說 明 「 重 複 修 門 課 直 到 通過 」。 方 形 的 格 子 代 表 修 課 。 菱 形 的 格 子 代 表 通過 。 箭 頭 代 表 流 程 的 方 向 。 如 果 修 課 不 通過 就 回 到 方 形 的 修 課 格 子 。 如 果 修 課 通過
2
Chapter1. 程式設計
直
高 階
的
所
們 需 要 個 轉 換 器 , 將 高 階 語言
相
轉 換 器 就 稱 為 編 譯 器 (compiler)。 在 學 習 程 式 設計 的 同 時 , 我 們 也 必 須 學 習 編 譯 器 的 使 用 方 法 。 本 書 所 使 用
接 執 行
語言
程 式 ,
以 我
轉 換 為 功 能
同 的 機 器 語言 。 這 個
圖
總
就結束。 1.2.2 編 編 輯 輯 輯 知 道 流 程 圖 是 什 麼 之 後 , 我 們 就 可 以 用 流 程 圖 介 紹 程 式 的 設計 過 程 。 在 撰 寫 程 式 時 我 們 需 要 個純文字編輯器 (plaintexteditor)。 C++ 程式可以用任何純文字編輯器來編輯。 在編輯完程 式 之 後 , 我 們 可 以 將 該 檔 案 命名 為 例 如 add.cc。 其 中 .cc 的 副 檔 名1 可 以 提 醒 我 們 該 檔 案 為 使用 C++ 程式語言的程式。 1 也有人用 .cpp。本書依作者習慣使用 .cc。
設計
takeacourse pass? yes
no
圖 1.2: 重複修 門課直到通過
學 學習 習要 要 點 點 1.1 C++ 程 程式可以用任何純文字編輯器來編輯。
1.2.3 編 編 譯 譯
在 編 輯 完 成 後 我 們 就 可 以 使 用 g++ 編 譯 器 將 寫 好 的 C++ 程 式 編 譯 成 執 行 檔 (executable)。 以
下的例子將 個名為 add.cc 程式用 g++ 編成 個名為 add 的執行檔。 請參考命令列 1.1。
命 命 令 令 列 列 1.1: 編譯 add.cc
1 g++add.cc-oadd
1.2.3.1 語 語法 法 錯 錯 誤 誤
由於 C++ 程式語言有嚴謹的語法 (syntax) 規定, 如果我們的 C++ 程式不合這些規定,有語 語 法 法 錯 錯 誤 誤 (syntaxerror), 就 無 法 產生 執 行 檔 。 例 如 打 錯 字 , 或 是 忘 了 在 句 尾 加 上 分 號 。 此 時
我 們 就 必 須 回 到 第 步 的 撰 寫 部 分 , 使 用 編 輯 器 修 正 程 式 中 的 語
1 #include <iostream>
2 using namespacestd;
3
4 int main()
5 { 6 int a,b,c;
7 cin>>a>>b>>c;
8 cout<<a * b/c<< endl
9 return 0; 10 }
1.2.
3
法 錯 誤 , 然 後 重 複 第 二 步 的 編 譯,直到程式沒有語法錯誤,能產生執行檔為止。 請見圖 1.3。 範 範例 例 1.2:(
) 語法錯誤
add-syntax.cc
以 範 例 1.2 為 例 。 這 個 範 例 想 讀 入 三 個 數 字 後 , 輸 出 數 字 和 。 但 是 endl 後 面 忘 了 打 分 號,產生語法錯誤,如圖 1.4 所示。
段:程式的執行。
學 學習 習 要 要 點 點 1.2 只要有錯誤,就無法產生執行檔。
為了除去語法錯誤,我們在 endl 後面補上分號,就得到範例 1.3。
範 範 例 例 1.3:(add-runtime.cc) 沒有語法錯誤
1 #include <iostream>
2 using namespacestd;
3
4 int main()
5 {
6 int a,b,c;
7 cin>>a>>b>>c;
8 cout<<a * b/c<< endl; 9 return 0;
4 Chapter1. 程式設計 editprogram compileprogram syntaxerror? no yes 圖 1.3: 重複修正並編譯直到程式沒有語法錯誤 圖 1.4: 程式有語法錯誤 注意,編譯範例 1.2 時,產生了一個語法錯誤 (syntaxerror),就是 endl 後面忘了打分號。 只 要 有 錯 誤 , 就 無 法 產生 執 行 檔 。 因 此 , 必 須 先 除 掉 所 有 的 錯 誤 , 能 產生 執 行 檔 , 才 能 進 到 下 階
10
}
設計
然後編譯範例 1.3,語法錯誤就消失了,我們也得到 add 執行檔,如圖 1.5 所示。 注意,我
們先用 ls-ladd 確認 add 執行檔並不存在。 ls 是 UNIX 系統中,用以表列檔案或資料夾
屬性的指令。 然後使用 g++ 編譯 add-runtime.cc,產生 add 執行檔。 最後,我們再用 ls
-ladd 確認已經產生了執行檔。
圖 1.5: 程式沒有語法錯誤
1.2.4 執 執 行 行
產生 執 行 檔 後 , 接 下 來 我 們 進 入 第 三 步 : 程 式 的 執 行 。 在 產生 出 執 行 檔 後 , 我 們 就 能 執 行 我 們 的程式。 例如在 UNIX 作業系統中,我們只要在命令列視窗中,打入執行檔的檔名即可執行該
執行檔,如命令列 1.4。 其中 ./ 代表在目前目錄下。
命 命 令 令 列 列 1.4: 執行 add 1 ./add
1.2.4.1 執 執行 行 錯 錯 誤 誤
有 時 程 式 執 行 到 一 半 , 就 產生 嚴 重 錯 誤 , 使 得 程 式 無 法 正 常 結 束 。 這 種 錯 誤 是 在執 行
1.2.
5
時 發 生 , 就 稱 為 執 執 行 行 錯 錯 誤 誤 (runtimeerror)。 執 行 錯 誤 的 原 因 很 多 , 例 如 程 式 取 用 到 不 該 取 用 的 記 憶 體,
覺到程式的執行錯誤,並將程式停止及發出通
2 例
範 例 1.3 編 譯 出 的 add, 結 果 產生 執 行 錯 誤 , 如 圖 1.6 所 示 。 此 時 我 們 就 必 須 回 到 第 步的撰寫部分,使用編輯器修正程式中造成執行錯誤的部分。 請見圖 1.7。 圖 1.6: 程式執行錯誤 2 例如在 Windows 中有名的「這個程式執行無效 」,或是 UNIX 的 segmentationfault。
就會發生執行錯誤。 此時作業系統會察
知。
如 執 行
int a,b,c;
return 0;
6 Chapter1. 程式設計 editprogram compileprogram syntaxerror? yes runprogram runtimeerror? no yes no 圖 1.7: 重複程式修正直到沒有執行錯誤 以範例 1.3 為例,經過仔細檢視輸入,發現是除以 0 造成的執行錯誤,改正後得到範例 1.5。 執行範例 1.5 編譯出的 add,結果程式順利執行,沒有執行錯誤,如圖 1.8 所示。 範 範例 例 1.5:(add-logic.cc) 邏輯錯誤
6
7
9
10
1.2.4.2 邏 邏 邏輯 輯錯 錯誤 誤 如果程式能夠正常執行,但是結果不正確,此時就稱為邏 邏 輯 輯錯 錯 誤 誤 (logicalerror)。 如圖 1.8 中 2 加 1 加 0 得 到 0。 邏 輯 錯 誤 的 原 因 也 很 多 , 例 如 本 來 要 測 試 數 值 是 否 大 於 零 , 結 果 程 式 寫 成 測 試 是 否 小 於 零 。 此 時 既 無 語 法 錯 誤 , 因 為 語 法 都 正 確 , 也 無 執 行 錯 誤 , 因 為 程 式 能 正 常 結 束 。 我 們 就 必 須 針 對 程 式 除 錯 (debug)。 一 般 所 謂 的 除 錯 就 是 指 除 掉 這 種 邏 輯 錯 誤 , 需 要
1 #include <iostream> 2 using namespacestd; 3 4 int main() 5 {
cin>>a>>b>>c; 8 cout<<a * b * c<<endl;
}
1 #include <iostream>
2 using namespacestd;
3 int main()
4 {
5 int a,b,c;
6 cin>>a>>b>>c;
7 cout<<a+b+c<< endl;
8 return 0;
9 }
1.2. 設計 7 圖 1.8: 程式邏輯錯誤 大 量 經 驗 的 累 積 。 仔 細 檢 視 範 例 1.5, 發 現 將 a+b+c 寫 成 a * b * c, 修 正 後得 到 範 例 1.6。 執行範例 1.6 編譯出的 add,結果程式順利執行,也產生正確答案,如圖 1.9 所示。 範 範 例 例 1.6:(add.cc) 正確的加法程式
圖 1.9: 正確的加法程式 用流程圖來看。 在找到錯誤之後,我們還是回到第 步,使用編輯器修正程式中造成邏輯錯 誤 的 部 分 。 請 見 圖 1.10。 再 次 強 調 , 般 所 謂 的 除 錯 指 的 是 去 除 邏 輯 錯 誤 。 這 是 個 考 驗 耐心與邏輯思考的過程,也是學習程式設計最難的地方。 學 學習 習 要 要 點 點 1.3 般所謂的除錯指的是去除邏輯錯誤。
國家圖書館出版品預行編目(CIP)資料
由重構學習C++程式設計/劉邦鋒著. -- 初版. -- 臺北市:國立臺灣
大學出版中心出版:國立臺灣大學發行,2023.06
面; 公分
ISBN 978-986-350-712-3(平裝)
1. CST: C++(電腦程式語言)
312.32C
由重構學習C++程式設計
作 者 劉邦鋒
總 監 張俊哲
責任編輯 李協芳
封面設計 鄧宜琨 封面插畫 施光祖
排版協力 黃秋玲
發 行 人 陳文章
發 行 所 國立臺灣大學
出 版 者 國立臺灣大學出版中心
法律顧問 賴文智律師
印 製 長達印刷有限公司
出版年月 2023年 6 月初版 版 次 初版
定 價 新臺幣1,000元整
展 售 處 國立臺灣大學出版中心
106319 臺北市羅斯福路四段1號
電話:(02) 2365-9286
100047 臺北市思源街18號澄思樓1樓
112002518
傳真:(02) 2363-6905
電話:(02) 3366-3991~3分機18 傳真:(02) 3366-9986
E-mail:ntuprs@ntu.edu.tw https://press.ntu.edu.tw
國家書店松江門市
104472 臺北市松江路209號1樓
電話:(02) 2518-0207
國家網路書店 http://www.govbooks.com.tw
五南文化廣場
400002 臺中市中區中山路6號
http://www.wunanbooks.com.tw
ISBN:978-986-350-712-3
GPN:1011200237
電話:(04) 2226-0330
本書已通過國立臺灣大學出版中心教科書審查 著作權所有‧翻印必究