本書是一本關于C 語言的經典書籍,全書共計20章,主要介紹了C 的基本知識、函數和庫、字符串、流、集合、類的設計、遞歸、遞歸策略、回溯算法、算法分析、指針與數組、動態內存管理、效率與表示、線性結構、映射、樹、圖、繼承、迭代的策略等內容。本書重點圖突出,全面講解了C 語言的基本概念,深入剖析了具體的編程思路。同事,每章后面都有配套的的習題,有助于讀者進一步理解和掌握晦澀的概念。本書適合作為計算機專業及相關專業學生的教材或教學參考書,也適合希望學習C 語言的初學者和中高級程序員使用。
前言Programming Abstractions in C++
致學生在過去的十年里,計算領域正令人振奮地高速發展著。我們隨身攜帶的網絡設備運行速度越來越快,價格越來越便宜,功能也越來越強大。谷歌和維基百科等基于網絡的服務給我們提供了大量觸手可及的信息。社交網絡把我們同世界各地的人聯系起來。流媒體技術和更快速的硬件讓我們能在任何時候下載所需的音樂和影像。
然而,這些技術并不是突然而至的,而是人們創造了它們。遺憾的是,具備必需的軟件開發技能的人現在正供不應求。在硅谷的高科技中心,很多公司找不到能把技術設想轉化為現實應用的工程師。各個公司正在極力招聘懂得開發及維護大型系統的人,即懂得數據表示、效率、安全性、正確性和模塊化等問題的軟件開發人員。
盡管本書不會教給你關于這些主題和計算機科學領域的所有知識,但它會給你一個良好的開始。在斯坦福大學,每年有超過1000名學生選擇使用本教材上課。他們中的大部分人覺得在暑期實習或實際工作中僅僅學習本教材中的知識遠遠不夠。更多的學生選擇繼續學習更深入的課程以使自己在這個高速發展的領域獲得更多的機會。
本書的主題除了會在計算機行業中給你提供機會外,同時它也寄樂于學。你在本書中學到的算法和策略有一部分是最近十年發明的,其他的都存在了超過2000年——它們充分體現了人類的聰明才智和創造力。這些算法和策略還非常實用,它們會幫助你成為一個富有經驗的程序員。
在你學習本書中的材料時,請牢記,編程總是需要通過實際操作來學習的。閱讀一種算法技術并不代表你就能夠把那個算法應用到實際中去。只有通過練習和嘗試去解決問題的調試,你才能真正學到算法的精髓。編程有時候使人感覺很沮喪,但是當你找到最后一個錯誤并且看到你的程序正確運行時,會欣喜若狂,它足以回報你在編程這條道路上所付出的任何努力。
致教師本教材適合作為典型的大學課程中第二門編程課程的教材。它涵蓋了ACM的Curriculum?8報告中定義的傳統CS2課程中的材料。因此它包含了CS102和CS103課程指定的絕大多數主題,CS102和CS103分別由“ACM/IEEE-CS聯合計算機課程2001版”報告及“計算機科學課程2013版”草稿中的AL/基本數據結構及算法單元中的材料定義。
本教材采用的教學策略在斯坦福大學已大獲成功。
1.數據結構的客戶優先方法。傳統的CS2課程由一系列基本數據結構組成。采用此模型,學生可同時學習如何使用一個特定的結構和如何實現它及理解它的性能特點。相比之下,本教材很早地展現了類的完整集合,讓學生以客戶的身份逐漸熟悉這些類。一旦學生透徹理解了這些內容,本書即開始展現它可能的實現范圍和相關的計算特性。在斯坦福大學采用這種策略有助于學生輕松理解相關內容。自從做了這個改變,學生在需要使用集合類的考試中的分數也有了大幅度提高。
2.稍晚呈現那些需要詳細了解底層機器的C++特性。盡管前兩章給學生提供了C++中基本類型和控制結構的總覽,但初始的部分刻意地區分了基本指針和數組等依賴于對底層機器架構理解的主題。雖然這些細節是CS2的基本部分,但也沒有必要在課程剛開始的時候就給學生過大的負擔。盡早介紹類的集合使得學生能夠掌握幾個其他同等重要的主題,包括集合類、遞歸、面向對象設計和算法分析,但是不需要同時糾結于它的底層細節。
3.一個方便易用的圖形化可移植類庫。使用C++作為教學語言的一個問題是標準類庫不提供圖形化功能。而本書自帶了一個免費發布的開源類庫—Standford C++類庫,它提供了一種進行圖形交互的簡單且宜教宜學的方法。Standford C++類庫還包括集合類的簡化實現,它支持一個更邏輯化且更加有效的表示規則。
補充資源對于學生在Pearson網站(http://www.pearsonhighered.com/ericroberts/)上,讀者可下載以下資源:
1.書中每個示例程序的源代碼文件2.運行示例的全彩PDF版本3.復習題的答案對于教師在Pearson網站上,有資格的教師可下載以下資源:
1.書中每個示例程序的源代碼文件2.運行示例的全彩PDF版本3.復習題的答案4.編程習題的答案5.每章的PowerPoint課件Stanford C++類庫Stanford C++類庫作為開源的開發項目可以免費獲得。頭文件、編譯庫和源代碼可以通過GitHub (http://www.github.com/eric-roberts/StanfordCPPLib)或從作者的個人網站(http://cs.stanford.com/~eroberts/StanfordCPPLib)獲得。
致謝本教材有著有趣的發展歷史,它在某些方面也反映了C++語言自身的進化。就像Bjarne Stroustrup的第1版C++是在C語言的基礎上實現的,本書產生于我的另一本基于C語言的書——《C程序設計的抽象思維》,它由Pearson下屬的AddisonWesley于1998年出版。十年前,我的斯坦福同事Julie Zelenski用C++語言更新了它,在那一年我們開始在一系列的概述課程中使用它。盡管修訂的教材版本在開始時效果很好,但這些年來我們演變的系列概述課程表明它需要一個重新編寫的教材版本,而這本書就是最終的產品。
查看全部↓
出版者的話
譯者序
前言
第1章 C++概述1
1.1 你的第一個C++程序1
1.2 C++的歷史2
1.2.1 面向對象范型2
1.2.2 C++的演化3
1.3 編譯過程3
1.4 C++程序結構4
1.4.1 注釋5
1.4.2 包含的庫文件6
1.4.3函數原型6
1.4.4主程序7
1.4.5函數定義8
1.5 變量9
1.5.1 變量聲明9
1.5.2命名規則10
1.5.3 局部變量和全局變量11
1.5.4 常量11
1.6 數據類型12
1.6.1 數據類型的概念12
1.6.2 整數類型13
1.6.3 浮點類型13
1.6.4 布爾類型14
1.6.5 字符14
1.6.6 字符串15
1.6.7 枚舉類型16
1.6.8 復合類型17
1.7 表達式17
1.7.1 優先級和結合律18
1.7.2 表達式中的混合類型19
1.7.3整數除法和求余操作符19
1.7.4 類型轉換20
1.7.5 賦值操作符20
1.7.6 自增和自減操作符21
1.7.7 布爾運算22
1.8 語句24
1.8.1 簡單語句24
1.8.2 塊24
1.8.3 if語句24
1.8.4 switch語句25
1.8.5while語句27
1.8.6 for語句29
本章小結31
復習題32
習題33
第2章 函數與庫37
2.1 函數概念37
2.1.1 數學中的函數37
2.1.2 編程中的函數37
2.1.3 使用函數的優點38
2.1.4函數和算法38
2.2庫39
2.3在C++中定義函數41
2.3.1函數原型41
2.3.2重載42
2.3.3默認形參數42
2.4函數調用機制43
2.4.1函數調用步驟43
2.4.2組合函數44
2.4.3追蹤組合函數執行過程46
2.5引用參數49
2.6接口與實現52
2.6.1定義error庫53
2.6.2導出數據類型54
2.6.3導出常量定義56
2.7接口設計原則58
2.7.1統一主題的重要性58
2.7.2簡單性與信息隱藏原理59
2.7.3滿足用戶需求60
2.7.4通用工具的優勢60
2.7.5庫穩定性的價值60
2.8隨機數庫的設計61
2.8.1隨機數與偽隨機數61
2.8.2標準庫中的偽隨機數62
2.8.3選擇正確的函數集63
2.8.4構建用戶程序65
2.8.5隨機數庫的實現65
2.8.6初始化隨機數種子69
2.9Stanford類庫介紹73
2.9.1簡單的輸入和輸出類庫73
2.9.2Stanford類庫中的圖形處理程序74
本章小結77
復習題78
習題79
第3章 字符串類string85
3.1使用字符串作為抽象數據85
3.2字符串操作87
3.2.1操作符重載88
3.2.2從一個字符串中選取字符89
3.2.3字符串賦值90
3.2.4提取字符串中的子串90
3.2.5在一個字符串中進行搜索90
3.2.6循環遍歷字符串中的所有字符91
3.2.7通過連接擴展字符串92
3.3庫93
3.4修改字符串中的內容94
3.5遺留的C風格字符串95
3.6編寫字符串應用程序95
3.6.1回文識別96
3.6.2將英語翻譯成兒童黑話96
3.7strlib.h庫99
本章小結100
復習題100
習題101
第4章 流類108
4.1格式化輸出108
4.2格式化輸入112
4.3數據文件113
4.3.1使用文件流114
4.3.2單個字符的輸入/輸出115
4.3.3面向行的輸入/輸出118
4.3.4格式化輸入/輸出119
4.3.5字符串流121
4.3.6一個用于控制臺輸入的更魯棒的策略122
4.4類層次123
4.4.1生物層次123
4.4.2流類層次124
4.4.3在流層次中選擇正確的層次126
4.5simpio.h和filelib.h庫127
本章小結128
復習題128
習題129
第5章 集合類 133
5.1Vector類134
5.1.1指定Vector的基類型134
5.1.2聲明Vector對象135
5.1.3Vector的操作135
5.1.4從Vector對象中選擇元素136
5.1.5作為參數傳遞Vector對象137
5.1.6創建預先定義大小的Vector138
5.1.7Vector類的構造函數141
5.1.8Vector中的操作符142
5.1.9表示二維結構143
5.1.10Stanford類庫中的Grid類143
5.2Stack類144
5.2.1Stack類結構145
5.2.2棧和小型計算器145
5.3Queue類148
5.3.1仿真和模型149
5.3.2排隊模型149
5.3.3離散時間150
5.3.4仿真時間中的事件150
5.3.5實現仿真151
5.4Map類154
5.4.1Map類的結構154
5.4.2在一個應用中使用Map類156
5.4.3Map類作為關聯數組157
5.5Set類158
5.5.1實現庫159
5.5.2創建單詞列表160
5.5.3Stanford類庫中的Lexicon類161
5.6在集合上進行迭代162
5.6.1迭代順序163
5.6.2再論兒童黑話164
5.6.3計算單詞的頻率165
本章小結167
復習題168
習題168
第6章 類的設計178
6.1 二維點的表示178
6.1.1 將Point定義為結構類型178
6.1.2 將Point定義為類179
6.1.3 接口與實現的分離182
6.2 操作符重載184
6.2.1 重載插入操作符184
6.2.2 判斷兩個點是否相等186
6.2.3 為Direction類型增加操作符189
6.3 有理數191
6.3.1 定義新類的機制192
6.3.2 采用用戶的觀點193
6.3.3 確定Rational類的私有實例變量193
6.3.4 為Rational類定義構造函數193
6.3.5 為Rational類定義方法194
6.3.6 實現Rational類196
6.4 token掃描器類的設計198
6.4.1 用戶想從記號掃描器中得到什么199
6.4.2 tokenscanner.h接口200
6.4.3 實現TokenScanner類202
6.5 將程序封裝成類205
本章小結207
復習題207
習題208
第7章 遞歸簡介215
7.1 一個簡單的遞歸例子215
7.2 階乘函數217
7.2.1 fact的遞歸公式217
7.2.2 追蹤遞歸過程218
7.2.3 遞歸的穩步跳躍221
7.3 斐波那契
查看全部↓
前言/序言