內容簡介
本書以C語言為編程環境,由淺入深地介紹了C語言的完整內容以及過程化程式設計的思想和方法。全書共有13章。第 1章介紹了什麼是程式設計。第 2章給出了一個完整的C語言程式,並介紹了如何在VS2010中輸入、編譯連結及調試程式。第3~5章分別介紹了C語言中支持結構化程式設計的3種結構:順序、分支和循環所必需的工具。第6章介紹了如何編寫及套用函式;第7章介紹了處理批量數據的工具,即數組。上述章節的內容都是C語言的核心知識,請務必掌握。第8~11章分別講解了結構體、共用體、鍊表、位運算和檔案等編程技術。第 12章講解了如何用結構化程式設計思想指導一個大程式的開發,以及軟體開發的基本過程。該章中用“猜硬幣”遊戲介紹了自頂向下分解的過程,用“石頭、剪刀、布”遊戲介紹了模組劃分,用“龜兔賽跑模擬”的例子介紹了如何建立一個自己的庫以及如何套用自己創建的庫,用學生管理系統和書店管理系統講述了軟體開發的過程。第 13章介紹了通用算法設計技術,旨在讓讀者了解,當遇到一個問題時應該如何設計解決問題的算法。
本書內容翔實、講解深入,每個知識點都提供了示例,全書共有171道例題和228個程式樣例,所有程式樣例都在VS2010中調試通過。為了方便讀者自學,本書還提供了118道自測題和141道編程題,以及所有習題的答案,且配套了講解主要知識點的視頻。
本書適合C語言初學者,也適合有一定基礎的讀者。可作為各高等院校
計算機專業的教材,也可供從事計算機軟體開發的人員參考。
圖書目錄
第 1章 程式設計概述 1
1.1 什麼是程式設計 1
1.2 計算機的基本組成 2
1.2.1 計算機硬體 2
1.2.2 計算機軟體 4
1.3 程式設計語言 4
1.3.1 機器語言 4
1.3.2 彙編語言 5
1.3.3 高級語言 6
1.3.4 智慧型語言 7
1.3.5 C語言 7
1.4 程式設計過程 7
1.4.1 算法設計 8
1.4.2 編碼 11
1.4.3 編譯與連結 11
1.4.4 調試與維護 12
1.5 編程規範及常見問題 13
1.5.1 真的需要算法設計階段嗎 13
1.5.2 為什麼不用自然語言編程 13
1.5.3 暫存器、主存儲器和外存儲器有什麼不同 13
1.5.4 所有的計算機能夠執行的指令都是相同的嗎 13
1.5.5 為什麼需要編譯和連結 13
1.5.6 為什麼在不同類型的計算機上運行C語言程式需要使用不同的編譯器 14
1.5.7 為什麼不同類型的計算機不能運行同一個彙編程式 14
1.6 小結 14
1.7 自測題 14
1.8 實戰訓練 15
第 2章 初識C語言 16
2.1 一個完整的C語言程式 16
2.1.1 注釋 17
2.1.2 預編譯 17
2.1.3 主程式 18
2.2 C語言的開發環境 20
2.2.1 VS2010的安裝 20
2.2.2 程式輸入 20
2.2.3 編譯連結 24
2.2.4 程式的運行 25
2.2.5 程式的調試 28
2.3 編程規範及常見問題 30
2.3.1 注意注釋 30
2.3.2 良好的排版習慣 30
2.3.3 為什麼要學C語言 31
2.3.4 如何學習程式設計 31
2.3.5 什麼是庫 31
2.4 小結 32
2.5 自測題 32
2.6 實戰訓練 32
第3章 順序程式設計 33
3.1 常量與變數 33
3.1.1 變數定義 33
3.1.2 數據類型 35
3.1.3 常量與符號常量 39
3.2 數據的輸入/輸出 44
3.2.1 字元的輸入/輸出 44
3.2.2 格式化輸入/輸出 46
3.3 算術運算 54
3.3.1 算術表達式 54
3.3.2 不同類型數據間的混合運算 56
3.3.4 數學函式館 59
3.4 賦值運算 60
3.4.1 賦值表達式 60
3.4.2 賦值的嵌套 62
3.4.3 複合賦值運算 62
3.4.4 自增和自減運算符 63
*3.5 信息表示 64
3.5.1 數制間的轉換 64
3.5.2 整數的表示 66
3.5.3 實數的表示 69
3.6 順序程式設計示例 69
3.7 程式規範及常見問題 71
3.7.1 變數命名 71
3.7.2 運算符的優先權 71
3.7.3 數據運算時的注意事項 71
3.7.4 為什麼要定義符號常量 72
3.7.5 變數定義後且對它賦值前的值是什麼 72
3.7.6 不要在表達式中插入有副作用的子表達式 72
3.8 小結 72
3.9 自測題 73
3.10 實戰訓練 74
第4章 分支程式設計 76
4.2 邏輯表達式 78
4.2.1 邏輯運算 78
4.2.2 短路求值 80
4.3 if語句 82
4.3.1 if語句的形式 82
4.3.2 if語句的嵌套 87
4.3.3 條件表達式 90
4.4 switch語句及其套用 92
4.5 程式規範及常見問題 102
4.5.1 條件語句程式的排版 102
4.5.3 注意短路求值 102
4.5.4 常見錯誤 102
4.6 小結 103
4.7 自測題 103
4.8 實戰訓練 104
第5章 循環程式設計 106
5.1 計數循環 106
5.1.1 for語句 106
5.1.2 for語句的進一步討論 115
5.1.3 for循環的嵌套 116
5.2 break和continue語句 118
5.2.2 continue語句 120
5.3 基於哨兵的循環 121
5.3.1 while語句 122
5.3.2 do…while循環 128
5.4 循環的中途退出 130
5.5 編程規範和常見問題 134
5.5.1 循環語句程式的排版 134
5.5.2 最佳化循環體 134
5.5.3 使用for循環的注意事項 134
5.5.4 常見錯誤 134
5.5.5 三個循環語句之間的關係 135
5.6 小結 135
5.7 自測題 135
5.8 實戰訓練 136
第6章 過程封裝——函式 139
6.1 函式的定義 140
6.1.1 函式的基本結構 140
6.1.2 return語句 141
6.1.3 函式示例 141
6.2 函式的使用 144
6.2.1 函式原型的聲明 144
6.2.2 函式調用 146
6.2.3 將函式與主程式放在一起 147
6.2.4 函式調用過程 151
6.3 帶參數的宏 154
6.4 變數的作用域 155
6.4.1 局部變數 155
6.4.2 全局變數 156
6.5 變數的存儲類別 158
6.5.1 自動變數 158
6.5.2 靜態變數 159
6.5.4 外部變數 161
*6.6 多源檔案程式的編譯連結 163
6.7 遞歸程式設計 164
6.7.1 遞歸的基本概念 165
6.7.2 遞歸函式的套用 167
6.8 編程規範及常見問題 173
6.8.1 使用函式時的建議 173
6.8.2 函式命名 174
6.8.3 沒有返回值的函式是否需要return語句 174
6.8.4 儘量避免使用全局變數 174
6.8.5 儘量避免實際參數表達式有副作用 175
6.8.6 常見錯誤 175
6.9 小結 175
6.10 自測題 176
6.11 實戰訓練 177
第7章 批量數據處理——數組 179
7.1 一維數組 179
7.1.1 一維數組的定義 179
7.1.2 數組元素的引用 180
7.1.3 一維數組的記憶體映像 184
7.1.4 一維數組的套用 185
7.2 數組作為函式的參數 190
7.3 查找算法 195
7.3.1 順序查找 196
7.3.2 二分查找 197
7.4 排序算法 201
7.4.1 直接選擇排序法 201
7.5 二維數組 205
7.5.1 二維數組的定義 206
7.5.2 二維數組元素的引用 207
7.5.3 二維數組的記憶體映像 208
7.5.4 二維數組的套用 208
7.5.5 二維數組作為函式的參數 218
7.6 字元串 220
7.6.1 字元串的存儲及初始化 220
7.6.2 字元串的輸入/輸出 221
7.6.3 字元串作為函式參數 225
7.6.4 字元串處理函式 230
7.6.5 字元串的套用 232
7.7 程式規範及常見問題 234
7.7.1 數組下標必須從0開始嗎 234
7.7.2 能用表達式des = src將字元串src賦給字元串des嗎 234
7.7.3 為什麼存放字元串的數組長度比字元串的實際長度多一個字元235
7.7.4 有了scanf函式為什麼還需要gets函式 235
7.7.5 傳遞字元串為什麼只需要一個參數 235
7.7.6 傳遞二維數組時形式參數中第二個方括弧中的值為什麼必須指定 235
7.8 小結 235
7.9 自測題 236
7.10 實戰訓練 237
第8章 指針 240
8.1 指針的概念 240
8.1.1 指針與間接訪問 240
8.1.2 指針變數的定義 241
8.1.3 指針變數的操作 242
8.2 指針與數組 246
8.2.1 指向數組元素的指針 246
8.2.2 指針運算與數組訪問 246
8.3 指針與函式 250
8.3.1 指針作為參數 250
8.3.2 返回指針的函式 254
8.3.3 數組作為函式參數的進一步討論 256
8.4 動態記憶體分配 259
8.4.1 動態變數 259
8.4.2 動態變數的創建 259
8.4.3 動態變數的消亡 261
8.4.4 記憶體泄露 261
8.4.5 查找malloc和calloc的失誤 261
8.4.6 動態變數套用 263
8.5 指針與字元串 265
8.5.1 用指向字元的指針變數表示字元串 265
8.5.2 字元串作為函式的參數 266
8.5.3 返回字元串的函式 268
8.6 指針數組與多級指針 270
8.6.1 指針數組 270
*8.6.3 多級指針 276
*8.6.4 二維數組與指向一維數組的指針 277
*8.6.5 動態二維數組 279
*8.7 函式指針 280
8.7.1 指向函式的指針 280
8.7.2 函式指針作為函式參數 281
8.7.3 函式指針用於選單選擇 284
8.8 編程規範與常見問題 285
8.8.1 int x, *p = &x;有錯嗎 285
8.8.2 避免使用懸空指針和未初始化的指針 286
8.8.3 不同類型的指針之間為什麼不能賦值 286
8.8.4 指針與數組等價嗎 286
8.8.5 值傳遞和指針傳遞的區別是什麼 286
8.8.6 返回指針的函式必須確保返回值指向的變數在函式執行
結束時依然存在 287
8.8.7 使用動態變數時必須嚴格防止記憶體泄露 287
8.9 小結 287
8.10 自測題 288
8.11 實戰訓練 289
第9章 更多的數據類型 290
9.1 枚舉類型 290
9.2 類型別名 293
9.3 結構體 294
9.3.1 結構體的概念 294
9.3.3 結構體類型變數的定義 296
9.3.4 結構體類型變數的使用 299
9.3.5 結構體與函式 302
9.4 鍊表 308
9.4.1 鍊表的概念 308
9.4.2 單鍊表的存儲 310
9.4.3 單鍊表的操作 311
9.4.4 帶頭結點的單鍊表 312
9.4.5 單鍊表實例 313
9.5 共用體 316
9.5.1 共用體概念和共用體類型的定義 316
9.5.2 共用體類型變數的定義及初始化 318
9.5.3 共用體變數的使用 318
9.6 編程規範及常見問題 324
9.6.1 結構體中每個欄位的類型都不相同嗎 324
9.6.2 單鍊表中為什麼要引入頭結點 324
9.6.3 引入結構體有什麼用處 324
9.6.4 結構體和共用體的區別 324
9.6.5 結構體和共用體類型定義時能否省略類型名 324
9.6.6 結構體類型定義與結構體變數定義 325
9.7 小結 325
9.8 自測題 325
9.9 實戰訓練 326
第 10章 位運算與位段 328
10.1 位運算 328
10.1.1 “按位與”運算 328
10.1.2 “按位或”運算 330
10.1.3 “按位異或”運算 331
10.1.4 “按位取反”運算 333
10.1.5 “左移”運算 335
10.1.6 “右移”運算 335
10.1.7 位運算與賦值運算 337
10.1.8 不同長度的數據進行位運算 337
10.2 位段 338
10.2.1 位段的概念及定義 338
10.2.2 位段的引用 339
10.3 編程規範及常見問題 341
10.3.1 檢驗某數中指定位的值 341
10.3.2 將數據中的某一位的值置成0 341
10.3.3 將數據中的某一位的值置成1 342
10.3.4 將數據中的某一位的值取反 342
10.4 小結 342
10.5 自測題 342
10.6 實戰訓練 343
第 11章 檔案 344
11.1 記憶體與外存 344
11.2 檔案的概念 345
11.2.1 什麼是檔案 345
11.3 檔案緩衝與檔案指針 346
11.4 檔案的打開與關閉 347
11.4.1 打開檔案 347
11.4.2 關閉檔案 349
11.5 ASCII檔案的讀寫 349
11.5.1 字元讀寫函式 350
11.5.2 字元串讀寫函式 352
11.5.3 數值讀寫函式 354
11.6 二進制檔案的讀寫 358
11.6.1 fwrite函式 358
11.6.2 fread函式 360
11.7 檔案的順序訪問 362
11.7.1 什麼是檔案的順序訪問 362
11.7.2 feof函式 363
11.8 檔案的隨機訪問 364
11.8.1 檔案定位指針 365
11.8.2 rewind函式 365
11.8.3 fseek函式 367
11.8.4 ftell函式 369
*11.9 檔案操作與控制台操作 370
11.10 編程規範及常見問題 371
11.10.1 良好的檔案使用習慣 371
11.10.2 檔案打開方式選擇 372
11.10.3 檔案指針與檔案定位指針 372
11.10.4 流與檔案 372
11.11 小結 372
11.12 自測題 373
11.13 實戰訓練 373
第 12章 軟體開發過程 374
12.1 結構化程式設計思想 374
12.2 自頂向下分解示例:“猜硬幣”遊戲 375
12.2.1 頂層分解 375
12.2.2 prn_instruction函式的實現 376
12.2.3 play函式的實現 376
12.2.4 get_call_from_user函式的實現 378
12.3 模組劃分示例:“石頭、剪刀、布”遊戲 380
12.3.1 自頂向下分解 381
12.3.2 模組劃分 382
12.3.3 頭檔案的設計 383
12.3.4 模組實現 386
12.4 設計自己的庫示例:隨機函式館的設計和實現 389
12.4.1 隨機函式館的功能設計 390
12.4.2 接口檔案的設計 390
12.4.3 實現檔案的設計 391
12.5 隨機函式館的套用示例:模擬龜兔賽跑 392
12.5.1 自頂向下分解 392
12.5.2 模組劃分及實現 393
12.6 軟體開發過程 395
12.6.1 軟體危機 395
12.6.2 軟體工程 396
12.7 軟體開發過程示例:學生管理系統的設計與實現 397
12.7.1 需求分析 397
12.7.2 概要設計 398
12.7.3 詳細設計 400
12.7.4 編碼與測試 402
12.8 軟體開發示例:網上書店的設計 407
12.8.1 需求分析 407
12.8.2 概要設計 408
12.8.3 詳細設計 411
12.9 編程規範及常見問題 413
12.9.1 頭檔案的格式 413
12.9.2 實現一個庫為什麼需要兩個檔案 413
12.9.3 慎用全局變數 414
12.10 小結 414
12.11 自測題 414
12.12 實戰訓練 414
第 13章 通用算法設計 416
13.1 枚舉法 416
13.2 貪婪法 423
13.3 分治法 427
13.4 動態規劃 431
13.5 回溯法 435
13.6 小結 442
13.7 實戰訓練 442
附錄 443
附錄1 第 1章自測題答案 443
附錄2 第 2章自測題答案 445
附錄3 第3章自測題答案 446
附錄4 第4章自測題答案 451
附錄5 第5章自測題答案 453
附錄6 第6章自測題答案 455
附錄7 第7章自測題答案 459
附錄8 第8章自測題答案 463
附錄9 第9章自測題答案 466
附錄10 第 10章自測題答案 467
附錄11 第 11章自測題答案 470
附錄12 第 12章自測題答案 472
附錄13 ASCII編碼表 474