目 錄
注:淺灰色的目錄標題是本書所對應的譚浩強《C程序設計》(第四版)中的相應章節的目錄標題。
第1章 C語言背後的故事 程序設計和C語言 1
1.1 計算機程序是什麼 什麼是計算機程序 1
1.2 計算機語言又是什麼 什麼是計算機語言 1
1.2.A 如何用計算機語言來錶達一個程序 2
1.2.B 從匯編語言到高級語言——風格各異的計算機語言 4
1.3 C語言真正的特點及其演變 C語言的發展及其特點 6
1.3A C語言與C++不得不說的那點事 8
1.3B 我們為什麼現在還要學習C語言 9
1.4 第一次的親密接觸——Hello,World 最簡單的C語言程序 11
1.4.A 最簡單的C語言程序背後的故事——它的匯編代碼是如何被執行的 12
1.4.1 比最簡單再復雜一點點 最簡單的C語言程序舉例 15
1.4.2 程序的三要素:數據輸入、數據處理與數據輸齣 C語言程序的結構 18
1.4.B 編碼規範——如何寫齣簡潔優美的代碼 19
1.5 C程序開發的兩個循環和四個步驟 運行C程序的步驟與方法 21
1.5A 工欲善其事,必先利其器——使用Eclipse編寫C程序 22
1.5B 使用GCC編譯C語言程序 24
1.6 程序設計的瀑布模型 程序設計的任務 25
第2章 解決問題的思路——算法 算法——程序的靈魂 28
2.1 先有算法,後有程序 什麼是算法 28
2.1A 算法的時間復雜度和空間復雜度 31
2.2 如何將抽象的算法實現為具體的代碼 簡單的算法舉例 36
2.3 算法的特徵——簡單,沒啥可說的 算法的特性 38
2.4 一群聰明的程序員是怎麼把事情搞砸的 怎樣錶示一個算法 38
2.5 掌握結構化的程序設計 結構化程序設計方法 39
2.5A 結構化程序設計的基本思想、步驟與流程 39
2.5B“自頂嚮下,逐步求精”:把“問題”變成“程序”的魔法 40
第3章 順序結構的程序設計 最簡單的C程序設計——順序程序設計 44
3.1 順序結構程序舉例——簡單,沒啥可說的 順序程序設計舉例 45
3.1A 如何理解程序的執行順序 45
3.2 如何描述數據,如何對數據進行運算 數據的錶現形式及其運算 46
3.2.1 常量、變量、常變量及符號 常量和變量 46
3.2.2 數據類型及舉例 數據類型 48
3.2.3 整型數據及如何選擇閤適的類型 整型數據 51
3.2.4 字符型數據及舉例 字符型數據 52
3.2.5 浮點型數據及比較大小時的特彆注意 浮點型數據 53
3.2.6 如何強製指定常量的數據類型 怎樣確定常量的類型 55
3.2.7 運算符和錶達式及使用經驗和建議 運算符和錶達式 55
3.3 基本程序單位——語句 C語句 58
3.3.1 C語言的語句分類 C語句的作用和分類 58
3.3.2 賦值語句及其使用注意 最基本的語句——賦值語句 60
3.4 數據從哪裏來,又到哪裏去? 數據的輸入輸齣 61
3.4.1 輸入輸齣舉例——簡單,沒啥可說的 輸入輸齣舉例 61
3.4.2 輸入輸齣的概念——簡單,沒啥可說的 有關數據輸入輸齣的概念 61
3.4.3 使用printf函數進行格式化數據輸齣 用printf函數輸齣數據 61
3.4.4 使用scanf函數進行格式化數據輸入 用scanf函數輸入數據 63
3.4.5 單字符的輸入輸齣及敏感信息輸入函數 字符數據的輸入輸齣 64
3.4.5A 字符串數據的簡單輸入輸齣 66
第4章 選擇結構的程序設計 選擇結構程序設計 67
4.1 選擇結構和條件判斷——交通燈例子 選擇結構和條件判斷 67
4.2—4.3 使用if語句實現選擇結構 69
4.4 邏輯運算符及錶達式 邏輯運算符和邏輯錶達式 69
4.4.1 邏輯運算符及優先級 邏輯運算符及其優先次序 69
4.4.1A 閤理的齣錯處理——讓你的程序更受歡迎 71
4.4.2 邏輯錶達式及其使用注意 邏輯錶達式 71
4.4.3 邏輯型變量——時控燈例子 邏輯型變量 72
4.5 條件運算符及錶達式 條件運算符和條件錶達式 73
4.6 條件結構的嵌套——拜金女擇偶例子 選擇結構的嵌套 73
4.7 使用switch語句實現多分支選擇結構——看天穿衣例子 用switch語句實現多分支選擇結構 75
4.8 綜閤運用——猜數字遊戲 選擇結構程序綜閤舉例 78
第5章 循環結構的程序設計 循環結構程序設計 82
5.1 為什麼需要循環控製——簡單,沒啥可說的 為什麼需要循環控製 82
5.1A 循環結構的四個要素 82
5.2 如果條件滿足,就一直做某事的while 用while語句實現循環 84
5.3 一直做某事,直到條件不滿足的do…while 用do…while語句實現循環 86
5.4 最完備最復雜的循環語句for 用for語句實現循環 87
5.5 更復雜的數據處理——嵌套的循環 循環的嵌套 89
5.6 如何選擇閤適的循環結構 幾種循環的比較 89
5.7 改變循環的狀態 改變循環執行的狀態 90
5.7.1—5.7.2 用break和continue語句提前終止循環 90
5.7.3 break和continue的不同 break語句和continue語句的區彆 90
5.8 綜閤運用——檢測磁盤剩餘容量與統計字符串中的單詞數 循環程序舉例 91
第6章 處理批量數據的利器——數組 利用數組處理批量數據 95
6.1 如何定義和引用一維數組 怎樣定義和引用一維數組 95
6.1.1 如何定義一維數組——保存學生成績的例子 怎樣定義一維數組 95
6.1.2 如何引用一維數組 怎樣引用一維數組元素 96
6.1.3 使用memset()函數進行一維數組的初始化 一維數組的初始化 98
6.1.4 用qsort()函數對數組進行排序 一維數組程序舉例 99
6.2 如何定義和引用二維數組 怎樣定義和引用二維數組 101
6.2.1 如何定義二維數組及二維數組的內存排列方式 怎樣定義二維數組 101
6.2.2 如何引用二維數組 怎樣引用二維數組的元素 102
6.2.3 使用memset()函數進行二維數組的初始化 二維數組的初始化 102
6.2.4 對二維數組中的數據進行排序 二維數組程序舉例 103
6.2.4.A 分析問題,定義二維數組描述批量數據 103
6.2.4.B 嚮二維數組輸入數據 104
6.2.4.C 用qsort()函數對二維數組進行排序 105
6.2.4.D 輸齣二維數組結果 106
6.2.A 擴展:多維數組的使用 107
6.3 字符數組的本質 字符數組 108
6.3.1—6.3.3 如何定義字符數組 108
6.3.4 字符串和字符數組的區彆 字符串和字符串結束標誌 108
6.3.5 字符數組和字符串的輸入輸齣 字符數組的輸入輸齣 109
6.3.6 使用字符串處理函數完成字符串處理任務 使用字符串處理函數 110
6.3.6.A 用gets()和puts()輸入輸齣字符串 110
6.3.6.B 用strcat()連接兩個字符串 110
6.3.6.C 用strchr()和strstr()查找字符串 112
6.3.6.D 用strcmp()比較字符串 113
6.3.7 綜閤運用——自己寫一個strsub()函數截取字符串 字符數組應用舉例 115
6.A 如何運用數組處理批量數據——一個計算平均血糖的例子 117
6.A.A 什麼時候應該使用數組 117
6.A.B 如何將數據輸入到數組 117
6.A.C 如何處理數組中的數據 118
6.A.D 數組使用的三部麯:定義數組、輸入數據、處理數據 119
第7章 模塊化程序設計的根基——函數 用函數實現模塊化程序設計 121
7.1 為什麼要用函數——便於代碼的管理和復用 為什麼要用函數 121
7.2 如何聲明函數 怎樣定義函數 122
7.2.1 為什麼要聲明函數 為什麼要定義函數 123
7.2.2 聲明函數的方法 定義函數的方法 123
7.2.2A 聲明函數的三要素:返迴值、函數名、參數列錶 124
7.3 如何調用函數 調用函數 128
7.3.1 調用的形式及調用語句 函數調用的形式 128
7.3.2 函數調用時的數據傳遞——兩個方嚮的傳遞 函數調用時的數據傳遞 129
7.3.2A 如何嚮函數傳遞體積很大的數據 130
7.3.3 調用的過程——簡單,沒啥可說的 函數調用的過程 132
7.3.4 關於函數的返迴值 函數的返迴值 133
7.3.4A 如何從函數返迴多個結果數據 133
7.4 編譯器對函數聲明的要求 對被調用函數的聲明和函數原型 137
7.4A 創建一個我們自己的頭文件 137
7.A 站在巨人的肩膀上——如何使用已有的函數庫 140
7.B 我也能成為巨人——如何創建一個函數庫 146
7.5 嵌套的函數調用 函數的嵌套調用 151
7.6 函數的遞歸調用——統計字符串齣現的次數 函數的遞歸調用 152
7.C 讓函數飛——在C語言中嵌入匯編代碼 155
7.7 將數組作為函數參數傳遞 數組作為函數參數 157
7.8 變量的生存期 局部變量和全局變量 157
7.8.1 局部變量的定義及作用域 局部變量 158
7.8.1A 不要從函數返迴指嚮局部變量的指針 161
7.8.2 全局變量及跨文件的全局變量 全局變量 161
7.9 變量的存儲方式及其區彆 變量的存儲方式和生存期 163
7.10 變量的聲明和定義的區彆——是否建立存儲空間 關於變量的聲明和定義 164
7.11 控製函數的訪問範圍 內部函數和外部函數 165
7.D 函數使用的四項基本原則 167
第8章 指針?沒啥好怕的! 善於利用指針 170
8.1 什麼是指針 指針是什麼 170
8.2 什麼是指針變量 指針變量 171
8.2.1 使用指針變量的例子——指針的四大用途 使用指針變量的例子 171
8.2.1A 什麼是NULL指針 176
8.2.2 如何定義指針變量 怎樣定義指針變量 178
8.2.2A 內存的動態申請與釋放 180
8.2.3 如何引用指針變量 怎樣引用指針變量 182
8.2.3A 指針變量存放在哪裏呢? 183
8.2.4 使用指針變量作為函數參數的場閤 指針變量作為函數參數 184
8.3 更靈活的數組訪問方式——使用指針訪問數組 通過指針引用數組 185
8.3.1—8.3.3A 使用指針訪問數組的要點 185
8.3.4 如何嚮函數傳遞一個數組 用數組名作函數參數 188
8.3.5 通過指針引用多維數組的要點——統計學生成績的例子 通過指針引用多維數組 188
8.4 利用指針引用字符串 通過指針引用字符串 193
8.5 定義指嚮函數的指針 指嚮函數的指針 195
8.5.1 瞭解函數指針 什麼是函數指針 195
8.5.1A 函數指針背後的故事——剖析它的匯編代碼 195
8.5.2 利用函數指針變量調用函數 用函數指針變量調用函數 198
8.5.3 函數指針變量的定義和使用 怎樣定義和使用指嚮函數的指針變量 199
8.5.4 用函數指針作函數參數——在函數之間傳遞函數,即傳遞操作 用指嚮函數的指針作函數參數 201
8.6 使用指針作為函數的返迴值 返迴指針值的函數 206
8.7 指針數組及指嚮指針的指針 指針數組和多重指針 207
8.7.1 什麼是指針數組——一個電磁爐火力控製程序 什麼是指針數組 207
8.7.2 指嚮指針的指針 指嚮指針數據的指針 209
8.7.3 嚮main()函數傳遞數據 指針數組作main函數的形參 212
8.8 動態內存分配及動態調整 動態內存分配與指嚮它的指針變量 214
8.9 指針的“醒世恒言” 有關指針的小結 214
8.A 如何避免錯誤地使用指針 216
第9章 建立自己的數據類型 用戶自己建立數據類型 220
9.1 結構體變量登場 定義和使用結構體變量 221
9.1.1—9.1.3 關於這三小節的特彆說明 221
9.1.A 定義結構體應該注意的問題 221
9.1.B 使用結構體以及它的數據成員 222
9.2 使用結構體數組——利用qsort()函數對數組排序 使用結構體數組 225
9.2.1—9.2.2 關於這兩小節的特彆說明 227
9.3 利用結構體指針減少傳遞的數據量 結構體指針 227
9.3.1—9.3.3 關於這三小節的特彆說明 229
9.4 筆試必考,麵試必問的數據結構——鏈錶 用指針處理鏈錶 229
9.4.1 鏈錶是神馬 什麼是鏈錶 230
9.4.2 如何建立靜態鏈錶 建立簡單的靜態鏈錶 230
9.4.3 如何建立動態鏈錶 建立動態鏈錶 230
9.4.4 如何輸齣鏈錶 輸齣鏈錶 233
9.4.A 鏈錶數據的處理:對鏈錶進行排序和查找 233
9.4.B 鏈錶數據的處理:查找結點 238
9.4.C 釋放一個鏈錶 241
9.5 共用體類型的定義和使用 共用體類型 242
9.5.1—9.5.3 關於這三小節的特彆說明 244
9.6 什麼是枚舉類型 使用枚舉類型 244
9.7 數據類型也可以有個更好記更好用的綽號——用typedef聲明新的數據類型 用typedef聲明新類型名 245
第10章 文件的輸入與輸齣 對文件的輸入輸齣 246
10.1 在C中文件的概念是怎樣的 C文件的有關基本知識 246
10.1.1—10.1.5 關於這五小節的特彆說明 247
10.1A C語言所處理的文件類型 247
10.2 如何打開與關閉文件 打開與關閉文件 248
10.2.1 使用fopen函數打開數據文件及注意事項 用fopen函數打開數據文件 248
10.2.1A 用freopen()重定嚮標準輸入輸齣流 249
10.2.2 使用fclose函數關閉數據文件及注意事項 用fclose函數關閉數據文件 251
10.3 對數據文件進行順序讀寫 順序讀寫數據文件 251
10.3.1—10.3.2 怎樣嚮文件讀寫字符和字符串 251
10.3.3 使用函數來進行數據文件的格式化讀寫 用格式化的方式讀寫文件 254
10.3.4 二進製方式的文件讀寫——讀寫一張圖片 用二進製方式嚮文件讀寫一組數據 254
10.3.A 文件讀寫的“三大紀律” 259
10.4 在任意位置讀寫數據文件 隨機讀寫數據文件 260
10.4.1—10.4.2 關於這兩小節的特彆說明 264
10.5—10.5A 擴展:訪問文件的各種屬性 264
10.5A.A 如何判斷文件是否存在 264
10.5A.B 如何獲得文件的日期和大小 266
第A章 程序是如何煉成的 268
A.A 問題的提齣——統計網頁中的詞頻 268
A.B 自頂嚮下:分析問題,劃分模塊 268
A.B.A 分析數據輸入模塊 269
A.B.B 分析數據處理模塊 269
A.B.C 分析數據輸齣模塊 271
A.C 逐步求精:用函數實現各個模塊 271
A.C.A 實現數據輸入模塊 271
A.C.B 實現數據處理模塊 273
A.C.C 組裝實現數據預處理模塊 276
A.C.D 實現計算詞頻模塊 279
A.C.E 實現文件排序模塊 281
A.C.F 實現數據輸齣模塊 282
A.C.G 打掃戰場:釋放動態申請的內存 282
A.D 百煉成鋼:如何調試我們的程序 284
A.E 程序就是這樣煉成的 287
第B章 接下來我該…… 288
B.A 接下來要讀的書 288
B.A.A 提升對C語言的理解和掌握 288
B.A.B 做一個有思想的程序員 290
B.B 接下來要做的事 293
B.B.A 編碼、編碼、再編碼 293
B.B.B 軟件開發模型:一個項目是如何運作的 293
B.B.C 實際參與一個項目 300
B.C 接下來該走的路 300
B.C.A 開發方嚮的選擇:底層開發、應用開發還是網絡開發? 301
B.C.B 開發語言的選擇:C語言、C++還是C#? 304
· · · · · · (
收起)