圖書簡介
本書是一本基於能力培養體系的C語言程式設計教材。本書按照作者提出的“提出問題、分析問題-編寫程式、語法說明-程式測試、結果分析”的思路,並按照“前期以培養解題思路為主,語法知識夠用就行;後期補充必要的語法細節”的原則編寫,旨在引導讀者在邏輯思維能力、語法套用能力和程式測試能力3個方面同步提高。
全書分為3篇。第1篇從幾個經典問題入手,將讀者帶入窮舉、疊代、遞歸、隨機模擬、時間步長、事件步長等基本邏輯思維訓練之中,並相對集中地融入基本語法,為初學者奠定程式設計的基本知識和能力。第2篇通過數組、結構體和指針3種構造數據類型以及常用算法設計策略的介紹,使讀者的程式設計能力上升到“數據結構 + 算法 = 程式”的水平。第3篇對C語言重點語法進行總結、提升和拓展,使讀者在發揮C語言優勢方面得到提升。
本書結構新穎、概念準確,魚漁並重、和木皆宜,例題經典、習題豐富、題型全面,適應面寬、注重效果,適合教學、兼顧自學,與教育部計算機科學與技術教學指導委員會推薦的《高等學校計算機科學與技術專業:公共核心知識體系與課程》中關於程式設計課程的要求一致,可以作為高等學校各專業的新一代程式設計課程教材,也可供從事程式設計相關領域的人員自學或參考。
出版信息
作者:程曉榮、趙惠蘭、張銘泉、李梅 定價:19元
印次:1-1
裝幀:平裝
印刷日期:2012-6-21
圖書目錄
第1篇 C語言程式設計初步
第1單元 簡單的C語言程式3
1.1 兩個整數相加3
1.1.1 兩個整數常數相加的C語言程式3
1.1.2 C語言程式的編譯與連線3
1.1.3 帶有輸出操作的C程式4
習題1.16
1.2 變數初步8
1.2.1 使用變數的兩整數相加程式8
1.2.2 從鍵盤給變數輸入值10
習題1.212
1.3 用浮點數進行除運算14
1.3.1 整數相除的問題14
1.3.2 兩個浮點數相除的C程式15
習題1.316
第2單元 選擇結構18
2.1 將從鍵盤輸入的任意兩個數按升序輸出18
2.1.1 問題分析與參考代碼18
2.1.2 關係運算符與關係表達式19
2.1.3 if-else二分支選擇結構20
2.1.4 程式測試21
2.1.5 程式的書寫風格22
習題2.123
2.2 三中取大25
2.2.1 算法分析與參考代碼25
2.2.2 邏輯運算符與邏輯表達式26
2.2.3 多分支選擇結構中if與else的配對規則27
2.2.4 測試用例設計: 語句覆蓋與分支覆蓋28
2.2.5 else if結構29
2.2.6 條件運算符30
習題2.231
2.3 字元分類34
2.3.1 字元類型35
2.3.2 基於整型值匹配的switch結構37
2.3.3 算法分析與參考代碼37
2.3.4 程式測試用例設計的等價分類法40
2.3.5 switch結構與if-else結構的比較41
習題2.342
第3單元 重複結構46
3.1 C語言重複結構基礎46
3.1.1 C語言的三種重複結構46
3.1.2 累加器程式47
3.1.3 列印九九乘法表53
習題3.1 56
3.2 窮舉65
3.2.1 求素數65
3.2.2 搬磚問題67
3.2.3 推斷名次69
習題3.273
3.3 疊代與遞推78
3.3.1 用輾轉相除法求兩個正整數的最大公因子78
3.3.2 Fibonacci數列81
3.3.3 猴子吃桃子83
3.3.4 用二分疊代法求解一元二次方程85
習題3.388
第4單元 用函式組織C程式92
4.1 函式基礎92
4.1.1 函式定義92
4.1.2 函式調用94
4.1.3 函式原型聲明95
4.1.4 局部變數與全局變數96
4.1.5 模組化程式設計99
習題4.1102
4.2 遞歸105
4.2.1 階乘的遞歸計算105
4.2.2 漢諾塔106
習題4.2109第5單元 計算機模擬111
5.1 隨機問題模擬111
5.1.1 產品隨機抽樣111
5.1.2 用蒙特卡洛法求π的近似值114
習題5.1115
5.2 基於步長的模擬116
5.2.1 事件步長法--中子擴散問題116
5.2.2 時間步長法--鹽水池問題118
習題5.2122
第2篇 數據結構+算法
第6單元 順序地組織同類型數據--數組類型127
6.1 數組基礎127
6.1.1 撲克牌的表示與數組定義127
6.1.2 撲克牌查找: 數組元素引用與數組名參數129
6.1.3 撲克洗牌的隨機模擬132
6.1.4 撲克牌整理: 數組元素排序133
6.1.5 撲克發牌: 二維數組套用135
習題6.1139
6.2 字元串143
6.2.1 字元串與字元數組143
6.2.2 字元串輸入輸出144
6.2.3 字元串的其他操作147
習題6.2150
第7單元 描述一類對象的屬性--結構體類型和共用體類型153
7.1 結構體類型基礎153
7.1.1 結構體類型的定義153
7.1.2 結構體類型的實例化154
7.1.3 結構體變數的引用155
習題7.1157
7.2 結構體數組159
7.2.1 結構體數組的定義與初始化159
7.2.2 結構體數組元素的引用161
習題7.2163
7.3 union類型165
7.3.1 共用體類型的定製與共用體變數的定義165
7.3.2 共用體類型與結構體類型的比較165
7.3.3 共用體變數的套用167
習題7.3168
第8單元 指針類型171
8.1 指針的概念171
8.1.1 指針=基類型+地址171
8.1.2 懸空指針、空指針與void指針173
8.1.3 多級指針174
8.1.4 指針的操作174
習題8.1177
8.2 數組的指針形式180
8.2.1 數組名與指向數組的指針180
8.2.2 二維數組的指針形式182
8.2.3 指針與C字元串184
習題8.2186
8.3 指針參數188
8.3.1 變數地址傳送189
8.3.2 數組地址傳送190
8.3.3 字元指針參數194
8.3.4 帶參主函式197
習題8.3199
第9單元 常用算法設計策略??202
9.1 分治策略202
9.1.1 二分查找202
9.1.2 快速排序204
9.1.3 腳踏車帶人問題207
習題9.1209
9.2 回溯策略211
9.2.1 迷宮問題211
9.2.2 使用堆疊組織搜尋過程215
習題9.2220
9.3 貪心策略221
9.3.1 旅行費用問題222
9.3.2 刪數問題224
習題9.3227
9.4 動態規劃228
習題9.4232
第3篇 深入學習C語言
第10單元 C語言中常量的表示237
10.1 字面常量237
10.1.1 整型字面常量的表示和辨識237
10.1.2 浮點類型字面常量的表示和辨識238
習題10.1239
10.2 宏241
10.2.1 宏定義241
10.2.2 使用宏應當注意的幾點241
10.2.3 帶參宏定義243
習題10.2245
10.3 const修飾符248
10.3.1 用const“固化”變數248
10.3.2 用const修飾指針249
習題10.3252
10.4 枚舉類型253
10.4.1 枚舉類型及其定義253
10.4.2 枚舉變數的定義254
10.4.3 對枚舉變數和枚舉元素的操作254
習題10.4255
第11單元 數據類型257
11.1 基本數據類型特性258
11.1.1 整型數據類型的主要特性258
11.1.2 浮點數據類型的主要特性260
習題11.1261
11.2 數據類型轉換262
11.2.1 數據類型轉換的一般規則262
11.2.2 數據類型轉換的副作用與注意事項265
習題11.2269
11.3 typedef和sizeof操作符270
11.3.1 typedef270
11.3.2 sizeof運算符272
習題11.3272
第12單元 C程式中變數的訪問屬性274
12.1 變數訪問屬性的概念274
12.1.1 變數的存儲類型與生存期274
12.1.2 標識符的作用域275
12.1.3 標識符的連結屬性276
習題12.1276
12.2 C語言程式實體的存儲類型277
12.2.1 C程式中的局部變數277
12.2.2 C程式中的外部變數279
習題12.2283
12.3 C程式中的動態記憶體分配287
12.3.1 申請存儲空間288
12.3.2 釋放一個指針指向的存儲空間289
12.3.3 修改一個指針指向的存儲空間大小290
習題12.3291
第13單元 格式化輸入輸出函式詳解292
13.1 格式化輸出函式printf ()292
13.1.1 格式參數結構292
13.1.2 基本格式符292
13.1.3 長度修飾符293
13.1.4 域寬與精度說明293
13.1.5 前綴修飾符294
習題13.1296
13.2 格式化輸入函式scanf ()297
13.2.1 地址參數297
13.2.2 格式參數結構與工作機制297
13.2.3 數值數據的輸入控制300
13.2.4 scanf ()與輸入緩衝區301
13.2.5 字元型數據的輸入控制302
13.2.6 scanf ()的停止與返回306
習題13.2306
第14單元 檔案308
14.1 C檔案的基本概念308
14.1.1 I/O流與緩衝308
14.1.2 檔案及其分類309
14.1.3 FILE類型及其指針309
習題14.1310
14.2 C檔案操作的一般過程310
14.2.1 檔案打開311
14.2.2 檔案讀寫定位與讀寫操作312
14.2.3 檔案關閉313
習題14.2314
14.3 檔案操作程式示例317
14.3.1 寫若干行字元串到文本檔案317
14.3.2 檔案複製317
習題14.3318
第15單元 位運算與位段320
15.1 位運算320
15.1.1 按位邏輯運算320
15.1.2 移位運算322
15.2 位段322
習題15325
附錄327
附錄A C語言的關鍵字及其用途327
附錄B C語言運算符的優先權和結合方向328
附錄C 編譯預處理命令328
C.1 宏定義328
C.2 檔案包含329
C.3 條件編譯329
附錄D C語言常用標準庫函式329
D.1 數學函式330
D.2 字元函式和字元串函式331
D.3 輸入輸出函式331
D.4 動態記憶體分配函式333
D.5 退出程式函式333
D.6 數值轉換函式334
D.7 時間和日期函式334
參考文獻335
前言
(一)
在資訊時代,程式設計會被人稱為計算機以及相關專業的看家本領,然而不僅如此,在程式設計中所蘊涵的邏輯,是解決所有領域複雜問題的根基,同時在程式設計課程中所進行的邏輯思維訓練,所有人都可從中獲益。但是,儘管程式設計課程已經開設幾十年了,教學效果卻很不盡如人意。
程式設計涉及邏輯思維、語言和方法3方面內容。然而,早期的程式設計課程僅僅是語言手冊的改編。因此,從20世紀80年代,就開始著手改變這種狀況,於1985年出版的我的第一本著作--《BASIC程式設計》中就在原來的語法體系中引入典型算法和軟體工程思想。以後受CIT考試的啟發,在為NIT(國家信息技術考試)編寫的《程式設計(C語言)》(清華大學出版社,1999)一書中,把程式測試引入到程式設計教材中。
之後,幾家出版社先後約稿,出版了《新概念C語言程式設計》(中國鐵道出版社,2003) 、《C語言程式設計案例教程》(清華大學出版社,2004) 、《新概念C程式設計教程》(南京大學出版社,2007) 、《新概念C語言教程》(中國電力出版社,2011) 。在這些教材中,逐步形成並完善了按照內容體系的程式設計教材。所以將它們以“新概念”命名,是想表明這種全新理念的程式設計體系。讓我欣慰的是,隨著這幾本書的不斷改進,類似的書也陸續問世,品種不斷增加,說明面向問題,按照“問題分析-設計代碼-語法說明”線索組織程式設計教學的理念日益被廣泛接受。
(二)
本書應清華大學出版社之邀而撰寫,它是對前幾本教材的進一步完善與改進。全書分為3篇。第1篇由5個單元組成,在這5個單元中,以幾個經典問題為載體,以窮舉、疊代、遞歸、隨機模擬、時間步長、事件步長等基本算法為主線,將設計思路、程式測試方法和C語言基本語法知識融於其中。第2篇由4個單元組成。第6~8單元分別介紹數組、結構體和指針這3種支持程式數據結構的重要類型,使讀者可以初步領略數據結構對於程式設計的重要性,第9單元介紹幾種常用的算法設計策略。通過這4個單元,使“數據結構 + 算法 = 程式”的思想在讀者心中紮根。前面兩篇,按照“訓練解題思路為主,語法夠用就行”的原則編寫。第3篇用6個單元補充了一些重要的語法細節,使讀者能在前兩篇初步掌握了程式設計的基本方法的基礎上,將C語言程式設計的學習引向深入。這樣不僅建立了一種全新的內容體系,將應試教育向能力培養方面做了較大幅度的轉變,同時也與教育部計算機科學與技術教學指導委員會推薦的《高等學校計算機科學與技術專業:公共核心知識體系與課程》中關於程式設計課程的要求一致,讀者可以按照自己的專業定位選擇其中的有關內容。
(三)
為了能有的放矢地進行訓練,本書以二級節為單位給出習題。習題分為4個欄目:概念辨析、代碼解析、探索驗證和開發練習。
“概念辨析”主要提供了一些選擇題和判斷題,旨在提高讀者對基礎語法知識的認知。
“代碼解析”包括指出程式(或代碼段)執行結果、改錯和填空,旨在提高讀者的代碼閱讀能力。因為讀程式也是程式設計的一種基本訓練。
“探索驗證”主要是用於提示或者指導學習者如何通過自己上機驗證來提高掌握語法細節的能力。除了這個欄目中的習題外,學習者最好也能通過設計程式驗證自己對於概念辨析欄目中的習題的判斷是否正確。
“開發練習”是一種綜合練習,應當要求學習者寫出開發文檔。內容主要包括問題(算法)分析、代碼設計、測試用例設計、測試及調試結果分析等幾個部分,重點應當放在問題分析、代碼設計和測試用例的設計上。要把這些工作都做好,再上機調試、測試,不要什麼還沒有設計出來就上機。
(四)
在本書即將出版之際,由衷地感謝在本書寫作過程中參與收集資料、程式調試以及校閱工作的姚威、張秋菊、文明瑤、杜勇、丁群、朱莎、史林娟、張展為、張有明。同時,也殷切地期待著廣大讀者和同仁的批評和建議。讓我們共同把程式設計課程的改革做得更有實效。
張基溫2012年2月