內容簡介
本書是一種“以計算思維訓練為核心,以能力培養為目標”的C語言程式設計教材,基於“程式設計 = 算法思維 + 語言藝術 + 工程規範”的知識和能力框架,以及“前期以培養解題思路為主,語法知識夠用就行;後期補充必要的語法細節”的教學策略編寫。全書共9單元可分為4個部分。
第1部分是針對C程式設計的初級訓練:第1單元介紹C語言程式設計首先應當掌握的一些基本概念和方法;第2、3單元在第1單元的基礎上介紹判斷結構和重複結構;第4單元介紹窮舉、疊代、遞歸和模擬,奠定算法基礎。
第2部分是在第1部分的基礎上進行數據類型的擴展:第5單元介紹數組,第6單元介紹3種可定製數據類型——構造體、共用體和枚舉,第7單元介紹指針及其套用。
第3部分只有第8單元一個單元,介紹分治、回溯、貪心策略和動態規劃,作為算法設計進階,可以使讀者的程式設計能力提升到較高水平。
第4部分即第9單元介紹一些可能用得著的有關內容,包括外部變數、內聯函式、帶參宏定義、契約式編程與防禦式編程、檔案操作。
這樣的結構可以滿足多種不同層次的教和學的需求,併兼顧自學。
作者在編寫本書時力求概念準確、難點分散、例題經典、習題豐富、題型全面、注重效果,並以C99作為藍本。
本書可以作為高等學校各專業的新一代程式設計課程教材,也可供從事程式設計相關領域的人員自學或參考。
目錄
第1單元C程式起步 1
1.1一個簡單的計算器程式設計 1
1.1.1用偽代碼描述的簡單計算器程式算法 1
1.1.2將偽代碼描述的算法逐步細化為C程式 2
1.1.3C語言程式的編譯、連結與執行 4
1.2數據類型、標識符與聲明 6
1.2.1數據類型 6
1.2.2C語言標識符規則 6
1.2.3聲明 7
1.3表達式 8
1.3.1字面量 8
1.3.2數據實體 8
1.3.3含有操作符的表達式及其求值規則 10
1.4函式 13
1.4.1用函式組織程式 13
1.4.2函式定義、函式調用與函式返回 14
1.4.3函式聲明 16
1.4.4main(?)函式 16
1.4.5庫函式與頭檔案 17
1.4.6printf(?)函式的基本用法 17
1.4.7scanf(?)函式的基本用法 19
1.5程式錯誤與異常 21
1.5.1程式中的語法錯誤與編譯錯誤信息 21
1.5.2程式中的邏輯錯誤及其測試 23
1.5.3C語言的實現定義行為和未定義行為 24
1.5.4C程式運行異常與契約失敗 25
1.5.5設計用戶友好的程式 26
1.6知識連結A:整數類型 26
1.6.1有符號整數類型與無符號整數類型 26
1.6.2標準整數類型與擴展整數類型 27
1.6.3宏與整數類型的極值宏 28
1.6.4整數常量使用的3種進制 30
1.6.5整數常量的標識 30
1.7知識連結B:浮點類型 31
1.7.1浮點類型的值的特性:取值範圍與精度 31
1.7.2浮點數據的捨入模式 32
1.7.3浮點類型數據的操作限制 33
1.7.4浮點類型常量的書寫格式 33
1.7.5_Complex類型和_Imaginary類型 34
1.8知識連結C:字元類型 34
1.8.1字元編碼概述 34
1.8.2char類型的基本特點 35
1.8.3轉義字元 36
1.8.4用scanf()和printf()輸入與輸出字元 36
1.8.5用getchar(?)和putchar(?)輸入與輸出字元 37
習題1 38
第2單元選擇程式設計 44
2.1可選擇計算類型的計算器程式算法分析 44
2.1.1粗略算法分析 44
2.1.2計算函式calculate(?)的算法分析 45
2.1.3判等操作符與關係操作符 46
2.2if-else型選擇語句 46
2.2.1用if-else實現的calculate(?)函式 46
2.2.2if-else語句的特點 47
2.2.3if-elseif語句 48
2.2.4瘸腿if-else語句嵌套 49
2.2.5邏輯操作符與邏輯表達式 50
2.2.6條件表達式 51
2.2.7良好的程式書寫風格 52
2.3選擇結構的測試 53
2.3.1白箱測試法 53
2.3.2使用double類型數據的calculate(?)代碼 54
2.3.3等價分類法 55
2.4switch型選擇語句 58
2.4.1基於整數值匹配的選擇語句——switch語句 58
2.4.2一個字元分類程式 59
2.4.3用switch語句的calculate(?)函式 61
2.4.4switch語句與if-else語句的比較 62
2.5知識連結D:變數的作用域與生存期 63
2.5.1標識符的作用域 63
2.5.2變數的生存期與存儲分配 66
2.6知識連結E:const限定符 68
2.6.1用const限定變數 68
2.6.2用const限定函式參數 70
2.7知識連結F:左值表達式與右值表達式 70
2.7.1左值表達式和右值表達式的概念與鑑定 70
2.7.2左值表達式的套用 72
習題2 73
第3單元循環程式設計 81
3.1可連續計算的計算器算法分析 81
3.1.1初步算法 81
3.1.2算法細化 81
3.1.3循環結構的C語言實現 82
3.2while語句 82
3.2.1while語句的格式與特點 82
3.2.2採用while語句的可連續型計算器主函式 83
3.2.3逗號操作符 84
3.3do-while語句 85
3.3.1do-while語句的格式與特點 85
3.3.2採用do-while語句的可連續型計算器主函式 85
3.4for語句 86
3.4.1for語句的格式與特點 86
3.4.2採用for語句的可連續型計算器主函式 86
3.4.3計數型循環語句 88
3.4.4複合賦值操作符與自增、自減操作符 92
3.5循環結構的測試 93
3.5.1基於路徑覆蓋的循環結構測試 93
3.5.2邊值分析法與循環結構測試 93
3.5.3基於因果分析的程式測試 95
3.6break與continue 97
3.6.1break與continue語法概要 97
3.6.2實例:求素數 98
3.7知識連結G:表達式的副作用與序列點 100
3.7.1表達式的副作用 100
3.7.2序列點及其對表達式求值順序的影響 101
3.7.3副作用編程對策 103
3.8知識連結H:算術數據類型轉換 104
3.8.1算術表達式中的數據類型轉換 104
3.8.2普通算術轉換中的“提升拉齊”規則 104
3.8.3傳送轉換中的數據類型轉換 106
3.8.4數據的顯式類型轉換 107
3.8.5數據類型轉換風險 108
習題3 112
第4單元算法基礎 120
4.1窮舉 120
4.1.1搬磚問題 121
4.1.2推斷名次 123
習題4.1 127
4.2疊代與遞推 131
4.2.1用二分疊代法求方程在指定區間的根 132
4.2.2猴子吃桃子問題 135
4.2.3用輾轉相除法求兩個正整數的最大公因子 137
習題4.2 140
4.3遞歸 143
4.3.1階乘的遞歸計算 143
4.3.2漢諾塔 146
4.3.3台階問題 149
習題4.3 150
4.4模擬 151
4.4.1產品隨機抽樣 152
4.4.2用蒙特卡洛法求?的近似值 155
4.4.3事件步長法——中子擴散問題 156
4.4.4時間步長法——鹽水池問題 158
習題4.4 162
第5單元數組 165
5.1一維數組 165
5.1.1數組類型的特徵 165
5.1.2數組的定義 166
5.1.3數組的初始化 167
5.1.4下標變數 168
5.1.5變長數組與常量數組 169
5.2排序與查找 170
5.2.1直接選擇排序 170
5.2.2冒泡排序 172
5.2.3二分查找 175
5.3二維數組 176
5.3.1二維數組的概念 176
5.3.2二維數組的初始化 177
5.3.3訪問二維數組元素 179
5.4字元串 180
5.4.1字元串字面量 180
5.4.2字元數組與C字元串變數 181
5.4.3字元串的輸入與輸出 182
5.4.4字元串操作的庫函式 185
習題5 188
第6單元可定製數據類型 194
6.1構造體類型 194
6.1.1構造體類型的特徵與定製 194
6.1.2用typedef定義類型的別名 195
6.1.3構造體變數 196
6.1.4構造體變數的分量及其操作 199
6.1.5構造體數組 200
6.1.6複合字面量 203
6.2共用體類型 204
6.2.1共用體類型的定製及其變數的定義 204
6.2.2共用體類型與構造體類型的比較 205
6.2.3共用體變數的套用舉例 207
6.3枚舉類型 209
6.3.1枚舉類型及其定義 209
6.3.2枚舉變數及其聲明 210
6.3.3對枚舉變數和枚舉元素的操作 210
6.3.4用枚舉為類提供整型符號常量名稱 211
習題6 211
第7單元指針 219
7.1指針類型與指針變數 219
7.1.1指針及其聲明 219
7.1.2同類型指針間的賦值與判等操作 220
7.1.3指針的遞引用 222
7.1.4void指針 223
7.1.5用const限定指針 223
習題7.1 224
7.2數組與指針 229
7.2.1數組名具有退化的左值性 229
7.2.2下標表達式的指針含義 230
7.2.3指針與字元串 232
7.2.4二維數組與指針 234
習題7.2 236
7.3函式與指針 242
7.3.1指針作為函式參數 242
7.3.2帶參主函式 249
7.3.3返回指針值的函式 250
7.3.4函式類型與指向函式的指針 251
習題7.3 257
7.4指向構造體的指針與鍊表 261
7.4.1指向構造體類型變數的指針 261
7.4.2鍊表及其特點 262
7.4.3構建鍊表 263
習題7.4 265
7.5動態存儲分配 268
7.5.1申請需要的存儲空間 269
7.5.2釋放一個指針指向的存儲空間 271
7.5.3修改一個指針指向的存儲空間大小 271
7.5.4構建動態鍊表 272
7.5.5帶有彈性數組成員的構造體 276
習題7.5 277
第8單元算法設計進階* 278
8.1分治策略 278
8.1.1快速排序 278
8.1.2腳踏車帶人問題 281
習題8.1 284
8.2回溯策略 286
8.2.1迷宮問題 287
8.2.2八皇后問題 290
習題8.2 292
8.3貪心策略 294
8.3.1旅行費用問題 294
習題8.3 299
8.4動態規劃 301
8.4.1動態規劃概述 301
8.4.2點數值三角形的最優路徑 303
8.4.3背包問題 305
習題8.4 309
第9單元語海拾貝 312
9.1外部變數 312
9.1.1外部變數及其聲明 312
9.1.2外部變數的連結性 312
9.1.3外部變數的風險 317
9.2內聯函式 317
9.2.1內聯函式的概念 317
9.2.2內聯函式的定義 318
9.2.3內聯函式的限制 319
9.3帶參宏 319
9.3.1帶參宏的基本定義格式 319
9.3.2使用帶參宏的注意事項 320
9.3.3帶參宏與函式的比較 320
9.4C語言契約式編程與防禦式編程 322
9.4.1斷言 322
9.4.2庫函式調用錯誤處理 324
9.5數據檔案 329
9.5.1數據檔案及其分類 329
9.5.2FILE類型及其指針 330
9.5.3數據檔案操作的一般過程 332
習題9 337
附錄AC語言運算符的優先權和結合方向 344
附錄BC語言的關鍵字 345
附錄C格式化輸出函式printf()?的格式 346
C.1printf(?)格式參數的結構 346
C.2printf(?)格式符 346
C.3長度修飾符 347
C.4域寬與精度說明 348
C.5格式前綴修飾符 348
附錄D格式化輸入函式scanf()?的格式 349
D.1scanf(?)指針參數 349
D.2scanf(?)格式參數的結構 349
D.2.1格式參數字元串的結構 349
D.2.2基本格式符和長度修正 349
D.2.3欄位寬度 350
D.3scanf(?)的停止與返回 351
D.4數值數據的輸入控制 351
D.5字元型數據的輸入控制 351
D.5.1在格式欄位前添加空格使格式欄位可以跳過空白字元 351
D.5.2用掃描集控制字元數組的讀入 351
附錄E編譯預處理命令 352
E.1宏定義 352
E.2檔案包含 352
E.3條件編譯 352
附錄FC標準庫頭檔案 353
附錄GC語言常用的標準庫函式 354
G.1數學函式 354
G.2字元函式和字元串函式 355
G.3輸入與輸出函式 356
G.4動態記憶體分配函式 357
G.5退出程式函式 358
G.6數值轉換函式 358
G.7時間和日期函式 358
附錄IC99、C89與K&RC主要內容的比較 368
參考文獻 369
編輯推薦
以C99標準為藍本併兼顧C89標準。
零起點,實例引導,輕鬆入門,螺旋式深入、擴展,適合不同層次的教學。
彰顯“程式設計 = 計算思維 + 語言藝術 + 工程規範”的程式設計教育理念。
按照“算法分析 + 代碼示例 + 語法說明 + 測試設計”的思路組織各知識單元。
概念力求本質性,示例力求典型性、說明力求啟迪性,結構力求便於梳理性。
習題類型多、題量大,覆蓋面寬。
作者簡介
張基溫 研究和教學領域涉及計算機科學與技術、信息管理、信息經濟學、電子政務與電子商務、新媒體、服務科學,發表論文百餘篇,出版著作百餘種;先後擔任名古屋大學訪問學者,山西財經大學、江南大學、華東政法大學、福建工程學院、晉城學院、廣西職業技術學院等多所大學的專職、客座或兼職教授,北京大學博雅方略城市發展與信息化研究中心研究員,南京大學出版社總編顧問,太原高新技術區IT研究院實驗室主任,山西省緊缺人才專家委員會副主任等職,中國信息經濟學會常務理事,全國高等院校計算機基礎教育研究會常務理事兼課程建設委員會副主任,中國計算機學會教育專業委員會委員,教育部NIT考試委員會委員,江蘇省計算機基礎教學指導委員會委員,山西省新世紀專家學者協會副會長;為清華大學出版社、電子工業出版社、中國水利水電出版社、南京大學出版社等出版社主編了信息管理與信息系統專業、計算機實驗與實踐、大學生信息素養等多個系列教材。在面向過程程式設計教學領域,從20世紀80年代初就開始進行有關研究和改革,嘗試將軟體工程方法和算法思想引入程式設計,倡導“程式設計 = 計算思維 + 語言藝術 + 工程規範”的程式設計教育理念,推行“以思維訓練為核心,程式測試與程式設計並行”、“前期重在邏輯思維和方法訓練、語法夠用就行;後期進行語法細節補充”的程式設計課程教學方法。他主筆並與他人聯合署名的《C語言程式設計教程》是*十一五規劃教材,並於2007年被評為*精品教材。