本書自第1版出版以來,就深受廣大讀者歡迎,成為學習C 的經典教材,這是*的第9版。本書共分19章,從計算機科學的基礎知識和內容開始,介紹C 程序的基本組成部分,C 語言的語法和結構,類與面向對象編程,文件與I/O操作,遞歸的應用,多態與虛函數,異常處理,模板實現與標準模板庫使用,鏈表的概念與操作,棧與隊列的概念與操作,二叉樹及其操作等。
本書的知識體系完整,編寫體例充分考慮了教學的需要,全書給出了思考題447道,復習與練習題586道,挑戰編程題304道,完整程序362個,非常適合作為高等院校計算機及相關專業程序設計與數據結構的教材,也是精通C 程序設計的*用書。
(1)知識體系完善,循序漸進,容易掌握。
(2)編寫體例適合教學,充分考慮到教學的進度和需要。
(3)圖示講解,一目了然;示例程序,精心設計。
(4)編程挑戰極具可擴展性。
(5)練習題447道,復習題586道,挑戰編程題304道,程序362個。
歡迎使用本書第9版中文版。本書適用于2或3學期的C 編程課程或一學期的快速課程。對于剛接觸編程的學生,以及其他語言課程的初學者,學習本書將大有裨益。本書不但為初學者提供了編程方面的基礎知識,也針對具有一定基礎的學習者深入探討了C 語言的技術細節、陷阱和微妙之處。本書的編寫風格清晰明快、易于理解,它涵蓋了介紹性編程課程的所有必要主題。本書還包含大量的示例程序,這些示例簡潔、實用,并且注重和現實接軌,確保學生不僅能學習到如何實現C 的功能和構造,還了解為什么要使用以及何時使用它們。
第9版中的內容
新C 11標準
C 11是C 語言的最新標準。在該標準開發之初,它被稱為C 0x版本。2011年8月,國際標準化組織(International Standards Organization,ISO)批準了該版本,新標準正式定名為C 11。絕大多數流行的C 編譯器現在都已經支持該標準。
新的C 11標準包含了核心語言的新特性,并且拓展了C 標準程序庫,但是,本書并不嚴格要求使用C 11編譯器。本書在介紹C 11標準的新性能時,會在頁邊附加C 11的圖標提示,沒有該圖標提示的程序仍然可以使用以前的編譯器進行編譯。
本書介紹的C 11主題
* 在第2章中介紹了auto關鍵字,它是一種簡化復雜變量定義的方式。該關鍵字使得編譯器可以從變量的初始化值推斷出它的數據類型。
* 第2章還介紹了新的long long int和unsigned long long int數據類型以及LL常數后綴。
* 第5章介紹了如何將一個string對象直接傳遞給一個文件流對象的open成員函數,而不必調用c_str()成員函數。同時,也為使用早期編譯器的讀者保留了對于c_str()成員函數的使用介紹。
* 第7章介紹了強類型枚舉enum。
* 在第8章介紹了基于范圍的循環。這個新的循環機制會自動對數組、矢量或其他集合的每個元素進行迭代,無須使用計數器變量或下標。
* 第8章還介紹了初始化變量的新方式,演示了如何使用初始化列表來初始化一個矢量。
* 第10章介紹了智能指針,并且提供了新的獨占指針unique_ptr和共享指針shared_ptr的多個應用實例,解釋了如何使用它們安全地分配和使用動態內存,以及要使用智能指針的原因。
* 第10章還介紹了移動賦值運算符,以及nullptr關鍵字,該關鍵字現在是表示空指針的新標準方式。
* 第11章討論了移動構造函數,并且深入介紹了移動賦值運算符,此外還介紹了Lambda表達式。
* 第12章介紹了C 11 string庫中的新函數,討論了新的重載函數to_string,它可以將數字值轉換為string對象。
* 第15章介紹和演示了新的override關鍵字的使用,它可以防止難以察覺的覆蓋錯誤。此外還介紹了final關鍵字,它可以防止虛成員函數被覆蓋。
* 第16章介紹了新的C 11函數begin(c)和end(c),以指定集合c中的開頭和末尾位置。
其他新變化
本書的教學方法和寫作風格與以前的版本保持一致。除了上面介紹的新增?C ?11?標 準內容之外,還有許多其他方面的改進,使其更方便讀者學習使用。
更新材料
整本書中的材料已更新,以反映技術和軟件開發環境的變化。本書的知識介紹更加簡潔明快,并且在介紹性編程教學中融入了最佳實踐,因此,本書新增了大量圖形或經過重新設計的插圖,在各章還添加了很多新的或經過改寫的示例程序,使全書內容更加豐富。
新資料
本書針對很多主題都添加了新的資料。除了上面介紹的使用C 11新特性的主題之外,新版還包括了對常數、隨機數以及枚舉數據類型等知識點的新修改,以及在設計類方面的改進資料。
新編程挑戰
新版在每個章節都增加了新的編程挑戰題目。
重組章節
為了提高讀者的學習能力,新版對若干章節進行了重組。例如,在第5章關于循環的介紹中,現在已經重組為先讓讀者使用while循環進行更多的練習,然后再介紹do-while和for循環。在第6章關于函數的介紹中,已經重組了定義和調用函數、函數原型介紹和main函數等方面的內容。
本書的組織結構
本書以循序漸進的方式講授有關C 的內容。每一章都涵蓋了一系列主題,并且可幫助學生隨著學習的進度而逐漸建立起完善的知識體系。雖然這些章節可以很輕松地按照現有順序進行教學,但也有一定的靈活性。下面的依賴關系圖(圖P-1)提出了可能的教學順序建議。
圖P-1 本書內容依賴關系圖
第1章介紹基礎的硬件、軟件和編程概念。如果已經掌握了這些主題的知識,則可以選擇跳過本章。
第2~6章涵蓋了基本的C 語法、數據類型、表達式、選擇結構、重復結構和函數等。這些章的每一章都建立在前一章的基礎上,應該按照所提出的順序開展教學。
第7章介紹面向對象編程,它可以在第6章之后的任何時候進行學習,但必須在第11章之前。喜歡先引入數組概念的教師可以在第7章之前先講授第8章。當然,8.13節(對象數組)需要先學習第7章才能講授。
如圖P-1所示,在本書的后半部分,可以按任何順序學習第11~14章,第11章、第15章和第16章應該按順序進行。對于希望在本課程中盡早介紹數據結構的教師,可以跳過第15章和第16章的高級面向對象編程知識,先講授第17章(鏈表)、第18章(棧和隊列)以及第19章(二叉樹),但是它們必須安排在第14章(遞歸)之后。并且,在這種情況下,有必要忽略第17~19章中有關處理模板和標準模板庫的部分。
各章內容概述
第1章:計算機和編程簡介
該章提供了和計算機科學領域相關的基礎知識和內容,涵蓋了硬件、軟件、操作系統、編程、解決問題和軟件工程等多方面的基本概念。介紹了關鍵詞、變量、運算符和標點符號等程序組件,以及層次結構圖和偽代碼等編程工具。綜合演練部分向學生展示了如何使用cout語句創建個性化的輸出消息。本章末尾的編程挑戰可以幫助學生了解如何使用相同的基本輸入、處理和輸出結構來創建多個程序。
第2章:C 簡介
該章旨在幫助學生初步了解C ,介紹了C 程序的基本部件、數據類型、變量和文本的使用、賦值語句、簡單的算術運算、程序輸出和注釋等。該章介紹了C string類,并且從此處開始,本書將使用string對象作為處理字符串的主要方法。該章還引入了編程風格約定,建立了良好的編程風格示范,并且貫穿全書。綜合演練部分則讓學生可以玩簡單的基于文本的圖形游戲。
第3章:表達式和交互
在該章中,學生將學習編寫輸入和處理數字、字符和字符串數據的程序,也包括算術運算符的使用和數學表達式的創建,以及運算符的優先級等重點知識。該章還有一個專門的小節介紹調試方法以及如何手動跟蹤程序。此外還包括使用隨機數字、簡單的輸出格式設置、數據類型轉換和強制轉換,以及使用庫函數處理數字等。綜合演練部分向學生展示了如何創建一個簡單的互動文字游戲。
第4章:條件選擇
在該章中,學生將學習關系表達式,以及如何使用if、else和if-else if語句來控制程序的流程。此外也介紹了邏輯運算符、條件運算符和switch語句等。同時還提供了這些結構的應用示例說明,如菜單驅動的程序。該章還介紹了塊和作用域的概念,并延續調試的話題,討論了驗證輸出結果的問題。綜合演練部分允許學生使用隨機數字和分支語句來創建算命游戲。
第5章:循環
該章介紹了C 的重復控制機制。幫助學生了解while循環、do-while循環和for循環,以及各種控制它們的方法。這些方法包括使用計數器、用戶輸入、結束標記符號和到達文件末尾測試等。該章還提供了很多使用循環的應用程序,例如保持累計匯總和執行數據驗證等。該章還增加了一個關于文件處理的小節。另外,在有關調試和測試的部分,介紹了如何創建良好的測試數據。該章綜合演練部分向學生介紹了Windows命令,如何使用它們創建豐富多彩的輸出,以及通過循環實現彩色顯示。
第6章:函數
在該章中,學生將學習如何構建模塊化程序,并了解為什么要進行模塊化。該章首先介紹了void和值返回函數、形參傳遞等知識,強調了通過值傳遞和通過引用傳遞參數的區別。該章也介紹了變量作用域的概念,對局部變量、全局變量和靜態局部變量進行了區分。此外還介紹和演示了函數重載操作。綜合演練部分包括一個模塊化的菜單驅動程序,強調函數的多樣性,說明如何通過發送給它們的參數來控制其行為。
第7章:類和對象簡介
該章開始關注面向對象的范例。學生們將學習如何定義自己的類以及如何創建和使用這些類的對象。該章詳細介紹了哪些函數屬于一個類,而哪些函數則屬于使用這個類的客戶端程序。良好的面向對象實踐是先進行充分的討論和模塊化設計,例如通過仔細構建的讀取器和設置器函數來保護成員數據,并隱藏客戶端程序的類實現細節。一旦學生適應了使用類和對象,則可以深入探討本章提供的面向對象分析和設計的主題。該章還介紹了有關枚舉數據類型和結構的相關知識。在綜合演練部分,學生們將學習使用屏幕控制技術來創建模擬溜溜球運動的動畫。
第8章:數組
在該章中,學生將學習如何創建和使用單維和多維數組。該章提供了許多數組處理的例子,包括使用函數來計算數組中的總和、平均值、最高值和最低值等。該章還介紹了使用二維數組創建表、按行或按列分析數組數據等。此外還演示了使用并行數組的編程技巧,并向學生展示了如何使用數據文件作為輸入源來填充數組。該章介紹了基于范圍的for循環,它是遍歷數組所有元素的簡便方式。此外還引入了標準模板庫矢量,并使之與數組進行比較,以加深學生的印象。關于對象數組和結構數組的內容被特意放在章節的末尾,這樣方便教師跳過第7章而先講授這一章,以后需要時再回來講授該節。綜合演練部分演示如何使用數組創建一個石頭、剪刀、布游戲。
第9章:搜索、排序和算法分析
在本章中,學生將學習搜索存儲在數組中的信息和排序數組(包括對象數組)的基本知識。該章涵蓋了線性搜索、二分搜索、冒泡排序和選擇排序算法,并加入了STL矢量搜索和排序的相關內容。該章還提供了算法分析的簡要介紹,并向學生展示了如何確定兩種算法中哪一種算法更有效。該章的綜合演練部分使用了表格查找或搜索算法來編碼和解碼秘密消息。
第10章:指針
該章介紹了如何使用指針,主要內容包括指針算術、指針初始化、指針比較、指針和數組、指針和函數、動態內存分配、新的nullptr關鍵字等。另外還新增了有關智能指針的內容,介紹如何使用它們避免內存泄漏。綜合演練部分演示了如何使用指針訪問返回日歷時間的庫數據結構和函數。
第11章:類和面向對象編程詳解
該章在第7章的基礎上繼續深入探討了有關類和面向對象編程的相關內容。它涵蓋了對象的繼承、聚合和組合等有一定深度的內容,并說明了Is-a和Has-a的區別。該章內容還包括常量成員函數、靜態成員、友元、按成員賦值、復制構造函數、對象類型轉換運算符、轉換構造函數、運算符重載、移動構造函數和移動賦值運算符等。此外還添加了一個新的章節,介紹函數對象和C 11的Lambda表達式。綜合演練部分匯集了繼承和轉換構造函數的概念,以構建一個程序,該程序將數組的內容格式化為一個HTML表格,以便在Web站點上顯示。
第12章:C字符串和string類詳解
該章介紹了用于處理字符和C字符串的標準庫函數,以及有關string類函數的資料,涵蓋新的C 11中的string庫、新的重載的to_string函數(將數字值轉換為string對象)等。綜合演練部分向學生展示了如何訪問基于字符串的程序環境,以獲取有關計算機和運行該程序的網絡的信息。
第13章:高級文件和I/O操作
該章介紹了更多有關順序訪問文本文件和隨機訪問二進制文件的內容。討論了以不同的模式打開文件的設置,以及讀取和寫入文件內容的多種方法。綜合演練程序應用了該章介紹的許多技術,將兩個文本文件合并成一個HTML文檔,以便在Web上顯示,并用不同的顏色來說明每個數據塊來自哪個文件。
第14章:遞歸
該章定義和演示了遞歸。通過清晰的遞歸調用圖示,講解了遞歸的原理和用法,并討論了遞歸應用程序。該章還提供了多種遞歸算法示例,包括計算階乘的遞歸函數、遞歸找到最大公約數、遞歸執行二分搜索、使用QuickSort進行排序以及遞歸解決漢諾塔問題等。對于需要更多挑戰的學生來說,還可以研究本章提供的窮舉和枚舉算法。綜合演練部分使用遞歸來評估前綴表達式。
第15章:多態和虛函數
該章繼續深入討論類和面向對象編程,并介紹了一些更高級的概念,如多態和虛函數。此外還提供了抽象基類、純虛函數、繼承層次結構中的類型兼容性以及虛擬繼承等方面的內容。綜合演練部分說明了如何使用繼承和多態來顯示圖形并使之產生動畫。
第16章:異常、模板和標準模板庫
該章介紹了如何使用異常來開發增強的錯誤捕獲技術,然后討論了如何使用函數和類模板來創建通用代碼。最后,還介紹了由標準模板庫(STL)提供的容器、迭代器和算法。綜合演練部分使用了標準模板庫中的各種容器來創建一款寓教于樂的兒童游戲。
第17章:鏈表
該章介紹使用鏈表所需的概念和技術。學生將首先了解鏈表抽象數據類型(ADT),然后學習如何創建和銷毀鏈表,以及編寫函數以插入、追加和刪除結點,遍歷鏈表和搜索特定結點的函數。此外還演示了鏈表類模板的使用。綜合演練部分將面向對象編程的許多重要概念匯集在一起,通過將對象、繼承、多態與STL的list類相結合,為一組圖形制作 動畫。
第18章:棧和隊列
在該章中,學生將學習創建和使用靜態棧、動態棧和隊列。學生將了解到棧和隊列的操作,以及每個抽象數據類型的模板。基于靜態數組的棧使用異常處理機制來處理棧的溢出和下溢,該章提供了定義、拋出和捕獲異常的真實而自然的例子。綜合演練部分討論了評估后綴表達式的策略,以及使用棧將后綴表達式轉換為中綴表達式的方法。
第19章:二叉樹
該章介紹了二叉樹抽象數據類型并演示了許多二叉樹操作,包括遍歷樹,插入、刪除和替換元素,搜索特定的元素,以及銷毀樹。綜合演練部分介紹了一個足夠多樣化的樹結構來創建譜系樹。
書中的附錄
附錄A:ASCII字符集?ASCII和擴展ASCII字符及其代碼的列表。
附錄B:運算符優先級和關聯性?C 運算符的優先級和關聯性列表。
附錄C:思考題答案?該附錄可以作為一個工具供學生參考。通過做思考題和比較自己的答案,學生可以判斷自己對各章知識點的掌握程度。該附錄包括本書所有思考題的 答案。
附錄D:復習和練習奇數題的答案?學生可以用來評估自身對全書知識點的理解和掌握程度的另一個工具。
本書配套站點上的其他附錄
附錄E:面向對象編程簡介?面向對象編程的概念和術語介紹。
附錄F:在類設計中使用UML?統一建模語言(UML)類圖的簡要介紹及其使用示例。
附錄G:多源文件程序?關于如何使用多個源文件創建、編譯和鏈接程序的教程。包括使用函數頭文件、類規范文件和類實現文件。
附錄H:多重和虛繼承?為已經熟悉單個繼承的讀者提供的多重和虛繼承的C 概念的自助討論。
附錄I:頭文件和庫函數參考?本書中使用的C 庫函數和頭文件的參考。
附錄J:命名空間?對命名空間及其用途的解釋,提供了關于如何定義命名空間和訪問其成員的示例。
附錄K:C 強制轉換和運行時類型標識?介紹了在C 中進行類型強制轉換的不同方法和運行時類型標識。
附錄L:傳遞命令行參數?介紹編寫接受命令行參數的C 程序。本附錄對于在UNIX或Linux等命令行環境下工作的學生非常有用。
附錄M:二進制數字和位運算?二進制數字系統和C 位運算符的指南,以及整數的內部存儲的教程。
附錄N:流程圖介紹?介紹流程圖及其符號的教程。它包括處理順序、選擇、大小寫、重復和調用其他模塊。該附錄中提供了本書若干個程序的示例流程圖。
本書特色內容
核心概念:本書大部分章節內容都以核心概念的陳述開始,它總結了本章的重點思想或核心知識點。
示例程序:本書有超過350個完整的示例程序,每個程序設計為突出目前正在討論的主題。在大多數情況下,這些都是實用示例。本書配套站點提供了這些程序的源代碼,以便學生可以自己運行程序。
程序輸出:在絕大多數示例程序之后,都有一個屏幕輸出樣本,向讀者演示了程序應該如何起作用。
綜合演練:這是一個特殊的部分,在每一章的最后都有,讀者可以通過該演練做一些聰明而有趣的事情,進而更好地掌握本章的內容。
思考題:這是讀者測試自己學習效用的工具,也有利于讀者掌握學習要點。本書后面的附錄C提供了所有關于思考題的答案。
注意:出現在書中的適當位置。這些簡短的解釋性文字對于厘清知識要點或闡釋容易引起誤解的內容很有幫助。
警告:對于某些C 特性、編程技術或做法提出警告,因為它們可能會導致程序出現故障或丟失數據。
案例研究:本書絕大多數章節都提供了模擬現實世界應用的案例研究,并且為每一個案例研究提供了完整的代碼。在本書配套站點上提供了更多的案例研究。這些案例研究旨在強調它們所出現章節的主要知識點。
復習和練習:本書每一章都提供了一套完整而多樣的復習和練習,如填空和簡答題,可以檢查學生對本章介紹內容的掌握程度。接下來是對分析和解決問題能力的練習,如算法工作臺、預測輸出結果和找出錯誤部分。每個章節還提供了一項軟件技能練習,側重于培養學生的溝通技能和團隊協作能力。此外,本書后面的附錄D提供了所有章節的復習和練習奇數題的答案。
編程挑戰:本書每一章都提供了一組編程練習,旨在鞏固學生對當前正在學習的知識要點和編程技巧的認識。在大多數情況下,這些挑戰題目提出了現實世界中需要解決的 問題。
團隊項目:本書有若干個團隊編程項目,建議由一個學生團隊完成。其中一個學生可以建立程序的用戶界面,另一個學生負責寫數學代碼,還有一個學生負責設計和實現一個程序使用的類。這個過程類似于許多專業程序的開發方式,并且也鼓勵課堂內的團隊合作。
補 充 資 料
學生資源
以下項目可在www.pearsonhighered.com/cs-resources的Gaddis Series資源頁面上獲得:
* 本書包含的每個程序的完整源代碼。
* 額外的案例研究及其完整的源代碼。
* 本書附帶的全套附錄(包括若干個教程)。
* 訪問本書配套站點上的視頻教程。
* 下載大量編程環境和IDE的鏈接,包括Visual Studio Community Edition。
致??謝
本書的開發和出版獲得了很多人的幫助。在此謹對以下評審人員提供的有益建議和專業知識表示衷心感謝。
目??錄
第1章 計算機和編程簡介 1
1.1 為什么要使用程序 1
1.2 計算機系統:硬件和軟件 2
1.2.1 硬件 2
1.2.2 軟件 5
1.2.3 思考題 6
1.3 程序和編程語言 6
1.3.1 程序的定義 7
1.3.2 編程語言 8
1.3.3 源代碼、目標代碼和可執行
代碼 9
1.3.4 思考題 11
1.4 程序的組成 11
1.4.1 語言元素 11
1.4.2 代碼行和語句 13
1.4.3 變量 14
1.4.4 變量定義 14
1.5 輸入、處理和輸出 15
思考題 15
1.6 編程過程 16
1.6.1 設計和創建程序 16
1.6.2 軟件工程的定義 19
1.6.3 思考題 20
1.7 綜合演練:顯示個性化消息 20
1.7.1 復習和練習 21
1.7.2 編程挑戰 23
第2章 C 簡介 24
2.1 C 程序的部件 24
思考題 27
2.2 cout對象 27
2.3 #include指令 32
思考題 33
2.4 變量和賦值語句 33
2.5 常數 35
2.5.1 有時數字并不是數字 36
2.5.2 思考題 36
2.6 標識符 37
2.7 整型數據類型 39
2.7.1 整數和長整型常數 42
2.7.2 十六進制和八進制常數 43
2.7.3 思考題 43
2.8 浮點數據類型 44
2.8.1 浮點常數 45
2.8.2 將浮點值分配給整型變量 46
2.8.3 思考題 47
2.9 char數據類型 47
2.10 C string類 51
2.10.1 使用string類 51
2.10.2 思考題 52
2.11 bool數據類型 52
2.12 確定數據類型的大小 53
2.13 變量賦值和初始化詳解 54
2.14 作用域 56
2.15 算術運算符 56
思考題 60
2.16 注釋 60
2.16.1 單行注釋 61
2.16.2 多行注釋 61
2.17 編程風格 62
2.18 綜合演練:笑臉! 63
2.18.1 復習和練習 64
2.18.2 編程挑戰 68
第3章 表達式和交互 71
3.1 cin對象 71
3.1.1 輸入多個值 74
3.1.2 思考題 76
3.2 數學表達式 77
3.2.1 運算符的優先級 79
3.2.2 關聯性 80
3.2.3 用圓括號分組 80
3.2.4 將代數表達式轉換為編程
語句 81
3.2.5 指數問題詳解 81
3.2.6 思考題 83
3.3 數據類型轉換和類型強制轉換 85
3.3.1 類型強制轉換 86
3.3.2 思考題 89
3.4 溢出和下溢 90
3.5 命名常量 91
思考題 93
3.6 多變量和組合賦值 94
3.6.1 組合賦值運算符 94
3.6.2 思考題 96
3.7 格式化輸出 97
3.7.1 setprecision操作符 100
3.7.2 fixed操作符 103
3.7.3 showpoint操作符 104
3.7.4 left和right操作符 105
3.7.5 思考題 107
3.8 處理字符和字符串 107
3.8.1 輸入字符串 108
3.8.2 輸入一個字符 110
3.8.3 使用cin.get 110
3.8.4 混合使用cin >>和cin.get 112
3.8.5 使用cin.ignore 112
3.8.6 實用的string成員函數和
運算符 113
3.8.7 使用C字符串 115
3.8.8 為C字符串賦值 116
3.8.9 跟蹤一個C字符串的大小 117
3.8.10 讀取一行輸入 119
3.8.11 思考題 120
3.9 更多數學庫函數 120
3.10 隨機數字 122
3.10.1 限制隨機數的范圍 125
3.10.2 思考題 125
3.11 關于調試:手動跟蹤程序 126
3.12 Green Fields Landscaping案例
研究第1部分 127
3.12.1 問題陳述 127
3.12.2 程序設計 128
3.12.3 程序 128
3.12.4 General Crates公司案例
研究 130
3.13 綜合演練:單詞游戲 130
3.13.1 復習和練習 132
3.13.2 編程挑戰 137
第4章 條件選擇 143
4.1 關系運算符 143
4.1.1 關系的值 144
4.1.2 真值和假值 145
4.1.3 思考題 147
4.2 if語句 148
4.2.1 編程風格和if語句 151
4.2.2 要注意的3個常見錯誤 151
4.2.3 真值詳解 153
4.2.4 標記 154
4.2.5 整數標記 155
4.2.6 思考題 155
4.3 if-else語句 156
4.3.1 使用if 或if-else的時機 157
4.3.2 比較浮點數 159
4.3.3 思考題 161
4.4 if-else if語句 161
4.4.1 使用結尾else 166
4.4.2 思考題 167
4.5 菜單驅動程序 168
4.6 嵌套if語句 170
思考題 173
4.7 邏輯運算符 174
4.7.1 &&運算符 174
4.7.2 || 運算符 176
4.7.3 ! 運算符 178
4.7.4 布爾變量和?!運算符 179
4.7.5 邏輯運算符的優先級和
關聯性 181
4.7.6 使用邏輯運算符檢查數字
范圍 182
4.7.7 思考題 182
4.8 驗證用戶輸入 183
4.9 塊和作用域詳解 185
4.9.1 同名變量 186
4.9.2 思考題 187
4.10 字符和字符串詳解 188
4.10.1 比較字符 188
4.10.2 比較string對象 189
4.10.3 測試字符 191
4.10.4 思考題 193
4.11 條件運算符 194
4.11.1 使用條件表達式的值 195
4.11.2 思考題 197
4.12 switch語句 197
4.12.1 在菜單驅動系統中使用
switch 203
4.12.2 思考題 205
4.13 枚舉數據類型 206
思考題 209
4.14 關于測試和調試:驗證輸出結果 210
4.15 Green Fields Landscaping案例研
究第2部分 212
4.15.1 問題陳述 212
4.15.2 程序設計 213
4.15.3 程序 214
4.15.4 Crazy A1的計算機商業
案例研究 216
4.16 綜合演練:算命游戲 217
4.16.1 復習和練習 218
4.16.2 編程挑戰 222
第5章 循環 228
5.1 循環介紹:while循環 228
5.1.1 while循環 228
5.1.2 while是一個預測試循環 230
5.1.3 無限循環 231
5.1.4 編程風格和while循環 232
5.1.5 思考題 234
5.2 使用while循環驗證輸入 235
5.3 遞增和遞減運算符 237
5.3.1 后綴和前綴模式 239
5.3.2 在數學表達式中使用遞增
和遞減運算符 241
5.3.3 在關系表達式中使用遞增
和遞減運算符 241
5.3.4 思考題 242
5.4 計數器 243
5.5 保持累計匯總 245
5.6 標記符號 247
思考題 248
5.7 do-while循環 249
5.7.1 toupper函數 251
5.7.2 與菜單一起使用do-while 252
5.7.3 思考題 254
5.8 for循環 254
5.8.1 for循環是一個預測試循環 257
5.8.2 避免修改for循環體中的
計數器變量 257
5.8.3 更新表達式的其他形式 258
5.8.4 定義for循環初始化表達式
中的變量 258
5.8.5 創建用戶控制的for循環 258
5.8.6 在初始化和更新表達式中
使用多個語句 259
5.8.7 省略for循環的表達式或
循環體 260
5.8.8 思考題 260
5.9 關于軟件工程:決定使用哪個
循環 261
5.9.1 while循環 261
5.9.2 do-while循環 262
5.9.3 for循環 262
5.10 嵌套循環 262
5.11 打破循環 265
5.11.1 在嵌套循環中使用break 266
5.11.2 continue語句 267
5.11.3 思考題 268
5.12 使用文件進行數據存儲 269
5.12.1 文件類型 270
5.12.2 文件訪問方法 271
5.12.3 文件名和文件流對象 271
5.12.4 為輸入輸出文件設置
程序 272
5.12.5 創建文件流對象并打開
文件 273
5.12.6 關閉文件 274
5.12.7 將數據寫入文件 274
5.12.8 從文件讀取數據 276
5.12.9 讀取位置 278
5.12.10 讓用戶指定一個文件名 279
5.12.11 使用舊版本C 中的
c_str成員函數 280
5.12.12 檢測文件的末尾 280
5.12.13 測試文件打開的錯誤 282
5.12.14 思考題 284
5.13 關于測試和調試:創建良好的
測試數據 284
5.14 Central Mountain Credit Union
案例研究 287
5.14.1 問題陳述 287
5.14.2 計算 287
5.14.3 變量 287
5.14.4 程序設計 288
5.14.5 詳細偽代碼 288
5.14.6 程序 289
5.14.7 測試程序 291
5.14.8 Lightening Lanes案例
研究 291
5.15 綜合演練:多彩世界 291
5.15.1 復習和練習 294
5.15.2 編程挑戰 299
第6章 函數 305
6.1 模塊化編程 305
6.2 定義和調用函數 306
6.2.1 空函數 307
6.2.2 調用函數 307
6.2.3 思考題 313
6.3 函數原型 314
6.4 將數據發送到函數中 315
6.5 按值傳遞數據 320
思考題 322
6.6 使用return語句 323
6.7 從函數返回值 325
6.7.1 定義一個返回值函數 325
6.7.2 調用返回值函數 326
6.8 返回一個布爾值 330
思考題 332
6.9 在菜單驅動程序中使用函數 332
6.10 局部變量和全局變量 336
6.10.1 局部變量 336
6.10.2 局部變量生存期 338
6.10.3 使用形參值初始化本地
變量 338
6.10.4 全局變量 338
6.10.5 全局常數 340
6.10.6 具有相同名稱的局部
變量和全局變量 342
6.11 靜態局部變量 343
思考題 345
6.12 默認實參 346
6.13 使用引用變量作為形參 349
6.13.1 按引用傳遞實參和
按值傳遞實參的時機 353
6.13.2 將文件傳遞給函數 355
6.13.3 思考題 358
6.14 重載函數 359
6.15 使用exit()函數 364
思考題 365
6.16 樁模塊和驅動模塊 366
6.17 小樂透案例研究 369
6.17.1 問題陳述 369
6.17.2 程序設計 369
6.17.3 程序 371
6.17.4 High Adventrue Travel
Agency旅行社案例研究 374
6.18 綜合演練:發光的南瓜燈 374
6.18.1 復習和練習 378
6.18.2 編程挑戰 381
第7章 類和對象簡介 388
7.1 抽象數據類型 388
7.1.1 抽象 388
7.1.2 在軟件開發中使用抽象 389
7.1.3 抽象數據類型 389
7.2 面向對象編程 389
7.3 關于類的介紹 391
7.3.1 使用已經知道的類 391
7.3.2 創建自己的類 392
7.3.3 訪問修飾符 393
7.3.4 private和public成員的
位置 393
7.4 創建和使用對象 394
7.4.1 訪問對象的成員 395
7.4.2 訪問器和設置器 396
7.5 定義成員函數 397
7.5.1 類成員函數的命名約定 399
7.5.2 避免陳舊數據 402
7.5.3 內聯函數詳解 402
7.5.4 思考題 403
7.6 構造函數 403
7.6.1 重載構造函數 407
7.6.2 默認構造函數 408
7.7 析構函數 409
思考題 410
7.8 私有成員函數 412
7.9 將對象傳遞給函數 415
7.9.1 常量引用形參 418
7.9.2 從函數返回一個對象 419
7.9.3 思考題 422
7.10 對象組合 422
思考題 425
7.11 關于軟件工程:分離類規范、
實現和客戶端代碼 426
7.11.1 使用多個文件的優點 431
7.11.2 在類對象中執行輸入
輸出 432
7.11.3 思考題 432
7.12 結構 432
7.12.1 訪問結構成員 433
7.12.2 顯示和比較結構變量 435
7.12.3 初始化結構 436
7.12.4 嵌套結構 437
7.12.5 思考題 440
7.12.6 將結構傳遞給函數 441
7.12.7 從函數返回一個結構 443
7.12.8 思考題 444
7.13 枚舉數據類型詳解 445
7.13.1 在同一個語句中聲明enum
數據類型并定義變量 445
7.13.2 將整數賦值給enum
變量 445
7.13.3 將枚舉量賦值給int
變量 446
7.13.4 使用數學運算符改變
enum變量的值 446
7.13.5 使用枚舉量輸出值 446
7.13.6 使用枚舉量控制循環 447
7.13.7 使用C 11中的強類型
enum 448
7.14 Home Software公司OOP案例
研究 449
7.14.1 私有成員變量 450
7.14.2 公共成員函數 450
7.14.3 類聲明 450
7.14.4 withdraw會員函數 451
7.14.5 類接口 452
7.14.6 實現類 452
7.15 面向對象分析與設計介紹 456
7.15.1 尋找類 459
7.15.2 確定類的責任 462
7.15.3 這僅僅是個開始 465
7.15.4 對象的可重用性 465
7.15.5 面向對象與基于對象的
編程 465
7.15.6 思考題 465
7.16 屏幕控制 466
7.16.1 屏幕光標定位 466
7.16.2 創建一個屏幕輸入表單 469
7.17 綜合演練:溜溜球動畫 471
7.17.1 復習和練習 473
7.17.2 編程挑戰 479
第8章 數組 486
8.1 保存多個值的數組 486
8.2 訪問數組元素 488
8.3 輸入和顯示數組內容 489
8.3.1 將數據從文件讀入數組 491
8.3.2 將數組的內容寫入文件 493
8.3.3 C 中沒有數組邊界檢查 493
8.3.4 注意大小差一錯誤 495
8.3.5 思考題 496
8.4 數組初始化 497
8.4.1 從數組元素1開始 501
8.4.2 數組部分初始化 501
8.4.3 隱式數組大小 503
8.4.4 初始化變量的新方法 503
8.5 基于范圍的for循環 504
8.6 處理數組內容 507
8.6.1 復制一個數組到另一個 509
8.6.2 比較兩個數組 510
8.6.3 對數字數組中的值求和 511
8.6.4 查找數字數組中數值的
平均值 511
8.6.5 在數字數組中查找最高值
和最低值 512
8.6.6 部分填充數組 514
8.6.7 為什么要使用數組 515
8.6.8 處理字符串 517
8.7 使用并行數組 519
思考題 521
8.8 typedef聲明 523
8.9 數組作為函數參數 523
8.9.1 使用const數組形參 529
8.9.2 一些有用的數組函數 529
8.9.3 思考題 532
8.10 二維數組 533
8.10.1 將二維數組傳遞給函數 537
8.10.2 對二維數組的所有元素
求和 539
8.10.3 對二維數組的行求和 539
8.10.4 對二維數組的列求和 540
8.11 三維或三維以上數組 541
思考題 543
8.12 矢量 544
8.12.1 定義和初始化矢量 545
8.12.2 存儲和檢索矢量中的值 546
8.12.3 使用C 11中基于范圍
的for循環和vector 548
8.12.4 使用push_back成員
函數 549
8.12.5 確定矢量的大小 550
8.12.6 從矢量中刪除元素 552
8.12.7 清理矢量 553
8.12.8 檢測一個空矢量 554
8.12.9 矢量成員函數匯總 556
8.12.10 思考題 556
8.13 對象數組* 557
8.13.1 思考題 562
8.13.2 結構數組 563
8.13.3 思考題 566
8.14 National Commerce Bank案例
研究 567
8.15 綜合演練:石頭、剪刀、布 569
8.15.1 復習和練習 571
8.15.2 編程挑戰 575
第9章 搜索、排序和算法分析 585
9.1 搜索算法簡介 585
9.1.1 線性搜索 585
9.1.2 二分搜索 588
9.2 搜索對象數組 591
思考題 595
9.3 排序算法簡介 595
9.3.1 冒泡排序 595
9.3.2 選擇排序 599
9.3.3 思考題 604
9.4 對象數組排序 604
9.5 矢量排序和搜索 607
9.6 算法分析簡介 609
9.6.1 計算問題和基本步驟 610
9.6.2 算法的復雜度 611
9.6.3 算法的最壞情況下的
復雜度 613
9.6.4 平均情況下的復雜度 615
9.6.5 漸近復雜度與大O表示法 615
9.6.6 思考題 617
9.7 案例研究 617
9.8 綜合演練:秘密消息 617
9.8.1 復習和練習 622
9.8.2 編程挑戰 623
第10章 指針 627
10.1 指針和地址運算符 627
10.2 指針變量 629
10.3 數組與指針之間的關系 632
10.4 指針的算術運算 637
10.5 初始化指針 638