內容簡介
C語言是在程式設計師中使用比較多的計算機語言,它是如
C++、C#等C系列語言的核心。本書精心挑選了有代表意義的500餘個實例,詳細介紹了程式設計中基礎知識的套用、模組化的程式設計、常見的算法和數據結構基礎,以及計算機底層處理方面的內容。本書的主要內容包括:C語言基礎知識部分、模組化的程式設計思想、指針在程式設計中的套用、數據結構和算法部分、底層處理、套用系統開發等。本書中每一個實例都經過細心的調試,同時在實例中給出了詳細的講解,既可以作為學習C語言程式設計的工具書,以及進行編程訓練的入門書,同樣可以作為參加全國二級計算機考試或全國國中級
程式設計師考試等學習資料。
圖書目錄
第1篇 入門篇
第1章 從零開始認識C語言 1
1.1 認識C語言 1
1.1.1 C語言的發展過程 1
1.1.2 C語言的標準 2
1.2 C語言在不同領域的擴展套用 3
1.2.1 單片機方面 4
1.2.2 LabVIEW方面 4
1.2.3 LabWindows/CVI方面 6
1.2.4 MATLAB方面 7
1.2.5 JavaScript方面 7
1.2.6 並行計算方面 8
1.2.7 Linux平台 8
1.3 搭建C語言開發環境 8
1.3.1 Turbo C 9
1.3.2 Visual C++ 9
1.3.3 Linux下的GCC 12
1.4 第一個C程式 13
1.4.1 創建項目 14
1.4.2 輸入原始碼 14
1.4.3 編譯連結程式 15
1.4.4 調試程式 16
1.5 C程式構成分析 16
1.5.1 頭檔案 17
1.5.2 主函式 17
1.5.3 其他組成部分 18
1.6 拓展訓練 22
1.6.1 訓練一:列印字母C 22
1.6.2 訓練二:scanf()函式的套用 22
1.7 技術解惑 23
1.7.1 C語言的一些基礎規範 23
1.7.2 C語言的注釋形式 25
第2章 數據是一切程式存在的基礎 26
2.1 C語言中的數據類型 26
2.1.1 基本類型 27
2.1.2 構造類型 27
2.1.3 指針類型 28
2.1.4 空類型 28
2.2 數據的存儲原理 28
2.2.1 記憶體單元 28
2.2.2 字元的存儲 29
2.2.3 數值的存儲 30
2.3 標識符和關鍵字 30
2.3.1 標識符 30
2.3.2 關鍵字 31
2.4 常量 32
2.4.1 直接常量 32
2.4.2 符號常量 32
2.5 變數 34
2.5.1 變數聲明 34
2.5.2 變數初始化 36
2.6 整數類型 37
2.6.1 整數類型及其存儲 37
2.6.2 整型常量的表示 40
2.6.3 整型數據輸出 42
2.7 字元類型 44
2.7.1 字元常量 45
2.7.2 字元變數及其初始化 45
2.7.3 轉義字元 46
2.7.4 字元型數據的輸出 47
2.8 實數類型 48
2.8.1 實數類型及其存儲 49
2.8.2 實型常量的表示 50
2.8.3 實型變數 51
2.8.4 實型數據的輸出 53
2.9 混合運算及類型轉換 54
2.9.1 混合運算 54
2.9.2 強制數據類型轉換 55
2.10 邏輯型(_Bool) 56
2.11 複數類型(_Complex和_Imaginary) 56
2.12 拓展訓練 57
2.12.1 訓練一:變數初始化 57
2.12.2 訓練二:不同數據類型轉換為十進制 58
2.13 技術解惑 59
2.13.1 整型數據機記憶體儲形式 59
2.13.2 字元型數據機記憶體儲形式 59
第3章 C語言代碼的基本組成 60
3.1 表達式 60
3.2 運算符 62
3.2.1 運算符概述 62
3.2.6 位運算符 73
3.2.8 其他運算符 75
3.3 表達式的運算順序 76
3.3.2 運算符的結合性 77
3.3.3 自增、自減運算符注意事項 78
3.4 語句 79
3.4.1 語句書寫方式 79
3.4.2 表達式語句 81
3.4.3 空語句 81
3.4.4 複合語句 82
3.4.5 標號語句 82
3.5 拓展訓練 83
3.5.1 訓練一:加1和減1運算符 83
3.5.2 訓練二:三目運算符 84
3.5.3 訓練三:逗號運算符 85
3.6 技術解惑 86
3.6.1 賦值及類型轉換 86
3.6.2 sizeof是一個運算符嗎 87
第4章 控制輸入/輸出的形式 88
4.1 格式化輸出——printf()函式 88
4.1.1 printf()函式的格式 88
4.1.2 printf()函式的格式字元 90
4.1.3 修飾符 91
4.1.4 printf()函式實例 94
4.1.5 動態設定輸出寬度和精度 99
4.1.6 printf()函式的返回值 100
4.1.7 理解輸出列表 101
4.2 格式化輸入——scanf()函式 104
4.2.1 scanf()函式的格式 104
4.2.2 scanf()函式的格式字元 106
4.2.3 scanf()函式的注意事項 107
4.2.4 scanf()函式的返回值 109
4.3 其他常用輸入/輸出函式 110
4.3.1 getchar()函式 110
4.3.2 getch()函式 111
4.3.3 gets()函式 111
4.3.4 putch()函式 113
4.3.5 puts()函式 113
4.4 拓展訓練 114
4.4.1 訓練一:雞、兔同籠問題 114
4.4.2 訓練二:格式化輸入 115
4.4.3 訓練三:輸入兩個變數的值,交換輸出 116
4.4.4 訓練四:大小寫字母轉換器 117
4.5 技術解惑 118
4.5.1 ASCII碼查詢 118
4.5.2 輸入/輸出的概念 118
第5章 程式的三大流程控制結構 120
5.1 順序結構 120
5.2 條件語句 120
5.2.1 if語句 121
5.2.2 if-else語句 124
5.2.3 if-else-if語句 125
5.2.4 if語句的嵌套 126
5.2.6 增強後的switch分支語句 131
5.3 循環語句 134
5.3.1 while循環結構 134
5.3.2 do-while 循環結構 141
5.3.3 for循環結構 144
5.3.4 循環的嵌套 150
5.4 轉向語句 157
5.4.1 break中斷語句 157
5.4.2 continue條件繼續語句 159
5.4.3 標籤語句 161
5.5 返回語句 162
5.6 拓展訓練 163
5.6.1 訓練一:水仙花數 163
5.6.2 訓練二:工資提成問題 164
5.6.3 訓練三:學生成績評分等級 165
5.6.4 訓練四:商店找零問題 166
5.6.5 訓練五:斐波那契數列問題 167
5.6.6 訓練六:簡單計算器 168
5.7 技術解惑 169
5.7.1 判斷一個數是否為素數 169
5.7.2 判斷三角形構成問題 170
第2篇 核心技術篇
第6章 數組管理更複雜的數據 171
6.1 了解數組 171
6.1.1 使用數組的好處 171
6.1.2 數組的概念 173
6.1.3 數組的維數 173
6.2 一維數組 174
6.2.1 一維數組的聲明 174
6.2.2 一維數組的存儲 177
6.2.3 引用一維數組 178
6.2.4 一維數組的初始化 180
6.3 二維數組 182
6.3.1 二維數組的聲明 182
6.3.2 二維數組的存儲 183
6.3.3 二維數組的初始化 186
6.4 字元數組和字元串 188
6.4.1 字元數組 188
6.4.2 了解字元串 189
6.4.3 字元串的輸入/輸出 191
6.5 拓展訓練 192
6.5.2 訓練二:採用
冒泡排序法對數據進行排序 193
6.5.3 訓練三:通過數組計算學生的平均成績 194
6.5.4 訓練四:字元串反轉 196
第7章 用函式模組化代碼結構 198
7.1 函式概述 198
7.1.1 函式的概念 198
7.1.2 函式的分類 199
7.1.3 定義函式 200
7.1.4 main()函式 201
7.2 函式的工作過程 202
7.2.1 程式結構 202
7.2.2 函式執行過程 203
7.3 編寫函式 204
7.3.1 函式頭 204
7.3.2 返回類型 204
7.3.3 參數列表 205
7.3.4 函式體 206
7.3.5 函式原型 206
7.4 函式的參數 208
7.4.1 參數傳遞過程 208
7.4.2 值調用 209
7.4.3 引用調用 210
7.4.4 數組調用 213
7.4.5 main()函式的參數 215
7.5 函式調用 218
7.5.1 函式調用方式 218
7.5.2 被調函式的說明 219
7.5.3 返回函式結果 220
7.5.4 函式的嵌套調用 221
7.6 遞歸函式 223
7.6.1 函式的遞歸調用 223
7.6.2 遞歸的基本原理 225
7.6.3 遞歸函式設計 226
7.6.4 遞歸的優缺點 229
7.7 拓展訓練 229
7.7.1 訓練一:計算1到x的5次方累加和 229
7.7.2 訓練二:統計字元出現次數 230
7.7.3 訓練三:通過函式計算兩個數的差值 231
7.7.4 訓練四:十進制數轉換為二進制數 232
7.8 技術解惑 233
7.8.1 函式傳址方式 233
7.8.2 形參和實參 236
第8章 算法在C語言中的套用 237
8.1 算法的定義 237
8.1.1 我所理解的算法 237
8.1.2 什麼情況下使用算法 238
8.2 常見算法 239
8.2.2 折半查找 240
8.2.3 堆疊的實現 241
8.3 拓展訓練 245
8.3.1 訓練一:求最大值算法 245
8.3.2 訓練二:希爾排序 246
8.4 技術解惑 248
8.4.1 算法的必要性 248
8.4.2 當下流行的各種算法 248
第9章 用指針控制計算機的虛擬地址 253
9.1 記憶體和變數 253
9.1.2 變數的存儲 254
9.2 指針和簡單變數 256
9.2.1 指針的概念 256
9.2.2 創建指針 257
9.2.3 初始化指針變數 258
9.2.4 指針變數的引用 259
9.2.5 給函式傳遞指針 263
9.3 指針變數的賦值 264
9.3.1 初始化賦值 264
9.3.2 取地址賦值 265
9.3.3 指針之間賦值 265
9.3.4 數組賦值 266
9.3.5 字元串賦值 266
9.3.6 函式入口賦值 269
9.4 指針和數組的關係 270
9.4.1 指針、數組和地址之間的關係 270
9.4.2 指針變數的運算 271
9.4.3 用指針運算元組元素 273
9.5 指向多維數組的指針 276
9.5.1 理解二維數組的地址 276
9.5.2 多維數組的指針表示 279
9.5.3 指向多維數組的指針變數 280
9.5.4 數組名作為函式的參數 284
9.5.5 指向數組的指針小結 288
9.6 指針和字元串 288
9.6.1 字元串的指針表示 289
9.6.2 字元串指針作為函式參數 290
9.6.3 字元數組和字元串指針變數的區別 292
9.7 指針數組 294
9.7.1 指針數組的概念 294
9.7.2 用指針數組處理字元串 296
9.7.3 用指針數組作為函式參數 298
9.8 指向指針的指針 300
9.8.1 理解指向指針的指針 300
9.8.2 二級指針變數與數組 303
9.9 指針和函式 307
9.9.1 返回指針的函式 307
9.9.2 指向函式的指針 309
9.10 指針和const變數 312
9.10.1 用const控制指針 312
9.10.2 const的幾種特殊用法 313
9.11 拓展訓練 314
9.11.1 訓練一:學生成績管理 314
9.11.2 訓練二:輸出兩個數中的大者 315
9.11.3 訓練三:通過指針變數交換兩個數 316
9.12 技術解惑 318
9.12.1 指向指針的指針有什麼用處 318
9.12.2 數組指針和指針數組的區別 319
第10章 不同形式的存儲——結構、聯合和枚舉 321
10.1 結構的概念 321
10.1.1 定義結構類型 321
10.1.2 定義結構變數 323
10.1.3 使用結構變數 323
10.2 結構的嵌套 325
10.2.1 包含數組的結構 326
10.2.2 包含指針的結構 326
10.2.3 包含結構的結構 327
10.3 初始化結構變數 330
10.4 結構數組 332
10.4.1 結構數組的定義和引用 332
10.4.2 結構數組的初始化 333
10.4.3 結構數組實例 334
10.5 結構指針 335
10.5.1 定義結構指針 335
10.5.2 使用結構指針 336
10.5.3 用指針處理結構數組 336
10.6 向函式傳遞結構 338
10.6.1 傳遞結構變數的值到函式 338
10.6.2 傳遞結構指針到函式 339
10.7 聯合 340
10.7.1 結構和聯合的區別 340
10.7.2 定義联合類型 341
10.7.3 使用聯合變數 342
10.7.4 在結構中嵌套聯合類型 342
10.7.5 聯合數組 344
10.7.6 聯合指針 345
10.8 枚舉 346
10.8.1 定義枚舉類型 346
10.8.2 使用枚舉變數 347
10.8.3 枚舉類型變數的賦值 347
10.9 使用typedef 348
10.10 拓展訓練 349
10.10.1 訓練一:統計並輸出學生和老師的信息 349
10.10.2 訓練二:結構變數地址作為函式參數實例 350
10.10.3 訓練三:候選人票數統計 352
10.11 技術解惑 353
10.11.1 結構變數地址作為函式參數 353
10.11.2 用戶自定義類型 353
第3篇 高級套用篇
第11章 系統底層的位運算 355
11.1 了解二進制數 355
11.1.1 數據的存儲 355
11.1.2 整數的二進制表示 356
11.1.3 實數的二進制表示 357
11.1.4 使用其他進制 358
11.2 位運算 359
11.2.1 位邏輯運算符 359
11.2.4 位運算的用途 363
11.3 位域 364
11.3.1 定義位域結構 364
11.3.2 位域的使用 365
11.3.3 位域與聯合的使用 367
11.4 拓展訓練 368
11.4.1 訓練一:位域的實例 368
11.4.2 訓練二:位運算的加減乘除 369
11.5 技術解惑 371
11.5.1 位域在現實中有哪些套用 371
11.5.2 位運算的定址與普通運算的區別 372
第12章 鍊表的基本操作 373
12.1 動態記憶體分配 373
12.1.1 為什麼用動態記憶體分配 373
12.1.2 如何實現動態記憶體分配及其管理 374
12.2 鍊表詳解 375
12.2.1 鍊表基本介紹 375
12.2.2 單向鍊表 376
12.2.3 創建一個鍊表 377
12.2.4 刪除整個鍊表 379
12.2.5 在鍊表中插入節點 379
12.2.6 在鍊表中刪除節點 381
12.2.7 雙向鍊表 382
12.2.8 循環鍊表 382
12.3 拓展訓練 383
12.3.1 訓練一:雙向鍊表的輸入/輸出 383
12.3.2 訓練二:單向鍊表簡單實例 385
12.4 技術解惑 386
12.4.1 結構體嵌套另一個結構體 386
12.4.2 共用體是用戶自定義類型嗎 387
第13章 檔案的輸入和輸出 388
13.1 檔案與數據流 388
13.1.1 程式的輸入/輸出概念 388
13.1.2 流的概念 389
13.1.3 預定義的流 389
13.1.4 檔案的基本概念 390
13.1.5 緩衝檔案系統 390
13.2 檔案的打開與關閉 391
13.2.1 檔案指針 391
13.2.2 打開檔案函式——fopen() 392
13.2.3 關閉檔案函式——fclose() 394
13.3 從檔案中讀/寫字元 394
13.3.1 寫字元函式——putc()和fputc() 395
13.3.2 讀字元函式——getc()和fgetc() 396
13.3.3 合併檔案 398
13.4 從檔案中讀/寫字元串 399
13.4.1 寫字元串函式——fputs() 399
13.4.2 讀字元串函式——fgets() 401
13.4.3 檔案格式輸出函式——fprintf() 402
13.4.4 檔案格式輸入函式——fscanf() 404
13.5 二進制檔案的讀/寫 406
13.5.1 寫入整型數據函式——putw() 406
13.5.2 讀取整型數據函式——getw() 407
13.5.3 寫數據塊函式——fwrite() 408
13.5.4 讀數據塊函式——fread() 410
13.5.5 檔案檢測函式 411
13.6 檔案的隨機讀/寫 412
13.6.1 獲取當前位置函式——ftell() 412
13.6.2 重置檔案位置指針函式——rewind() 414
13.6.3 設定檔案位置指針函式——fseek() 415
13.7 管理緩衝區 418
13.8 輸入/輸出的重定向 419
13.8.1 作業系統的重定向功能 419
13.8.2 重定向輸出 420
13.8.3 重定向函式——freopen() 421
13.9 檔案管理 422
13.9.1 重命名檔案 422
13.9.2 刪除檔案 423
13.9.3 複製檔案 424
13.9.4 創建臨時檔案 426
13.10 拓展訓練 427
13.10.1 訓練一:檔案讀/寫 427
13.10.2 訓練二:從檔案中讀取信息 428
13.11 技術解惑 429
13.11.1 檔案出錯時如何檢測 429
13.11.2 緩衝檔案和非緩衝檔案 430
第14章 C語言特有的預處理 431
14.1 預處理簡介 431
14.1.1 預處理功能 431
14.1.2 預處理命令 432
14.2 宏定義命令 432
14.2.1 無參數的宏定義 432
14.2.2 帶參數的宏定義 434
14.2.3 #undef命令 435
14.2.4 預處理操作符#和## 436
14.3 檔案包含命令 439
14.4 條件編譯命令 440
14.4.1 #if、#else、#endif命令 441
14.4.2 #elif命令 443
14.4.3 #ifdef、#ifndef命令 444
14.4.4 使用#defined和#undef 444
14.5 其他預處理命令 445
14.5.1 預定義的宏名 445
14.5.2 重置行號和檔案名稱命令#line 446
14.5.3 修改編譯器設定命令#pragma 446
14.5.4 產生錯誤信息命令#error 447
14.6 內聯函式 447
14.7 拓展訓練 448
14.7.1 訓練一:計算半徑為1~10的圓的面積和體積累加和 448
14.7.2 訓練二:通過靜態變數計算1~10的階乘 449
14.7.3 訓練三:通過條件編譯將大寫字母轉換為小寫字母 450
14.8 技術解惑 451
14.8.1 預處理和宏的區別 451
14.8.2 C語言的預處理機制 451
第15章 C語言的網路編程 453
15.1 OSI 7層網路模型 453
15.2.1 IP協定 455
15.3 使用C語言開發網路項目 459
15.3.1 網路編程方式 459
15.3.2 網路通信基本流程 459
15.3.3 搭建開發環境 460
15.3.4 兩個常用的數據結構 460
15.3.5 Windows Socket基礎 461
15.4 常用的WinSock函式 461
15.4.1 WSAStartup()函式 461
15.4.2 socket()函式 462
15.4.3 inet_addr()函式 462
15.4.4 gethostbyname()函式 462
15.4.5 bind()函式 463
15.4.6 connect()函式 463
15.4.7 select()函式 463
15.4.8 recv()函式 464
15.4.9 sendto()函式 464
15.6 NetBIOS編程 465
15.6.1 處理過程 465
15.6.2 NetBIOS命令 465
15.6.3 NetBIOS名字解析 465
15.6.4 何為NetBEUI 467
15.6.5 NetBIOS範圍ID 468
15.6.6 NetBIOS控制塊 468
15.7 獲取當前機器的MAC地址 469
15.7.1 選擇開發工具 469
15.7.2 設計MFC窗體 469
15.7.3 具體編碼 469
15.8 拓展訓練 476
15.8.1 訓練一:實現HTTP下載 476
15.8.2 訓練二:編寫聊天程式 485
15.9 技術解惑 491
15.9.1 winsock2.h找不到 491
15.9.2 非阻塞WinSock編程的問題及解決辦法 491
第16章 高效開發的常用函式 492
16.1 字元的操作 492
16.1.1 字元串的靜態存儲 492
16.1.2 字元串的動態存儲 493
16.1.3 字元檢測函式 495
16.1.4 控制字元檢測函式 497
16.1.5 十六進制數字檢測函式 498
16.1.6 可列印字元檢測函式 498
16.1.7 包含空格的可列印字元檢測函式 499
16.1.8 格式字元檢測函式 499
16.2 隨機函式 500
16.2.1 偽隨機函式——rand() 500
16.2.2 隨機種子函式——srand() 501
16.2.3 更加合理的隨機數產生方法 501
16.2.4 獲取任意範圍的隨機數 502
16.2.5 獲取隨機字元 502
16.3 數學函式 503
16.3.2 三角函式 504
16.3.3 雙曲三角函式 505
16.3.4 指數函式和對數函式 506
16.3.5 取整函式 508
16.3.6 浮點型分離函式 509
16.3.7 冪函式 510
16.3.8 取余函式 511
16.3.9 C99標準中擴展的數學函式 512
16.4 日期時間函式 513
16.4.1 表示日期時間的數據結構 513
16.4.2 獲取日期時間 514
16.4.3 轉換日期時間的表示形式 515
16.4.4 格式化日期時間 518
第4篇 實戰篇
第17章 員工管理系統 523
17.1 程式分析 523
17.1.1 模組劃分 523
17.1.2 設計數據結構 524
17.2 頭檔案 525
17.3 主模組 526
17.3.1 main()函式 526
17.3.2 檢查初始化狀態 527
17.3.3 檢查登錄密碼 529
17.3.4 從檔案創建鍊表 530
17.3.5 顯示主選單 532
17.3.6 將鍊表保存到檔案 534
17.4 輸入員工信息 535
17.5 查詢員工信息 538
17.5.1 查詢子選單 538
17.5.2 查詢函式 540
17.5.3 通用顯示函式 541
17.6 顯示員工信息 542
17.7 修改員工信息 543
17.7.1 修改子選單 543
17.7.2 修改數據 546
17.8 刪除員工信息 546
17.9 統計員工信息 548
17.10 重設系統密碼 549
第18章 簡易文本編輯器 551
18.1 程式分析 551
18.1.1 模組劃分 551
18.1.2 流程圖 552
18.2 頭檔案 552
18.3 主模組 553
18.3.1 main()函式 553
18.3.2 顯示主選單 553
18.4 清空以前文本內容 555
18.5 打開檔案 556
18.6 輸入文本信息 557
18.7 查找文本信息 558
18.7.1 定位文本位置 558
18.7.2 輸出文本信息 559
18.8 插入文本信息 560
18.9 刪除文本信息 562
18.10 替換文本信息 564
18.11 顯示文本信息 567
18.12 保存當前文本內容 567
18.13 退出文本編輯 568
第19章 餐廳信息管理系統 569
19.1 程式分析 569
19.1.1 模組劃分 569
19.1.2 思路分析 570
19.1.3 系統可行性分析 570
19.2 頭檔案 571
19.3 主模組main()函式 572
19.4 將數據保存到檔案 575
19.4.1 保存選單信息 575
19.4.2 保存預約者信息 575
19.4.3 保存點菜信息 576
19.5 顯示選單 576
19.6 顯示預約者信息 577
19.7 顯示消費信息 578