內容簡介
《c++程式設計:思想與方法》內容包括數據類型、控制結構、數組、指針、數據封裝、過程封裝、運算符的重載、繼承、多態性和異常處理等。第2 版秉承以程式設計方法為主、程式設計語言為輔的思想,採用以問題求解引出知識點的方法,強調編程思想和知識的套用,增加了更多的習題和實例,多章都增加了“編程規範與常見錯誤”小節。結構更加合理,內容更加通俗易懂。
《c++程式設計:思想與方法》旨在使讀者通過學習,並經過一定的訓練和實踐,能夠掌握程式設計的方法,並具備良好的程式設計風格。本書可作為各大專院校計算機專業程式設計課程的教材,也可供從事計算機軟體開發的科研人員作為參考資料。
作譯者
本書提供作譯者介紹
翁惠玉 上海人,上海交通大學博士,現為上海交通大學計算機系副教授,主要從事計算機網路、資料庫和信息系統的研究,並長期擔任ACM班計算機科學導論、程式設計 和數據結構課程的主講教師,其中程式設計課程於2004年被評為上海市精品課程。翁老師科研成果頗豐,多次獲得上海市科技進步獎,並多次獲得上海交通大學 的優秀教學獎,編寫了多本教材,如《數據結構:思想與實現》和《數據結構:題解與拓展》等,還翻譯了多本國外的教材。
目錄
《c++程式設計:思想與方法》
第1 章 緒論 1
1.1 計算機硬體 1
1.2 計算機軟體 2
1.3 程式設計 3
1.3.1 算法設計 3
1.3.2 編碼 4
1.3.3 程式的編譯和調試 5
小結 6
習題 6
第2 章 通過例子學習 8
2.1 第一個程式:輸出hello world 8
2.1.1 注釋 8
2.1.2 預編譯 9
2.1.3 主程式 10
2.1.4 名字空間 11
2.2 第二個程式:計算圓的面積和周長 11
2.3 數據類型 14
2.3.1 整型 14
2.3.2 實型 16
.2.3.3 字元型 17
2.3.4 布爾型 21
2.3.5 枚舉類型 21
2.3.6 用typedef 重新命名類型名 23
2.3.7 變數賦初值 23
2.3.8 用sizeof 了解占用的記憶體量 24
2.4 符號常量 24
2.5 算術運算 25
2.5.1 主要的算術運算符 25
2.5.2 各種類型的數值間的混合運算 25
2.5.3 整數除法和取模運算符 26
2.5.4 優先權與結合性 26
2.5.5 數學函式館 26
2.6 賦值運算 27
2.6.1 賦值運算符 27
2.6.2 賦值時的自動類型轉換 28
2.6.3 賦值的嵌套 28
2.6.4 多重賦值 28
2.6.5 複合賦值運算 29
2.7 自增和自減運算符 30
2.8 強制類型轉換 31
2.9 數據的輸入/輸出 32
2.9.1 數據的輸入 32
2.9.2 數據的輸出 33
2.10 編程規範及常見錯誤 33
小結 34
習題 34
第3 章 邏輯思維——分支程式設計 38
3.1 關係運算 38
3.1.1 關係運算符 38
3.1.2 關係表達式 39
3.2 邏輯運算 39
3.3 if 語句 42
3.3.1 if 語句的形式 42
3.3.2 if 語句的嵌套 43
3.3.3 if 語句的套用 43
3.3.4 條件表達式 46
3.4 switch 語句及其套用 46
3.5 編程規範及常見錯誤 52
小結 52
習題 53
第4 章 重複控制——循環程式設計 55
4.1 for 循環 55
4.1.1 重複n 次操作 55
4.1.2 for 語句的進一步討論 58
4.1.3 for 循環的嵌套 58
4.2 while 循環 59
4.3 do-while 循環 62
4.4 循環的中途退出 63
4.5 枚舉法 64
4.6 貪婪法 67
4.7 編程規範和常見錯誤 68
小結 69
習題 69
第5 章 批量數據處理——數組 73
5.1 一維數組 73
5.1.1 一維數組的定義 73
5.1.2 數組元素的引用 73
5.1.3 一維數組的初始化 74
5.1.4 一維數組在記憶體中的表示 74
5.1.5 一維數組的套用 75
5.2 查找和排序 77
5.2.1 查找 77
5.2.2 排序 81
5.3 二維數組 84
5.3.1 二維數組的定義 84
5.3.2 二維數組的初始化 84
5.3.3 二維數組在記憶體中的表示 85
5.3.4 二維數組的套用 85
5.4 字元串 88
5.4.1 字元串的存儲及初始化 88
5.4.2 字元串的輸入/輸出 89
5.4.3 字元串處理函式 90
5.4.4 字元串的套用 90
5.5 編程規範及常見錯誤 91
小結 92
習題 92
第6 章 過程封裝——函式 95
6.1 函式的定義 96
6.1.1 return 語句 96
6.1.2 函式示例 96
6.2 函式的使用 98
6.2.1 函式原型的聲明 98
6.2.2 函式的調用 100
6.2.3 將函式與主程式放在一起 101
6.2.4 函式調用過程 102
6.3 數組作為函式的參數 104
6.4 帶默認值的函式 107
6.5 內聯函式 108
6.6 重載函式 109
6.7 函式模板 111
6.8 變數的作用域 112
6.9 變數的存儲類別 114
6.9.1 自動變數 114
6.9.2 靜態變數 114
6.9.3 暫存器變數 116
6.9.4 外部變數 116
6.10 遞歸函式 118
6.10.1 遞歸函式的基本概念 118
6.10.2 遞歸函式的套用 121
6.11 基於遞歸的算法 126
6.11.1 回溯法 126
6.11.2 分治法 129
6.11.3 動態規劃 133
6.12 編程規範及常見錯誤 135
小結 136
習題 137
第7 章 間接訪問——指針 140
7.1 指針的概念 140
7.1.1 指針變數的定義 141
7.1.2 指針的基本操作 141
7.2 指針運算與數組 145
7.2.1 指針運算 146
7.2.2 用指針訪問數組 147
7.3 指針與動態記憶體分配 148
7.3.1 動態變數的創建 149
7.3.2 動態變數的回收 150
7.3.3 記憶體泄漏 150
7.3.4 查找new 操作的失誤 150
7.4 字元串再討論 151
7.5 指針與函式 152
7.5.1 指針作為形式參數 152
7.5.2 數組名作為形式參數的再討論 155
7.5.3 字元串作為函式的參數 157
7.5.4 返回指針的函式 157
7.5.5 引用與引用傳遞 158
7.5.6 返回引用的函式 160
7.6 指針數組與多級指針 161
7.6.1 指針數組 161
7.6.2 main 函式的參數 162
7.6.3 多級指針 164
7.7 多維數組和指向數組的指針 165
7.8 指向函式的指針 167
7.8.1 作為函式的參數 168
7.8.2 用於選單選擇 169
7.9 編程規範與常見錯誤 170
小結 171
習題 172
第8 章 數據封裝——結構體 174
8.1 記錄的概念 174
8.2 c++語言中記錄的使用 175
8.2.1 結構體類型的定義 175
8.2.2 結構體類型的變數的定義 176
8.2.3 結構體類型的變數的使用 177
8.2.4 結構體數組 178
8.3 結構體作為函式的參數 180
8.4 鍊表 182
8.4.1 鍊表的概念 182
8.4.2 單鍊表的存儲 183
8.4.3 單鍊表的操作 184
8.5 編程規範及常見錯誤 189
小結 189
習題 189
第9 章 模組化開發 192
9.1 自頂向下分解 192
9.1.1 頂層分解 193
9.1.2 prn_instruction 函式的實現 193
9.1.3 play 函式的實現 194
9.1.4 get_call_from_user 函式的實現 195
9.2 模組劃分 195
9.3 設計自己的庫 201
9.4 編程規範及常見錯誤 206
小結 207
習題 207
第10 章 創建工具——類的定義與使用 209
10.1 從過程化到面向對象 209
10.1.1 抽象的過程 209
10.1.2 面向對象程式設計的特點 210
10.1.3 庫和類 211
10.2 類的定義 217
10.3 對象的使用 221
10.3.1 對象的定義 221
10.3.2 對象的操作 222
10.3.3 this 指針 223
10.3.4 對象的構造與析構 224
10.4 常量對象與常量成員函式 233
10.5 常量數據成員 234
10.6 靜態數據成員與靜態成員函式 234
10.6.1 靜態數據成員的定義 235
10.6.2 靜態成員函式 235
10.6.3 靜態常量成員 238
10.7 友元 239
10.8 編程規範及常見錯誤 241
小結 241
習題 241
第11 章 運算符重載 245
11.1 什麼是運算符重載 245
11.2 運算符重載的方法 246
11.3 幾個特殊運算符的重載 249
11.3.1 賦值運算符的重載 249
11.3.2 下標運算符的重載 251
11.3.3 函式調用運算符重載 252
11.3.4 ++和--運算符的重載 253
11.3.5 輸入/輸出運算符的重載 254
11.3.6 重載函式的原型設計考慮 256
11.4 自定義類型轉換函式 257
11.4.1 內置類型到類類型的轉換 258
11.4.2 類類型到其他類型的轉換 258
11.5 運算符重載的套用 259
11.5.1 完整的rational 類的定義和使用 259
11.5.2 完整的doublearray類的定義和使用 262
11.6 編程規範與常見錯誤 265
小結 266
習題 266
第12 章 組合與繼承 268
12.1 組合 268
12.2 繼承 270
12.2.1 單繼承 271
12.2.2 基類成員在派生類中的訪問特性 272
12.2.3 派生類對象的構造、析構與賦值操作 274
12.2.4 重定義基類的函式 279
12.2.5 派生類作為基類 281
12.2.6 將派生類對象隱式轉換為基類對象 282
12.3 多態性與虛函式 284
12.3.1 多態性 284
12.3.2 虛函式 284
12.3.3 虛析構函式 288
12.4 純虛函式和抽象類 288
12.4.1 純虛函式 288
12.4.2 抽象類 288
12.5 多繼承 289
12.5.1 多繼承的格式 289
12.5.2 名字衝突 290
12.5.3 虛基類 291
12.6 面向對象設計範例 291
12.7 編程規範和常見錯誤 298
小結 298
習題 298
第13 章 泛型機制——模板 301
13.1 類模板的定義 301
13.2 類模板的實例化 303
13.3 模板的編譯 304
13.4 非類型參數和參數的默認值 304
13.5 類模板的友元 306
13.5.1 普通友元 306
13.5.2 模板的特定實例的友元 306
13.6 類模板作為基類 310
13.7 編程規範及常見錯誤 311
小結 311
習題 312
第14 章 輸入/輸出與檔案 313
14.1 流與標準庫 313
14.2 輸入/輸出緩衝 314
14.3 基於控制台的輸入/輸出 315
14.3.1 輸出流 315
14.3.2 輸入流 318
14.3.3 格式化的輸入/輸出 321
14.4 基於檔案的輸入/輸出 324
14.4.1 檔案的概念 324
14.4.2 檔案和流 325
14.4.3 檔案的順序訪問 328
14.4.4 檔案的隨機處理 330
14.4.5 用流式檔案處理含有記錄的檔案 332
14.5 基於字元串的輸入/輸出 337
14.6 編程規範及常見錯誤 338
小結 338
習題 338
第15 章 異常處理 341
15.1 傳統的異常處理方法 341
15.2 異常處理機制 341
15.2.1 異常拋出 342
15.2.2 異常捕獲 343
15.3 異常規格說明 347
15.4 編程規範和常見錯誤 348
小結 349
習題 349
第16 章 容器和疊代器 351
16.1 容器 351
16.2 疊代器 351
16.3 容器和疊代器的設計示例 352
16.3.1 用數組實現的容器 352
16.3.2 用鍊表實現的容器 355
小結 358
習題 358
附錄 ascii 表 359
參考文獻 360
前言
程式設計是計算機專業十分重要的一門課程,是實踐性非常強的一門課程,也應該是一門非常有趣、讓學生很有成就感的課程。但在教學過程中,很多學生的反應是:課聽懂了,但題不會做,以至於最後喪失了興趣。我認為主要的問題是教學過程中過分重視程式設計語言本身,過分強調理解語言的語法,而沒有把思路放在解決問題的方法上面。因此,2008年我編寫了《C++程式設計:思想與方法》,並由人民郵電出版社出版。
我校在教學中一直使用《C++程式設計:思想與方法》,在使用過程中,我發現了一些不足之處,也收集了學生和授課老師對本教材的一些意見和建議。在上海交通大學和人民郵電出版社圖靈公司的支持下,我對《C++程式設計:思想與方法》一書進行了修訂,並決定出版這一新版。
第2版保持了第1版的寫作風格,繼續秉承以程式設計方法為主、程式設計語言為輔的思想,採用以問題求解引出知識點的方法,在介紹語言要素的同時,更多地強調編程思想,強調知識的套用,並在以下幾個方面做了較大的修改。
(1) 增加了習題量。習題是教材的重要組成部分,第1版的習題部分比較薄弱,所以在第2版中增加了較多的習題。這些習題不僅能幫助學生鞏固學到的知識,更重要的是,這些習題能起到拓展知識的作用。
(2) 多章都增加了“編程規範與常見錯誤”小節。在教學過程中,我發現了一些初學者常犯的錯誤,於是將這些錯誤總結起來放在相關章的最後,希望能起到提醒的作用。一個好的程式就像一篇優美的文章,讓人賞心悅目。一個好的程式必須符合良好的規範,編程規範旨在指導學生如何使程式更加規範,讓學生在開始學程式設計時就養成良好的習慣。
(3) 擴充算法設計和問題求解過程方面的內容,增加了更多的實例。
(4) 對各章內容和文字進行了細緻的修改,使結構更加合理、內容更加通俗易懂。
相信第2版會更加符合讀者的需求。但由於作者水平有限,本書肯定存在很多不足,敬請讀者批評指正。
最後,我要感謝上海交通大學電信學院程式設計課程組的各位老師,我的可愛勤奮的學生們以及關心、愛護和幫助過我的朋友們。
翁惠玉
2011年10月