本書是國家精品在線開放課程、國家級一流本科課程、華為“智能基座”精品慕課“C語言程序設計精髓”的配套教材。全書由12章組成,包括4個模塊:程序設計的計算機基礎(第1章)、程序設計方法基礎(第2~5章)、程序設計的問題求解基礎(第6章)、算法和數據結構基礎(第7~12章)。其中,程序設計方法基礎涵蓋了4章內容,包括基本I/O和基本數據類型、基本運算、基本控制結構、結構化與模塊化。算法和數據結構基礎涵蓋了6章內容,包括用數組保存數據、查找和排序算法、指針、字符串和文本處理、用結構封裝數據、結構設計之美。
本書以快樂為本、實用為根,試圖以現代視角解讀C語言,通過階梯化的實例,達到讓讀者舉一反三、融會貫通的目的,力圖用最簡明的語言、最典型的實例、最通俗的解釋及最豐富的圖示,將程序設計的趣味性和哲理性挖掘出來,帶給讀者全新的學習體驗。此外,本書還為任課教師免費提供多媒體課件、例題和習題源代碼,以及程序設計遠程在線考試平臺和實驗等教學資源。
本書可作為高等學校計算機相關專業(yè)程序設計課程教材,也可供從事計算機相關工作的科技人員及各類自學人員參考。
1)教材內容取材新穎,聚焦程序設計的基礎知識和核心問題,案例緊密結合實踐。
2)在教材中融入新穎的思政元素。
3)引入AI輔助編程內容。
4)教輔資料完備,提供了全方位多元化的教學資源。
蘇小紅,哈爾濱工業(yè)大學計算學部教授、智能軟件工程研究中心主任,博士生導師,黑龍江省教學名師,中國計算機學會(CCF)高級會員。曾獲教育部-華為“智能基座”優(yōu)秀教師獎勵計劃、霍英東教育基金會高等院校教育教學獎、寶鋼優(yōu)秀教師獎、高校計算機專業(yè)優(yōu)秀教師獎勵計劃、全國高等院校計算機基礎教育研究會計算機基礎教育優(yōu)秀教師、中國大學MOOC“杰出貢獻獎”、全省優(yōu)秀教師、省師德先進個人等榮譽。
主持的C語言程序設計課程先后獲評國家精品在線開放課程、國家級一流本科課程、教育部-華為“智能基座”優(yōu)秀在線課程,主持的計算機圖形學課程獲黑龍江省研究生課程思政高質量建設項目立項。獲國家級教學成果獎一、二等獎各1項,省級教學成果一等獎6項。主編教材10余部,其中4部國家十二五規(guī)劃教材累計發(fā)行100余萬冊。
研究方向為智能軟件工程,包括軟件漏洞檢測與定位,軟件倉庫挖掘,軟件智能化測試,API序列推薦和代碼生成等,主持完成國家自然科學基金項目4項,目前在研國家自然科學基金面上基金項目 1 項,發(fā)表學術論文200余篇,擁有國家授權發(fā)明專利22項。
目錄
第1章 程序設計的計算機基礎 1
1.1 計算的“自動化”夢想 1
1.2 計算的“無止境”現實 3
1.3 計算的“再塑造”未來 4
1.4 編程不只是“coding” 4
1.5 什么是“編程” 5
1.6 怎么學“編程” 7
1.7 擴展閱讀1 “我”的故事 7
1.8 擴展閱讀2 “我”和“我”的舞臺 8
1.9 擴展閱讀3 AI輔助編程 9
習題1 11
第2章 程序設計方法學基礎——基本I/O和基本數據類型 12
2.1 初識C語言,從“Hello world!”開始 12
2.2 常量和變量 14
2.2.1 變量的類型和變量的定義 14
2.2.2 最佳編碼原則:標識符的命名規(guī)則和程序注釋 16
2.2.3 常量的表示形式 17
2.2.4 最佳編碼原則:使用宏常量和const常量 19
2.3 變量的類型決定了什么 20
2.4 鍵盤輸入和屏幕輸出 26
2.4.1 單個字符的輸入輸出 27
2.4.2 數據的格式化屏幕輸出 28
2.4.3 數據的格式化鍵盤輸入 30
2.5 本章思維導圖 33
習題2 34
第3章 程序設計方法學基礎——基本運算 35
3.1 算術運算——最基本的數學運算 35
3.2 賦值運算——用變量保存計算結果 37
3.3 增1和減1運算——最快捷常用的運算 39
3.4 混合數據類型運算中的類型轉換 40
3.4.1 自動類型轉換與類型提升 40
3.4.2 “呼風喚雨”的強制類型轉換 41
3.4.3 自動類型轉換的安全隱患 42
3.5 本章思維導圖 47
習題3 47
第4章 程序設計方法學基礎——基本控制結構 49
4.1 算法的概念與算法的描述方法 49
4.1.1 算法的概念 49
4.1.2 算法的描述方法 50
4.2 計算機的問題求解 51
4.3 順序結構 51
4.4 選擇結構 53
4.4.1 選擇結構的基本形式——變是唯一的不變 53
4.4.2 條件語句——無處不在的抉擇 54
4.4.3 開關語句——條條道路通羅馬 59
4.4.4 最佳編碼原則:正確使用關系和邏輯運算符 63
4.5 循環(huán)結構——周而復始的循環(huán)之道 65
4.5.1 循環(huán)的控制方式 65
4.5.2 計數控制的循環(huán) 66
4.5.3 條件控制的循環(huán) 73
4.5.4 最佳編碼原則:結構化程序設計 77
4.6 本章思維導圖 82
習題4 82
第5章 程序設計方法學基礎——結構化與模塊化 84
5.1 結構化程序設計——像搭積木一樣寫代碼 84
5.1.1 自底向上的程序設計方法 84
5.1.2 自頂向下、逐步求精的結構化程序設計方法 90
5.2 模塊化程序設計——分工與合作的藝術 92
5.2.1 模塊分解的基本原則 92
5.2.2 如“活字印刷”般的函數 97
5.2.3 函數調用和參數傳遞 100
5.2.4 最佳編碼原則:防御式編程 106
5.2.5 多文件編程 112
5.2.6 最佳編碼原則:正確運用變量的作用域和存儲類型 118
5.3 程序測試方法 125
5.3.1 程序測試的目的 125
5.3.2 測試方法和測試用例 125
5.3.3 錯誤實例分析 126
5.4 程序調試方法 130
5.4.1 常用的程序調試與排錯方法 130
5.4.2 錯誤實例分析 133
5.5 擴展閱讀 最佳編碼原則:代碼規(guī)范 136
5.6 本章思維導圖 137
習題5 137
第6章 程序設計的問題求解基礎 139
6.1 問題求解策略 139
6.2 枚舉——從找回你的密碼談起 139
6.3 遞推——荷花定律和大自然中的秘密 149
6.3.1 正向順推實例 150
6.3.2 反向逆推實例 152
6.4 遞歸——“千里之行,始于足下”的啟示 154
6.4.1 遞歸的內涵與數學基礎 154
6.4.2 遞歸算法的基本要素 155
6.4.3 遞歸的執(zhí)行過程 157
6.4.4 遞歸與迭代的關系 159
6.5 擴展閱讀 尾遞歸 166
6.6 AI輔助編程實例 168
6.7 本章思維導圖 170
習題6 171
第7章 算法和數據結構基礎——用數組保存數據 174
7.1 數組的定義、引用和初始化 174
7.2 向函數傳遞批量數據 179
7.2.1 按值傳遞與模擬按引用傳遞 179
7.2.2 一維數組的參數傳遞——以篩法求素數為例 179
7.2.3 二維數組的參數傳遞——以楊輝三角為例 182
7.3 數組下標越界錯誤實例分析 184
7.3.1 一維數組的下標越界實例分析 184
7.3.2 二維數組的下標越界實例分析 185
7.4 擴展閱讀 安全編碼規(guī)范 187
7.5 本章思維導圖 188
習題7 188
第8章 算法和數據結構基礎——查找和排序算法 190
8.1 線性查找算法——眾里尋他千百度 190
8.1.1 線性查找算法的基本原理 191
8.1.2 線性查找算法的程序實現 191
8.2 二分查找算法——猜數游戲中的智慧 193
8.2.1 二分查找算法的基本原理 193
8.2.2 二分查找算法的遞歸和迭代實現 194
8.2.3 二分查找算法的實際應用 195
8.3 求最值算法 197
8.4 排序算法——如影隨形的“順序” 200
8.4.1 交換排序算法 200
8.4.2 選擇排序算法 203
8.4.3 冒泡排序算法 203
8.5 本章思維導圖 206
習題8 207
第9章 算法和數據結構基礎——指針 209
9.1 指針——C語言世界中的如意金箍棒 209
9.1.1 變量的尋址方式 210
9.1.2 指針變量的定義、初始化及其解引用 210
9.2 指針變量與模擬按引用傳參 213
9.3 函數指針及其應用 218
9.3.1 函數指針的概念 218
9.3.2 函數指針的應用 220
9.4 指針及其孿生兄弟 222
9.4.1 指針上的游走 223
9.4.2 指針和一維數組的前世之緣 225
9.5 文件指針和格式化文件讀寫 228
9.5.1 文本文件和二進制文件 228
9.5.2 文件指針與文件緩存 230
9.5.3 文件的打開與關閉 232
9.5.4 標準輸入輸出重定向 234
9.5.5 文件的格式化讀寫 236
9.6 擴展閱讀 函數指針數組 237
9.7 擴展閱讀 安全編碼規(guī)范 238
9.8 本章思維導圖 240
習題9 240
第10章 算法和數據結構基礎——字符串和文本處理 242
10.1 字符串的存儲、表示與處理 242
10.1.1 字符串的存儲與表示 242
10.1.2 字符串的輸入和輸出 245
10.1.3 字符串處理函數 250
10.2 字符串的應用——編程帶你去看“詩和遠方” 252
10.2.1 向函數傳遞字符串——從微情書到回文詩和回文對聯(lián) 252
10.2.2 從函數返回字符串——破解藏頭詩 256
10.2.3 錯誤實例分析 258
10.3 指針數組及其應用 261
10.3.1 指針和二維數組間的關系——以撲克牌為例 261
10.3.2 字符指針數組和二維字符數組 264
10.3.3 進階內容:錯誤實例分析 269
10.4 文本文件的讀寫及應用 273
10.4.1 讀寫文件中的字符 273
10.4.2 讀寫文件中的字符串 275
10.5 擴展閱讀 安全編碼規(guī)范和緩沖區(qū)溢出攻擊 277
10.6 本章思維導圖 282
習題10 283
第11章 算法和數據結構基礎——用結構封裝數據 286
11.1 結構體類型及其應用——變形金剛之組合金剛 286
11.1.1 結構體類型的聲明和結構體變量的定義 287
11.1.2 結構體成員的初始化和訪問 290
11.1.3 結構體與數組的嵌套 292
11.1.4 結構體占內存的字節(jié)數 293
11.1.5 結構體的相關計算和操作 295
11.2 用結構體封裝函數參數 297
11.2.1 在函數之間傳遞結構體數據 297
11.2.2 結構體應用實例1:奧運獎牌排行榜 301
11.2.3 結構體應用實例2:一萬小時定律 307
11.2.4 結構體應用實例3:洗發(fā)牌模擬 308
11.3 共用體類型和枚舉類型 310
11.3.1 共用體類型及其應用 310
11.3.2 枚舉類型及其應用 314
11.4 擴展閱讀1 表驅動編寫高質量的代碼 315
11.5 擴展閱讀2 安全編碼規(guī)范 322
11.6 本章思維導圖 323
習題11 323
第12章 算法和數據結構基礎——結構設計之美 325
12.1 從定長數組到動態(tài)數組 325
12.1.1 動態(tài)內存分配 325
12.1.2 動態(tài)數組實例——隨機點名 327
12.2 從靜態(tài)數據結構到動態(tài)數據結構 330
12.2.1 線性表的鏈式存儲 330
12.2.2 單向鏈表的基本操作 331
12.3 棧的順序存儲和鏈式存儲——再談回文詩 337
12.4 用多種數據結構求解循環(huán)報數問題 342
12.4.1 用單向循環(huán)鏈表求解循環(huán)報數問題 342
12.4.2 用循環(huán)隊列求解循環(huán)報數問題 346
12.5 樹和圖等非線性數據結構 353
12.5.1 樹的概念和應用 353
12.5.2 圖的概念和應用 356
12.6 擴展閱讀 安全編碼規(guī)范 357
12.7 本章思維導圖 360
習題12 360
附錄A C語言中的關鍵字 362
附錄B GCC中數據類型占內存的字節(jié)數和表數范圍 363
附錄C 運算符的優(yōu)先級與結合性 364
附錄D 常用字符的ASCII碼對照表 365
附錄E 二進制補碼的計算方法 366
附錄F 輸入輸出格式轉換說明 368
附錄G 常用的ANSI C標準庫函數 371
附錄H 位運算 379
參考文獻 381