《程序設計教程:用C++語言編程(第2版)》是以C++作為實現語言的第一門程序設計課程的教材。以介紹基本的程序設計思想、概念和技術為中心,強調了數據結構、算法、過程抽象以及數據抽象等重要的程序設計思想。全書共12章,主要內容包括:數據類型、表達式、流程控制、子程序、遞歸、類/對象、繼承、類屬(泛型)、輸入/輸出以及異常處理等。內容相對完整,概念力求精確。
《程序設計教程:用C++語言編程(第2版)》在第1版的基礎上,相應地增加了例子、代碼注釋和習題,便于讀者輕松且牢固地掌握程序設計的技巧。可作為高等院校本科生第一門程序設計課程的教材,也可供程序設計的初學者參考。
本書第1版自2004年出版以來,得到了廣大讀者的熱情關注和支持,很多讀者還提出了寶貴的建議,我們深表感謝。
在近幾年的教學中,我們也發現了本書的一些不足之處。首先,編寫該教材的初衷是介紹程序設計的基本思想、概念和技術,C++語言是作為編程實現語言的角色出現,然而,在教材某些內容的表述上違背了這個初衷,教材的一些地方出現了C++語言“喧賓奪主”的情況。其次,教材在一些內容的表達上過于“精煉”,使初學者有“看天書”的感覺。再次,教材對現在比較流行的C++標準模板庫(STL)以及它所支持的泛型程序設計沒有給出足夠的介紹,從而給讀者學習使用STL帶來了困難。此外,教材中還存在少量的錯誤。
針對上述問題,我們對教材進行了修訂。第2版的變動主要體現在以下幾個方面:
1)重新組織了一些章節的內容,并調整了相應章節(主要是節)的標題和次序,進一步突出了程序設計的主流思想、概念和技術。
2)對教材的文字進行了潤色,補充了例子,并為例子中的程序代碼增加了注釋,使之更加容易理解。
陳家駿,男,1963年生。獲南京大學博士學位,現為南京大學計算機科學與技術系教授,博士生導師。主要從事自然語言處理和軟件工程領域的研究工作,曾多次主持國家及省級科研項目的研究與開發,其中包括:863“基于語義和多策略融合的日漢機器翻譯關鍵技術研究”、國家自然科學基金“基于統計關系學習的漢語指代消解研究”以及江蘇省自然科學基金“基于條件隨機場和核集成的自適應中文信息抽取技術研究”等項目,研究成果多次獲得省部級科研獎勵。具有多年的軟件開發和程序設計課程教學的經歷。
鄭滔,男,1966年生。獲南京大學碩士學位,現為南京大學軟件學院教授。主要從事軟件工程和嵌入式系統領域的研究工作。曾多次參加國家/省科技攻關項目、國家/省自然科學基金項目和國家863高科技項目的研究與開發,研究成果兩次獲得部級科技成果二等獎。具有多年軟件開發和程序設計以及編譯技術課程教學的經歷。
第2版前言
第1版前言
作者簡介
教學建議
第1章 概述
1.1 計算機的工作模型
1.1.1 硬件
1.1.2 軟件
1.1.3 機內信息表示
1.2 程序設計
1.2.1 程序設計范型
1.2.2 程序設計步驟
1.2.3 程序設計語言
1.3 C++語言
1.3.1 C++語言概述
1.3.2 C++程序的構成
1.3.3 C++程序的運行步驟
1.3.4 C++語言的詞法
1.4 小結
1.5 習題
第2章 數據描述(Ⅰ)——基本數據類型和表達式
2.1 數據類型概述
2.2 基本數據類型
2.2.1 整數類型
2.2.2 實數類型
2.2.3 字符類型
2.2.4 邏輯類型
2.3 數據的表現形式
2.3.1 常量
2.3.2 變量
2.3.3 變量值的輸入
2.4 操作符(運算符)
2.4.1 算術操作符
2.4.2 關系與邏輯操作符
2.4.3 位操作符
2.4.4 賦值操作符
2.4.5 其他操作符
2.4.6 操作數的類型轉換
2.5 表達式
2.5.1 表達式的構成與分類
2.5.2 操作符的優先級和結合性
2.5.3 表達式中操作數的類型轉換
2.5.4 表達式結果的輸出
2.5.5 表達式的副作用
2.6 小結
2.7 習題
第3章 流程控制——語句
3.1 程序流程控制概述
3.2 順序控制
3.2.1 表達式語句
3.2.2 復合語句
3.2.3 空語句
3.3 選擇控制
3.3.1 if語句
3.3.2 switch語句
3.4 循環(重復)控制
3.4.1 while語句
3.4.2 do.while語句
3.4.3 for語句
3.4.4 計數循環和事件循環
3.4.5 循環程序設計實例
3.5 無條件轉移控制
3.5.1 goto語句
3.5.2 break語句
3.5.3 continue語句
3.6 程序設計風格
3.6.1 結構化程序設計
3.6.2 關于goto語句
3.7 小結
3.8 習題
第4章 過程抽象——函數
4.1 基于過程抽象的程序設計
4.1.1 功能分解與復合
4.1.2 子程序
4.1.3 子程序間的數據傳遞
4.2 C++函數
4.2.1 函數的定義
4.2.2 函數的調用
4.2.3 值作為參數傳遞
4.2.4 基于函數的過程式程序設計
4.3 標識符的作用域與變量的生存期
4.3.1 變量的局部性——局部變量與全局變量
4.3.2 C++程序的多模塊結構
4.3.3 標識符的作用域
4.3.4 名空間
4.3.5 變量的生存期(存儲分配)
4.3.6 基于棧的函數調用的實現
4.4 遞歸函數
4.4.1 什么是遞歸函數
4.4.2 “分而治之”的程序設計
4.4.3 遞歸與循環的選擇
4.4.4 遞歸函數應用實例
4.5 函數的進一步討論
4.5.1 內聯函數
4.5.2 帶默認值的形式參數
4.5.3 函數名重載
4.6 C++標準函數庫
4.7 C++的條件編譯
4.7.1 條件編譯命令
4.7.2 基于多環境的程序編制
4.7.3 程序調試
4.8 小結
4.9 習題
第5章 數據描述(Ⅱ)——構造數據類型
5.1 枚舉類型
5.2 數組類型
5.2.1 一維數組的定義與操作
5.2.2 字符串類型的一種實現——一維字符數組
5.2.3 二維數組的定義與操作
5.2.4 數組類型的應用
5.3 結構類型
5.3.1 結構類型的定義與操作
5.3.2 結構類型的應用
5.4 聯合類型
5.5 指針類型
5.5.1 指針類型的定義
5.5.2 指針類型的基本操作
5.5.3 指針作為參數傳遞
5.5.4 指針與動態變量
5.5.5 函數指針
5.5.6 指針與數組
5.5.7 多級指針
5.6 引用類型
5.6.1 引用類型的定義
5.6.2 引用作為參數傳遞
5.6.3 引用類型與指針類型的區別
5.7 小結
5.8 習題
第6章 數據抽象——對象與類
6.1 基于數據抽象的程序設計
6.1.1 什么是面向對象程序設計
6.1.2 為什么要面向對象
6.1.3 面向對象程序設計的基本內容
6.2 類
6.2.1 數據成員
6.2.2 成員函數
6.2.3 成員的訪問控制——信息隱藏
6.3 對象
6.3.1 對象的創建和標識
6.3.2 對象的操作
6.3.3 this指針
6.4 對象的初始化和消亡前處理
6.4.1 構造函數與析構函數
6.4.2 成員對象的初始化
6.4.3 拷貝構造函數
6.5 對象與類的進一步討論
6.5.1 對常量對象的訪問——常成員函數
6.5.2 對象之間的數據共享靜態數據成員
6.5.3 提高對對象私有數據成員的訪問效率——友元
6.6 類作為模塊
6.6.1 類模塊的組成
6.6.2 Demeter法則
6.7 小結
6.8 習題
第7章 操作符重載
7.1 操作符重載概述
7.1.1 操作符重載的必要性
7.1.2 操作符重載的方式
7.1.3 操作符重載的基本原則
7.2 操作符重載的實現
7.2.1 雙目操作符重載
7.2.2 單目操作符重載
7.3 C++中幾個特殊操作符的重載
7.3.1 賦值操作符
7.3.2 數組元素訪問操作符(下標操作符)
7.3.3 類成員訪問操作符
7.3.4 動態存儲分配與去配操作符
7.3.5 自定義類型轉換操作符
7.3.6 函數調用操作符
7.4 操作符重載的實例——字符串類String的一種實現
7.5 小結
7.6 習題
第8章 類的繼承——派生類
8.1 類之間的繼承關系——基類與派生類
8.2 單繼承
8.2.1 單繼承的定義
8.2.2 在派生類中訪問基類成員——protected訪問控制
8.2.3 派生類對基類成員的訪問控制繼承方式
8.2.4 派生類對象的初始化和賦值操作
8.2.5 單繼承的應用實例
8.2.6 類之間的聚集關系
8.3 消息(成員函數調用)的動態綁定
8.3.1 消息的多態性
8.3.2 虛函數與消息的動態綁定
8.3.3 純虛函數和抽象類
8.3.4 虛函數動態綁定的一種實現
8.4 多繼承
8.4.1 多繼承的必要性
8.4.2 多繼承的定義
8.4.3 名沖突
8.4.4 重復繼承——虛基類
8.5 小結
8.6 習題
第9章 類屬(泛型)機制——模板
9.1 類屬(泛型)程序設計
9.2 模板
9.2.1 函數模板
9.2.2 類模板
9.2.3 模板的復用
9.3 C++標準模板庫
9.3.1 概述
9.3.2 容器
9.3.3 迭代器
9.3.4 算法
9.4 小結
9.5 習題
第10章輸入/輸出
10.1 輸入/輸出概述
10.2 面向控制臺的輸入/輸出
10.2.1 基于函數庫的控制臺I/O
10.2.2 基于類庫的控制臺。I/O
10.2.3 抽取/插入操作符“”和“10.3 面向文件的輸入/輸出
10.3.1 基于函數庫的文件I/O
10.3.2 基于類庫的文件I/O
10.4 面向字符串變量的輸入/輸出
10.5 小結
10.6 習題
第11章 異常處理
11.1 異常處理概述
11.1.1 什么是異常
11.1.2 異常處理的基本手段
11.2 C++異常處理機制
11.2.1 try、throw以及catch語句
11.2.2 異常處理的嵌套
11.3 小結
11.4 習題
第12章 實例——面向對象的Windows應用程序框架
12.1 Windows應用程序的基本結構
12.1.1 應用程序的用戶界面
12.1 12消息驅動的程序結構
12.2 面向對象的Windows應用程序結構
12.2.1 Windows應用程序中的對象
12.2.2 MFC對面向對象Windows應用程序開發的支持
12.2.3 VisualC++的應用向導和類向導
12.3 小結
12.4 習題
附錄AASCII字符集及其編碼
附錄BIEEE浮點數的內部表示
參考文獻
第1章概述
自1946年第一臺數字電子計算機(ENIAC)問世以來,計算機在理論、技術以及應用等方面發展迅速。特別是計算機的應用,它已從早期的數值計算應用拓廣到現在的大量的非數值計算應用,如管理信息系統、文字處理系統、基于Internet的web瀏覽器以及嵌入式應用系統(如家電的電腦控制)等。現在,計算機已經滲透到人類社會活動的各個領域并發揮著巨大的作用。
一臺計算機由硬件和軟件兩部分構成。硬件是指計算機的物理構成,軟件主要是指計算機程序(指令序列)。硬件是計算機的物質基礎,軟件是計算機的靈魂。沒有硬件就沒有計算機;但是,如果只有硬件沒有軟件,可以說計算機幾乎什么事情也做不了,要想用計算機來解決各種問題,必須要有相應的軟件。從某種意義上講,一臺計算機的性能主要由硬件決定,而它的功能則主要由軟件來提供。
隨著計算機應用領域不斷擴大、應用層次不斷加深,社會對計算機軟件的需求急劇增長,從而導致軟件規模不斷擴大、復雜程度不斷提高。如何設計出大量的滿足用戶需求的高質量軟件是軟件工作者所面臨的嚴峻挑戰。
1.1計算機的工作模型
計算機程序不同于其他程序(如音樂會程序),它是由計算機來執行的,編制計算機程序(程序設計)時通常要考慮到計算機解決問題的方式和特點。因此,要進行程序設計,就有必要對計算機的工作模型有一定的了解。下面將分別從計算機的硬件、軟件以及計算機內部的信息表示幾個方面來介紹計算機的工作模型。
……