本書以C語言為編程環(huán)境,由淺入深地介紹了C語言的完整內(nèi)容以及過程化程序設計的思想和方法。全書共有13章。第 1章介紹了什么是程序設計。第 2章給出了一個完整的C語言程序,并介紹了如何在VS2010中輸入、編譯鏈接及調(diào)試程序。第3~5章分別介紹了C語言中支持結構化程序設計的3種結構:順序、分支和循環(huán)所必需的工具。第6章介紹了如何編寫及應用函數(shù);第7章介紹了處理批量數(shù)據(jù)的工具,即數(shù)組。上述章節(jié)的內(nèi)容都是C語言的核心知識,請務必掌握。第8~11章分別講解了結構體、共用體、鏈表、位運算和文件等編程技術。第 12章講解了如何用結構化程序設計思想指導一個大程序的開發(fā),以及軟件開發(fā)的基本過程。該章中用“猜硬幣”游戲介紹了自頂向下分解的過程,用“石頭、剪刀、布”游戲介紹了模塊劃分,用“龜兔賽跑模擬”的例子介紹了如何建立一個自己的庫以及如何應用自己創(chuàng)建的庫,用學生管理系統(tǒng)和書店管理系統(tǒng)講述了軟件開發(fā)的過程。第 13章介紹了通用算法設計技術,旨在讓讀者了解,當遇到一個問題時應該如何設計解決問題的算法。
本書內(nèi)容翔實、講解深入,每個知識點都提供了示例,全書共有171道例題和228個程序樣例,所有程序樣例都在VS2010中調(diào)試通過。為了方便讀者自學,本書還提供了118道自測題和141道編程題,以及所有習題的答案,且配套了講解主要知識點的視頻。
本書適合C語言初學者,也適合有一定基礎的讀者。可作為各高等院校計算機專業(yè)的教材,也可供從事計算機軟件開發(fā)的人員參考。
學習程序設計,初學者往往遇到這樣的困境:語言規(guī)則可以倒背如流,但寫出的代碼總是編譯通不過,即使編譯通過了卻也得不出想要的結果。怎么辦?《第一行代碼 C語言》可以給你提供幫助。
你不需要具備高深的數(shù)學和電子學知識,只需要訓練自己以計算機能夠理解的方式去表達自己的邏輯,也就是要具備“計算思維”,尋找到解決問題的方法,然后用編程語言去指揮計算機執(zhí)行即可。因此,本書與常規(guī)的C語言書不同,除了C語言本身的語法規(guī)則外,本書更關注的是培養(yǎng)初學者具有程序設計的思想,掌握程序設計的方法。
另外,計蒜客在線教育團隊,為本書的讀者提供了伴隨式的在線編程平臺支持,讀者可以將圖書和線上編程結合起來學習。
提供掃碼看視頻服務,全書94個微視頻,總時長超過1000分鐘。
提供輔助教學資源包,包括實驗、試卷及答案、教學大綱、PPT等。
翁惠玉:上海交通大學副教授,“程序設計”“數(shù)據(jù)結構”和“計算機網(wǎng)絡”等課程主講教師,曾獲高等教育教學成果獎一等獎、高等教育教學成果獎二等獎、高等教育上海市級教育成果一等獎等。
第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 調(diào)試與維護 12
1.5 編程規(guī)范及常見問題 13
1.5.1 真的需要算法設計階段嗎 13
1.5.2 為什么不用自然語言編程 13
1.5.3 寄存器、主存儲器和外存儲器有什么不同 13
1.5.4 所有的計算機能夠執(zhí)行的指令都是相同的嗎 13
1.5.5 為什么需要編譯和鏈接 13
1.5.6 為什么在不同類型的計算機上運行C語言程序需要使用不同的編譯器 14
1.5.7 為什么不同類型的計算機不能運行同一個匯編程序 14
1.6 小結 14
1.7 自測題 14
1.8 實戰(zhàn)訓練 15
第2章 初識C語言 16
2.1 一個完整的C語言程序 16
2.1.1 注釋 17
2.1.2 預編譯 17
2.1.3 主程序 18
2.2 C語言的開發(fā)環(huán)境 20
2.2.1 VS2010的安裝 20
2.2.2 程序輸入 20
2.2.3 編譯鏈接 24
2.2.4 程序的運行 25
2.2.5 程序的調(diào)試 28
2.3 編程規(guī)范及常見問題 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 實戰(zhàn)訓練 32
第3章 順序程序設計 33
3.1 常量與變量 33
3.1.1 變量定義 33
3.1.2 數(shù)據(jù)類型 35
3.1.3 常量與符號常量 39
3.2 數(shù)據(jù)的輸入/輸出 44
3.2.1 字符的輸入/輸出 44
3.2.2 格式化輸入/輸出 46
3.3 算術運算 54
3.3.1 算術表達式 54
3.3.2 不同類型數(shù)據(jù)間的混合運算 56
3.3.3 強制類型轉(zhuǎn)換 57
3.3.4 數(shù)學函數(shù)庫 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 數(shù)制間的轉(zhuǎn)換 64
3.5.2 整數(shù)的表示 66
3.5.3 實數(shù)的表示 69
3.6 順序程序設計示例 69
3.7 程序規(guī)范及常見問題 71
3.7.1 變量命名 71
3.7.2 運算符的優(yōu)先級 71
3.7.3 數(shù)據(jù)運算時的注意事項 71
3.7.4 為什么要定義符號常量 72
3.7.5 變量定義后且對它賦值前的值是什么 72
3.7.6 不要在表達式中插入有副作用的子表達式 72
3.8 小結 72
3.9 自測題 73
3.10 實戰(zhàn)訓練 74
第4章 分支程序設計 76
4.1 關系表達式 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 程序規(guī)范及常見問題 102
4.5.1 條件語句程序的排版 102
4.5.2 不要連用關系運算符 102
4.5.3 注意短路求值 102
4.5.4 常見錯誤 102
4.6 小結 103
4.7 自測題 103
4.8 實戰(zhàn)訓練 104
第5章 循環(huán)程序設計 106
5.1 計數(shù)循環(huán) 106
5.1.1 for語句 106
5.1.2 for語句的進一步討論 115
5.1.3 for循環(huán)的嵌套 116
5.2 break和continue語句 118
5.2.1 break語句 118
5.2.2 continue語句 120
5.3 基于哨兵的循環(huán) 121
5.3.1 while語句 122
5.3.2 do…while循環(huán) 128
5.4 循環(huán)的中途退出 130
5.5 編程規(guī)范和常見問題 134
5.5.1 循環(huán)語句程序的排版 134
5.5.2 優(yōu)化循環(huán)體 134
5.5.3 使用for循環(huán)的注意事項 134
5.5.4 常見錯誤 134
5.5.5 三個循環(huán)語句之間的關系 135
5.6 小結 135
5.7 自測題 135
5.8 實戰(zhàn)訓練 136
第6章 過程封裝——函數(shù) 139
6.1 函數(shù)的定義 140
6.1.1 函數(shù)的基本結構 140
6.1.2 return語句 141
6.1.3 函數(shù)示例 141
6.2 函數(shù)的使用 144
6.2.1 函數(shù)原型的聲明 144
6.2.2 函數(shù)調(diào)用 146
6.2.3 將函數(shù)與主程序放在一起 147
6.2.4 函數(shù)調(diào)用過程 151
6.3 帶參數(shù)的宏 154
6.4 變量的作用域 155
6.4.1 局部變量 155
6.4.2 全局變量 156
6.5 變量的存儲類別 158
6.5.1 自動變量 158
6.5.2 靜態(tài)變量 159
6.5.3 寄存器變量 160
6.5.4 外部變量 161
*6.6 多源文件程序的編譯鏈接 163
6.7 遞歸程序設計 164
6.7.1 遞歸的基本概念 165
6.7.2 遞歸函數(shù)的應用 167
6.8 編程規(guī)范及常見問題 173
6.8.1 使用函數(shù)時的建議 173
6.8.2 函數(shù)命名 174
6.8.3 沒有返回值的函數(shù)是否需要return語句 174
6.8.4 盡量避免使用全局變量 174
6.8.5 盡量避免實際參數(shù)表達式有副作用 175
6.8.6 常見錯誤 175
6.9 小結 175
6.10 自測題 176
6.11 實戰(zhàn)訓練 177
第7章 批量數(shù)據(jù)處理——數(shù)組 179
7.1 一維數(shù)組 179
7.1.1 一維數(shù)組的定義 179
7.1.2 數(shù)組元素的引用 180
7.1.3 一維數(shù)組的內(nèi)存映像 184
7.1.4 一維數(shù)組的應用 185
7.2 數(shù)組作為函數(shù)的參數(shù) 190
7.3 查找算法 195
7.3.1 順序查找 196
7.3.2 二分查找 197
7.4 排序算法 201
7.4.1 直接選擇排序法 201
7.4.2 冒泡排序法 203
7.5 二維數(shù)組 205
7.5.1 二維數(shù)組的定義 206
7.5.2 二維數(shù)組元素的引用 207
7.5.3 二維數(shù)組的內(nèi)存映像 208
7.5.4 二維數(shù)組的應用 208
7.5.5 二維數(shù)組作為函數(shù)的參數(shù) 218
7.6 字符串 220
7.6.1 字符串的存儲及初始化 220
7.6.2 字符串的輸入/輸出 221
7.6.3 字符串作為函數(shù)參數(shù) 225
7.6.4 字符串處理函數(shù) 230
7.6.5 字符串的應用 232
7.7 程序規(guī)范及常見問題 234
7.7.1 數(shù)組下標必須從0開始嗎 234
7.7.2 能用表達式des = src將字符串src賦給字符串des嗎 234
7.7.3 為什么存放字符串的數(shù)組長度比字符串的實際長度多一個字符235
7.7.4 有了scanf函數(shù)為什么還需要gets函數(shù) 235
7.7.5 傳遞字符串為什么只需要一個參數(shù) 235
7.7.6 傳遞二維數(shù)組時形式參數(shù)中第二個方括號中的值為什么必須指定 235
7.8 小結 235
7.9 自測題 236
7.10 實戰(zhàn)訓練 237
第8章 指針 240
8.1 指針的概念 240
8.1.1 指針與間接訪問 240
8.1.2 指針變量的定義 241
8.1.3 指針變量的操作 242
8.2 指針與數(shù)組 246
8.2.1 指向數(shù)組元素的指針 246
8.2.2 指針運算與數(shù)組訪問 246
8.3 指針與函數(shù) 250
8.3.1 指針作為參數(shù) 250
8.3.2 返回指針的函數(shù) 254
8.3.3 數(shù)組作為函數(shù)參數(shù)的進一步討論 256
8.4 動態(tài)內(nèi)存分配 259
8.4.1 動態(tài)變量 259
8.4.2 動態(tài)變量的創(chuàng)建 259
8.4.3 動態(tài)變量的消亡 261
8.4.4 內(nèi)存泄露 261
8.4.5 查找malloc和calloc的失誤 261
8.4.6 動態(tài)變量應用 263
8.5 指針與字符串 265
8.5.1 用指向字符的指針變量表示字符串 265
8.5.2 字符串作為函數(shù)的參數(shù) 266
8.5.3 返回字符串的函數(shù) 268
8.6 指針數(shù)組與多級指針 270
8.6.1 指針數(shù)組 270
*8.6.2 main函數(shù)的參數(shù) 272
*8.6.3 多級指針 276
*8.6.4 二維數(shù)組與指向一維數(shù)組的指針 277
*8.6.5 動態(tài)二維數(shù)組 279
*8.7 函數(shù)指針 280
8.7.1 指向函數(shù)的指針 280
8.7.2 函數(shù)指針作為函數(shù)參數(shù) 281
8.7.3 函數(shù)指針用于菜單選擇 284
8.8 編程規(guī)范與常見問題 285
8.8.1 int x, *p = &x;有錯嗎 285
8.8.2 避免使用懸空指針和未初始化的指針 286
8.8.3 不同類型的指針之間為什么不能賦值 286
8.8.4 指針與數(shù)組等價嗎 286
8.8.5 值傳遞和指針傳遞的區(qū)別是什么 286
8.8.6 返回指針的函數(shù)必須確保返回值指向的變量在函數(shù)執(zhí)行
結束時依然存在 287
8.8.7 使用動態(tài)變量時必須嚴格防止內(nèi)存泄露 287
8.9 小結 287
8.10 自測題 288
8.11 實戰(zhàn)訓練 289
第9章 更多的數(shù)據(jù)類型 290
9.1 枚舉類型 290
9.2 類型別名 293
9.3 結構體 294
9.3.1 結構體的概念 294
9.3.2 結構體類型的定義 295
9.3.3 結構體類型變量的定義 296
9.3.4 結構體類型變量的使用 299
9.3.5 結構體與函數(shù) 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 編程規(guī)范及常見問題 324
9.6.1 結構體中每個字段的類型都不相同嗎 324
9.6.2 單鏈表中為什么要引入頭結點 324
9.6.3 引入結構體有什么用處 324
9.6.4 結構體和共用體的區(qū)別 324
9.6.5 結構體和共用體類型定義時能否省略類型名 324
9.6.6 結構體類型定義與結構體變量定義 325
9.7 小結 325
9.8 自測題 325
9.9 實戰(zhàn)訓練 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 不同長度的數(shù)據(jù)進行位運算 337
10.2 位段 338
10.2.1 位段的概念及定義 338
10.2.2 位段的引用 339
10.3 編程規(guī)范及常見問題 341
10.3.1 檢驗某數(shù)中指定位的值 341
10.3.2 將數(shù)據(jù)中的某一位的值置成0 341
10.3.3 將數(shù)據(jù)中的某一位的值置成1 342
10.3.4 將數(shù)據(jù)中的某一位的值取反 342
10.4 小結 342
10.5 自測題 342
10.6 實戰(zhàn)訓練 343
第11章 文件 344
11.1 內(nèi)存與外存 344
11.2 文件的概念 345
11.2.1 什么是文件 345
11.2.2 ASCII文件與二進制文件 346
11.3 文件緩沖與文件指針 346
11.4 文件的打開與關閉 347
11.4.1 打開文件 347
11.4.2 關閉文件 349
11.5 ASCII文件的讀寫 349
11.5.1 字符讀寫函數(shù) 350
11.5.2 字符串讀寫函數(shù) 352
11.5.3 數(shù)值讀寫函數(shù) 354
11.6 二進制文件的讀寫 358
11.6.1 fwrite函數(shù) 358
11.6.2 fread函數(shù) 360
11.7 文件的順序訪問 362
11.7.1 什么是文件的順序訪問 362
11.7.2 feof函數(shù) 363
11.8 文件的隨機訪問 364
11.8.1 文件定位指針 365
11.8.2 rewind函數(shù) 365
11.8.3 fseek函數(shù) 367
11.8.4 ftell函數(shù) 369
*11.9 文件操作與控制臺操作 370
11.10 編程規(guī)范及常見問題 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 實戰(zhàn)訓練 373
第12章 軟件開發(fā)過程 374
12.1 結構化程序設計思想 374
12.2 自頂向下分解示例:“猜硬幣”游戲 375
12.2.1 頂層分解 375
12.2.2 prn_instruction函數(shù)的實現(xiàn) 376
12.2.3 play函數(shù)的實現(xiàn) 376
12.2.4 get_call_from_user函數(shù)的實現(xiàn) 378
12.3 模塊劃分示例:“石頭、剪刀、布”游戲 380
12.3.1 自頂向下分解 381
12.3.2 模塊劃分 382
12.3.3 頭文件的設計 383
12.3.4 模塊實現(xiàn) 386
12.4 設計自己的庫示例:隨機函數(shù)庫的設計和實現(xiàn) 389
12.4.1 隨機函數(shù)庫的功能設計 390
12.4.2 接口文件的設計 390
12.4.3 實現(xiàn)文件的設計 391
12.5 隨機函數(shù)庫的應用示例:模擬龜兔賽跑 392
12.5.1 自頂向下分解 392
12.5.2 模塊劃分及實現(xiàn) 393
12.6 軟件開發(fā)過程 395
12.6.1 軟件危機 395
12.6.2 軟件工程 396
12.7 軟件開發(fā)過程示例:學生管理系統(tǒng)的設計與實現(xiàn) 397
12.7.1 需求分析 397
12.7.2 概要設計 398
12.7.3 詳細設計 400
12.7.4 編碼與測試 402
12.8 軟件開發(fā)示例:網(wǎng)上書店的設計 407
12.8.1 需求分析 407
12.8.2 概要設計 408
12.8.3 詳細設計 411
12.9 編程規(guī)范及常見問題 413
12.9.1 頭文件的格式 413
12.9.2 實現(xiàn)一個庫為什么需要兩個文件 413
12.9.3 慎用全局變量 414
12.10 小結 414
12.11 自測題 414
12.12 實戰(zhàn)訓練 414
第13章 通用算法設計 416
13.1 枚舉法 416
13.2 貪婪法 423
13.3 分治法 427
13.4 動態(tài)規(guī)劃 431
13.5 回溯法 435
13.6 小結 442
13.7 實戰(zhàn)訓練 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