C語言大學教程(第八版)

C語言大學教程(第八版)

《C語言大學教程(第八版)》是2017年電子工業出版社出版的圖書。作者是(美)Paul Deitel(保羅. 戴特爾),Harvey Deitel(哈維. 戴特爾)。

內容簡介

本書是全球暢銷的C語言教程之一。全書系統地介紹了4種當今流行的程式設計方法——面向過程、基於對象、面向對象以及泛型編程,內容全面、生動、易懂,作者由淺入深地介紹了結構化編程及軟體工程的基本概念,從簡單的概念到最終的完整的語言描述,清晰、準確、透徹、詳細地講解了C語言,尤其注重程式設計思想和方法的介紹。相對於上一版,這一版在內容方面新增加了C安全程式設計、"更上一層樓”練習集,更新了C++和面向對象程式設計、基於Allegro的遊戲編程、C99標準介紹等內容。

目錄

第1章 計算機、網際網路和全球資訊網導論 1

1.1 引言 2

1.2 計算機硬體和軟體 2

1.2.1 摩爾定律 2

1.2.2 計算機組成 3

1.3 數據的層次結構 3

1.4 機器語言、彙編語言和高級語言 5

1.5 C程式設計語言 6

1.6 C標準庫 7

1.7 C++和其他基於C的程式設計語言 8

1.8 對象技術 8

1.8.1 對象——以汽車為例 9

1.8.2 方法與類 9

1.8.3 實例化 9

1.8.4 軟體重用 9

1.8.5 訊息與方法調用 9

1.8.6 屬性與實例變數 9

1.8.7 封裝與信息隱藏 10

1.8.8 繼承 10

1.9 典型的C程式開發環境 10

1.9.1 第1步:創建一個C程式 11

1.9.2 第2步和第3步:預處理及編譯一個C程式 11

1.9.3 第4步:連結 11

1.9.4 第5步:裝載 11

1.9.5 第6步:執行 12

1.9.6 程式運行時可能會出現的問題 12

1.9.7 標準輸入、標準輸出和標準錯誤流 12

1.10 在Windows、Linux和Mac OS X上測試並運行一個C應用程式 12

1.10.1 在Windows命令提示符下運行一個C應用程式 13

1.10.2 使用Linux中的GNU C來運行一個C應用程式 15

1.10.3 使用Mac OS X終端來運行一個C應用程式 17

1.11 作業系統 19

1.11.1 Windows —— 一個專有的作業系統 19

1.11.2 Linux —— 一個開源的作業系統 19

1.11.3 蘋果公司的Mac OS X;面向iPhone、iPad 和iPod Touch的iOS作業系統 20

1.11.4 谷歌公司的Android作業系統 20

1.12 網際網路和全球資訊網 20

1.12.1 網際網路:計算機網路的網路 21

1.12.2 全球資訊網:讓網際網路對用戶更友好 21

1.12.3 全球資訊網服務 21

1.12.4 Ajax 23

1.12.5 物聯網 23

1.13 一些重要的軟體技術 23

1.14 跟上信息技術的發展 24

第2章 C語言程式設計入門 28

2.1 引言 28

2.2 一個簡單的C程式:列印一行文字 28

2.3 另一個簡單的C程式:兩個整數求和 31

2.4 存儲單元的基本概念 35

2.5 C語言中的算術運算 35

2.6 做出決策:相等和關係運算符 38

2.7 安全的C程式設計 41

第3章 結構化的C程式設計 51

3.1 引言 51

3.2 算法 51

3.3 偽代碼 52

3.4 控制結構 52

3.5 if條件語句 54

3.6 if…else條件語句 54

3.7 while循環語句 57

3.8 算法設計案例1:計數控制的循環 58

3.9 自頂向下、逐步求精的算法設計案例2:標記控制的循環 60

3.10 自頂向下、逐步求精的算法設計案例3:嵌套控制結構 65

3.11 賦值運算符 67

3.12 增1和減1運算符 68

3.13 安全的C程式設計 70

第4章 C程式控制 84

4.1 引言 84

4.2 循環的基本原理 84

4.3 計數控制的循環 85

4.4 for循環語句 86

4.5 for語句:注意事項 88

4.6 使用 for語句的例子 89

4.7 switch多重選擇語句 91

4.8 do…while循環語句 96

4.9 break和continue語句 97

4.10 邏輯運算符 98

4.11 區分相等運算符(= =)和賦值運算符(=) 100

4.12 結構化程式設計小結 101

4.13 安全的C程式設計 105

第5章 C函式 117

5.1 引言 117

5.2 C語言中的程式模組 117

5.3 數學庫函式 118

5.4 函式 119

5.5 函式定義 120

5.5.1 square函式 120

5.5.2 maximum函式 123

5.6 函式原型:一個深入的剖析 123

5.7 函式調用堆疊及活動記錄堆疊幀 125

5.8 頭檔案 128

5.9 按值或按引用傳遞參數 129

5.10 隨機數的生成 129

5.11 案例分析:運氣遊戲;引入enum 133

5.12 存儲類型 135

5.13 作用域的規定 137

5.14 遞歸 139

5.15 遞歸套用案例:斐波那契數列 142

5.16 遞歸與疊代 144

5.17 安全的C程式設計 146

第6章 C數組 161

6.1 引言 162

6.2 數組 162

6.3 數組定義 163

6.4 數組實例 163

6.4.1 定義一個數組並用循環結構來設定數組元素值 163

6.4.2 在定義語句中用一個初始值列表來初始化一個數組 164

6.4.3 用符號常量來定義數組的大小並通過計算來初始化數組元素 165

6.4.4 數組元素值求和 166

6.4.5 用數組來統計民意調查的結果 166

6.4.6 用直方圖來展示數組元素值 168

6.4.7 用數組來統計投擲骰子60 000 000次的結果 169

6.5 用字元數組來存儲和處理字元串 170

6.5.1 定義一個字元串來初始化一個字元數組 170

6.5.2 用一個字元初始化列表來初始化一個字元數組 170

6.5.3 訪問一個字元串中的字元 170

6.5.4 針對一個字元數組的輸入 170

6.5.5 將一個代表字元串的字元數組輸出 171

6.5.6 字元數組的演示 171

6.6 靜態局部數組和自動局部數組 171

6.7 將數組傳遞給函式 173

6.8 數組排序 176

6.9 案例分析:用數組來計算平均值、中值和眾數 178

6.10 數組查找 181

6.10.1 線性查找數組元素 181

6.10.2 折半查找數組元素 182

6.11 多下標數組 185

6.11.1 雙下標數組概述 185

6.11.2 雙下標數組的初始化 186

6.11.3 設定某行元素的元素值 187

6.11.4 計算雙下標數組中所有元素值的總和 187

6.11.5 對雙下標數組的處理 188

6.12 可變長數組 190

6.13 安全的C程式設計 192

第7章 C指針 207

7.1 引言 207

7.2 指針變數的定義和初始化 208

7.3 指針運算符 208

7.4 按引用向函式傳遞實參 210

7.5 對指針使用const限定符 213

7.5.1 用指向可變數據的可變指針將字元串中的字元改成大寫 214

7.5.2 用指向常量數據的可變指針逐個列印字元串中的字元 215

7.5.3 試圖修改指向可變數據的常量指針 217

7.5.4 試圖修改指向常量數據的常量指針 217

7.6 採用按引用傳遞的冒泡排序 218

7.7 sizeof運算符 220

7.8 指針表達式和指針算術運算 222

7.8.1 指針算術運算中可使用的運算符 222

7.8.2 將指針對準一個數組 222

7.8.3 給指針加上一個整數 222

7.8.4 給指針減去一個整數 223

7.8.5 指針增1或減1 223

7.8.6 從一個指針中減去另一個指針 223

7.8.7 將一個指針賦予另一個指針 223

7.8.8 指向void的指針 224

7.8.9 指針的比較 224

7.9 指針和數組的關係 224

7.9.1 指針/偏移量表示法 224

7.9.2 指針/下標表示法 225

7.9.3 不能用指針算術運算來修改數組名 225

7.9.4 指針下標和指針偏移量的使用演示 225

7.9.5 用數組和指針實現字元串的複製 226

7.10 指針數組 227

7.11 案例研究:模擬撲克牌的洗牌和發牌 228

7.12 指向函式的指針 232

7.12.1 按升序或降序進行排序 232

7.12.2 使用函式指針來創建一個選單驅動的系統 234

7.13 安全的C程式設計 236

第8章 C字元和字元串 252

8.1 引言 252

8.2 字元串和字元基礎 253

8.3 字元處理函式館 254

8.3.1 函式isdigit,isalpha,isalnum和isxdigit 255

8.3.2 函式islower,isupper,tolower和toupper 256

8.3.3 函式isspace,iscntrl,ispunct,isprint和isgraph 257

8.4 字元串轉換函式 258

8.4.1 函式strtod 258

8.4.2 函式strtol 259

8.4.3 函式strtoul 260

8.5 標準輸入/輸出庫函式 260

8.5.1 函式fgets和putchar 261

8.5.2 函式getchar 261

8.5.3 函式sprintf 262

8.5.4 函式sscanf 263

8.6 字元串處理函式館中的字元串處理函式 263

8.6.1 函式strcpy和 strncpy 264

8.6.2 函式strcat和 strncat 264

8.7 字元串處理函式館中的比較函式 265

8.8 字元串處理函式館中的查找函式 266

8.8.1 函式strchr 267

8.8.2 函式strcspn 268

8.8.3 函式strpbrk 268

8.8.4 函式strrchr 268

8.8.5 函式strspn 269

8.8.6 函式strstr 269

8.8.7 函式strtok 270

8.9 字元串處理函式館中的記憶體處理函式 271

8.9.1 函式memcpy 271

8.9.2 函式memmove 272

8.9.3 函式memcmp 272

8.9.4 函式memchr 273

8.9.5 函式memset 273

8.10 字元串處理函式館中的其他函式 274

8.10.1 函式strerror 274

8.10.2 函式strlen 274

8.11 安全的C程式設計 275

第9章 C格式化輸入/輸出 285

9.1 引言 285

9.2 流 286

9.3 用printf函式實現格式化輸出 286

9.4 列印整數 286

9.5 列印浮點數 287

9.5.1 轉換說明符e,E或f 288

9.5.2 轉換說明符g或G 288

9.5.3 浮點數轉換說明符的使用演示 288

9.6 列印字元串或字元 289

9.7 其他的轉換說明符 289

9.8 帶域寬和精度的列印 290

9.8.1 在列印整數時指定域寬 290

9.8.2 在列印整數、浮點數和字元串時指定精度 291

9.8.3 同時指定域寬和精度 292

9.9 在printf函式的格式控制字元串中使用標記 292

9.9.1 右對齊和左對齊 292

9.9.2 用與不用+標記來列印正數和負數 293

9.9.3 使用空格標記 293

9.9.4 使用#標記 293

9.9.5 使用0標記 294

9.10 列印文本和轉義序列 294

9.11 用scanf函式讀取格式化的輸入 294

9.11.1 scanf的語法 295

9.11.2 scanf的轉換說明符 295

9.11.3 用scanf來讀入整數 295

9.11.4 用scanf來讀入浮點數 296

9.11.5 用scanf來讀入字元和字元串 296

9.11.6 在scanf中使用掃描集 297

9.11.7 在scanf中指定域寬 298

9.11.8 在輸入流中忽略掉特定字元 298

9.12 安全的C程式設計 299

第10章 結構體、共用體、位操作和枚舉類型 305

10.1 引言 306

10.2 結構體的定義 306

10.2.1 自引用結構體 306

10.2.2 定義結構體類型的變數 307

10.2.3 結構體標記名 307

10.2.4 可對結構體實施的操作 307

10.3 結構體的初始化 308

10.4 用.和?>訪問結構體成員 308

10.5 在函式中使用結構體 310

10.6 typedef的使用 310

10.7 實例分析:高性能的洗牌與發牌模擬 311

10.8 共用體 313

10.8.1 聲明一個共用體 313

10.8.2 可對共用體執行的操作 313

10.8.3 在聲明語句中對共用體進行初始化 313

10.8.4 使用共用體的演示 314

10.9 位運算符 315

10.9.1 按位顯示一個無符號整數 315

10.9.2 使函式displayBits更具可擴展性和可移植性 316

10.9.3 按位與、按位或、按位異或和按位取反運算符的使用 317

10.9.4 按位左移和按位右移運算符的使用 319

10.9.5 按位運算後賦值運算符 320

10.10 位域 321

10.10.1 位域的定義 321

10.10.2 用位域來表示一張紙牌的花色、牌面值和顏色 321

10.10.3 無名位域 323

10.11 枚舉常量 323

10.12 匿名的結構體和共用體 324

10.13 安全的C程式設計 325

第11章 檔案處理 334

11.1 引言 334

11.2 檔案與流 334

11.3 順序存取檔案的創建 335

11.3.1 指向FILE結構體類型的指針 336

11.3.2 用函式fopen打開檔案 336

11.3.3 用函式feof來檢查檔案結束標記 337

11.3.4 用函式fprintf向檔案寫入數據 337

11.3.5 用函式fclose來關閉檔案 337

11.3.6 檔案打開模式 338

11.4 從順序存取檔案中讀取數據 339

11.4.1 檔案位置指針的復位 340

11.4.2 信用查詢程式 340

11.5 隨機存取檔案 343

11.6 隨機存取檔案的創建 343

11.7 隨機地向一個隨機存取檔案中寫入數據 345

11.7.1 用函式fseek來定位檔案位置指針 346

11.7.2 出錯檢查 347

11.8 從一個隨機存取檔案中讀取數據 347

11.9 案例研究:事務處理程式 348

11.10 安全的C程式設計 352

第12章 C數據結構 361

12.1 引言 361

12.2 自引用結構體 362

12.3 動態記憶體分配 362

12.4 鍊表 363

12.4.1 insert函式 367

12.4.2 delete函式 368

12.4.3 printList函式 369

12.5 堆疊 370

12.5.1 push函式 372

12.5.2 pop函式 373

12.5.3 堆疊的套用 373

12.6 佇列 374

12.6.1 enqueue函式 377

12.6.2 dequeue函式 378

12.7 樹 378

12.7.1 insertNode函式 381

12.7.2 遍歷函式inOrder,preOrder和postOrder 381

12.7.3 消除冗餘 382

12.7.4 二元樹搜尋 382

12.7.5 二元樹的其他操作 382

12.8 安全的C程式設計 382

第13章 C預處理 392

13.1 引言 392

13.2 #include預處理命令 393

13.3 #define預處理命令:符號常量 393

13.4 #define預處理命令:宏 394

13.4.1 帶一個參數的宏 394

13.4.2 帶兩個參數的宏 395

13.4.3 宏連續符 395

13.4.4 #undef預處理命令 395

13.4.5 標準庫函式和宏 395

13.4.6 不要把帶有副作用的表達式放在宏中 395

13.5 條件編譯 395

13.5.1 # if…# endif預處理命令 395

13.5.2 用# if…# endif將代碼塊注釋起來 396

13.5.3 對調試代碼的條件編譯 396

13.6 #error和#pragma預處理命令 396

13.7 #和# #運算符 397

13.8 行號 397

13.9 預定義的符號常量 397

13.10 斷言 398

13.11 安全的C程式設計 398

第14章 C語言的其他專題 402

14.1 引言 402

14.2 I/O的重定向 402

14.2.1 用<來重定向輸入 403

14.2.2 用|來重定向輸入 403

14.2.3 重定向輸出 403

14.3 可變長的參數列表 403

14.4 使用命令行實參 405

14.5 編譯由多個源檔案組成的程式 406

14.5.1 在別的檔案中對全局變數進行extern聲明 406

14.5.2 函式原型 406

14.5.3 用static來限制作用域 407

14.5.4 Makefile 407

14.6 使用exit和atexit終止程式 407

14.7 整型和浮點型常量的後綴 408

14.8 信號處理 409

14.9 動態記憶體分配:函式calloc和realloc 410

14.10 用goto實現無條件轉移 411

第15章 C++,一個更好的C;介紹對象技術 416

15.1 引言 417

15.2 C++ 417

15.3 簡單程式:兩個整數相加 417

15.3.1 用C++編寫加法程式 417

15.3.2 頭檔案 418

15.3.3 main函式 418

15.3.4 變數聲明 418

15.3.5 標準輸出流和標準輸入流對象 418

15.3.6 std::endl流操縱符 418

15.3.7 關於std::的說明 419

15.3.8 級聯的流輸出 419

15.3.9 main函式中的return語句不是必需的 419

15.3.10 運算符重載 419

15.4 C++標準庫 419

15.5 頭檔案 420

15.6 內聯函式 421

15.7 C++關鍵字 422

15.8 引用和引用形參 423

15.8.1 引用形參 423

15.8.2 按值和按引用傳參 423

15.8.3 函式體內引用作為別名 425

15.8.4 從函式返回引用 426

15.8.5 未初始化的引用的錯誤提示信息 426

15.9 空形參列表 426

15.10 默認實參 426

15.11 一元作用域運算符 428

15.12 函式重載 429

15.13 函式模板 431

15.13.1 定義一個函式模板 431

15.13.2 使用函式模板 431

15.14 對象技術與UML簡介 432

15.14.1 對象技術基本概念 433

15.14.2 類、數據成員和成員函式 434

15.14.3 面向對象分析與設計 434

15.14.4 統一建模語言 435

15.15 C++標準庫類模板vector簡介 435

15.15.1 C風格的基於指針的數組 435

15.15.2 使用類模板vector 435

15.15.3 異常處理:處理下標越界 439

15.16 本章小結 439

第16章 類:對象和字元串簡介 444

16.1 引言 444

16.2 定義一個具有成員函式的類 444

16.3 定義一個有參成員函式 446

16.4 數據成員,set成員函式與get成員函式 449

16.5 用構造函式初始化對象 453

16.6 將類放在單獨的檔案中以增強重用性 455

16.7 將接口與實現分離 458

16.8 用set函式驗證數據 462

16.9 本章小結 465

第17章 類:深入剖析;拋出異常 471

17.1 引言 471

17.2 Time類的案例學習 472

17.3 類域和訪問類的成員 477

17.4 訪問函式和工具函式 477

17.5 Time類的案例學習:具有默認實參的構造函式 478

17.6 析構函式 482

17.7 構造函式與析構函式的調用時間 482

17.8 Time類的案例學習:隱蔽陷阱——返回private數據成員的引用或指針 485

17.9 默認按成員賦值 487

17.10 const對象和const成員函式 488

17.11 組合:對象作為類的成員 490

17.12 友元函式和友元類 494

17.13 使用this指針 495

17.14 static類成員 499

17.15 本章小結 503

第18章 運算符重載;string類 511

18.1 引言 511

18.2 使用標準庫模板類string中的重載運算符 512

18.3 運算符重載基礎 514

18.4 重載二元運算符 515

18.5 重載流插入和流讀取運算符 516

18.6 重載一元運算符 518

18.7 重載一元前置和後置++和???運算符 519

18.8 案例學習:Date類 520

18.9 動態記憶體管理 523

18.10 案例學習:Array類 525

18.10.1 使用Array類 525

18.10.2 Array類定義 528

18.11 作為類的成員和作為非成員函式的運算符函式的比較 534

18.12 類型轉換 534

18.13 explicit構造函式和轉換運算符 535

18.14 重載函式調用運算符( ) 537

18.15 本章小結 537

第19章 面向對象編程:繼承 546

19.1 引言 546

19.2 基類和派生類 547

19.3 基類和派生類的關係 548

19.3.1 創建並使用CommissionEmployee類 549

19.3.2 不用繼承創建BasePlusCommissionEmployee類 552

19.3.3 創建CommissionEmployee-BasePlusCommissionEmployee繼承層次結構 556

19.3.4 使用protected數據的CommissionEmployee-BasePlusCommission-Employee繼承層次

結構 559

19.3.5 使用private數據的CommissionEmployee-BasePlusCommission Employee繼承層次結構 561

19.4 派生類的構造函式與析構函式 565

19.5 public,protected和private繼承 566

19.6 關於繼承的軟體工程 567

19.7 本章小結 567

第20章 面向對象編程:多態 571

20.1 引言 571

20.2 多態簡介:多態的視頻遊戲 572

20.3 繼承層次結構中對象間的關係 572

20.3.1 派生類對象調用基類的函式 573

20.3.2 派生類指針指向基類對象 575

20.3.3 用基類指針調用派生類成員函式 576

20.3.4 虛函式和虛析構函式 577

20.4 類型域和switch語句 582

20.5 抽象類和純虛函式 582

20.6 案例學習:利用多態的工資系統 583

20.6.1 創建抽象基類Employee 584

20.6.2 創建具體的派生類SalariedEmployee 587

20.6.3 創建具體的派生類CommissionEmployee 588

20.6.4 創建間接的具體派生類BasePlusCommissionEmployee 590

20.6.5 演示多態處理 591

20.7 (選講)多態、虛函式以及動態聯編的“幕後機制” 594

20.8 案例學習:利用多態的和運行時類型信息的工資系統,通過向下類型轉換,dynamic_cast,

typeid以及type_info使用運行時類型信息 596

20.9 本章小結 599

第21章 輸入/輸出流:深入學習 603

21.1 引言 603

21.2 流 604

21.2.1 傳統流與標準流的比較 604

21.2.2 iostream類庫頭檔案 605

21.2.3 輸入/輸出流類和對象 605

21.3 輸出流 606

21.3.1 輸出char*變數 607

21.3.2 用成員函式put輸出字元 607

21.4 輸入流 607

21.4.1 成員函式get和getline 608

21.4.2 istream類的成員函式peek,putback和ignore 610

21.4.3 類型安全的I/O 610

21.5 用read,write和gcount進行無格式I/O 610

21.6 流操縱符簡介 611

21.6.1 設定整數流的基數:dec,oct,hex和setbase 611

21.6.2 設定浮點數精度(precision,setprecision) 612

21.6.3 設定域寬(width,setw) 613

21.6.4 用戶定義的輸出流操縱符 614

21.7 流格式狀態和流操縱符 614

21.7.1 設定尾數零和十進制小數點(showpoint) 615

21.7.2 設定對齊(left,right和internal) 616

21.7.3 設定填充字元(fill,setfill) 616

21.7.4 設定整數流的基數(dec,oct,hex,showbase) 617

21.7.5 設定浮點數;科學計數法和定點計數法(scientific、fixed) 618

21.7.6 大/小寫控制(uppercase) 619

21.7.7 指定布爾格式(boolalpha) 619

21.7.8 用成員函式flags設定和重置格式狀態 620

21.8 流錯誤狀態 621

21.9 將輸出流綁定到輸入流上 622

21.10 本章小結 622

第22章 異常處理:深入學習 631

22.1 引言 631

22.2 實例:處理除數為0的異常 632

22.3 重新拋出異常 635

22.4 棧展開 637

22.5 何時使用異常處理 638

22.6 構造函式、析構函式與異常處理 638

22.7 異常與繼承 639

22.8 處理new故障 639

22.9 unique_ptr類與動態記憶體分配 641

22.10 標準庫的異常層次結構 643

22.11 本章小結 645

第23章 模板 649

23.1 引言 649

22.2 類模板 649

23.3 函式模操作類模板的特化對象 653

23.4 非類型形參 654

23.5 模板類型形參的默認實參 654

23.6 重載函式模板 654

23.7 本章小結 655

附錄A 運算符優先權表 657

附錄B ASCII字元集 660

附錄C 數值系統 661

附錄D 排序:一個深入的分析 670

附錄E 多執行緒及其他C11和C99專題 684

索引 70

相關詞條

熱門詞條

聯絡我們