內 容 簡介C語言是計算機專業的基礎課和核心課程。本書內容全面,結構清晰,語言通俗,重點難點突出,所有程序都能夠直接運行。本書內容包括C語言概述、常用的程序開發環境、基本數據類型、表達式、順序結構程序設計、選擇結構程序設計、循環結構程序設計、數組、函數、預處理命令、指針、結構體和共用體、位運算、文件、鏈表、鍵盤和鼠標、網絡編程基礎、常用算法、棧和隊列、排序、學生成績管理系統、常見錯誤和程序調試技術。本書可作為學習C程序設計、從事計算機軟件開發、參加等級考試和軟考的人員的參考書,也可以作為計算機及相關專業的教材。前 言
C語言是一門使用最為廣泛的程序設計語言,也是計算機等相關專業的必修課程,它是今后繼續學習數據結構和算法的基礎課程。C語言功能豐富,表達能力強,使用方便靈活,程序執行效率高,移植性好,既具有高級語言的特點,又具有低級語言的特征。現在流行的Visual C++和C++ Builder就是以C語言為基礎的開發工具。
本書適合初、中級程序員閱讀,是入門級用戶的首選教材和參考用書。如果您還在猶豫應選擇哪門程序設計語言作為開始,或者您剛下定決心要學好C語言,選擇本書一定沒有錯。但如果您是一名高級程序員,想了解一些專門領域的內容,那么這本書不適合您,希望您將本書放回書架比較顯眼的位置,在此表示感謝。
本書全面地介紹C語言的基本概念、基本語法及程序設計方法,以學習程序設計的基本路線進行講解,通過實例,分析程序的結構和含義,每個實例都給出具體的代碼,并配合流程圖進行講解。
本書內容全面,不僅詳細介紹C語言的基礎知識,還涉及C語言相關的高級技術和理論知識,是一部難得的技術參考書和自學教材,主要內容包括C語言概述、常用的程序開發環境、基本數據類型、表達式、順序結構程序設計、選擇結構程序設計、循環結構程序設計、數組、函數、預處理命令、指針、結構體和共用體、位運算、文件、鏈表、鍵盤和鼠標、網絡編程基礎、常用算法、棧和隊列、排序、C語言常見錯誤與調試技術。
學完本書之后,讀者基本上就可以熟練地掌握程序設計的方法了,并能夠熟練地開發C語言程序。
1. 本書特點
(1) 內容全面,講解詳細
為了方便讀者學習,本書首先對C語言的特點及優勢進行講解,然后講解各種C語言開發工具。本書內容全面,覆蓋C語言的全部知識,對于每個知識點,都使用具體實例和生活中的實例進行講解、對比,以便讀者能夠迅速地掌握C語言。
(2) 層次清晰,結構合理
本書將C語言按章、節和小節劃分知識點,將知識點細化,層次清晰、結構合理,易于讀者理解和學習。每一章、每一節、每一小節都劃分為單獨的知識點,每一小節還可分為更多的知識點。在知識點的講解過程中,循序漸進、由淺入深,先用提問的方式引出概念,然后再進行講解,最后通過例子來強化知識點,這樣的講解方式使讀者更容易理解和消化。
(3) 結合圖表,敘述簡單
針對每個知識點,都結合圖表和具體的實例去說明,將抽象的概念具體化,以利于讀者領會。在語言的敘述上,普遍采用短句子、易于理解的語言,而避免使用復雜句子和晦澀難懂的語言,使讀者可以更加容易地學會C語言。
(4) 例子典型,深入剖析
在講解每一個C語言知識點時,結合具體例子進行剖析。所選取的例子都是一些最為常見的典型程序,且每個例子都準確說明了相關的知識點。在每一章的最后或比較大的知識點后面,都給出一個完整的程序;給出程序的同時,對程序通過圖進行具體講解,并深入分析,在程序的最后給出運行結果。
(5) 語言詼諧,結合生活
在知識的講解方面,本書采用詼諧的語言,將每個概念與現實生活結合起來對比,從而使晦澀難懂的知識變得有趣,讓學習C語言程序設計變得易如反掌,使讀者能夠快速地從外行變為內行。
2. 本書內容
本書共分21章,各章內容介紹如下。
第1章:如果讀者還不知道應該學習C、C++、C#、Java中的哪一種編程語言,則通過閱讀該章,可以堅定學習C語言的決心。該章介紹C語言的特點、為什么要學習C語言和基本的理論基礎。
第2章:對幾種常用的C語言開發工具進行詳細的講解。主要包括Turbo C、Win-TC、LCC、Visual C++ 6.0,讀者可以選擇一個自己喜歡的工具。
第3章:主要介紹變量和常量。首先講解為什么要有變量、為什么要有數據類型,然后講解各種類型的變量定義及使用,最后講解常量。
第4章:主要介紹運算符和表達式。首先介紹運算符的分類、什么是表達式,然后講解常用的算術表達式、賦值表達式、關系表達式、邏輯表達式、逗號表達式。通過對該章內容的學習,讀者將學會各種表達式的使用。
第5章:主要介紹順序結構程序設計。首先介紹語句的概念,然后介紹順序結構程序的特點,最后通過具體實例講解如何編寫順序結構的程序。
第6章:主要介紹選擇結構程序設計。首先講解條件運算符和條件表達式,然后講解單分支的if選擇語句、雙分支的if選擇語句、多分支的if選擇語句、switch選擇語句,最后給出一個具體的實例。
第7章:主要介紹循環結構程序設計。首先介紹3種常用的循環語句——while循環語句、do-while循環語句、for循環語句,接著介紹goto語句、break語句和continue語句、多重循環結構的程序設計,最后給出幾個典型的實例。
第8章:主要介紹數組。首先通過具體問題引出數組的概念,然后介紹一維數組、二維數組、字符數組。
第9章:主要介紹函數。首先介紹函數的分類,然后介紹函數的定義形式、局部變量和全局變量、函數的參數和函數的值、函數的調用、函數的嵌套調用、函數的遞歸調用、數組作為函數的參數,最后給出幾個實例。通過學習該章的內容,讀者將掌握模塊化程序設計知識。
第10章:講解預處理命令。依次介紹宏定義、文件包含命令、條件編譯,通過學習該章的內容,可以提高所編寫程序的編譯效率。
第11章:主要介紹C語言的靈魂——指針。首先介紹指針與地址的區別,然后講解指針變量、數組與指針、字符串與指針、指針數組與指向指針的指針、函數與指針、返回指針值的函數。指針是C語言中最難的一個知識點,該章通過對比學習指針中容易混淆的概念,使讀者可以編寫出高效的C語言程序。
第12章:主要介紹結構體和共用體。首先介紹結構體的定義、引用、初始化,然后講解結構體數組、指針與結構體、共用體、枚舉類型。通過對該章內容的學習,讀者將能夠定義及使用比較復雜的數據,設計出更加實用的程序。
第13章:主要介紹位運算。首先介紹位運算符及位運算的優先級與結合性,然后介紹各種位運算符,并通過一個典型實例講解位運算符的使用方法。通過對該章內容的學習,讀者將了解到計算機的底層操作。
第14章:主要介紹文件的知識。首先介紹文件的分類,然后講解打開和關閉文件、讀取文件和寫入文件、文件的定位等操作,最后講解常見的其他文件操作函數。通過對該章內容的學習,讀者將掌握文件的相關操作。
第15章:主要介紹鏈表的知識。首先介紹鏈表的概念、動態存儲分配,然后講解創建鏈表、插入鏈表、刪除鏈表等操作,最后給出具體的應用實例。通過學習該章內容,讀者將掌握如何進行動態內存分配,構造出最簡單的數據結構。
第16章:主要介紹鍵盤和鼠標操作。首先介紹鍵盤和鼠標操作的一些基礎知識,然后通過實例分析鍵盤和鼠標操作的具體應用技術。通過對該章內容的學習,讀者將掌握計算機內部的工作原理,理解控制鍵盤和鼠標的技術。
第17章:主要介紹網絡編程基礎。首先介紹網絡的基本知識,然后介紹Winsock基礎知識和相關函數,最后給出一個基于TCP和UDP的網絡聊天程序。通過對該章內容的學習,讀者將學會如何使用C語言編寫簡單的網絡應用程序。
第18章:主要介紹常用算法。首先介紹算法設計的基礎知識,然后分別介紹迭代算法、遞推算法、窮舉算法、遞歸算法、分治算法、貪心算法和矩陣算法。通過對該章內容的學習,讀者將掌握軟件開發中最常見的算法,進一步提高軟件開發水平。
第19章:主要介紹棧和隊列。首先介紹隊列和棧的有關概念,然后介紹隊列和棧的表示與實現,最后介紹隊列和棧的應用。通過對該章內容的學習,讀者將能夠利用棧和隊列這種最簡單的數據結構對事物進行抽象。
第20章:主要介紹排序技術。首先介紹排序的有關概念,然后分別介紹插入排序、選擇排序、交換排序、歸并排序和分配排序,最后對各種排序算法進行比較。
第21章:主要介紹學生成績管理系統。通過一個具體的軟件項目來告訴讀者如何進行軟件開發,首先對需要開發的軟件系統進行目標分析,然后進行總體設計、詳細設計,最后是編碼和測試。通過對該章內容的學習和實踐,讀者將能夠掌握軟件開發的流程,初步學會軟件開發技術。
第22章:主要介紹C語言常見錯誤和程序調試技術。首先介紹C語言開發過程中的常見錯誤,然后舉例說明如何利用Visual C++ 6.0進行程序調試。根據一些熱心讀者和學生在學習C語言過程中遇到的問題,進行有針對性的分析和講解。通過對該章內容的學習,讀者將學會識別最常見的C語言錯誤信息,并初步掌握Visual C++ 6.0程序調試技術。
本書的第1~9章及第15~20章、第22章由陳銳編寫,第10章、第11章、第21章由楊宇晶編寫,第12~14章由郭天嬌編寫。
由于作者水平有限,書中難免存在一些疏漏和不足之處,懇請讀者批評指正。請通過nwuchenrui@126.com與作者聯系。
3. 適合的讀者
本書適合下列人員閱讀和使用:
* 大中專院校的學生。
* 準備參加計算機等級考試的人員。
* 準備參加軟考的人員。
* 軟件開發人員。
* 計算機相關的科研工作者。
4. 致謝
感謝我的導師張蕾教授,她豐富的知識儲備及敏銳的洞察力極大地影響了我的學習態度和認識能力,使我在職業生涯中受益,也為本書的編寫奠定了良好的基礎。
感謝我的家人,是因為有他們默默的付出和鼓勵,我才能順利地做好各項工作。
最后特別感謝溫縣教育局及所有支持我寫作的朋友們!
陳 銳
2013年7月
目 錄
第1章 C語言概述 1
1.1 為什么要選擇C語言 2
1.1.1 選擇C語言的好處 2
1.1.2 C語言的特點 2
1.1.3 如何學好C語言 3
1.2 進制轉換 4
1.2.1 十進制數的表示 4
1.2.2 二進制數的表示 5
1.2.3 二進制數、十六進制數
和八進制數轉換為十進制數 6
1.2.4 十進制數轉換為二進制數 6
1.2.5 十進制數轉換為十六進制數 9
1.2.6 十進制數轉換為八進制數 11
1.2.7 二進制數與十六進制數、
八進制數的轉換 12
1.3 計算機中數的表示 13
1.3.1 計算機中的正數與負數表示 14
1.3.2 原碼和補碼 14
1.3.3 浮點數 17
1.4 小結 19
第2章 C語言開發環境 21
2.1 Turbo C 2.0開發環境介紹 22
2.1.1 運行Turbo C 2.0 22
2.1.2 Turbo C 2.0環境設置 23
2.1.3 Turbo C 2.0的使用 25
2.2 Win-TC開發環境介紹 27
2.2.1 Win-TC開發環境概述 27
2.2.2 Win-TC的使用 28
2.3 LCC開發環境介紹 30
2.3.1 使用LCC開發環境創建
項目 30
2.3.2 LCC開發環境的介紹 32
2.3.3 LCC的使用 33
2.4 Visual C++ 6.0開發環境介紹 34
2.4.1 使用Visual C++ 6.0新建
項目 34
2.4.2 使用Visual C++ 6.0新建源
程序文件 36
2.4.3 使用Visual C++ 6.0開發
環境 37
2.5 小結 38
第3章 基本數據類型 39
3.1 變量 40
3.1.1 為什么要使用變量 40
3.1.2 什么是變量——變量在計算機
中的表示 40
3.1.3 如何定義變量 41
3.1.4 為什么要有數據類型 41
3.1.5 C語言有哪些數據類型 42
3.1.6 什么符號可以作為變量名——
用戶定義的標識符 43
3.1.7 關鍵字——已經被占用的
標識符 44
3.1.8 初識變量賦值 44
3.2 整型變量 45
3.2.1 為什么要使用整型變量 45
3.2.2 基本整型變量 46
3.2.3 基本整型變量的輸入——使用
scanf函數 47
3.2.4 基本整型變量的輸出——使用
printf函數 49
3.2.5 長整型變量——解決大整數
問題 50
3.2.6 短整型變量——節省內存
空間 52
3.2.7 無符號整型變量——只包括
非負的整數 53
3.2.8 整型變量的應用舉例 54
3.3 實型變量 57
3.3.1 為什么使用實型變量 57
3.3.2 單精度浮點型變量 57
3.3.3 雙精度浮點型變量 60
3.3.4 長雙精度浮點型變量 61
3.3.5 實型變量的應用舉例 62
3.4 字符型數據類型 64
3.4.1 為什么要使用字符型變量 64
3.4.2 字符型變量 64
3.4.3 字符型數據的輸入與字符型變量
值的輸出——使用%c和%s 65
3.4.4 字符型變量的應用舉例 66
3.5 常量 68
3.5.1 為什么使用常量 68
3.5.2 整型常量 68
3.5.3 浮點型常量 69
3.5.4 字符型常量與字符串型常量 69
3.5.5 常量與常數 70
3.6 小結 70
習題 70
第4章 運算符與表達式 73
4.1 表達式 74
4.1.1 運算符有哪些 74
4.1.2 什么是表達式 74
4.1.3 運算符的優先級與結合性 75
4.1.4 自動類型轉換 76
4.2 算術運算符與算術表達式 77
4.2.1 基本算術表達式 77
4.2.2 自增表達式——++a和a++ 79
4.2.3 自減表達式——--a和a-- 82
4.2.4 算術運算符的混合運算——算術
運算符的優先級與結合性 83
4.2.5 算術表達式應用舉例 84
4.3 賦值運算符與賦值表達式及其應用 86
4.3.1 賦值運算符與賦值表達式 86
4.3.2 類型轉換 89
4.3.3 賦值表達式的應用舉例 91
4.4 關系運算符與關系表達式及其應用 93
4.4.1 關系運算符和關系表達式 93
4.4.2 關系表達式應用舉例 94
4.5 邏輯運算符與邏輯表達式及其應用 95
4.5.1 邏輯運算符和邏輯表達式 95
4.5.2 邏輯表達式應用舉例 97
4.6 逗號表達式 98
4.6.1 逗號運算符與逗號表達式 99
4.6.2 逗號表達式中應注意的問題 99
4.6.3 逗號表達式應用舉例 99
4.7 小結 100
第5章 順序結構程序設計 101
5.1 語句和程序 102
5.1.1 什么是簡單語句 102
5.1.2 為什么使用復合語句 103
5.1.3 什么是復合語句 103
5.1.4 使用復合語句應注意的
問題 104
5.1.5 為什么要有程序 105
5.1.6 C語言程序的框架結構 106
5.2 順序結構程序設計 107
5.2.1 順序結構程序設計的特點——
自上而下執行每一個語句 107
5.2.2 順序結構程序設計——求圓的
面積 107
5.2.3 順序結構程序——求一元二次
方程ax2+bx+c=0的根 110
5.2.4 順序結構程序設計應用舉例——
將小寫字母轉換為大寫字母 111
5.3 小結 113
第6章 選擇結構程序設計 115
6.1 條件運算符 116
6.1.1 為什么要有條件運算符 116
6.1.2 條件運算符與條件表達式 116
6.2 if選擇語句 119
6.2.1 為什么要有if選擇語句——
理解容易 119
6.2.2 if選擇語句——單分支選擇
結構 120
6.2.3 if-else選擇語句——雙分支的
選擇結構 124
6.2.4 if...else if…else選擇語句——
多分支選擇結構 126
6.2.5 if選擇語句的嵌套 131
6.2.6 設置標志變量 135
6.2.7 if選擇語句與條件運算符——
相互轉換 136
6.3 switch選擇語句 137
6.3.1 switch選擇語句 137
6.3.2 switch選擇語句應用舉例 138
6.4 選擇結構程序設計應用舉例 143
6.5 小結 151
第7章 循環結構程序設計 153
7.1 為什么要有循環結構 154
7.1.1 如何重復輸出多個hello
world 154
7.1.2 如何求連續的n個自然數
的和 154
7.2 while循環語句 155
7.2.1 while循環語句——當型
循環 155
7.2.2 while循環語句應用舉例 158
7.3 do-while循環語句 160
7.3.1 為什么要有do-while 160
7.3.2 do-while循環語句——直到型
循環 160
7.3.3 比較while循環結構和do-while
循環結構 162
7.4 for循環語句 165
7.4.1 for循環語句概述 165
7.4.2 for循環語句的靈活性 169
7.4.3 幾種循環語句的比較 174
7.5 goto語句與goto語句構成的循環
語句 175
7.5.1 goto語句——無條件轉移
語句 175
7.5.2 goto語句構成的循環語句——
向前跳轉 176
7.5.3 goto語句與while語句、for
語句的比較 177
7.6 break語句 178
7.6.1 循環中的“提前開溜” 178
7.6.2 使用break語句 179
7.7 continue語句 181
7.7.1 為什么要有continue語句 181
7.7.2 使用continue語句 181
7.7.3 continue語句與break語句的
區別 182
7.7.4 continue語句應用舉例 183
7.8 多重循環程序設計 184
7.8.1 為什么要有循環的嵌套——
一層循環是不能解決所有
問題的 184
7.8.2 循環的嵌套——循環結構中
還可以有循環結構 185
7.8.3 多重循環應用舉例——輸出
乘法口訣表 187
7.9 循環結構程序應用舉例 190
7.9.1 循環結構程序應用舉例——
求π的近似值 190
7.9.2 循環結構程序應用舉例——
求101~200之間的所有
質數 193
7.9.3 循環結構程序應用舉例——
質數問題的改進算法 195
7.9.4 循環結構程序應用舉例——
百雞問題 196
7.10 小結 198
第8章 數組 199
8.1 為什么要有數組 200
8.1.1 多變量的解決之道——數組的
引入 200
8.1.2 數組就是這個樣子——初識
數組 201
8.1.3 數組的數組——維度的
出現 202
8.2 一維數組 204
8.2.1 一維數組是這樣定義的 204
8.2.2 一維數組的引用——其實
很簡單 205
8.2.3 一維數組的初始化——方法
有許多 206
8.2.4 一維數組的應用舉例——求
數組各元素的平均值 208
8.2.5 一維數組的應用舉例——數組
元素的倒排 209
8.2.6 一維數組的應用舉例——冒泡
排序 211
8.3 二維數組 214
8.3.1 二維數組原來是這樣
定義的 214
8.3.2 二維數組的引用——其實
并不難 216
8.3.3 二維數組的初始化——多樣的
初始化 217
8.3.4 二維數組應用舉例——計算
各科成績的平均分 220
8.3.5 二維數組應用舉例——矩陣的
轉置 222
8.3.6 二維數組應用舉例——有趣的
魔方陣 223
8.4 字符數組 227
8.4.1 字符數組是這樣定義的 227
8.4.2 字符數組的初始化 228
8.4.3 字符數組的連續輸出——
格式符%s 230
8.4.4 字符數組的連續輸入——
格式符%s 231
8.4.5 常用的字符串處理函數 232
8.4.6 字符數組的應用舉例 236
8.5 小結 240
第9章 函數 241
9.1 為什么要有函數及函數的分類 242
9.1.1 為什么要有函數 242
9.1.2 函數有哪些——庫函數
和用戶函數 243
9.2 函數的定義形式 243
9.2.1 不帶參數的函數定義形式 243
9.2.2 帶參數的函數定義形式——
有參數列表 244
9.2.3 帶參數的函數定義形式——
形參定義的傳統方式 245
9.3 局部變量與全局變量 246
9.3.1 局部變量 246
9.3.2 全局變量 248
9.4 函數的參數與函數的值 250
9.4.1 形式參數與實際參數 250
9.4.2 函數的返回值 252
9.5 函數的調用 254
9.5.1 函數調用的一般形式 254
9.5.2 函數調用的方式 256
9.5.3 對被調用函數的聲明 257
9.6 函數的嵌套調用 260
9.6.1 函數的嵌套調用過程 260
9.6.2 函數的嵌套應用舉例 261
9.7 函數的遞歸調用 262
9.7.1 什么是遞歸——自己調用
自己 262
9.7.2 遞歸函數應用舉例——
求n! 263
9.7.3 遞歸函數調用應用舉例——
Fibonacci數列 265
9.8 數組作為函數的參數 266
9.8.1 數組元素作為函數的參數——
只能傳遞一個數組元素 266
9.8.2 數組名作為函數的參數——
可以傳遞整個數組 268
9.8.3 數組名作為參數傳遞——實際
上傳遞的是數組的首地址 271
9.8.4 多維數組名作為函數的參數——
傳遞整個數組 275
9.9 變量的存儲 277
9.9.1 什么是動態存儲與靜態存儲——
生存期不同 278
9.9.2 auto變量——自動類型
變量 278
9.9.3 static變量——靜態變量 278
9.9.4 register變量——使運行速度
更快的變量 281
9.9.5 extern變量——聲明外部
變量 282
9.10 內部函數與外部函數 284
9.10.1 內部函數——使用static 284
9.10.2 外部函數——使用extern 285
9.11 函數應用舉例 286
9.11.1 函數應用舉例——遞歸求解
n個數的最大值 286
9.11.2 函數應用舉例——遞歸求解a
與b的最大公約數 288
9.11.3 函數應用舉例——字符數組
元素逆序存放 289
9.12 小結 290
第10章 預處理命令 291
10.1 宏定義 292
10.1.1 為什么要有宏定義 292
10.1.2 不帶參數的宏定義 292
10.1.3 宏定義與常量定義的區別 294
10.1.4 帶參數的宏定義 294
10.1.5 宏定義中的參數與函數的
參數的區別 295
10.2 文件包含命令 297
10.2.1 為什么要有文件包含
命令 297
10.2.2 文件包含命令——#include 297
10.3 條件編譯 299
10.3.1 第一種條件編譯命令——
#ifdef 300
10.3.2 第二種條件編譯命令——
#ifdef…#elif…#endif 301
10.3.3 第三種條件編譯命令——
#ifndef 302
10.3.4 第四種條件編譯命令——
#if 303
10.4 小結 304
第11章 指針 305
11.1 指針的相關概念 306
11.1.1 為什么要有指針和指針
變量 306
11.1.2 什么是地址 306
11.1.3 什么是指針變量——存放
地址的變量 307
11.2 指針變量 308
11.2.1 定義指針變量 308
11.2.2 使用指針變量 310
11.2.3 指針變量作為函數參數 313
11.3 數組與指針 317
11.3.1 指向數組元素的指針 317
11.3.2 通過指針引用數組元素 318
11.3.3 指針變量的自增運算
和自減運算 322
11.3.4 數組指針作為函數的參數 323
11.3.5 指向多維數組的指針變量 329
11.4 字符串與指針 336
11.4.1 指向字符串的指針變量 336
11.4.2 字符串指針作為函數的
參數 342
11.4.3 字符數組與字符指針變量的
比較 346
11.5 指針數組與指向指針的指針 347
11.5.1 指針數組 347
11.5.2 指向指針的指針 351
11.5.3 指針數組作為main函數的
參數 353
11.6 函數與指針 354
11.6.1 函數指針調用函數 354
11.6.2 指向函數的指針作為函數
參數 355
11.7 返回指針值的函數 358
11.7.1 為什么函數要返回指針值——
可以返回多個值 358
11.7.2 返回指針類型的函數 358
11.8 小結 360
第12章 結構體和共用體 361
12.1 結構體 362
12.1.1 為什么要有結構體 362
12.1.2 結構體類型的定義 363
12.1.3 定義結構體變量 363
12.1.4 引用結構體變量 365
12.1.5 結構體變量的初始化 367
12.2 結構體數組 369
12.2.1 為什么要有結構體數組 369
12.2.2 定義結構體數組 369
12.2.3 結構體數組的初始化 370
12.2.4 結構體數組應用舉例 371
12.3 指針與結構體 375
12.3.1 指向結構體變量的指針 375
12.3.2 指向結構體數組的指針 376
12.3.3 結構體變量和指向結構體的
指針作為函數的參數 378
12.4 typedef類型定義 382
12.4.1 typedef——為數據類型重新
起個名字 382
12.4.2 使用typedef時應注意的
問題 384
12.4.3 typedef的應用舉例 384
12.5 共用體 387
12.5.1 為什么要有共用體——節省
內存,多選一 387
12.5.2 定義共用體 388
12.5.3 引用共用體變量 389
12.5.4 使用共用體應該注意的
問題 390
12.5.5 共用體應用舉例 390
12.6 枚舉類型 393
12.6.1 為什么要有枚舉類型——變量
的值只有有限的幾種 393
12.6.2 定義枚舉類型及變量 394
12.6.3 使用枚舉類型時應注意的
問題 394
12.6.4 枚舉類型應用舉例 395
12.7 小結 396
第13章 位運算 397
13.1 為什么要有位運算與位運算符 398
13.1.1 為什么要有位運算——提高
效率 398
13.1.2 位運算符 398
13.1.3 位運算符的優先級
與結合性 399
13.2 位運算符和位運算 399
13.2.1 按位與運算符和按位
與運算 399
13.2.2 按位或運算符與按位
或運算 401
13.2.3 按位異或運算符與按位
異或運算 401
13.2.4 按位取反運算符與按位
取反運算 403
13.2.5 左移運算符與左移運算 404
13.2.6 右移運算符與右移運算 405
13.2.7 與位運算符相結合的賦值
運算符 405
13.3 位運算應用舉例 406
13.3.1 以二進制形式輸出一個數——
按位與運算并輸出1或0 406
13.3.2 取一個整數的中間幾位 407
13.4 位段 409
13.4.1 定義位段 409
13.4.2 引用位段成員 410
13.4.3 使用位段需要說明的問題 411
13.5 小結 412
第14章 文件 413
14.1 文件的相關概念 414
14.1.1 為什么要有文件 414
14.1.2 文件的分類——二進制文件
和文本文件 414
14.1.3 緩沖文件系統 414
14.2 打開與關閉文件 415
14.2.1 文件類型指針——FILE* 415
14.2.2 打開文件——使用fopen
函數 416
14.2.3 關閉文件——使用fclose
函數 417
14.3 讀取文件與寫入文件 418
14.3.1 使用fputc函數寫文件和
使用fgetc函數讀取文件 418
14.3.2 使用fputs函數寫文件和使用
fgets函數讀取文件 422
14.3.3 使用fwrite函數寫文件和
使用fread函數讀取文件 424
14.3.4 使用fprintf函數寫文件和
使用fscanf函數讀取文件 426
14.4 文件的定位 428
14.4.1 rewind函數——移動位置
指針到文件的開始位置 428
14.4.2 fseek函數——移動位置指針
到任意位置 429
14.4.3 ftell函數——得到位置指針
的當前位置 431
14.5 文件狀態檢測 432
14.5.1 feof函數——檢測位置指針
是否到了文件末尾 432
14.5.2 ferror函數——檢測是否操作
文件錯誤 432
14.5.3 clearerr函數——清除錯誤
標志 433
14.6 文件的輸入與輸出操作函數
總結 433
14.7 小結 434
第15章 鏈表 435
15.1 鏈表的相關概念 436
15.1.1 為什么要有鏈表——節省
內存單元,不用事先定義
空間大小 436
15.1.2 什么是鏈表 436
15.1.3 簡單鏈表——靜態鏈表 438
15.1.4 動態存儲分配 442
15.2 鏈表的操作 443
15.2.1 創建鏈表 443
15.2.2 鏈表的輸出操作 447
15.2.3 鏈表的插入操作 449
15.2.4 鏈表的刪除操作 453
15.2.5 鏈表的綜合操作 456
15.3 鏈表操作應用舉例 457
15.3.1 鏈表操作應用舉例——逆置
鏈表 457
15.3.2 鏈表操作應用舉例——
約瑟夫問題 463
15.4 小結 467
第16章 鍵盤和鼠標 469
16.1 鍵盤操作 470
16.1.1 鍵盤編碼 470
16.1.2 鍵盤操作函數 470
16.2 鼠標操作 472
16.2.1 鼠標的工作原理 473
16.2.2 鼠標綜合應用舉例 477
16.3 小結 484
第17章 網絡編程基礎 485
17.1 網絡基礎知識 486
17.1.1 什么是計算機網絡 486
17.1.2 網絡協議 486
17.1.3 協議分層 487
17.1.4 網絡參考模型 488
17.1.5 端口 491
17.2 WinSocket基礎 491
17.2.1 套接字Socket 491
17.2.2 基于TCP的Socket編程 491
17.2.3 基于UDP的Socket編程 493
17.3 WinSocket相關函數 493
17.3.1 WSAStartup函數——啟動
套接字庫 494
17.3.2 Socket函數——建立
套接字 494
17.3.3 bind函數——綁定本地IP
地址和端口 495
17.3.4 listen函數——偵聽客戶端
請求 496
17.3.5 accept函數——等待客戶端的
請求 496
17.3.6 send函數——發送數據 496
17.3.7 recv函數——接收數據 497
17.3.8 connect函數——建立
連接 497
17.3.9 recvfrom函數——接收
數據 497
17.3.10 sendto函數——發送
數據 497
17.4 基于TCP的簡單網絡程序 498
17.4.1 服務器端的程序實現 498
17.4.2 客戶端程序的實現 501
17.5 基于UDP的簡單網絡聊天程序 503
17.5.1 服務器端程序的實現 503
17.5.2 客戶端程序的實現 505
17.6 小結 506
第18章 常用算法 507
18.1 算法基礎 508
18.1.1 什么是算法及算法的描述
語言 508
18.1.2 算法的特性 509
18.1.3 算法設計的目標 509
18.1.4 算法的時間復雜度和空間
復雜度 510
18.2 迭代算法 511
18.2.1 算法思想 511
18.2.2 求一個數的平方根 511
18.2.3 角谷猜想 512
18.2.4 牛頓迭代法 513
18.3 遞推算法 515
18.3.1 認識遞推 515
18.3.2 斐波那契數列 516
18.3.3 分西瓜 517
18.3.4 該存多少錢 518
18.4 窮舉算法 518
18.4.1 算法思想 519
18.4.2 完全數 519
18.4.3 背包問題 520
18.5 遞歸算法 521
18.5.1 算法思想 522
18.5.2 數制轉換 522
18.5.3 組合問題 523
18.6 分治算法 525
18.6.1 算法思想 525
18.6.2 求n個數的最大值
和最小值 525
18.6.3 賽程安排問題 527
18.7 貪心算法 530
18.7.1 算法思想 530
18.7.2 加油站問題 531
18.7.3 找零錢問題 532
18.8 矩陣算法 534
18.8.1 打印魔方陣 534
18.8.2 打印拉丁方陣 536
18.8.3 將矩陣旋轉90度 537
18.9 小結 539
第19章 簡單數據結構——棧和隊列 541
19.1 隊列 542
19.1.1 隊列的定義 542
19.1.2 隊列的表示與實現 543
19.1.3 順序循環隊列 544
19.1.4 順序循環隊列的實現 545
19.1.5 鏈式隊列的表示與實現 547
19.1.6 隊列的應用——商品貨架
模擬 549
19.2 棧 553
19.2.1 棧的定義 553
19.2.2 順序棧的存儲結構與實現 553
19.2.3 鏈式棧的存儲結構與實現 555
19.2.4 棧的應用舉例——算術
表達式求值 557
19.3 小結 563
第20章 常用技術——排序 565
20.1 排序的基礎知識 566
20.1.1 排序的相關概念 566
20.1.2 排序算法的分類 567
20.2 插入類排序 567
20.2.1 直接插入排序 568
20.2.2 折半插入排序 569
20.2.3 希爾排序 571
20.3 選擇類排序 573
20.3.1 簡單選擇排序 573
20.3.2 堆排序 575
20.4 交換類排序 582
20.4.1 冒泡排序 582
20.4.2 快速排序 584
20.5 歸并類排序 587
20.5.1 二路歸并排序算法思想 587
20.5.2 二路歸并排序算法實現 588
20.6 分配類排序 591
20.6.1 基數排序算法思想 591
20.6.2 基數排序算法實現 592
20.7 各種排序方法的比較 598
20.8 小結 599
第21章 學生成績管理系統 601
21.1 系統總體設計 602
21.1.1 項目開發目標 602
21.1.2 系統功能描述 602
21.2 系統詳細設計 603
21.2.1 主函數的運行流程 603
21.2.2 功能模塊設計 604
21.2.3 數據結構設計 606
21.2.4 函數功能描述 606
21.3 系統實現與系統測試 608
21.3.1 編碼 608
21.3.2 系統測試 621
21.4 小結 625
第22章 C語言常見錯誤與程序調試
技術 627
22.1 常見錯誤 628
22.1.1 錯誤分類 628
22.1.2 常見錯誤舉例 628
22.2 程序調試 632
22.2.1 Visual C++ 6.0開發環境的
程序調試 632
22.2.2 程序調試應用舉例 638
22.3 小結 643
后記 645
參考文獻 651