本書重點介紹程序設計的基本方法和技術,全書共15章,以程序設計思想、程序設計語言、程序設計技術和軟件工程管理四條主線組織內(nèi)容。在程序設計思想方面,以結構化程序設計思想為主,同時介紹面向?qū)ο蟪绦蛟O計思想,并引入并行程序設計的思想。在程序設計語言方面,以C語言為主,按照*C11標準,充分考慮初學者的學習規(guī)律,深入淺出地介紹基本語法和特性,內(nèi)容通俗易懂。在程序設計技術方面,重點介紹結構化程序設計,同時從代碼封裝與重用入手,介紹函數(shù)庫和組件;另外,還加強了并行計算技術的內(nèi)容,除介紹面向多機的MPI外,還介紹面向多核的多線程和OpenMP技術。在軟件工程管理方面,為培養(yǎng)個人軟件工程的能力,從程序設計的規(guī)范性入手介紹個體軟件過程管理。
本書適合作為高等學校程序設計基礎課程的教材,也可供程序設計愛好者學習。
十二五普通高等教育本科*規(guī)劃教材,精品課程配套教材。程序設計課程的經(jīng)典教材,使用廣泛,歷久彌新,追求卓越,精心修訂。圍繞程序設計能力培養(yǎng),從程序設計思想、語言、技術和工程管理四個方面組織內(nèi)容,以結構化程序設計思想為主,兼顧面向?qū)ο蟪绦蛟O計和并行程序設計;程序?qū)崿F(xiàn)以C語言為主,系統(tǒng)介紹了C11標準,同時介紹其他語言的相應處理;從分解與重用的角度闡述函數(shù)、文件、庫、組件等相關技術,從高性能計算的角度介紹MPI并行程序設計技術;從編碼規(guī)范入手引入個體軟件過程管理。在教材內(nèi)容編排模式上,采用將完整案例分解,逐級深入,引導學生有序地用程序設計思想解決實際工程問題。配套資源豐富。提供教學計劃、教學講義(中英文)、教學課件、教學素材、教學例題與案例、教學視頻、在線測試系統(tǒng)等數(shù)字資源。以知識點為單元組織在線資源,利用思維導圖將知識點有機地聯(lián)系到一起。從高度、廣度、深度三個方面立體展示了課程知識網(wǎng)絡。結構清晰,語言通俗易懂,內(nèi)容由淺入深,循序漸進,實例豐富,習題具有代表性。全書貫穿傳授知識、培養(yǎng)能力、提高素質(zhì)的教學理念。
第3版前言
近年來,以云計算、大數(shù)據(jù)、深度學習為代表的計算機技術快速發(fā)展,互聯(lián)網(wǎng) 成為傳統(tǒng)工業(yè)改革的重要方向,強大的社會需求對高等教育人才的計算機能力培養(yǎng)提出了新的要求。程序設計基礎是計算機能力培養(yǎng)的核心課程,承擔著計算思維與程序設計能力培養(yǎng)的重要責任。
計算思維的表達和程序設計均離不開程序設計語言。本教材選擇了C語言。1972年,為編寫UNIX操作系統(tǒng),貝爾實驗室Dennis Ritchie和Ken Thompson設計了C語言,并于1978年發(fā)布C語言的第一個版本,史稱K&R版本。伴隨著小型機和PC的快速發(fā)展,MacOS、Windows、Linux等操作系統(tǒng)及其應用軟件的開發(fā)大量使用了C語言。隨著C 、Java、PHP、Python等多種程序語言的興起,C語言在應用軟件開發(fā)中的比例有所下降。但是,根據(jù) IEEE Spectrum發(fā)布的報告,C語言在最近3年內(nèi)依然是最受歡迎的兩種程序設計語言之一。隨著多核計算和GPU計算等并行計算的興起,大多數(shù)并行計算框架依然選擇了C語言。因此,在本科階段的程序設計基礎課程中,C語言是一個最佳的選擇。
本次修訂在前兩版的基礎上對內(nèi)容進行了大幅度的調(diào)整。結合作者多年的教學和軟件開發(fā)經(jīng)驗,本教材重點介紹程序設計的基本方法和技術,以程序設計思想、程序設計語言、程序設計技術和軟件工程管理4條主線組織相關內(nèi)容。在程序設計思想方面,以結構化程序設計思想為主,同時介紹面向?qū)ο蟪绦蛟O計思想,并引入并行程序設計的思想。在程序設計語言方面,以C語言為主,按照最新C11標準,充分考慮初學者的學習規(guī)律,深入淺出地介紹基本語法和特性,內(nèi)容通俗易懂。在程序設計技術方面,重點介紹結構化程序設計,同時從代碼封裝與重用入手,介紹函數(shù)庫和組件;同時加強并行計算技術的內(nèi)容,除介紹面向多機的MPI外,還介紹了面向多核的多線程和OpenMP技術。為培養(yǎng)個人軟件工程的能力,從程序設計的規(guī)范性入手介紹個體軟件過程管理。
本教材共分15章。第1章按照計算設備的發(fā)展過程,介紹圖靈機及現(xiàn)代計算機的工作原理、問題求解與算法以及主流的程序設計思想和程序設計語言。第2章從信息編碼與存儲著手,介紹基本標識符、數(shù)據(jù)類型、常量和變量。第3章從數(shù)值計算角度出發(fā),介紹運算符、表達式、輸入輸出函數(shù)庫、數(shù)值計算函數(shù)庫以及基本程序設計語句。第4章重點介紹邏輯運算與選擇結構及其實現(xiàn)。第5章介紹迭代邏輯與循環(huán)結構及其實現(xiàn)。第6章從集合數(shù)據(jù)處理角度介紹數(shù)組、字符串及其實現(xiàn)。第7章從分工和重用角度介紹函數(shù)以及基于多文件的程序結構。第8章從地址角度介紹如何通過指針處理數(shù)據(jù)和指令。第9章圍繞復雜數(shù)據(jù)結構的表示形式,介紹結構體、共用體和線性鏈表。第10章介紹預編譯處理及其程序移植和泛化編程。第11章從數(shù)據(jù)永久存儲角度介紹文件和常用函數(shù)。第12章匯總了常見問題的求解算法。第13章從代碼和數(shù)據(jù)封裝的角度介紹面向?qū)ο蟮某绦蛟O計思想。第14章從高性能計算角度介紹并行程序設計的基本思想以及MPI、OpenMP和多線程技術。第15章從培養(yǎng)合格程序設計人員的角度介紹程序設計規(guī)范和代碼重用技術,并引入軟件工程的概念,初步介紹個體軟件過程(PSP)。
本教材由高克寧教授主編,副主編有李金雙、趙長寬、柳秀梅和徐彬。其中第1章由高克寧編寫,第2~5章由李金雙編寫,第7、12、14、15章由趙長寬編寫,第6、9、11章由柳秀梅編寫,第8、10、13章由徐彬編寫。高克寧、趙長寬負責全書的統(tǒng)稿。同時,感謝為本教材出版付出辛苦的各位同事和研究生。
本教材提供全部教學PPT、習題答案、案例,請聯(lián)系清華大學出版社(www.tup.com.cn)。教材中的部分程序要求采用支持C11標準的編譯器,建議使用GCC 4.9.2或更新版本。
作者
2017年7月于東北大學[1]〖3〗程序設計基礎(C語言)(第3版)前言〖3〗[3]
目錄
第1章計算機及程序設計概述1
1.1概述1
1.2計算與機器2
1.2.1計算器2
1.2.2機械式計算機2
1.2.3圖靈機模型3
1.2.4電子數(shù)字計算機4
1.3指令與程序5
1.4計算機的典型應用6
1.5程序設計語言7
1.5.1機器語言8
1.5.2匯編語言8
1.5.3高級語言9
1.6問題求解與算法11
1.6.1算法定義12
1.6.2算法復雜性12
1.7算法描述13
1.7.1偽代碼13
1.7.2流程圖14
1.7.3NS圖15
1.8程序設計15
1.8.1基本步驟15
1.8.2結構化程序設計16
1.8.3面向?qū)ο蟪绦蛟O計17
1.8.4并行程序設計17
1.8.5程序設計思想前沿18
1.9C語言簡介18
1.9.1C語言的特點18
1.9.2簡單的C程序設計19[1]〖3〗程序設計基礎(C語言)(第3版)目錄〖3〗[3]1.9.3C語言程序結構21
1.9.4C程序設計過程23
1.10案例24
練習題25
第2章信息編碼與數(shù)據(jù)類型27
2.1概述27
2.2二進制與信息編碼27
2.2.1整數(shù)編碼27
2.2.2實數(shù)編碼28
2.2.3字符編碼29
2.3標識符和關鍵字30
2.3.1標識符構成30
2.3.2關鍵字30
2.3.3自定義標識符31
2.4基本數(shù)據(jù)類型31
2.4.1整數(shù)類型33
2.4.2實數(shù)類型34
2.4.3字符類型34
2.4.4邏輯類型36
2.4.5復數(shù)類型36
2.5常量37
2.5.1整型常量37
2.5.2實型常量38
2.5.3字符常量38
2.5.4字符串常量39
2.5.5邏輯常量40
2.5.6復數(shù)常量40
2.5.7符號常量41
2.6變量41
2.6.1變量聲明42
2.6.2變量初始化43
2.6.3變量賦值44
2.6.4變量讀寫45
2.7案例45
練習題46
第3章基本運算與順序結構48
3.1概述48
3.2運算符與表達式48
3.3賦值運算50
3.4算術運算51
3.4.1基本算術運算51
3.4.2自增或自減運算52
3.4.3整數(shù)運算53
3.4.4實數(shù)運算55
3.4.5復合賦值運算56
3.5字符運算56
3.5.1算術運算56
3.5.2字符分類57
3.5.3字符轉換58
3.6位運算58
3.6.1位邏輯運算58
3.6.2位移運算60
3.6.3復合位運算及補位原則61
3.7逗號運算61
3.8強制類型轉換62
3.8.1算術運算中的隱式轉換62
3.8.2賦值運算中的隱式轉換62
3.8.3顯式轉換63
3.9sizeof運算64
3.10標準設備輸入輸出庫64
3.10.1字符輸入輸出函數(shù)65
3.10.2格式化輸出函數(shù)66
3.10.3格式化輸入函數(shù)72
3.11數(shù)學庫76
3.11.1實數(shù)計算函數(shù)76
3.11.2復數(shù)運算函數(shù)77
3.12基本語句78
3.12.1標簽語句78
3.12.2空語句78
3.12.3聲明語句79
3.12.4表達式語句79
3.12.5復合語句79
3.13順序結構80
3.14案例82
練習題83
第4章邏輯判斷與選擇結構85
4.1概述85
4.2關系運算85
4.3邏輯運算86
4.4條件運算88
4.5if語句89
4.5.1單分支選擇結構89
4.5.2雙分支選擇結構91
4.5.3多分支選擇結構93
4.6switch語句96
4.7選擇結構嵌套101
4.8案例106
練習題108
第5章迭代計算與循環(huán)結構109
5.1概述109
5.2while語句110
5.3do…while語句112
5.4for語句115
5.5循環(huán)語句對比118
5.6循環(huán)嵌套119
5.7跳轉控制語句124
5.7.1break語句124
5.7.2continue語句126
5.7.3goto語句126
5.7.4continue、break、goto語句的區(qū)別128
5.8案例129
練習題131
第6章集合數(shù)據(jù)與數(shù)組133
6.1概述133
6.2一維數(shù)組134
6.2.1一維數(shù)組定義134
6.2.2一維數(shù)組初始化135
6.2.3一維數(shù)組引用136
6.2.4一維數(shù)組應用137
6.3二維數(shù)組140
6.3.1二維數(shù)組定義141
6.3.2二維數(shù)組初始化142
6.3.3二維數(shù)組引用143
6.3.4二維數(shù)組應用143
6.4高維數(shù)組147
6.5字符數(shù)組與字符串149
6.5.1字符數(shù)組149
6.5.2字符串151
6.6字符串處理函數(shù)155
6.6.1字符串標準輸入輸出函數(shù)155
6.6.2字符串輸入輸出函數(shù)157
6.6.3字符串復制函數(shù)158
6.6.4字符串連接函數(shù)159
6.6.5字符串比較函數(shù)159
6.6.6字符串檢索函數(shù)160
6.6.7字符串轉換函數(shù)162
6.6.8其他字符串常用函數(shù)162
6.6.9寬字節(jié)型字符串函數(shù)163
6.7數(shù)組新特性164
6.8案例165
練習題166
第7章模塊化與函數(shù)168
7.1概述168
7.2函數(shù)定義170
7.2.1函數(shù)定義形式170
7.2.2函數(shù)返回值與函數(shù)類型173
7.3函數(shù)聲明、頭文件的使用和庫函數(shù)聲明176
7.3.1函數(shù)聲明176
7.3.2頭文件的使用177
7.3.3庫函數(shù)聲明178
7.4參數(shù)傳遞180
7.4.1形式參數(shù)180
7.4.2實際參數(shù)182
7.4.3值復制傳遞機制183
7.4.4地址復制傳遞機制185
7.4.5數(shù)組參數(shù)新特性189
7.5函數(shù)調(diào)用190
7.5.1函數(shù)調(diào)用形式190
7.5.2嵌套調(diào)用191
7.5.3遞歸調(diào)用192
7.6源程序文件與函數(shù)分類194
7.6.1外部函數(shù)194
7.6.2內(nèi)部函數(shù)195
7.6.3內(nèi)聯(lián)函數(shù)196
7.7變量存儲類型197
7.7.1普通變量197
7.7.2寄存器變量197
7.8變量作用域198
7.8.1局部變量199
7.8.2全局變量200
7.8.3靜態(tài)變量203
7.8.4變量訪問控制204
7.9源程序結構205
7.9.1單文件單函數(shù)結構205
7.9.2單文件多函數(shù)結構206
7.9.3多文件多函數(shù)結構206
7.10案例208
練習題210
第8章地址操作與指針212
8.1概述212
8.2指針和指針變量213
8.2.1指針變量聲明213
8.2.2指針變量的賦值及初始化214
8.2.3指針變量的引用214
8.3指針運算215
8.3.1取地址與取值運算216
8.3.2算術運算216
8.3.3關系運算218
8.3.4指針類型轉換218
8.4數(shù)組和指針220
8.4.1用指針訪問數(shù)組元素220
8.4.2指向多維數(shù)組的指針221
8.5字符串和指針224
8.5.1指針處理字符串224
8.5.2使用字符指針變量與字符數(shù)組的區(qū)別225
8.6函數(shù)和指針227
8.6.1指針作為函數(shù)參數(shù)227
8.6.2指針作為函數(shù)的返回值232
8.6.3指向函數(shù)的指針233
8.7指針數(shù)組236
8.7.1指針數(shù)組定義236
8.7.2帶參數(shù)的main函數(shù)239
8.8數(shù)組指針241
8.9指向指針的指針242
8.10內(nèi)存訪問控制244
8.11案例245
練習題249
第9章復雜數(shù)據(jù)類型與結構體251
9.1概述251
9.2結構體類型252
9.2.1結構體類型定義253
9.2.2結構體類型變量聲明與初始化254
9.2.3結構體變量的引用257
9.2.4結構體數(shù)組259
9.2.5結構體與函數(shù)262
9.2.6結構體類型指針264
9.3共用體267
9.4枚舉類型269
9.5類型重定義271
9.6日期和時間273
9.7鏈表274
9.7.1鏈表定義274
9.7.2動態(tài)內(nèi)存管理函數(shù)275
9.7.3鏈表的基本操作279
9.8結構體新特性283
9.9案例285
練習題290
第10章泛化編程與預編譯292
10.1概述292
10.2#define指令292
10.2.1不帶參數(shù)的宏定義292
10.2.2帶參數(shù)的宏定義294
10.3#include指令297
10.4條件編譯299
10.4.1#ifdef … #else …#endif299
10.4.2#ifndef … #else …#endif299
10.4.3#if … #else …#endif300
10.5其他指令302
10.6預定義宏305
10.7異常處理305
10.8程序移植307
10.9案例308
練習題310
第11章數(shù)據(jù)存儲與文件312
11.1概述312
11.2文本文件與二進制文件313
11.2.1文本文件313
11.2.2二進制文件313
11.3文件類型314
11.4文件打開與關閉315
11.4.1文件打開315
11.4.2文件關閉318
11.5文件讀寫319
11.5.1單字符讀寫319
11.5.2字符串讀寫322
11.5.3格式化讀寫323
11.5.4數(shù)據(jù)塊讀寫325
11.6文件定位函數(shù)328
11.7文件狀態(tài)跟蹤330
11.8其他文件操作函數(shù)332
11.9案例334
練習題338
第12章程序設計思想及范例 340
12.1概述340
12.2求和/求積問題340
12.2.1多項式求和341
12.2.2數(shù)列求和342
12.3遍歷問題344
12.4迭代問題350
12.4.1二分迭代法350
12.4.2牛頓迭代法352
12.5排序問題354
12.5.1直接插入排序355
12.5.2起泡排序357
12.5.3選擇排序359
12.6查找問題361
12.6.1順序查找361
12.6.2折半查找362
12.7遞歸問題364
12.8矩陣運算367
12.8.1矩陣加/減運算367
12.8.2矩陣乘法368
12.8.3矩陣轉置370
練習題371
第13章面向?qū)ο笈cC 基礎373
13.1概述373
13.1.1結構化程序設計373
13.1.2模塊封裝與訪問控制374
13.2面向?qū)ο蟪绦蛟O計376
13.3類與對象376
13.3.1類376
13.3.2對象378
13.3.3類在C 中的實現(xiàn)378
13.3.4成員變量384
13.3.5成員函數(shù)386
13.3.6構造函數(shù)和析構函數(shù)390
13.3.7函數(shù)重載392
13.3.8運算符重載394
13.3.9靜態(tài)成員變量396
13.3.10靜態(tài)成員函數(shù)398
13.4繼承與多態(tài)400
13.4.1類繼承400
13.4.2多態(tài)性與虛函數(shù)403
13.5案例407
練習題408
第14章高性能計算與并行程序設計409
14.1概述409
14.2并行算法409
14.2.1并行問題409
14.2.2并行算法設計410
14.3并行程序設計實現(xiàn)411
14.3.1并行程序設計模型411
14.3.2進程412
14.3.3創(chuàng)建進程412
14.3.4消息傳遞413
14.4MPI程序設計基礎416
14.4.1MPI簡介416
14.4.2簡單MPI程序設計417
14.4.3MPI初始化與關閉417
14.4.4MPI函數(shù)庫419
14.4.5MPI消息傳遞420
14.5多核CPU與多線程428
14.5.1多核CPU428
14.5.2線程430
14.6OpenMP與多核程序設計431
14.6.1OpenMP簡介431
14.6.2OpenMP并行程序結構431
14.6.3parallel節(jié)433
14.6.4for節(jié)434
14.6.5其他節(jié)435
14.6.6共享變量與信息傳遞436
14.7多線程技術437
14.7.1線程函數(shù)庫簡介437
14.7.2Win32線程函數(shù)庫437
14.7.3C11標準線程函數(shù)庫444
練習題451
第15章個體軟件過程管理453
15.1概述453
15.2編碼規(guī)范定義454
15.3MPI編碼規(guī)范454
15.3.1標識符命名規(guī)范455
15.3.2函數(shù)或過程規(guī)范455
15.4ANSI C程序編碼規(guī)范456
15.4.1代碼結構與組織456
15.4.2注釋458
15.4.3標識符命名規(guī)范460
15.4.4代碼風格與排版461
15.5代碼重用技術462
15.5.1源程序文件463
15.5.2靜態(tài)庫463
15.5.3動態(tài)鏈接庫465
15.5.4組件技術467
15.6軟件生命周期模型簡介468
15.7CMM簡介470
15.8PSP簡介470
15.9PSP0級471
15.9.1計劃過程管理472
15.9.2開發(fā)過程管理472
15.9.3總結過程管理473
15.9.4PSP0過程管理文檔474
15.9.5PSP0.1級475
15.10軟件開發(fā)計劃477
15.10.1軟件開發(fā)計劃基本內(nèi)容477
15.10.2制定個體軟件開發(fā)計劃478
15.10.3PSP軟件開發(fā)計劃過程管理479
15.11PSP1級479
15.11.1規(guī)模計算480
15.11.2任務計劃480
15.11.3進度計劃481
15.12PSP2級481
15.12.1代碼評審482
15.12.2設計評審483
15.12.3缺陷預防483
15.12.4PSP2級的改進483
練習題483
附錄AASCII碼表485
附錄B運算符和結合方向486
參考文獻488