本書以C語言為編程環(huán)境,由淺入深地介紹了C語言的完整內(nèi)容以及過程化程序設(shè)計的思想和方法。全書共有13章。第 1章介紹了什么是程序設(shè)計。第 2章給出了一個完整的C語言程序,并介紹了如何在VS2010中輸入、編譯鏈接及調(diào)試程序。第3~5章分別介紹了C語言中支持結(jié)構(gòu)化程序設(shè)計的3種結(jié)構(gòu):順序、分支和循環(huán)所必需的工具。第6章介紹了如何編寫及應(yīng)用函數(shù);第7章介紹了處理批量數(shù)據(jù)的工具,即數(shù)組。上述章節(jié)的內(nèi)容都是C語言的核心知識,請務(wù)必掌握。第8~11章分別講解了結(jié)構(gòu)體、共用體、鏈表、位運(yùn)算和文件等編程技術(shù)。第 12章講解了如何用結(jié)構(gòu)化程序設(shè)計思想指導(dǎo)一個大程序的開發(fā),以及軟件開發(fā)的基本過程。該章中用“猜硬幣”游戲介紹了自頂向下分解的過程,用“石頭、剪刀、布”游戲介紹了模塊劃分,用“龜兔賽跑模擬”的例子介紹了如何建立一個自己的庫以及如何應(yīng)用自己創(chuàng)建的庫,用學(xué)生管理系統(tǒng)和書店管理系統(tǒng)講述了軟件開發(fā)的過程。第 13章介紹了通用算法設(shè)計技術(shù),旨在讓讀者了解,當(dāng)遇到一個問題時應(yīng)該如何設(shè)計解決問題的算法。
本書內(nèi)容翔實(shí)、講解深入,每個知識點(diǎn)都提供了示例,全書共有171道例題和228個程序樣例,所有程序樣例都在VS2010中調(diào)試通過。為了方便讀者自學(xué),本書還提供了118道自測題和141道編程題,以及所有習(xí)題的答案,且配套了講解主要知識點(diǎn)的視頻。
本書適合C語言初學(xué)者,也適合有一定基礎(chǔ)的讀者?勺鳛楦鞲叩仍盒S嬎銠C(jī)專業(yè)的教材,也可供從事計算機(jī)軟件開發(fā)的人員參考。
學(xué)習(xí)程序設(shè)計,初學(xué)者往往遇到這樣的困境:語言規(guī)則可以倒背如流,但寫出的代碼總是編譯通不過,即使編譯通過了卻也得不出想要的結(jié)果。怎么辦?《第一行代碼 C語言》可以給你提供幫助。
你不需要具備高深的數(shù)學(xué)和電子學(xué)知識,只需要訓(xùn)練自己以計算機(jī)能夠理解的方式去表達(dá)自己的邏輯,也就是要具備“計算思維”,尋找到解決問題的方法,然后用編程語言去指揮計算機(jī)執(zhí)行即可。因此,本書與常規(guī)的C語言書不同,除了C語言本身的語法規(guī)則外,本書更關(guān)注的是培養(yǎng)初學(xué)者具有程序設(shè)計的思想,掌握程序設(shè)計的方法。
另外,計蒜客在線教育團(tuán)隊,為本書的讀者提供了伴隨式的在線編程平臺支持,讀者可以將圖書和線上編程結(jié)合起來學(xué)習(xí)。
提供掃碼看視頻服務(wù),全書94個微視頻,總時長超過1000分鐘。
提供輔助教學(xué)資源包,包括實(shí)驗(yàn)、試卷及答案、教學(xué)大綱、PPT等。
翁惠玉:上海交通大學(xué)副教授,“程序設(shè)計”“數(shù)據(jù)結(jié)構(gòu)”和“計算機(jī)網(wǎng)絡(luò)”等課程主講教師,曾獲高等教育教學(xué)成果獎一等獎、高等教育教學(xué)成果獎二等獎、高等教育上海市級教育成果一等獎等。
第1章 程序設(shè)計概述 1
1.1 什么是程序設(shè)計 1
1.2 計算機(jī)的基本組成 2
1.2.1 計算機(jī)硬件 2
1.2.2 計算機(jī)軟件 4
1.3 程序設(shè)計語言 4
1.3.1 機(jī)器語言 4
1.3.2 匯編語言 5
1.3.3 高級語言 6
1.3.4 智能語言 7
1.3.5 C語言 7
1.4 程序設(shè)計過程 7
1.4.1 算法設(shè)計 8
1.4.2 編碼 11
1.4.3 編譯與鏈接 11
1.4.4 調(diào)試與維護(hù) 12
1.5 編程規(guī)范及常見問題 13
1.5.1 真的需要算法設(shè)計階段嗎 13
1.5.2 為什么不用自然語言編程 13
1.5.3 寄存器、主存儲器和外存儲器有什么不同 13
1.5.4 所有的計算機(jī)能夠執(zhí)行的指令都是相同的嗎 13
1.5.5 為什么需要編譯和鏈接 13
1.5.6 為什么在不同類型的計算機(jī)上運(yùn)行C語言程序需要使用不同的編譯器 14
1.5.7 為什么不同類型的計算機(jī)不能運(yùn)行同一個匯編程序 14
1.6 小結(jié) 14
1.7 自測題 14
1.8 實(shí)戰(zhàn)訓(xùn)練 15
第2章 初識C語言 16
2.1 一個完整的C語言程序 16
2.1.1 注釋 17
2.1.2 預(yù)編譯 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 程序的運(yùn)行 25
2.2.5 程序的調(diào)試 28
2.3 編程規(guī)范及常見問題 30
2.3.1 注意注釋 30
2.3.2 良好的排版習(xí)慣 30
2.3.3 為什么要學(xué)C語言 31
2.3.4 如何學(xué)習(xí)程序設(shè)計 31
2.3.5 什么是庫 31
2.4 小結(jié) 32
2.5 自測題 32
2.6 實(shí)戰(zhàn)訓(xùn)練 32
第3章 順序程序設(shè)計 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 算術(shù)運(yùn)算 54
3.3.1 算術(shù)表達(dá)式 54
3.3.2 不同類型數(shù)據(jù)間的混合運(yùn)算 56
3.3.3 強(qiáng)制類型轉(zhuǎn)換 57
3.3.4 數(shù)學(xué)函數(shù)庫 59
3.4 賦值運(yùn)算 60
3.4.1 賦值表達(dá)式 60
3.4.2 賦值的嵌套 62
3.4.3 復(fù)合賦值運(yùn)算 62
3.4.4 自增和自減運(yùn)算符 63
*3.5 信息表示 64
3.5.1 數(shù)制間的轉(zhuǎn)換 64
3.5.2 整數(shù)的表示 66
3.5.3 實(shí)數(shù)的表示 69
3.6 順序程序設(shè)計示例 69
3.7 程序規(guī)范及常見問題 71
3.7.1 變量命名 71
3.7.2 運(yùn)算符的優(yōu)先級 71
3.7.3 數(shù)據(jù)運(yùn)算時的注意事項 71
3.7.4 為什么要定義符號常量 72
3.7.5 變量定義后且對它賦值前的值是什么 72
3.7.6 不要在表達(dá)式中插入有副作用的子表達(dá)式 72
3.8 小結(jié) 72
3.9 自測題 73
3.10 實(shí)戰(zhàn)訓(xùn)練 74
第4章 分支程序設(shè)計 76
4.1 關(guān)系表達(dá)式 76
4.2 邏輯表達(dá)式 78
4.2.1 邏輯運(yùn)算 78
4.2.2 短路求值 80
4.3 if語句 82
4.3.1 if語句的形式 82
4.3.2 if語句的嵌套 87
4.3.3 條件表達(dá)式 90
4.4 switch語句及其應(yīng)用 92
4.5 程序規(guī)范及常見問題 102
4.5.1 條件語句程序的排版 102
4.5.2 不要連用關(guān)系運(yùn)算符 102
4.5.3 注意短路求值 102
4.5.4 常見錯誤 102
4.6 小結(jié) 103
4.7 自測題 103
4.8 實(shí)戰(zhàn)訓(xùn)練 104
第5章 循環(huán)程序設(shè)計 106
5.1 計數(shù)循環(huán) 106
5.1.1 for語句 106
5.1.2 for語句的進(jìn)一步討論 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)語句之間的關(guān)系 135
5.6 小結(jié) 135
5.7 自測題 135
5.8 實(shí)戰(zhàn)訓(xùn)練 136
第6章 過程封裝——函數(shù) 139
6.1 函數(shù)的定義 140
6.1.1 函數(shù)的基本結(jié)構(gòu) 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 遞歸程序設(shè)計 164
6.7.1 遞歸的基本概念 165
6.7.2 遞歸函數(shù)的應(yīng)用 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í)際參數(shù)表達(dá)式有副作用 175
6.8.6 常見錯誤 175
6.9 小結(jié) 175
6.10 自測題 176
6.11 實(shí)戰(zhàn)訓(xù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ù)組的應(yīng)用 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ù)組的應(yīng)用 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 字符串的應(yīng)用 232
7.7 程序規(guī)范及常見問題 234
7.7.1 數(shù)組下標(biāo)必須從0開始嗎 234
7.7.2 能用表達(dá)式des = src將字符串src賦給字符串des嗎 234
7.7.3 為什么存放字符串的數(shù)組長度比字符串的實(shí)際長度多一個字符235
7.7.4 有了scanf函數(shù)為什么還需要gets函數(shù) 235
7.7.5 傳遞字符串為什么只需要一個參數(shù) 235
7.7.6 傳遞二維數(shù)組時形式參數(shù)中第二個方括號中的值為什么必須指定 235
7.8 小結(jié) 235
7.9 自測題 236
7.10 實(shí)戰(zhàn)訓(xù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 指針運(yùn)算與數(shù)組訪問 246
8.3 指針與函數(shù) 250
8.3.1 指針作為參數(shù) 250
8.3.2 返回指針的函數(shù) 254
8.3.3 數(shù)組作為函數(shù)參數(shù)的進(jìn)一步討論 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)變量應(yīng)用 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í)行
結(jié)束時依然存在 287
8.8.7 使用動態(tài)變量時必須嚴(yán)格防止內(nèi)存泄露 287
8.9 小結(jié) 287
8.10 自測題 288
8.11 實(shí)戰(zhàn)訓(xùn)練 289
第9章 更多的數(shù)據(jù)類型 290
9.1 枚舉類型 290
9.2 類型別名 293
9.3 結(jié)構(gòu)體 294
9.3.1 結(jié)構(gòu)體的概念 294
9.3.2 結(jié)構(gòu)體類型的定義 295
9.3.3 結(jié)構(gòu)體類型變量的定義 296
9.3.4 結(jié)構(gòu)體類型變量的使用 299
9.3.5 結(jié)構(gòu)體與函數(shù) 302
9.4 鏈表 308
9.4.1 鏈表的概念 308
9.4.2 單鏈表的存儲 310
9.4.3 單鏈表的操作 311
9.4.4 帶頭結(jié)點(diǎn)的單鏈表 312
9.4.5 單鏈表實(shí)例 313
9.5 共用體 316
9.5.1 共用體概念和共用體類型的定義 316
9.5.2 共用體類型變量的定義及初始化 318
9.5.3 共用體變量的使用 318
9.6 編程規(guī)范及常見問題 324
9.6.1 結(jié)構(gòu)體中每個字段的類型都不相同嗎 324
9.6.2 單鏈表中為什么要引入頭結(jié)點(diǎn) 324
9.6.3 引入結(jié)構(gòu)體有什么用處 324
9.6.4 結(jié)構(gòu)體和共用體的區(qū)別 324
9.6.5 結(jié)構(gòu)體和共用體類型定義時能否省略類型名 324
9.6.6 結(jié)構(gòu)體類型定義與結(jié)構(gòu)體變量定義 325
9.7 小結(jié) 325
9.8 自測題 325
9.9 實(shí)戰(zhàn)訓(xùn)練 326
第10章 位運(yùn)算與位段 328
10.1 位運(yùn)算 328
10.1.1 “按位與”運(yùn)算 328
10.1.2 “按位或”運(yùn)算 330
10.1.3 “按位異或”運(yùn)算 331
10.1.4 “按位取反”運(yùn)算 333
10.1.5 “左移”運(yùn)算 335
10.1.6 “右移”運(yùn)算 335
10.1.7 位運(yùn)算與賦值運(yùn)算 337
10.1.8 不同長度的數(shù)據(jù)進(jìn)行位運(yùn)算 337
10.2 位段 338
10.2.1 位段的概念及定義 338
10.2.2 位段的引用 339
10.3 編程規(guī)范及常見問題 341
10.3.1 檢驗(yàn)?zāi)硵?shù)中指定位的值 341
10.3.2 將數(shù)據(jù)中的某一位的值置成0 341
10.3.3 將數(shù)據(jù)中的某一位的值置成1 342
10.3.4 將數(shù)據(jù)中的某一位的值取反 342
10.4 小結(jié) 342
10.5 自測題 342
10.6 實(shí)戰(zhàn)訓(xùn)練 343
第11章 文件 344
11.1 內(nèi)存與外存 344
11.2 文件的概念 345
11.2.1 什么是文件 345
11.2.2 ASCII文件與二進(jìn)制文件 346
11.3 文件緩沖與文件指針 346
11.4 文件的打開與關(guān)閉 347
11.4.1 打開文件 347
11.4.2 關(guān)閉文件 349
11.5 ASCII文件的讀寫 349
11.5.1 字符讀寫函數(shù) 350
11.5.2 字符串讀寫函數(shù) 352
11.5.3 數(shù)值讀寫函數(shù) 354
11.6 二進(jìn)制文件的讀寫 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 文件的隨機(jī)訪問 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 良好的文件使用習(xí)慣 371
11.10.2 文件打開方式選擇 372
11.10.3 文件指針與文件定位指針 372
11.10.4 流與文件 372
11.11 小結(jié) 372
11.12 自測題 373
11.13 實(shí)戰(zhàn)訓(xùn)練 373
第12章 軟件開發(fā)過程 374
12.1 結(jié)構(gòu)化程序設(shè)計思想 374
12.2 自頂向下分解示例:“猜硬幣”游戲 375
12.2.1 頂層分解 375
12.2.2 prn_instruction函數(shù)的實(shí)現(xiàn) 376
12.2.3 play函數(shù)的實(shí)現(xiàn) 376
12.2.4 get_call_from_user函數(shù)的實(shí)現(xiàn) 378
12.3 模塊劃分示例:“石頭、剪刀、布”游戲 380
12.3.1 自頂向下分解 381
12.3.2 模塊劃分 382
12.3.3 頭文件的設(shè)計 383
12.3.4 模塊實(shí)現(xiàn) 386
12.4 設(shè)計自己的庫示例:隨機(jī)函數(shù)庫的設(shè)計和實(shí)現(xiàn) 389
12.4.1 隨機(jī)函數(shù)庫的功能設(shè)計 390
12.4.2 接口文件的設(shè)計 390
12.4.3 實(shí)現(xiàn)文件的設(shè)計 391
12.5 隨機(jī)函數(shù)庫的應(yīng)用示例:模擬龜兔賽跑 392
12.5.1 自頂向下分解 392
12.5.2 模塊劃分及實(shí)現(xiàn) 393
12.6 軟件開發(fā)過程 395
12.6.1 軟件危機(jī) 395
12.6.2 軟件工程 396
12.7 軟件開發(fā)過程示例:學(xué)生管理系統(tǒng)的設(shè)計與實(shí)現(xiàn) 397
12.7.1 需求分析 397
12.7.2 概要設(shè)計 398
12.7.3 詳細(xì)設(shè)計 400
12.7.4 編碼與測試 402
12.8 軟件開發(fā)示例:網(wǎng)上書店的設(shè)計 407
12.8.1 需求分析 407
12.8.2 概要設(shè)計 408
12.8.3 詳細(xì)設(shè)計 411
12.9 編程規(guī)范及常見問題 413
12.9.1 頭文件的格式 413
12.9.2 實(shí)現(xiàn)一個庫為什么需要兩個文件 413
12.9.3 慎用全局變量 414
12.10 小結(jié) 414
12.11 自測題 414
12.12 實(shí)戰(zhàn)訓(xùn)練 414
第13章 通用算法設(shè)計 416
13.1 枚舉法 416
13.2 貪婪法 423
13.3 分治法 427
13.4 動態(tài)規(guī)劃 431
13.5 回溯法 435
13.6 小結(jié) 442
13.7 實(shí)戰(zhàn)訓(xù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