本書可作為第二門程序設(shè)計課程的教材,*好應(yīng)在學(xué)過C語言之后使用。本書內(nèi)容包括過程化設(shè)計和面向?qū)ο髢刹糠謽?gòu)成,但對過程化設(shè)計只以很少篇幅做提要式介紹。全書共分10章。第1章介紹C 語言的預(yù)備知識,并用簡單示例比較了過程化程序設(shè)計與面向?qū)ο蟪绦蛟O(shè)計在思考問題上的差異,介紹面向?qū)ο蟪绦蛟O(shè)計的主要特點,基本的面向?qū)ο髥栴}分析和程序設(shè)計方法。第2章介紹C 語言的過程化語法,并對C 語言中的基本對象作了滲透。第3、4章介紹C 語言的封裝特性,第5、6章分別介紹繼承和多態(tài)性。第7、8章分別討論運算符重載和流技術(shù)。第9章簡要說明了建立在類模板基礎(chǔ)上的泛型編程技術(shù)。第10章介紹了C 的異常處理機制。本書的每章開始以精煉的語言扼要說明其主要內(nèi)容,難點被適當?shù)胤纸庠诟髡吕。部分重點章節(jié)安排了若干有實際背景的設(shè)計案例。每章*后配備了若干思考題和相當數(shù)量的習(xí)題。思考題有助于理解語言的語法現(xiàn)象,值得認真對照教材去分析,或者構(gòu)造適當?shù)睦尤嶒,而通過完成這些習(xí)題,有助于對知識點的透徹掌握。為了幫助學(xué)習(xí)者順利進行編程實踐,書后以附錄形式對C Builder 6.0、DEV C 和Visual C 6.0這幾種環(huán)境的編程甚至程序調(diào)試方法都給出了適度介紹。
前 言
C 是計算機軟件領(lǐng)域中覆蓋面最廣的編程語言,得到了極為廣泛的關(guān)注并有大量應(yīng)用C 開發(fā)的應(yīng)用系統(tǒng)。以介紹C 編程為目的的圖書數(shù)量眾多,包括國內(nèi)外學(xué)者撰寫的各種設(shè)計類、教材類書籍,其中不乏學(xué)習(xí)和研究C 語言程序設(shè)計的經(jīng)典,如《C Primer中文版》、《C 語言程序設(shè)計(特別版)》和《Effective C 》等。不過,因為C 語言本身的內(nèi)容多,也有很多技術(shù)和概念較為復(fù)雜,還有部分技術(shù)甚至脫離了開發(fā)者的范疇。因此,如何對內(nèi)容進行取舍,以什么樣的方式討論所涉及的技術(shù),怎樣有效地結(jié)合工程實踐,都是值得思考的問題。事實上,各類學(xué)校開設(shè)C 課程的時間、先期的課程安排、教學(xué)大綱的要求等都不盡相同,而多數(shù)學(xué)習(xí)者也不是以成為C 語言的專家為目標,注重的是掌握必備的知識,能更好地應(yīng)用其從事軟件開發(fā)工作;谶@些觀點,我們編寫了《標準C 程序設(shè)計》(第一版),力圖以有限的篇幅透徹講解標準C 語言的核心內(nèi)容。
本書在第一版的基礎(chǔ)上,結(jié)合教學(xué)要求的變化和教學(xué)過程反映出來的問題,對原書做了較大幅度的調(diào)整,對結(jié)構(gòu)化的程序設(shè)計內(nèi)容進行壓縮,擴展對面向?qū)ο蠓治雠c設(shè)計方法的討論,并增加項目案例以強化對工程實踐的要求。總體上,本書繼承了第一版的特色,同時又彰顯了一些新的特點:
? 簡潔通俗、平實透徹講解 從過程化程序設(shè)計過渡到面向?qū)ο笠馕吨鴮栴}的看待和處理方法的轉(zhuǎn)變,甚至要花相當?shù)木磙D(zhuǎn)變觀念。因此,將重點問題概括、展開,用通俗的語言講清道理,而不是用代碼代替。
? 概括、突出問題核心 對解決一類問題的核心內(nèi)容給予總結(jié)、概括和突出,說明此類問題的實質(zhì)和解決方法的關(guān)鍵而不是一個具體題目的解法。
? 由淺入深、循序漸進展開問題 在對相關(guān)知識點進行鋪墊的基礎(chǔ)上,從基本思想和存在的問題入手,邊引導(dǎo)邊展開,逐步說明解決問題的技術(shù)和方法,避免突兀和跳躍,增強沉浸感。
? 適當引入工程問題 選取領(lǐng)域中有代表性的工程應(yīng)用實踐問題作為設(shè)計案例,使學(xué)習(xí)更靠近應(yīng)用,激發(fā)課程學(xué)習(xí)和解決實際問題的興趣。
? 突出重要理念和思想 作為教材,對于重要的核心問題、關(guān)鍵技術(shù)和應(yīng)該遵循的理念給出特殊提示,這些提示貫穿于各主要知識點,對應(yīng)重點掌握的核心知識進行強化。同時,這些提示可作為注意事項,對程序設(shè)計者積累經(jīng)驗、養(yǎng)成良好習(xí)慣具有很好的警示作用。
本書可作為第二門程序設(shè)計課程的教材,最好應(yīng)在學(xué)過C語言之后使用。本書內(nèi)容包括過程化設(shè)計和面向?qū)ο髢刹糠謽?gòu)成,但對過程化設(shè)計只以很少篇幅做提要式介紹。全書共分10章。第1章介紹C 語言的預(yù)備知識,并用簡單示例比較了過程化程序設(shè)計與面向?qū)ο蟪绦蛟O(shè)計在思考問題上的差異,介紹面向?qū)ο蟪绦蛟O(shè)計的主要特點,基本的面向?qū)ο髥栴}分析和程序設(shè)計方法。第2章介紹C 語言的過程化語法,并對C 語言中的基本對象作了滲透。第3、4章介紹C 語言的封裝特性,第5、6章分別介紹繼承和多態(tài)性。第7、8章分別討論運算符重載和流技術(shù)。第9章簡要說明了建立在類模板基礎(chǔ)上的泛型編程技術(shù)。第10章介紹了C 的異常處理機制。
本書的每章開始以精煉的語言扼要說明其主要內(nèi)容,難點被適當?shù)胤纸庠诟髡吕铩2糠种攸c章節(jié)安排了若干有實際背景的設(shè)計案例。每章最后配備了若干思考題和相當數(shù)量的習(xí)題。思考題有助于理解語言的語法現(xiàn)象,值得認真對照教材去分析,或者構(gòu)造適當?shù)睦尤嶒灒ㄟ^完成這些習(xí)題,有助于對知識點的透徹掌握。
書中所有的完整程序代碼都由作者在C Builder 6.0環(huán)境下調(diào)試通過,它們都可以在其他環(huán)境下正常運行。為了幫助學(xué)習(xí)者順利進行編程實踐,書后以附錄形式對C Builder 6.0、DEV C 和Visual C 6.0這幾種環(huán)境的編程甚至程序調(diào)試方法都給出了適度介紹。
對于學(xué)習(xí)者,掌握程序設(shè)計技術(shù)最好的途徑就是上機實驗。為此,本書的每章末給出了大量的實踐性題目,它們都有不同程度的應(yīng)用背景。我們認為,它們是使學(xué)習(xí)者經(jīng)過自身動手實踐并最終掌握利用C 設(shè)計程序的不可跳躍的階梯。
另外,本書注重程序設(shè)計的理念和實際編程技術(shù),目標是努力提高學(xué)生的編程能力,擺脫計算機專業(yè)畢業(yè)生不會編程的現(xiàn)象。
本書由牛連強擔(dān)任主編,馬廣焜、任義和張剛分別主要參與了第5、6章、第3、4章和第8、9章的編寫工作,由牛連強進行全書統(tǒng)稿。
還應(yīng)該說明,這是一本可以用作48~64學(xué)時教學(xué)的教材。我們努力從實用的角度來介紹標準C 語言的基本內(nèi)容和技術(shù)精華,但限于篇幅,更深、更詳細地研究時可參考書后列出的參考書目,其中不乏一些經(jīng)典的著作。
本書為授課教師提供電子課件等較為全面的學(xué)習(xí)輔助資源,有需要者請登錄電子工業(yè)出版社(www.phei.com.cn)免費下載。
我們希望本書能夠高質(zhì)量地滿足工科學(xué)校計算機相關(guān)專業(yè)的教學(xué)需要,也特別希望讀者能夠不吝指出書中的缺點和錯誤,以便再版時能夠得到改進。
作者的電子郵箱:niulq@sut.edu.cn。
作 者
牛連強,男,沈陽工業(yè)大學(xué)軟件學(xué)院院長、教授二是余年來,長期從事高等學(xué)校計算機領(lǐng)域的教學(xué)和科研工作,教學(xué)經(jīng)驗豐富、科研項目成果豐富,并出版了多部教材和專著,發(fā)表論文40余篇。
目 錄
第1章 C 語言與面向?qū)ο蟪绦蛟O(shè)計概述1
1.1 C 語言概述1
1.1.1 標準C 語言的產(chǎn)生與發(fā)展1
1.1.2 編寫簡單的C 語言程序2
1.2 由過程化到面向?qū)ο蟪绦蛟O(shè)計4
1.2.1 過程化程序設(shè)計4
1.2.2 面向?qū)ο蟮某绦蛟O(shè)計6
1.3 面向?qū)ο蟪绦虻闹饕卣?
1.3.1 抽象與封裝(encapsulation)8
1.3.2 由繼承(inheritance)實現(xiàn)重用9
1.3.3 由多態(tài)(polymorphism)反映
變革10
1.4 面向?qū)ο蟮膯栴}分析11
1.4.1 確定類11
1.4.2 確定類的屬性11
1.4.3 確定類的方法12
1.4.4 確定對象模式12
思考與練習(xí)113
實驗113
第2章 C 語言基礎(chǔ)14
2.1 標識符與關(guān)鍵字14
2.1.1 標識符14
2.1.2 關(guān)鍵字14
2.2 數(shù)據(jù)與數(shù)據(jù)類型15
2.2.1 基本數(shù)據(jù)類型15
2.2.3 字面值15
2.2.4 符號常量16
2.2.5 變量18
2.3 基本運算18
2.3.1 運算符和表達式18
2.3.2 數(shù)據(jù)類型轉(zhuǎn)換與造型20
2.4 語句與流程控制21
2.4.1 簡單語句與復(fù)合語句21
2.4.2 分支語句22
2.4.3 循環(huán)語句23
2.4.4 流程轉(zhuǎn)向語句24
2.4.5 數(shù)據(jù)輸入與輸出25
2.5 指針、數(shù)組與引用26
2.5.1 指針26
2.5.2 數(shù)組28
2.5.3 引用30
2.6 函數(shù)31
2.6.1 函數(shù)的定義與聲明31
2.6.2 函數(shù)調(diào)用與參數(shù)匹配32
2.6.3 函數(shù)返回值與函數(shù)調(diào)用表達式35
2.6.4 形式參數(shù)的默認值37
2.6.5 內(nèi)聯(lián)函數(shù)37
2.6.6 函數(shù)重載38
2.6.7 函數(shù)模板39
2.7 new、delete與動態(tài)對象42
2.7.1 動態(tài)生成和銷毀一個對象42
2.7.2 動態(tài)生成和銷毀對象數(shù)組43
2.8 名字空間43
2.8.1 名字沖突及對策43
2.8.2 定義和使用名字空間44
2.9 預(yù)處理指令45
2.9.1 宏定義45
2.9.2 條件編譯46
2.9.3 文件包含46
思考與練習(xí)247
實驗250
第3章 類、對象與封裝51
3.1 類51
3.1.1 類的含義與表述51
3.1.2 類定義的語法規(guī)則52
3.2 對象55
3.2.1 對象定義55
3.2.2 成員訪問56
3.2.3 對象存儲58
3.3 類的方法59
3.3.1 為類提供必要的方法59
3.3.2 inline方法61
3.3.3 const方法61
3.3.4 隱含的this指針62
3.3.5 方法重載與缺省參數(shù)63
3.3.6 類的模板函數(shù)方法64
3.4 構(gòu)造與析構(gòu)64
3.4.1 初始化的難題64
3.4.2 構(gòu)造函數(shù)與對象初始化65
3.4.3 無名對象67
3.4.4 對象數(shù)組與動態(tài)對象68
3.4.5 初始化列表與特殊成員的
初始化69
3.4.6 共用體類與位域類71
3.4.7 析構(gòu)函數(shù)與對象拆除72
3.5 拷貝構(gòu)造與對象拆除73
3.5.1 拷貝構(gòu)建新對象73
3.5.2 改變?nèi)笔〉目截愋袨?4
3.5.3 拷貝構(gòu)造器的實現(xiàn)75
3.5.4 用自己定義的析構(gòu)器拆除對象76
3.6 字符串類string76
3.6.1 string類的屬性與對象構(gòu)造76
3.6.2 string類支持的主要運算76
3.6.3 string類的主要方法77
3.7 案例一:設(shè)計一個棧類78
3.8 案例二:公司員工類的設(shè)計(一)80
思考與練習(xí)383
實驗385
第4章 類的靜態(tài)成員、友元與指針訪問87
4.1 靜態(tài)成員87
4.1.1 靜態(tài)屬性87
4.1.2 靜態(tài)方法90
4.2 友元91
4.2.1 友元函數(shù)91
4.2.2 類方法作為友元92
4.2.3 友元類93
4.3 指向類成員的指針94
4.3.1 利用普通指針訪問屬性94
4.3.2 指向非靜態(tài)方法的指針95
4.4 案例三:賬戶類的設(shè)計96
思考與練習(xí)498
實驗4100
第5章 繼承與重用101
5.1 繼承的概念與表示101
5.1.1 繼承與派生101
5.1.2 繼承關(guān)系的描述102
5.2 繼承的實現(xiàn)103
5.2.1 繼承的語法形式103
5.2.2 訪問父類的成員104
5.3 類之間的關(guān)系與類的構(gòu)造107
5.3.1 繼承與聚集108
5.3.2 子類的構(gòu)造109
5.3.3 派生類的析構(gòu)110
5.4 復(fù)雜對象的構(gòu)造與析構(gòu)111
5.4.1 責(zé)任重大的構(gòu)造器111
5.4.2 類成員的構(gòu)造與析構(gòu)次序112
5.5 繼承的工作方式113
5.5.1 派生類是一種(個)基類113
5.5.2 利用指針和引用的訪問114
5.5.3 非public方式派生114
5.6 案例四:公司員工類的設(shè)計(二)115
5.6.1 雇員類的定義115
5.6.2 工人類的定義116
5.6.3 經(jīng)理類的定義117
思考與練習(xí)5118
實驗5121
第6章 虛函數(shù)與多態(tài)性122
6.1 多態(tài)性及其語法規(guī)則122
6.1.1 多態(tài)性與聯(lián)編方式122
6.1.2 用虛函數(shù)實現(xiàn)動態(tài)綁定123
6.2 共同基類下的對象訪問124
6.2.1 概念中的共性124
6.2.2 公共基類125
6.2.3 利用虛函數(shù)支持動態(tài)訪問126
6.3 對虛函數(shù)的進一步討論127
6.3.1 如何構(gòu)成虛函數(shù)關(guān)系127
6.3.2 類的構(gòu)造、析構(gòu)與虛函數(shù)129
6.3.3 虛函數(shù)的內(nèi)部實現(xiàn)機制130
6.3.4 重載、覆蓋和隱藏132
6.3.5 動態(tài)造型(dynamic_cast)134
6.4 純虛函數(shù)與抽象類135
6.4.1 純虛函數(shù)135
6.4.2 抽象類136
6.5 多重繼承138
6.5.1 多重繼承的語法規(guī)則138
6.5.2 多重繼承中的二義性140
6.5.3 虛繼承141
6.6 案例五:公司員工類的設(shè)計(三)144
6.6.1 雇員類的定義145
6.6.2 其他類的定義145
思考與練習(xí)6146
實驗6149
第7章 運算符重載150
7.1 重載運算符的概念與一般方法150
7.1.1 運算符重載是函數(shù)重載150
7.1.2 重載運算符的兩種方法151
7.1.3 重載運算符的限制153
7.2 重載運算符的設(shè)計154
7.2.1 運算符函數(shù)的參數(shù)154
7.2.2 運算符函數(shù)的返回值154
7.3 常見運算符的重載155
7.3.1 重載增量運算符 155
7.3.2 重載賦值運算符=157
7.3.3 重載==運算符和!=運算符160
7.3.4 重載下標運算符[]160
7.3.5 重載類型轉(zhuǎn)換運算符()161
7.3.6 重載函數(shù)調(diào)用運算符與函數(shù)
對象162
7.4 案例六:一個向量類的運算符
重載164
7.4.1 向量類定義164
7.4.2 為向量添加運算166
思考與練習(xí)7168
實驗7168
第8章 流與文件操作169
8.1 理解流機制169
8.1.1 流與文件169
8.1.2 從函數(shù)到對象169
8.1.3 源、匯和iostream流控制類170
8.2 構(gòu)造可流的類172
8.2.1 再談cout和cin對象172
8.2.2 重載輸出運算符<<172
8.2.3 重載輸入運算符>>173
8.3 格式控制174
8.3.1 使用流的方法175
8.3.2 使用操控符(Manipulators)179
8.3.3 內(nèi)存格式化(字符串流)182
8.4 文件流183
8.4.1 文件流的打開與關(guān)閉183
8.4.2 文件的讀寫操作185
8.4.3 二進制文件186
8.4.4 文件的隨機訪問187
8.5 案例七:一個圖書管理系統(tǒng)的
設(shè)計188
8.5.1 對象的輸入/輸出189
8.5.2 管理程序189
思考與練習(xí)8191
實驗8191
第9章 類模板、容器與泛型算法192
9.1 類模板192
9.1.1 類模板的定義192
9.1.2 使用類模板193
9.1.3 類模板的方法實現(xiàn)194
9.1.4 類模板與普通類之間的相互
繼承195
9.1.5 一個模板類實例complex196
9.1.6 設(shè)計一個隊列模板Queue197
9.2 容器與泛型199
9.2.1 抽象容器類模板199
9.2.2 泛型編程199
9.3 迭代器202
9.3.1 輸入迭代器(InputIterator)203
9.3.2 輸出迭代器(OutputIterator)204
9.3.3 前向迭代器(ForwardIterator)204
9.3.4 雙向迭代器(BidirectionalIterator)
和隨機訪問迭代器(Random-
AccessIterator)204
9.3.5 容器提供的迭代器205
9.3.6 插入迭代器(適配器)205
9.3.7 反向迭代器(reverse_iterator)206
9.4 幾種主要容器類與類的方法207
9.4.1 容器類的主要方法207
9.4.2 向量(vector)容器208
9.4.3 列表(list)容器209
9.4.4 雙端隊列(deque)、棧(stack)
和隊列(queue)容器210
9.4.5 映射(map)容器210
9.5 常用的通用算法212
9.5.1 只讀算法212
9.5.2 改寫元素算法213
9.5.3 元素排序算法213
思考與練習(xí)9214
實驗9215
第10章 異常處理216
10.1 異常及常規(guī)處理方法216
10.1.1 常見的異常216
10.1.2 常規(guī)處理方法216
10.2 用try-catch結(jié)構(gòu)處理異常218
10.2.1 try-catch異常處理機制218
10.2.2 異常219
10.2.3 拋出異常219
10.2.4 用try結(jié)構(gòu)監(jiān)視異常220
10.2.5 用catch結(jié)構(gòu)處理異常220
10.3 合理地處理異常222
10.3.1 異常類設(shè)計222
10.3.2 多catch結(jié)構(gòu)組成的異常
捕捉網(wǎng)224
10.3.3 捕捉自己應(yīng)該處理的異常225
10.3.4 申明異常227
思考與練習(xí)10228
實驗10228
附錄A C Builder集成化環(huán)境的使用229
附錄B DEV-C 與Visual C 6編程
環(huán)境238
附錄C 運算符的優(yōu)先級與結(jié)合性244
參考文獻245