本書以問題求解為核心,通過對(duì)問題的分析、求解過程的講解及演示,全面介紹C99語言及程序設(shè)計(jì)的思想與方法。體系上以問題為先導(dǎo),通過對(duì)問題的分析求解,引入必要的語言和編程知識(shí),并以文字、”黑板式”課堂講解視頻及編程全過程示范視頻等多種教學(xué)方式,演示其恰如其分的應(yīng)用。之后立即安排相關(guān)的練習(xí),通過在線評(píng)測(OnlineJudge)平臺(tái),實(shí)現(xiàn)講練結(jié)合、學(xué)做合一。內(nèi)容上,安排了獨(dú)立的綜合運(yùn)用所學(xué)編程知識(shí)解決較大問題的章節(jié),以供相關(guān)實(shí)訓(xùn)環(huán)節(jié)(課程)或?qū)W生自行鞏固提高綜合編程能力使用。
穆?lián)P,姜沐的筆名,男,副教授,碩士研究生,畢業(yè)于南京理工大學(xué),先后在沈陽工業(yè)學(xué)院、南京理工大學(xué)、南京工業(yè)職業(yè)技術(shù)大學(xué)從事教學(xué)工作。長期從事程序設(shè)計(jì)教學(xué)工作,精通C語言標(biāo)準(zhǔn),擅長以問題為先導(dǎo)按結(jié)構(gòu)化程序設(shè)計(jì)和軟件工程原則進(jìn)行程序設(shè)計(jì)教學(xué),著有C語言程序設(shè)計(jì)書籍多部。
第0章 從0開始 1
0.0 什么是編程 1
0.0.0 計(jì)算機(jī)的工作原理 1
0.0.1 內(nèi)存中的程序來自何處 3
0.0.2 可執(zhí)行文件的制作 3
0.1 怎樣用C語言編程 6
0.1.0 學(xué)習(xí)C語言編程的條件 6
0.1.1 編寫最簡單的C程序 7
0.2 輸出字符序列 11
0.2.0 輸出簡單字符序列 11
0.2.1 輸出特殊字符 13
0.2.2 C語言的“單詞” 16
第1章 整數(shù)類型及表達(dá)式 21
1.0 輸出整數(shù) 21
1.0.0 輸出整數(shù)問題 21
1.0.1 十進(jìn)制常量 21
1.0.2 用printf()函數(shù)輸出整數(shù)常量 22
1.0.3 整數(shù)常量的其他寫法 23
1.1 整數(shù)的五則運(yùn)算 23
1.1.0 整數(shù)的加減運(yùn)算 23
1.1.1 整數(shù)的乘法運(yùn)算 24
1.1.2 標(biāo)識(shí)符 26
1.1.3 整數(shù)的除法運(yùn)算 28
1.1.4 數(shù)據(jù)類型的概念 30
1.2 讓程序擁有記憶 31
1.2.0 填數(shù)問題 31
1.2.1 用變量思考 37
1.3 程序在運(yùn)行時(shí)輸入數(shù)據(jù) 40
1.3.0 通過調(diào)用scanf()函數(shù)輸入數(shù)據(jù) 40
1.3.1 scanf()函數(shù)的應(yīng)用 41
1.3.2 scanf()函數(shù)的誤用 44
1.4 其他整數(shù)類型 46
1.4.0 int類型回顧 46
1.4.1 unsigned類型 47
1.4.2 其他幾對(duì)整數(shù)類型 49
1.4.3 字符類型 52
1.4.4 有關(guān)字符類型的問題 55
1.5 運(yùn)算符和表達(dá)式 66
1.5.0 運(yùn)算符 66
1.5.1 表達(dá)式 69
1.5.2 運(yùn)算符的優(yōu)先級(jí)和結(jié)合性 74
第2章 順序與選擇 77
2.0 幾個(gè)問題 77
2.0.0 分橘子問題 77
2.0.1 找對(duì)手問題 79
2.0.2 大數(shù)相加問題 81
2.0.3 程序概述 83
2.1 語句概述 87
2.1.0 什么是語句 87
2.1.1 什么不是語句 89
2.1.2 關(guān)于語句的誤區(qū) 89
2.2 if語句 90
2.2.0 判斷整數(shù)是否是奇數(shù) 90
2.2.1 判斷整數(shù)是奇數(shù)還是偶數(shù) 94
2.2.2 討論 97
2.3 判斷常用的幾種運(yùn)算 99
2.3.0 判斷是否是3的倍數(shù) 99
2.3.1 判斷各位數(shù)字是否全相同 103
2.3.2 條件運(yùn)算符 108
2.3.3 關(guān)系運(yùn)算符 110
2.3.4 冒泡法排序 116
2.4 switch語句 119
2.4.0 求第幾天 119
2.4.1 求星期幾 125
2.4.2 對(duì)switch語句的進(jìn)一步說明和討論 128
第3章 循環(huán)與近似計(jì)算 137
3.0 while語句 137
3.0.0 海盜問題 137
3.0.1 統(tǒng)計(jì)字符個(gè)數(shù) 140
3.0.2 四進(jìn)制數(shù)轉(zhuǎn)十進(jìn)制數(shù) 142
3.0.3 序點(diǎn)的概念 145
3.1 do-while語句 149
3.1.0 統(tǒng)計(jì)字符個(gè)數(shù) 149
3.1.1 求逆序數(shù)和位數(shù) 151
3.2 for語句 155
3.2.0 由數(shù)字求整數(shù) 155
3.2.1 Fibonacci數(shù)列問題 160
3.2.2 第二種for語句 162
3.3 不規(guī)則的循環(huán) 163
3.3.0 判斷素?cái)?shù) 163
3.3.1 字符轉(zhuǎn)換輸出 167
3.4 窮舉法 170
3.4.0 做對(duì)了多少道題 170
3.4.1 換零錢 172
3.4.2 誰是兇手 175
3.5 goto語句 178
3.6 浮點(diǎn)類型及應(yīng)用 178
3.6.0 浮點(diǎn)數(shù)的基本概念 178
3.6.1 C語言中的實(shí)浮點(diǎn)類型 179
3.6.2 求調(diào)和級(jí)數(shù)的近似值 182
3.6.3 求平方根 184
3.6.4 求sin函數(shù)值 186
第4章 函數(shù)與指針 188
4.0 函數(shù)調(diào)用、函數(shù)聲明與函數(shù)定義 188
4.0.0 函數(shù)調(diào)用(Function call) 188
4.0.1 函數(shù)聲明(Function declaration) 189
4.0.2 函數(shù)定義(Function definition) 189
4.1 函數(shù)與結(jié)構(gòu)化程序設(shè)計(jì) 191
4.1.0 結(jié)構(gòu)化程序設(shè)計(jì)原則 191
4.1.1 完數(shù)問題 191
4.2 作用域和生存期 197
4.2.0 作用域 197
4.2.1 函數(shù)名的作用域 197
4.2.2 兩種不易被察覺的錯(cuò)誤寫法 197
4.2.3 局部變量的作用域 198
4.2.4 生存期的概念 199
4.3 遞歸 202
4.3.0 什么是遞歸 202
4.3.1 求階乘 203
4.3.2 求最大公約數(shù) 206
4.3.3 Hanoi塔問題 207
4.3.4 關(guān)于Hanoi塔的新問題 211
4.4 指向數(shù)據(jù)對(duì)象的指針概述 215
4.4.0 約分問題 215
4.4.1 指向數(shù)據(jù)對(duì)象的指針 217
4.4.2 在遞歸計(jì)數(shù)問題中的應(yīng)用 224
第5章 數(shù)組與指針 227
5.0 兩個(gè)簡單的問題 227
5.0.0 摘蘋果問題 227
5.0.1 分糖果問題 231
5.1 學(xué)會(huì)數(shù)數(shù) 234
5.1.0 翻卡片問題 234
5.1.1 篩法求素?cái)?shù)表 236
5.2 向函數(shù)傳遞數(shù)組 238
5.2.0 篩法求素?cái)?shù)表 238
5.2.1 排序問題 241
5.3 數(shù)組名的性質(zhì)和指針的運(yùn)算 244
5.3.0 數(shù)組名的類型 244
5.3.1 指向數(shù)據(jù)對(duì)象指針的運(yùn)算 247
5.4 指向虛無的指針及函數(shù)形式的宏定義 256
5.4.0 分組問題 256
5.4.1 改進(jìn)的寫法 259
5.4.2 函數(shù)形式的宏定義 260
第6章 字符串及數(shù)組構(gòu)成的數(shù)組 264
6.0 字符串、字符數(shù)組及指向字符的指針 264
6.0.0 字符串及裸串 264
6.0.1 字符串的輸入與存儲(chǔ) 268
6.1 字符串的常見操作及應(yīng)用 269
6.1.0 求字符串長度 270
6.1.1 比較兩個(gè)字符串的大小 271
6.1.2 scanf()函數(shù)中的轉(zhuǎn)換 274
6.1.3 字符處理庫函數(shù) 278
6.2 常用的字符串函數(shù) 279
6.2.0 字符串處理庫函數(shù) 279
6.2.1 sscanf()與sprintf()函數(shù) 281
6.2.2 restrict關(guān)鍵字(C99)及memcpy()函數(shù)集 281
6.2.3 字符串轉(zhuǎn)換庫函數(shù) 282
6.3 由數(shù)組構(gòu)成的數(shù)組 283
6.3.0 幻方問題 284
6.3.1 由數(shù)組構(gòu)成的數(shù)組的數(shù)據(jù)類型 287
6.3.2 向函數(shù)傳遞由數(shù)組構(gòu)成的數(shù)組 291
6.4 main()函數(shù)的參數(shù) 297
6.4.0 指向指針的指針 297
6.4.1 main()函數(shù)的另一種寫法 297
6.4.2 求和問題 299
第7章 結(jié)構(gòu)體、共用體及枚舉類型 301
7.0 結(jié)構(gòu)體類型 301
7.0.0 輸出分?jǐn)?shù)最高的學(xué)生信息 301
7.0.1 改進(jìn) 304
7.0.2 進(jìn)一步改進(jìn) 308
7.0.3 成績統(tǒng)計(jì) 311
7.1 共用體類型 315
7.1.0 概述 315
7.1.1 對(duì)double類型的解析 316
7.2 位運(yùn)算 318
7.2.0 求反碼 318
7.2.1 輸出整數(shù)的二進(jìn)制形式 319
7.2.2 按位異或運(yùn)算——“^” 321
7.2.3 按位或運(yùn)算——“|” 322
7.2.4 查找兇手 323
7.2.5 輸出二進(jìn)制形式的數(shù)值 324
7.2.6 位段 325
7.3 枚舉類型 327
7.3.0 概述 327
7.3.1 球的顏色問題 328
7.4 _Bool類型 330
7.4.0 _Bool類型概述 330
7.4.1 stdbool.h文件 330
第8章 數(shù)據(jù)類型的深入討論 332
8.0 指向函數(shù)的指針 332
8.0.0 局部排序 332
8.0.1 qsort()庫函數(shù)的應(yīng)用 340
8.0.2 bsearch()庫函數(shù)的應(yīng)用 344
8.1 復(fù)雜數(shù)據(jù)類型的構(gòu)造方法和解讀 345
8.1.0 復(fù)雜數(shù)據(jù)類型的構(gòu)造方法 345
8.1.1 復(fù)雜數(shù)據(jù)類型的解讀 350
8.1.2 typedef 352
8.2 更自由地使用內(nèi)存 354
8.2.0 計(jì)算100! 354
8.2.1 動(dòng)態(tài)分配內(nèi)存函數(shù) 357
8.2.2 改進(jìn)的寫法 358
8.2.3 用鏈表解決問題 361
第9章 輸入與輸出 367
9.0 面向文件的輸入與輸出 367
9.0.0 把程序輸出寫入文件 367
9.0.1 C程序怎樣讀文件 371
9.0.2 格式化輸入/輸出的格式 372
9.0.3 fprintf()與printf()函數(shù)的等效性 377
9.1 文件、流、FILE及FILE * 378
9.1.0 文件 378
9.1.1 流 378
9.1.2 FILE 378
9.1.3 FILE * 379
9.1.4 文本流和二進(jìn)制流 379
9.1.5 自動(dòng)打開的流 380
9.1.6 EOF 380
9.1.7 其他幾個(gè)用于文本文件的輸入/輸出函數(shù) 380
9.2 二進(jìn)制文件的讀/寫 381
9.2.0 二進(jìn)制流 381
9.2.1 用fwrite()函數(shù)寫二進(jìn)制文件 382
9.2.2 用fread()函數(shù)讀二進(jìn)制文件 383
9.2.3 feof()與ferror()函數(shù) 384
9.3 定位問題 385
9.3.0 ftell()函數(shù) 386
9.3.1 fseek()函數(shù) 386
9.3.2 rewind()函數(shù) 386
9.3.3 fgetpos()與fsetpos()函數(shù) 386
第10章 程序組織與編譯預(yù)處理 387
10.0 編譯預(yù)處理簡介 387
10.0.0 預(yù)處理的一般特點(diǎn) 387
10.0.1 預(yù)處理的幾個(gè)階段 388
10.1 文件包含 388
10.1.0 #include預(yù)處理命令 388
10.1.1 用途 389
10.2 宏定義與宏替換 389
10.2.0 類似對(duì)象的宏 390
10.2.1 類似函數(shù)的宏 390
10.2.2 預(yù)處理單詞 392
10.3 預(yù)處理命令的其他話題 393
10.3.0 再談宏 393
10.3.1 其他預(yù)處理命令 395
10.4 使用外部變量 396
10.4.0 外部變量 396
10.4.1 static函數(shù) 399
第11章 標(biāo)準(zhǔn)庫簡介 400
11.0 使用標(biāo)準(zhǔn)庫的一些常識(shí) 400
11.0.0 標(biāo)準(zhǔn)頭與標(biāo)準(zhǔn)頭文件 400
11.0.1 使用庫的禁忌 401
11.0.2 并存的宏與函數(shù) 401
11.0.3 函數(shù)定義域問題 402
11.1 對(duì)語言的補(bǔ)充 402
11.1.0 stddef.h 402
11.1.1 iso646.h 403
11.1.2 limits.h和float.h 404
11.1.3 stdarg.h 404
11.1.4 stdbool.h(C99) 404
11.1.5 stdint.h(C99) 404
11.2 stdio.h 406
11.2.0 數(shù)據(jù)類型 406
11.2.1 宏 406
11.2.2 函數(shù) 406
11.3 stdlib.h 408
11.3.0 數(shù)值轉(zhuǎn)換函數(shù) 408
11.3.1 偽隨機(jī)數(shù)序列生成函數(shù) 409
11.3.2 內(nèi)存管理函數(shù) 409
11.3.3 環(huán)境通信函數(shù) 409
11.3.4 查找與排序函數(shù) 412
11.3.5 整數(shù)算術(shù)函數(shù) 412
11.3.6 多字節(jié)、寬字節(jié)字符和字符串轉(zhuǎn)換函數(shù) 413
11.4 string.h 413
11.5 數(shù)值計(jì)算 413
11.5.0 math.h(C89) 413
11.5.1 math.h(C99) 414
11.5.2 complex.h(C99) 418
11.5.3 tgmath.h(C99) 418
11.5.4 fenv.h(C99) 418
附錄A C語言的關(guān)鍵字 420
附錄B C語言的數(shù)據(jù)類型 421
附錄C ASCII碼表 422
附錄D C語言的運(yùn)算符 423
附錄E Dev-C++使用簡介 424
參考文獻(xiàn) 426