本书是一本关于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 斐波那契
查看全部↓
前言/序言