Learn C++ Programming by Refactoring

Liu Pang-feng

  • PublishedJune, 2023
  • Binding平裝 / 26*19 / 780pages / 單色(黑) / 中文
  • Publisher國立臺灣大學出版中心
  • SeriesEducation-Textbooks
  • ISBN978-986-350-712-3
  • GPN1011200237
  • Price NT$1000
  • ebook
    KOBO / Readmoo / TAAZE / 博客來 /
  • Paper Books San Min Books / wunan / books.com.tw / National Books / iRead / eslite / TAAZE /
  • EISBN(PDF)978-986-350-740-6
  • EISBN(EPub)978-986-350-7413

本書主要針對高中與大學開始接觸程式設計的初學者,及想學好C++11程式設計的讀者所設計。書中文字敘述力求淺顯簡潔,並以大量範例、片語、學習要點、風格要點等方式,逐步引導初學者進入程式設計的領域。

這本書以「重構」為中心,也就是以一再改寫來引導初學者,強調機制的原理與應用,並用於程式之中。期待藉此正確的程式設計技術傳遞給廣大讀者群,以提升讀者對程式設計的興趣。

本書特色

1. 以「重構」為中心,也就是以一再改寫來引導初學者。
2. 透過「學習要點」、「風格要點」、「特殊字元」等設計,隨時提醒讀者各項學習重點,以提升學習效率。
3. 本書搭配專屬網站(https://sites.google.com/view/cplusplusrefactor),提供各章練習題、作業,並隨時更新相關補充資料、程式碼等資訊。
4. 以更多完整範例、相關圖示說明複雜的觀念與方法,同時強化各範例間的關聯性,讓讀者能從中反覆練習、更瞭解所學之實際應用。

 

Learn C++ Programming by Refactoring is a specifically designed textbook for high school or college students who want to learn and excel in C++11 programming. With clear and concise instructions, numerous examples, phrases, learning points, and style tips, this book emphasizes the concept of "refactoring," guiding beginners through iterative rewriting, highlighting the principles, mechanisms and its applications. 
See more supplementary materials (assignments & examples) at https://sites.google.com/view/cplusplusrefactor
 

劉邦鋒

現任
國立臺灣大學資訊工程系暨資訊網路與多媒體研究所教授

學歷
美國耶魯大學計算機科學博士

研究專長
平行分散式系統、演算法設計與分析

講授課程
計算機程式設計、高等程式設計、物件導向程式設計、平行程式設計等。

 

Pang Feng Liu is a Micro Chair Professor of the Department of Computer Science and Information Engineering at National Taiwan University. 

前言
關於「批改娘」
1 程式設計
 1.1 程式
 1.2 設計
2 基本程式架構
 2.1 程式骨架
 2.2 變數
 2.3 輸出
 2.4 輸入
3 運算
 3.1 指定
 3.2 運算
4 判斷
 4.1 if 判斷
 4.2 判斷式值
 4.3 switch 判斷
5 迴圈
 5.1 while 迴圈
 5.2 for 迴圈
 5.3 do while 迴圈
 5.4 break
 5.5 continue
 5.6 巢狀迴圈
6 標準輸入輸出
 6.1 輸入資料
 6.2 輸出訊息
 6.3 多變數輸出入
 6.4 格式輸出入操控子
7 陣列
 7.1 屬性
 7.2 一維陣列
 7.3 assert
 7.4 一維陣列應用
 7.5 多維陣列
 7.6 多維陣列應用
8 浮點數
 8.1 宣告
 8.2 位元組數
 8.3 輸出與輸入
 8.4 類別轉換
 8.5 泰勒展開式
 8.6 開平方根
9 函式
 9.1 呼叫函式
 9.2 定義有回傳值的函式
 9.3 定義無回傳值的函式
 9.4 多個參數的函式
 9.5 參數傳遞
 9.6 生命遊戲
 9.7 鏡子房間
 9.8 井字遊戲
 9.9 結語
10 指標
  10.1 指標變數
  10.2 指標參數傳遞
  10.3 指標與陣列
  10.4 指標回傳值
  10.5 用途與限制
11 參考類別
  11.1 宣告及初始
  11.2 參數傳遞
  11.3 參考回傳值
  11.4 參考應用
12 字元
  12.1 宣告
  12.2 輸出
  12.3 字元常數
  12.4 輸入
  12.5 常用函式
13 宣告修飾
  13.1 修飾大小
  13.2 有號及無號
  13.3 C++11 標準類別
  13.4 常數
  13.5 靜態宣告
  13.6 auto
14 字串
  14.1 宣告及輸出入
  14.2 串接
  14.3 字串常數
  14.4 操作函式
  14.5 C-style字串
  14.6 簡易BASIC解譯器
15 位元運算
  15.1 宣告
  15.2 檢查位元
  15.3 位元且
  15.4 位元或
  15.5 位元互斥或
  15.6 位元互補
  15.7 位元數目排序
16 結構
  16.1 結構宣告
  16.2 結構欄位
  16.3 表列初始
  16.4 結構指標
  16.5 記憶體位址
  16.6 參數傳遞
  16.7 標頭檔
  16.8 生命遊戲
  16.9 鏡子房間
  16.10 繞圈
  16.11 位元數目排序
  16.12 井字遊戲
  16.13 簡易BASIC解譯器
  16.14 結語
17 模組化
  17.1 vector
  17.2 生命遊戲
  17.3 井字遊戲
  17.4 鏡子房間
  17.5 繞圈
  17.6 BASIC
18 類別
  18.1 井字遊戲
  18.2 權限
  18.3 類別與結構
  18.4 建構子
  18.5 常數成員函式
  18.6 類別與實體
  18.7 類別成員
  18.8 鏡子房間
  18.9 繞圈
  18.10 生命遊戲
  18.11 BASIC
  18.12 有理數
19 遞迴
  19.1 定義
  19.2 費伯納西數
  19.3 計算時間
  19.4 constexpr
  19.5 最大公因數
  19.6 遞迴實作
  19.7 三位撇節法
  19.8 河內塔
  19.9 八后問題
  19.10 老鼠走迷宮
  19.11 數獨
  19.12 疊紙片
  19.13 效能考量
20 繼承
  20.1 基礎類別
  20.2 多載
  20.3 繞圈
  20.4 老鼠走迷宮
  20.5 數獨
  20.6 井字遊戲
  20.7 生命遊戲
  20.8 鏡子房間
21 運算子
  21.1 運算子函式
  21.2 位元數目排序
  21.3 有理數
  21.4 比較1位元個數
  21.5 lambda function
  21.6 位元數目排序重構
  21.7 頂層運算子函式
  21.8 錯誤處理
  21.9 隱藏類別轉換
  21.10 explicit
22 鏈結序列
  22.1 資料結構
  22.2 記憶體配置
  22.3 名稱空間
  22.4 鏈結序列
  22.5 鏈結序列遞迴實作
  22.6 排序鏈結序列
  22.7 鏈結序列範例
  22.8 堆疊
23 移動與深度複製
  23.1 指標物件問題
  23.2 移動
  23.3 深度複製
  23.4 建構子
24 智慧指標
  24.1 共享指標
  24.2 唯一指標
25 二元樹
  25.1 節點類別
  25.2 二元樹
  25.3 二元搜尋樹
  25.4 重建二元樹
  25.5 二元樹交集及聯集
26 多型與虛擬函式
  26.1 函式綁定
  26.2 多型
  26.3 BASIC
27 檔案處理
  27.1 開啟與關閉檔案
  27.2 標準檔案指標
  27.3 文字檔案處理
  27.4 二進制檔案處理
  27.5 移動讀寫位置
  27.6 EOF
28 運算子及多載
  28.1 運算子
  28.2 二元樹交集聯集
  28.3 函數
  28.4 檔案輸入
29 模板
  29.1 類別模板
  29.2 函式模板
  29.3 別名模板
30 前置處理
  30.1 引入
  30.2 定義
  30.3 條件編譯
  30.4 巨集函數
  30.5 #、LINE、FILE
  30.6 ##
  30.7 應用
31 不想教的東西
  31.1 goto
  31.2 全域變數
  31.3 多重繼承
  31.4 保護及私有繼承
  31.5 朋友類別及函式
  31.6 輸出格式
 31.7 指標技巧
 31.8 修改記憶體
 31.9 征服銀河系
徵引書目
Index

前言(摘錄)
 
編寫這本書緣起於我對現代C++的興趣。我最早接觸C++是在唸博士班的時候。那時在寫天文物理模擬的程式,常需要建立大量類似的資料結構進行相似的處理。我本來自大學開始就是習慣用C開發,所以博士班也是如此。但是程式越來越複雜,維護就越來越困難。那時合作計畫的Marina Chen教授就問說,你要不要試著用C++整理你的程式?我開始用C++後,整個計畫的程式維護就比較簡單了。後來為了在平行計算機上實作複雜資料結構及計算,還發表了一些論文。這些論文的程式都是用C++開發的,使用的C++也都是偏應用。回台灣後又在中正大學教過五年的物件導向程式設計。這時才開始對C++有比較學理上的探討,瞭解也比較全面。
 
以上說的都是傳統C++。現代C++從C++11開始就引入大量的改變,使得程式的表達能力更強大,機制也更加有彈性,但是也更加複雜,對初學者有相當的難度。這本書針對的讀者是高中及大學剛開始學C++的初學者,以及所有想學好程式設計的朋友。希望讀者讀完這本書後,對C++11能有初步的認識。我特地用中文寫,這樣可以避免語言障礙,希望高中生也能看得懂。正因為是給初學者看的書,所以簡化了很多地方,這些都是針對初學者做調整,對C++熟練的讀者可能需要瞭解這點。
 
這本書的寫法是以重構(refactor)為中心,也就是以一再改寫來引導初學者。這本書分為兩個部分,第一個部分到第7章為止講述C++基本觀念,為重構做準備。第二個部分是這本書的主要核心,藉由重構逐一介紹C++的進階觀念。在我教程式語言的經驗中,學生往往知道一個機制,但是卻不會實際運用,這在C++這種複雜的程式語言尤其明顯。我覺得原因在於教學的時候往往著重機制的規則,而不瞭解機制的原理及應用。那麼要如何改進?這本書是以重構為中心。程式本來是這樣寫,今天我增加了一個機制,我就可以這樣寫,而這樣寫有什麼好處?我希望用不斷的重構,讓學生能瞭解機制的應用,才能將機制應用在自己的程式。就好像修改文章一樣,一修再修,越修越好,而且要知道為什麼這樣修比較好。
...............................................................................................
 
這本書裡除了大量的重構程式外,還有以下三個要項:
•學習要點
是把我認為重要的觀念強調一次。請務必理解所有的學習要點。
•風格要點
是關於如何寫出易於閱讀、理解及維護的程式。請在寫程式時確實遵守,養成良好的寫程式習慣。
•特殊字元
C++中大量使用了特殊字元,這些特殊字元遠比我們習慣的標點符號複雜。在遇到特別的字元時,我會整理成特殊字元項目,提醒讀者注意。
 
這本書在字體編排上有以下原則:
•直接與電腦程式有關的英文名詞使用打字機字型,例如程式列表、變數名稱、檔案名稱、指令名稱等。例如變數名稱使用counter。
•與電腦程式無直接關係的英文名詞使用Times Roman 字型。例如編譯器(compiler)。
•方程式按照一般慣例使用斜體。例如a2 + b2 = c2。
•數字除非出現在方程式內均使用Times Roman字型。例如1234。
 
由於程式語言的系統相關部分會隨著時間而改變,所以我另外成立了一個網站。https://sites.google.com/view/cplusplusrefactor/home。任何有關這本書的資訊都會放在這裡,歡迎參觀指教。
 
關於第31章最後的部分我個人考慮再三最後還是放進去了。當然作為一本嚴謹的教科書這可能會讓一些老師覺得有待斟酌,但個人以為,教書是一件有趣的事,在無傷大雅的情況下結束一本書和我堅持做有趣的事的信念不謀而合。如果有老師覺得不妥,可以跳過最後一頁。
 
本書經過仔細校對,但一定還是有一些錯誤。如果您找到任何錯誤,歡迎寄信給我,無比感謝。我的電子郵件信箱是pangfeng.liu@gmail.com。