第1章 程序設計與問題解決概述 1
1.1 程序設計概述 1
1.1.1 什麼是程序設計 1
1.1.2 怎樣編寫程序 2
1.1.3 什麼是算法 3
1.1.4 什麼是程序設計語言 4
1.2 計算機如何運行程序 7
1.2.1 程序設計語言可以編寫的指令類型 9
1.2.2 什麼是軟件維護 11
1.3 計算機裏有什麼 15
1.4 計算行業的行為準則與義務 19
1.4.1 軟件盜版 19
1.4.2 數據的保密 19
1.4.3 計算機資源的使用 19
1.4.4 軟件工程 20
1.5 問題求解方法 21
1.5.1 提齣問題 21
1.5.2 尋找熟悉的內容 21
1.5.3 類比解決 22
1.5.4 方法-目標分析 22
1.5.5 分而治之 23
1.5.6 構建模塊方法 23
1.5.7 閤並解決方案 24
1.5.8 心理障礙:對開始的恐懼 24
1.5.9 用算法解決問題 25
1.6 小結 29
第2章 C++語法與語義及程序開發過程.31
2.1 C++程序的組成元素 31
2.1.1 C++程序結構 31
2.1.2 語法與語義 33
2.1.3 語法模闆 34
2.1.4 為程序元素命名:標識符 36
2.1.5 數據和數據類型 37
2.1.6 為元素命名:聲明 38
2.1.7 采取行動:可執行語句 42
2.1.8 超越最簡主義:嚮程序添加注釋 46
2.2 程序構造 47
2.2.1 程序塊(復閤語句) 49
2.2.2 C++預處理器 50
2.3 再說“輸齣” 55
2.3.1 生成空行 55
2.3.2 在一行內插入空格 56
2.3.3 特殊字符 56
2.4 程序輸入、糾錯和執行 57
2.4.1 輸入程序 57
2.4.2 編譯和運行程序 58
2.5 測試與調試 61
2.6 小結 62
第3章 數值類型、錶達式和輸齣 63
3.1 C++數據類型概述 63
3.2 數值數據類型 64
3.2.1 整型 64
3.2.2 浮點類型 65
3.3 數值類型的聲明 66
3.3.1 命名常量聲明 66
3.3.2 變量聲明 67
3.4 簡單算術錶達式 67
3.4.1 算術運算符 67
3.4.2 遞增和遞減運算符 70
3.5 復閤算術錶達式 70
3.5.1 優先級規則 70
3.5.2 隱式類型轉換和顯式類型轉換 71
3.6 函數調用和庫函數 75
3.6.1 返迴值的函數 75
3.6.2 庫函數 77
3.6.3 void函數 78
3.7 設置輸齣格式 78
3.7.1 整數和字符串 79
3.7.2 浮點數 81
3.8 其他string操作 85
3.8.1 length和size函數 85
3.8.2 find函數 86
3.8.3 substr函數 87
3.8.4 訪問字符串中的字符:at函數 88
3.8.5 轉換為小寫和大寫 88
3.9 測試與調試 92
3.10 小結 93
第4章 程序輸入和軟件設計過程 94
4.1 嚮程序輸入數據 94
4.1.1 輸入流和提取運算符(>>) 95
4.1.2 讀取標記和換行符 97
4.1.3 用get函數讀取字符數據 98
4.1.4 用ignore函數跳過字符 100
4.1.5 讀取字符串數據 101
4.2 交互式輸入/輸齣 103
4.3 非交互式輸入/輸齣 105
4.4 文件輸入和輸齣 105
4.4.1 文件 106
4.4.2 使用文件 106
4.4.3 運行時輸入文件名 111
4.5 輸入失敗 113
4.6 軟件設計方法 113
4.7 功能分解 114
4.7.1 模塊 116
4.7.2 實現設計 116
4.7.3 有關設計的一種觀點 119
4.8 測試與調試 123
4.9 小結 124
第5章 條件、邏輯錶達式和選擇控製結構 126
5.1 控製流 126
5.2 條件與邏輯錶達式 128
5.2.1 bool數據類型 128
5.2.2 邏輯錶達式 128
5.3 If語句 132
5.3.1 If-Then-Else形式 132
5.3.2 塊(復閤語句) 134
5.3.3 If-Then形式 136
5.3.4 常見錯誤 137
5.4 嵌套If語句 140
5.5 邏輯運算符 144
5.5.1 運算符的優先級 148
5.5.2 與浮點類型一起使用的關係運算符 150
5.6 判斷I/O流的狀態 151
5.7 測試與調試 157
5.7.1 問題求解階段的測試:算法演練 157
5.7.2 實現階段的測試 159
5.7.3 測試計劃 162
5.7.4 在編譯和執行期間自動執行的測試 163
5.8 小結 165
第6章 循環 166
6.1 While語句 166
6.2 循環的執行階段 168
6.3 使用While語句的循環 169
6.3.1 計數控製的循環 169
6.3.2 事件控製的循環 171
6.3.3 循環子任務 176
6.4 如何設計循環 182
6.4.1 設計控製流 182
6.4.2 設計循環中的過程 183
6.4.3 循環退齣 184
6.5 嵌套邏輯 184
6.6 測試與調試 202
6.6.1 循環測試策略 202
6.6.2 涉及循環的測試計劃 202
6.7 小結 204
第7章 更多控製結構 205
7.1 Switch語句 205
7.2 Do-While語句 210
7.3 For語句 214
7.4 Break和Continue語句 219
7.5 選擇循環語句的原則 220
7.6 更多C++運算符 221
7.6.1 賦值運算符和賦值錶達式 222
7.6.2 遞增和遞減運算符 223
7.6.3 位運算符 223
7.6.4 強製轉換操作 224
7.6.5 sizeof運算符 224
7.6.6 ?:運算符 224
7.6.7 運算符優先級 225
7.6.8 算術與關係錶達式中的隱式類型轉換 226
7.7 測試與調試 231
7.8 小結 232
第8章 函數 233
8.1 用void函數實現功能分解 233
8.1.1 使用函數的時機 234
8.1.2 模塊為什麼需要接口設計 234
8.1.3 設計接口 234
8.1.4 將模塊寫為void函數 235
8.2 迴顧用戶定義的函數 239
8.2.1 函數調用中的控製流 239
8.2.2 函數形參 240
8.3 void函數的語法與語義 241
8.3.1 函數調用 241
8.3.2 函數聲明和定義 242
8.3.3 局部變量 243
8.3.4 Return語句 244
8.4 形參 246
8.4.1 值參數 246
8.4.2 引用參數 247
8.4.3 使用帶有形參的錶達式 253
8.4.4 關於實參列錶和形參列錶的最後一點提醒 254
8.4.5 將斷言寫為函數文檔 255
8.5 測試與調試 265
8.6 小結 267
第9章 作用域、生存期及函數 268
9.1 標識符的作用域 268
9.1.1 作用域規則 270
9.1.2 變量聲明與定義 272
9.1.3 命名空間 273
9.2 變量的生存期 275
9.3 接口設計 280
9.3.1 副作用 280
9.3.2 全局常量 282
9.4 返迴值的函數 284
9.4.1 完整示例 286
9.4.2 布爾函數 289
9.4.3 接口設計與副作用 291
9.4.4 何時使用返迴值的函數 292
9.5 賦值、實參傳送、返迴函數值中的類型轉
換 293
9.6 測試與調試 302
9.7 小結 306
第10章 用戶定義的數據類型 308
10.1 內置簡單類型 308
10.1.1 數值類型 309
10.1.2 字符 310
10.2 用戶定義的簡單類型 311
10.2.1 Typedef語句 312
10.2.2 枚舉類型 312
10.2.3 命名與匿名數據類型 319
10.3 簡單數據類型與結構化數據類型 320
10.4 記錄(Struct) 321
10.4.1 訪問各個組成項 323
10.4.2 對struct的聚閤操作 324
10.4.3 再談struct聲明 325
10.4.4 綁定相似項目 326
10.5 分層記錄 328
10.6 union 330
10.7 指針 331
10.7.1 指針變量 332
10.7.2 指針錶達式 334
10.8 引用類型 335
10.9 測試與調試 342
10.9.1 應對輸入錯誤 342
10.9.2 涉及指針的調試 343
10.10 小結 344
第11章 數組 346
11.1 一維數組 346
11.1.1 聲明數組 348
11.1.2 訪問各個數組項 349
11.1.3 齣界數組索引 351
11.1.4 在聲明中初始化數組 352
11.1.5 數組聚閤操作(的缺乏) 352
11.1.6 聲明和訪問數組的例子 353
11.1.7 在實參中傳送數組 358
11.1.8 數組的注釋 360
11.1.9 對數組使用typedef 363
11.1.10 指針錶達式和數組 363
11.1.11 C風格的字符串 364
11.1.12 作為數組的字符串 364
11.1.13 C字符串操作 365
11.1.14 將C字符串轉換為C++字符串 366
11.1.15 使用哪種字符串錶示法 366
11.2 記錄的數組 366
11.3 特殊的數組處理 370
11.3.1 子數組處理 370
11.3.2 具有語義內容的索引 372
11.4 二維數組 372
11.5 在實參中傳遞二維數組 375
11.6 處理二維數組 377
11.6.1 對行求和 377
11.6.2 修改後的對行求和 378
11.6.3 對列求和 379
11.6.4 初始化數組 380
11.6.5 打印數組 380
11.7 定義二維數組的另一種方法 382
11.8 多維數組 384
11.9 測試與調試 398
11.9.1 一維數組 398
11.9.2 復雜結構 399
11.9.3 多維數組 400
11.10 小結 401
第12章 類和抽象 402
12.1 抽象數據類型 402
12.2 C++類 405
12.2.1 實現成員函數 408
12.2.2 類、對象和成員 410
12.2.3 對對象的內置操作 411
12.2.4 類作用域 412
12.3 信息隱藏 413
12.3.1 用戶編寫的頭文件 414
12.3.2 規格說明文件和實現文件 415
12.3.3 編譯和鏈接多文件程序 419
12.4 什麼是對象 421
12.5 類的設計原則 423
12.5.1 封裝 423
12.5.2 抽象 425
12.5.3 提高可修改性、可重用性的設計 425
12.5.4 可變性 426
12.6 Name ADT 432
12.6.1 ADT的規格說明 433
12.6.2 實現文件 434
12.7 組閤 436
12.8 UML圖 440
12.8.1 繪製類的圖 440
12.8.2 繪製類的組閤關係圖 441
12.9 測試與調試 446
12.10 小結 450
第13章 基於數組的列錶 451
13.1 什麼是列錶 451
13.2 作為抽象數據類型的列錶 452
13.2.1 改進職責 453
13.2.2 數據錶示 454
13.2.3 示例程序 456
13.3 List ADT的實現 459
13.3.1 基本操作 459
13.3.2 插入和刪除 460
13.3.3 順序查找 460
13.3.4 迭代器 461
13.4 有序列錶 465
13.4.1 基本操作 466
13.4.2 插入 466
13.4.3 順序查找 468
13.4.4 二分查找 469
13.4.5 刪除 472
13.5 類的有序列錶 475
13.5.1 IsThere 476
13.5.2 Insert和Delete 477
13.6 再說UML圖 479
13.7 測試與調試 488
13.8 小結 488
第14章 動態數據和鏈接列錶 489
14.1 動態數據 489
14.1.1 分配動態數據 489
14.1.2 刪除動態數據 491
14.1.3 常量和動態數據 494
14.2 順序結構與鏈接結構 495
14.3 創建動態鏈接列錶:練習示例 496
14.4 ADT列錶的動態實現 501
14.4.1 創建一個空鏈接列錶 502
14.4.2 嚮鏈接列錶中插入 503
14.4.3 鏈接列錶的遍曆 504
14.4.4 從鏈接列錶中刪除 505
14.4.5 復位列錶 507
14.4.6 獲取下一項目 507
14.4.7 檢查鏈接列錶是否已滿 507
14.4.8 搜索列錶 507
14.5 析構函數和復製構造函數 511
14.5.1 析構函數 511
14.5.2 淺復製與深復製 511
14.5.3 復製構造函數 513
14.6 有序鏈接列錶 515
14.6.1 插入(20) 516
14.6.2 插入(60)(從循環處開始) 517
14.6.3 插入(100) 518
14.6.4 從鏈接列錶中刪除 519
14.6.5 刪除(30) 520
14.6.6 刪除(50) 520
14.7 測試和調試 523
14.8 小結 524
第15章 繼承、多態和麵嚮對象的設計.525
15.1 麵嚮對象的程序設計 525
15.2 繼承 526
15.2.1 類比 527
15.2.2 繼承和麵嚮對象的設計過程528
15.2.3 由一個類派生另一個類 529
15.2.4 ExpandedEntry類的規格說明530
15.2.5 ExpandedEntry類的實現 531
15.2.6 構造函數執行順序 535
15.3 動態綁定和虛函數 540
15.3.1 切去問題 540
15.3.2 虛函數 542
15.4 麵嚮對象的設計 543
15.4.1 自由討論 544
15.4.2 篩選 544
15.4.3 情景探究 545
15.4.4 職責算法 546
15.4.5 結語 546
15.5 實現設計 547
15.6 測試與調試 562
15.7 小結 563
第16章 模闆、運算符重載和異常 564
16.1 模闆類 564
16.1.1 定義類模闆 565
16.1.2 實例化類模闆 566
16.1.3 實現輸入參數的另一種方式:const引用 568
16.1.4 程序代碼的組織 568
16.1.5 一句提醒 573
16.2 泛型函數 574
16.2.1 函數重載 574
16.2.2 在類的外部定義函數模闆 575
16.2.3 實例化函數模闆 575
16.3 運算符重載 576
16.4 異常 579
16.4.1 throw語句 580
16.4.2 try-catch語句 581
16.4.3 非局部異常處理程序 583
16.4.4 重新拋齣異常 585
16.4.5 標準異常 585
16.5 測試與調試 601
16.6 小結 602
第17章 使用標準模闆庫的數據結構簡介 603
17.1 抽象數據結構與實現 603
17.2 其他綫性結構 605
17.2.1 棧 606
17.2.2 隊列 607
17.2.3 優先級隊列 608
17.3 雙嚮綫性結構 609
17.3.1 雙嚮列錶 609
17.3.2 雙端隊列 609
17.4 STL簡介 610
17.4.1 迭代器 611
17.4.2 vector模闆 612
17.4.3 list模闆 616
17.4.4 stack模闆 618
17.4.5 queue模闆 620
17.4.6 priority_queue模闆 621
17.4.7 deque模闆 622
17.5 非綫性結構 632
17.5.1 二叉樹 633
17.5.2 散列錶 635
17.6 關聯容器 637
17.6.1 set模闆 637
17.6.2 map模闆 640
17.7 測試與調試 652
17.8 小結 652
第18章 遞歸 654
18.1 什麼是遞歸 654
18.2 使用簡單變量的遞歸算法 657
18.3 漢諾塔 659
18.4 使用結構化變量的遞歸算法 662
18.5 使用指針變量的遞歸 668
18.5.1 按逆序輸齣動態鏈接列錶 668
18.5.2 復製動態鏈接列錶 670
18.6 選擇遞歸還是迭代 673
18.7 測試與調試 679
18.8 小結 680
附錄A 保留字 681
附錄B 運算符優先級 682
附錄C 標準庫例程選編 683
附錄D 閱讀本書時使用標準化之前的C++版本 692
附錄E 字符集 695
附錄F 程序風格、格式設置和文檔 697
附錄G 浮點數補議 702
附錄H 使用C字符串 709
附錄I C++ char常量 715
· · · · · · (
收起)