第一行代碼 C語言 視頻講解版
內容描述
本書以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.3強制類型轉換57
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.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程序規範及常見問題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實戰訓練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 .1 break語句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.3寄存器變量160
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.4.2冒泡排序法203
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.2 main函數的參數272 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.2結構體類型的定義295
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.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字符讀寫函數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
作者介紹
翁惠玉:上海交通大學副教授,“程序設計”“數據結構”和“計算機網絡”等課程主講教師,曾獲高等教育教學成果獎一等獎、高等教育教學成果獎二等獎、高等教育上海市級教育成果一等獎等。