本书是由具有多年教学实践经验的美国Creighton大学D.S.Malik教授根据课堂讲稿编写而成的C++实用教程。全书系统地介绍了ANSI/ISO标准C++,结构化程序设计和面向对象程序设计以及用C++实现的数据结构。\r\n 全书共分21章。前11章是基础部分,主要介绍C++程序设计语言、程序结构和结构化程序设计;第12章至第15章是面向对象程序设计部分,主要介绍了建立在C++程序设计语言基础上的面向对象程序设计方法;第16章至第20章是数据结构部分,主要介绍了数据结构的基本概念、算法,以及如何用C++程序设计语言来实现;第21章介绍了C++标准模板库。\r\n 本书概念清楚,内容充实,取材适当,通俗易懂,既可以直接用做大学计算机及相关专业程序设计语言教程及数据结构的参考书籍,又可以供自学者使用。
第1章 计算机和程序设计语言概述\r\n\r\n1.1 简介 \r\n1.2 计算机发展史简述\r\n1.3 计算机系统的组成\r\n1.3.1 硬件\r\n1.3.2 软件\r\n1.4 计算机语言\r\n1.5 程序设计语言的发展\r\n1.6 高级语言程序的处理过程\r\n1.7 按问题分析—编码—执行循环的程序设计\r\n1.8 面向对象程序设计\r\n1.9 ANSI/ISO标准C++\r\n1.10 小结\r\n1.11 练习\r\n\r\n第2章 C++基础\r\n\r\n2.1 C++程序基础\r\n2.2 数据类型\r\n2.2.1 简单数据类型\r\n2.2.2 浮点数据类型\r\n2.2.3 字符串数据类型\r\n2.3 算术运算符及其优先级\r\n2.3.1 运算符优先级\r\n2.4 表达式\r\n2.4.1 混合表达式\r\n2.4.2 类型转换(强制转换)\r\n2.5 输入\r\n2.5.1 给常量和变量分配内存\r\n2.5.2 将数据存储到变量中\r\n2.6 增量运算符和减量运算符\r\n2.7 输出\r\n2.8 预处理指令\r\n2.8.1 cin和cout与名字空间\r\n2.8.2 在程序中使用string数据类型\r\n2.9 程序的风格和形式\r\n2.9.1 main函数\r\n2.9.2 语法\r\n2.9.3 空格符的使用\r\n2.9.4 分号、大括号和逗号的使用\r\n2.9.5 语义规则\r\n2.9.6 形式和风格\r\n2.9.7 说明文档\r\n2.10 其他赋值语句\r\n2.11 程序范例:长度转换\r\n2.12 程序范例:零钱换整\r\n2.13 小结\r\n2.14 练习\r\n2.15 编程练习\r\n\r\n第3章 输入/输出\r\n\r\n3.1 I/O流和标准I/O设备\r\n3.1.1 cin和析取操作符>>\r\n3.2 在程序中使用预定义函数\r\n3.2.1 cin和get函数\r\n3.2.2 cin和ignore函数\r\n3.2.3 putbaek函数和peek函数\r\n3.2.4 I/O流变量和I/O函数间的点符号(.)\r\n3.3 输入失败\r\n3.3.1 clear函数\r\n3.4 输出和格式化输出\r\n3.4.1 setprecision控制符\r\n3.4.2 fixed控制符\r\n3.4.3 showpoint控制符\r\n3.4.4 setw控制符\r\n3.5 其他的格式输出\r\n3.5.1 fill和setfill\r\n3.5.2 left和right控制符\r\n3.5.3 flush函数\r\n3.5.4 输入/输出string类型数据\r\n3.6 文件输入/输出\r\n3.7 程序范例:电影票销售和慈善捐赠\r\n3.8 程序范例:学生成绩\r\n3.9 小结\r\n3.10 练习\r\n3.11 编程练习\r\n\r\n第4章 控制结构I(选择)\r\n\r\n4.1 控制结构\r\n4.2 关系运算符\r\n4.2.1 关系运算符和简单数据类型\r\n4.2.2 关系运算符和string类型\r\n4.3 逻辑运算符和逻辑表达式\r\n4.3.1 运算符优先级\r\n4.3.2 优化(短路)计算\r\n4.3.3 int数据类型和逻辑(布尔)表达式\r\n4.3.4 bool数据类型和逻辑(布尔)表达式\r\n4.4 选择:if和if…else\r\n4.4.1 单路选择\r\n4.4.2 双路选择\r\n4.4.3 复合(块)语句\r\n4.4.4 多重选择:嵌套if \r\n4.4.5 if…else语句和系列辽语句的比较\r\n4.4.6 使用伪代码进行程序开发、测试和调试程序\r\n4.4.7 输人失败和if语句\r\n4.4.8 恒等运算符(==)和赋值运算符(=)之间容易产生的混淆\r\n4.4.9 条件运算符(?:)\r\n4.5 switch结构\r\n4.6 使用assert函数终止程序\r\n4.7 程序范例:有线电视公司的计费程序\r\n4.8 小结\r\n4.9 练习\r\n4.10 编程练习\r\n\r\n第5章 控制结构II(循环)\r\n\r\n5.1 为什么需要循环\r\n5.2 while循环(重复)结构\r\n5.2.1 情形1:计数器控制的while循环\r\n5.2.2 情形2:结束标记控制的while循环\r\n5.2.3 情形3:标志控制的while循环\r\n5.2.4 情形4:EOF控制的while循环\r\n5.2.5 eof函数\r\n5.3 程序范例:活期账户余额\r\n5.4 程序范例:Fibonacci数列\r\n5.5 for循环(重复)结构\r\n5.6 程序范例:数字分类\r\n5.7 do…while循环(重复)结构\r\n5.8 break和continue语句\r\n5.9 嵌套控制结构\r\n5.10 小结\r\n5.11 练习\r\n5.12 编程练习\r\n\r\n第6章 用户自定义函数I\r\n\r\n6.1 标准(预定义)函数\r\n6.2 用户自定义函数\r\n6.3 带有返回值的函数\r\n6.3.1 return语句\r\n6.3.2 函数原型\r\n6.3.3 执行过程\r\n6.4 程序范例:最大值\r\n6.5 程序范例:有线电视公司的计费程序\r\n6.6 小结\r\n6.7 练习\r\n6.8 编程练习\r\n\r\n第7章 用户自定义函数II\r\n\r\n7.1 无返回值函数\r\n7.1.1 不带参数的无返回值函数\r\n7.1.2 带有参数的无返回值函数\r\n7.1.3 引用参数\r\n7.2 值参数、引用参数和内存地址\r\n7.3 引用参数和带有返回值的函数\r\n7.4 标识符的作用域\r\n7.5 全局变量的副作用\r\n7.6 静态变量和自动变量\r\n7.7 函数重载简介\r\n7.8 带有默认参数的函数\r\n7.9 程序范例:数字分类\r\n7.10 程序范例:数据比较\r\n7.11 小结\r\n7.12 练习\r\n7.13 编程练习\r\n\r\n第8章 用户自定义简单数据类型、名字空间和string类型\r\n\r\n8.1 枚举类型\r\n8.1.1 定义变量\r\n8.1.2 赋值\r\n8.1.3 枚举数据类型上的运算\r\n8.1.4 枚举数据类型和循环结构\r\n8.1.5 枚举数据类型的输人/输出\r\n8.1.6 函数和枚举类型\r\n8.1.7 在定义枚举数据类型同时定义变量\r\n8.1.8 匿名数据类型\r\n8.1.9 typedef语句\r\n8.2 程序范例:剪刀、石头、布的游戏\r\n8.3 名字空间\r\n8.4 string数据类型\r\n8.4.1 其他string类型数据上的操作\r\n8.5 程序范例:PigLatin字符串\r\n8.6 小结\r\n8.7 练习\r\n8.8 编程练习\r\n\r\n第9章 数组和字符串\r\n\r\n9.1 数组\r\n9.1.1 访问数组元素\r\n9.1.2 处理一维数组\r\n9.1.3 数组下标越界\r\n9.1.4 在定义时初始化数组\r\n9.1.5 数组处理中的一些限制\r\n9.1.6 数组作为函数参数\r\n9.1.7 整数类型和数组下标\r\n9.2 C-string(字符数组)\r\n9.2.1 字符串比较\r\n9.2.2 输入输出字符串\r\n9.2.3 字符串输入\r\n9.2.4 字符串输出\r\n9.2.5 在执行时指定输入输出文件\r\n9.3 平行数组\r\n9.4 二维数组和多维数组\r\n9.4.1 访问数组元素\r\n9.4.2 在定义时初始化二维数组\r\n9.4.3 二维数组和枚举数据类型\r\n9.4.4 处理二维数组\r\n9.4.5 将二维数组作为参数传递给函数\r\n9.4.6 字符串数组\r\n9.4.7 定义二维数组的另一种方法\r\n9.5 多维数组\r\n9.6 程序范例:代码校验\r\n9.7 程序范例:文本处理\r\n9.8 小结\r\n9.9 练习\r\n9.10 编程练习\r\n\r\n第10章 递归\r\n\r\n10.1 递归定义\r\n10.2 使用递归解决问题\r\n10.2.1 Hanoi塔:分析\r\n10.3 递归与迭代的比较\r\n10.4 程序范例:将二进制数转化成十进制数\r\n10.5 程序范例:将十进制数转化成二进制数\r\n10.6 小结\r\n10.7 练习\r\n10.8 编程练习\r\n\r\n第11章 结构\r\n\r\n11.1 结构\r\n11.1.1 访问结构成员\r\n11.1.2 赋值\r\n11.1.3 比较(关系运算)\r\n11.1.4 输入/输出\r\n11.1.5 结构变量和函数\r\n11.1.6 数组和结构的比较\r\n11.1.7 含数组的结构\r\n11.1.8 结构数组\r\n11.1.9 嵌套结构\r\n11.2 程序范例:销售数据分析\r\n11.3 小结\r\n11.4 练习\r\n11.5 编程练习\r\n\r\n第12章 类和数据抽象\r\n\r\n12.1 类\r\n12.1.1 类的内建运算符\r\n12.1.2 类的作用域\r\n12.1.3 函数和类\r\n12.1.4 成员函数的实现\r\n12.1.5 类的公有成员和私有成员的顺序\r\n12.1.6 构造函数\r\n12.1.7 调用构造函数\r\n12.1.8 对象数组和构造函数\r\n12.1.9 析构函数\r\n12.2 数据抽象、类和抽象数据类型\r\n12.3 结构和类的比较\r\n12.4 信息隐藏\r\n12.5 可执行代码\r\n12.6 程序范例:糖果自动销售机\r\n12.7 小结\r\n12.8 练习\r\n12.9 编程练习\r\n\r\n第13章 继承和组成\r\n\r\n13.1 继承\r\n13.1.1 基类成员函数的重定义\r\n13.1.2 基类和派生类的构造函数\r\n13.1.3 派生类的头文件\r\n13.1.4 头文件的多重包含\r\n13.1.5 C++流类\r\n13.1.6 类的受保护成员\r\n13.1.7 公有继承、受保护继承和私有继承\r\n13.2 组成\r\n13.3 面向对象程序设计(OOD)和面向对象编程(OOP)\r\n13.3.1 标识类、对象和操作\r\n13.4 程序范例:成绩单\r\n13.5 小结\r\n13.6 练习\r\n13.7 编程练习\r\n\r\n第14章 指针、类、表及虚函数\r\n\r\n14.1 指针数据类型与指针变量\r\n14.1.1 声明指针变量\r\n14.2 取地址运算符\r\n14.3 递引用运算符\r\n14.4 类、结构及指针变量\r\n14.5 初始化指针变量\r\n14.6 动态变量\r\n14.7 指针变量的运算\r\n14.8 动态数组\r\n14.9 浅拷贝、深拷贝及指针\r\n14.10 类与指针:一些特性\r\n14.10.1 析构函数\r\n14.10.2 赋值运算符\r\n14.10.3 拷贝构造函数\r\n14.11 基于数组的表\r\n14.11.1 拷贝构造函数\r\n14.11.2 搜索\r\n14.11.3 插入\r\n14.11.4 删除\r\n14.12 继承、指针和虚函数\r\n14.12.1 类与虚析构函数\r\n14.13 取地址运算符和类\r\n14.14 小结\r\n14.15 练习\r\n14.16 编程练习\r\n\r\n第15章 重载与模板\r\n\r\n15.1 为什么需要重载运算符\r\n15.2 运算符重载\r\n15.2.1 运算符函数的语法\r\n15.2.2 重载运算符:一些限制\r\n15.2.3 this指针\r\n15.2.4 类的友元函数\r\n15.2.5 运算符函数作为成员函数和非成员函数\r\n15.2.6 重载双目运算符\r\n15.2.7 重载流插入和流析取运算符\r\n15.2.8 重载赋值运算符\r\n15.2.9 重载单目运算符\r\n15.2.10 重载增量运算符和减量运算符\r\n15.2.11 运算符重载:成员与非成员的比较\r\n15.2.12 类和指针数据成员(再叙)\r\n15.2.13 运算符重载:结束语\r\n15.3 程序范例:clockType\r\n15.4 程序范例:复数\r\n15.5 重载数组下标运算符\r\n15.6 程序范例:newString\r\n15.7 函数重载\r\n15.8 模板\r\n15.8.1 函数模板\r\n15.8.2 类模板\r\n15.8.3 基于数组的表(再叙)\r\n15.9 小结\r\n15.10 练习\r\n15.11 编程练习\r\n\r\n第16章 链表\r\n\r\n16.1 链表\r\n16.1.1 链表:一些属性\r\n16.1.2 插入及删除节点\r\n16.1.3 创建链表\r\n16.2 作为抽象数据类型的链表\r\n16.3 有序链表\r\n16.4 向链表\r\n16.5 程序范例:影碟店\r\n16.6 小结\r\n16.7 练习\r\n16.8 编程练习\r\n\r\n第17章 栈和队列\r\n\r\n17.1 栈\r\n17.1.1 栈操作\r\n17.2 使用数组实现栈\r\n17.2.1 栈头文件\r\n17.3 程序范例:最高GPA\r\n17.4 使用链表实现栈\r\n17.5 栈应用:后缀表达式计算器\r\n17.6 消除递归:逆向打印链表的非递归算法\r\n17.7 队列\r\n17.7.1 队列操作\r\n17.7.2 使用数组实现队列\r\n17.7.3 用链表实现队列\r\n17.7.4 从类linkedListType派生队列\r\n17.8 队列应用:模拟\r\n17.8.1 客户\r\n17.8.2 服务者(器)\r\n17.8.3 服务者(器)表\r\n17.8.4 等待客户队列\r\n17.8.5 主程序\r\n17.9 小结\r\n17.10 练习\r\n17.11 编程练习\r\n\r\n第18章 查找和排序算法\r\n\r\n18.1 查找算法\r\n18.1.1 顺序查找\r\n18.1.2 有序表\r\n18.1.3 折半查找\r\n18.1.4 有序表的插入\r\n18.2 渐近表示法\r\n18.2.1 基于比较的查找算法的下界\r\n18.3 排序算法\r\n18.3.1 选择排序:基于数组表\r\n18.3.2 分析:选择排序\r\n18.4 插人排序:基于数组表\r\n18.5 插入排序:基于链表\r\n18.5.1 分析:插入排序\r\n18.5.2 基于比较的排序算法的下界\r\n18.6 快速排序:基于数组表\r\n18.6.1 分析:快速排序\r\n18.7 归并排序:基于链表\r\n18.7.1 拆分\r\n18.7.2 归并\r\n18.7.3 分析:归并排序\r\n18.8 程序范例:选举结果统计\r\n18.9 小结\r\n18.10 练习\r\n18.11 编程练习\r\n\r\n第19章 二叉树\r\n\r\n19.1 二叉树简介\r\n19.1.1 拷贝树\r\n19.1.2 二叉树遍历\r\n19.1.3 实现二叉树\r\n19.2 二叉搜索树\r\n19.2.1 二叉搜索树:分析\r\n19.3 非递归二叉树遍历算法\r\n19.3.1 非递归的中序遍历\r\n19.3.2 非递归的前序遍历\r\n19.3.3 非递归的后序遍历\r\n19.4 二叉树遍历与函数参数\r\n19.5 程序范例:影碟店\r\n19.6 小结\r\n19.7 练习\r\n19.8 编程练习\r\n\r\n第20章 图\r\n\r\n20.1 简介\r\n20.1.1 图的定义和符号\r\n20.2 图的表示\r\n20.2.1 邻接矩阵\r\n20.2.2 邻接表\r\n20.3 图操作\r\n20.4 图遍历\r\n20.4.1 深度优先算法\r\n20.4.2 广度优先遍历\r\n20.5 最短路径算法\r\n20.5.1 最短路径\r\n20.6 最小生成树\r\n20.7 小结\r\n20.8 练习\r\n20.9 编程练习\r\n\r\n第21章 标准模板库\r\n\r\n21.1 STL的组成部分\r\n21.1.1 容器类型\r\n21.1.2 顺序容器\r\n21.1.3 顺序容器:向量\r\n21.1.4 所有容器公共的成员函数\r\n21.1.5 顺序容器公共的成员函数\r\n21.1.6 copy算法\r\n21.1.7 顺序容器:双端队列\r\n21.1.8 顺序容器:表\r\n21.2 迭代器\r\n21.2.1 迭代器的类型\r\n21.2.2 流迭代器\r\n21.3 关联容器\r\n21.3.1 关联容器:集合和多重集合\r\n21.3.2 声明集合和多重集合关联容器\r\n21.3.3 集合/多重集合中元素的插入和删除\r\n21.4 容器适配器\r\n21.4.1 栈\r\n21.4.2 队列\r\n21.5 容器、相关的头文件以及迭代器\r\n21.6 算法\r\n21.6.1 STL算法分类\r\n21.6.2 函数对象\r\n21.6.3 插入迭代器\r\n21.6.4 STL算法\r\n21.6.5 函数fill和fill_n\r\n21.6.6 函数generate和generate_n\r\n21.6.7 函数find,find_if,find_end和find_first_of\r\n21.6.8 函数remove,remove_if,remove_copy和remove_copy_if\r\n21.6.9 函数replace,replace_if,replace_copy和replace_copy_if\r\n21.6.10 函数swap,iter_swap和swap_ranges\r\n21.6.11 函数search,search_n,sort和binary_search\r\n21.6.12 函数adjacent_find,merge和inplace_merge\r\n21.6.13 函数reverse,reverse_copy,rotate和rotate_copy\r\n21.6.14 函数count,count_if,max_element,min_element和random_shuffle\r\n21.6.15 函数for_each和transform\r\n21.6.16 函数includes,seUntersection,set_union,set_difference和set_symmetric_difference\r\n21.6.17 函数accumulate,adjacent_difference,inner_product和partial_sum\r\n21.7 小结\r\n21.8 练习\r\n21.9 编程练习\r\n\r\n附录A 保留字\r\n附录B 运算符优先级\r\n附录C 字符集\r\n附录D 运算符重载\r\n附录E ANSI/ISO标准C++和标准C++中头文件命名规则\r\n附录F 头文件\r\n附录G 系统中数据类型长度\r\n附录H 参考文献\r\n附录I 部分参考答案
欢迎使用本书。本书专为两个学期(CSl和CS2)的C++课程而设计,相信它一定能给广大教师和学生以耳目一新的感觉。本课程应作为计算机专业的基础课程。主要目的是激发所有学习程序设计者的学习兴趣,而没有考虑其目前已经达到何种水平。因为对学生的程序设计兴趣的培养和激发是他们学好本课程的关键因素。笔者已经成功地讲授了50多个学期的计算机专业程序设计课程,本书正是从这些课程的讲稿中不断改进、发展而来的最终成果。
《C++编程——数据结构与程序设计方法》一书,刚开始只是为笔者所在学校当时使用的一些程序设计教程所写的简单例题、习题以及大篇幅的代码举例的补充材料。很快,这本补充材料内容多得可以单独成为一本教科书。事实上,本书中所采用的编排方式和讲述方法,会使读者感到概念清晰,易于理解。本书的选材都经过反复推敲,易于学生接受。本书中选用的大多数例题,也都经过课堂上与同学们相互探讨。
无论从事何种职业,将知识在实际中运用才是最重要的。正如厨艺学习者要按照菜谱练习烹饪,小提琴初学者要练习音阶一样,程序设计的初学者一定要亲自动手编写代码来解决问题。本书并不是一本C++参考手册;我们不只是列出C++语法并给出例子,而是进一步揭示出隐藏在各种概念、思想之中的“为什么”。在每一章中,这种关键性的“为什么”的问题都将得以解答。这种方法成为学好C++语言的有效手段。只有让学生们明白“为什么”,才能激发起他们学习的兴趣。
一般来说,C++初学者需要先掌握一门其他的程序设计语言。但是,本书假定读者没有任何程序设计基础。然而,例如代数学等高等数学知识还是必需要具备的。
本书内容
C++语言是从C语言演化发展而来的。现在,它不仅只是作为软件行业广泛使用的一种程序开发语言,为数众多的大专院校已将C++作为第一门程序设计语言课程列在教学计划中。C++融合了结构化程序设计和面向对象程序设计两种方法,本书将分别阐述。
本书应在计算机专业分两个学期讲授,CS1和CS2。第一个学期讲授前12章或13章,其余部分应在第二学期讲授。
1998年7月,正式通过了ANSI/ISO标准C++。本书在主要讲述ANSI/ISO标准C++的同时,也将介绍怎样使用标准C++编写程序。虽然标准C++和ANSI/ISO标准C++大部分语法是相同的,但在本书第8章中还是对ANSI/ISO标准C++支持而标准C++不支持的一些特性做了讨论。
第1章简要回顾了计算机和程序设计语言的发展史。读者在迅速阅读本章之后可以了解一些计算机软、硬件方面的基础知识。本章也同时介绍结构化程序设计和面向对象程序设计的基本概念。
在完成第2章之后,读者将了解C++的一些基本知识,并可以着手编写一些涉及到计算的复杂程序。输入/输出是所有程序设计语言的基础。输入/输出在本章中简要介绍,并在第3章中详细讨论。
第4章和第5章将介绍用来改变程序执行顺序的控制结构。第6章和第7章将讲述用户自定义函数。建议没有任何程序设计基础的读者要在第6章和第7章中多下些功夫。第7章中使用大量举例帮助读者理解参数传递和标识符作用域的概念。
第8章将讨论用户自定义的简单数据类型(枚举类型)、ANSI/ISO标准C++的名字空间机制以及string类型。早期版本的C语言不支持枚举类型。枚举类型的用途十分有限,其主要作用是增加程序的可读性。本书的编排也充分考虑到这一点,读者可以在第一次阅读本书时略过枚举类型部分,并不会感到不连贯。枚举类型部分可以放在后面仔细阅读。
第9章将详细说明数组,第10章将介绍并讨论递归。
第11章将介绍结构。本书中介绍的结构与C语言中的结构极为相似。实际上,本章也可以略过,因为结构并不是后续章节所必须知道的预备知识。
第12章开始讲述面向对象程序开发技术(OOP),并介绍类。本章前一部分将介绍类的定义和使用,后一部分介绍抽象数据类型(ADTL本章也将指出为什么类成为C什中实现抽象数据类型的很自然的方法。第13章继续介绍面向对象程序设计(OOD)和面向对象程序开发的基础概念,并讨论继承和组成。本章解释了为什么类成为C++中实现抽象数据类型的一种很自然机制,并介绍C++是怎样支持面向对象程序开发的。本章同时也讨论了在解决具体问题时应该怎样去定义类。
第14章将详细讨论指针。在介绍指针的基础知识和怎样在程序中使用指针之后,本章着重讨论了含有指针类型数据成员类的特性,以及怎样避免由指针引起的错误。本章进一步指出了怎样利用动态数组存储和处理列表。本章同时还将讨论怎样通过虚函数来实现多态机制。
第15章继续讲述面向对象程序设计和面向对象程序开发,并将重点讨论C++的多态机制。本章具体地讨论了C++中的两种类型的多态机制——重载和模板。
第16章和第17章专门论述数据结构。第16章将详细讨论链表,第17章将讨论栈和队列。这两章所提供的程序代码对于该类型数据结构都是通用的。这两章充分使用了面向对象程序设计的基本概念。
第18章讨论了多种查找和排序算法。在指出这些算法原理的同时,本章还提供了关于这些算法执行效率的相关分析。算法分析使程序设计者能够在解决具体问题时知道应选用何种算法。本章同时介绍了多种排序算法,教师可以根据实际情况选择讲授其中的几种算法。
第19章介绍了二叉树。本章讨论和讲述了二叉树的基本性质和各种遍历算法。本章还介绍了一种特殊的二叉树——二叉查找树,介绍并举例说明了二叉查找树的查找、插入和删除算法。本章同时提供了二叉树的非递归遍历算法。为了增加遍历算法的灵活性,本书介绍了怎样构造和传递函数指针参数。
第20章讨论了图论中的一些算法。本章在介绍了图论中的一些基本术语后,讨论了图在计算机存储器中的表示方法;同时也讨论了最短路径和最小生成树等图的遍历算法。
C++自带了功能强大的类库——标准模板库(STL),其中的数据结构和算法可以有效地在应用程序中广泛使用。第21章详尽地讲述了标准模板库。在介绍了标准模板库三种基本的组成部分后,本章说明了在程序中该如何使用顺序容器;同时也讨论了栈和队列等具体容器。本章后半部分讲述如何在程序中使用各种标准模板库算法。本章的内容相当多,如果时间有限,教师可以只讲授顺序容器、栈类、队列类和其他一些算法。
附录A给出了C++中的保留字。附录B给出了C++中运算符的优先级和结合律。附录C给出了ASCII码字符集和EBCDIC码。附录D给出了C++中可以重载的运算符集。附录E给出了ANSI/ISO标准C++和标准C++头文件的习惯命名方法。附录F讨论了一些广泛使用的程序库和相应的标准C++的头文件名。通过运行附录G中的程序,可以知道所使用系统中的各种内置数据类型所占用的存储空间大小。附录H列出了深入学习C++语言所用到的参考资料。附录I给出了本书中部分习题的参考答案。
本书特点
本书中每一章都有如下特点,读者既可以在本书的指导下学习,也可以根据本人的实际情况选择性地学习:
●每章的“本章要点”简述了在本章中要详细讨论的C++程序设计概念。
●“注意”强调了各章节中的概念要点。
●375张插图详尽地解释了难于理解的概念。
●统一编号的例题可以帮助读者理解关键概念及相关程序代码。例题中的程序代码行编号以便于参照,同时给出程序运行举例和代码行执行的结果和注释。
●.每章章尾的程序范例都是完整的程序代码。这些程序范例中包括输入、输出、问题分析和算法设计,以及完整的程序代码清单。
●小结总结了每章的重要概念。
●练习用来巩固学习成果,并可以用来检查学生是否真正地理解了该章的主要内容。
●编程练习培养学生亲自动手编写C++程序的能力。
自始至终,本书在适当的时机引入相应的概念,便于学生学习。本书的写作风格不拘泥于形式,通俗易懂,很适于在课堂上讲授。在介绍重要概念之前,本书将解释为什么某些元素是必需的。然后,使用举例和小程序来讲述概念。
本书中每一章都有两种类型的程序。第一种是带有编号的范例(例如:例4.1),它们都是一些小程序,用来帮助理解重点概念。这种小程序的每一行代码都有编号,并给出了程序运行范例和逐行解释。
本书中提供了大量的程序范例,这些程序范例是本书的精髓。
本书中的程序都经过精心设计,便于读者理解。每一个程序范例都有问题分析和算法设计。然后,每一步算法都给出相应的C++程序代码。为了帮助学生提高解决问题的能力,这些程序代码详细地告诉读者怎样用C++程序设计语言实现程序设计的基本概念和基本思想。强烈建议读者仔细阅读程序范例,以便提高学习效率。
每一章后面的小结部分可以帮助读者巩固学习成果。在阅读每一章后,读者可以迅速地浏览本章的重点知识,然后使用后面提供的练习来测试学习效果。许多学生都将在考试前阅读小结中的要点,作为一种快速复习的方法。
本书提供的所有程序源代码都通过编译,保证符合ANSI/ISO标准C++和标准C++的标准。可以使用Microsoft码Visual C++6.0,Borland C++Builder5开发工具或是MetrowerksCode Warrior编译这些程序。
教学工具
教师可以在课堂讲授本书的同时使用下列辅助教学工具。这些辅助教学工具附在光盘中,教师可以根据书后所附的“教学支持说明”,向有关出版商索取。
电子教师手册 该教师手册包括以下内容:
●附加的授课资料,帮助教师做好课前准备,包括对授课内容的建议。
●每章后面练习的参考答案,包括编程练习。
ExamView 本书提供的ExamView是一套功能强大的考试软件包。教师可以使用它进行以下三种方式的考试:试卷式,(局域网)计算机上考试和Internet上考试。ExamView包括大量关于本书中涉及到的内容的试题,可帮助学生获得详细的学习指南。计算机上和Internet上的考试工具可以使学生们在自己的计算机上完成考试,并且可以节省教师的工作时间,因为这两种考试是计算机评分的。
PowerPoint幻灯片 本书的每一章都有相应的Microsoft PowerPoint幻灯片。这些幻灯片可以作为辅助教学工具在课堂上放映使用,也可以放在网络文件月盼器上供学生复习肘使用,还可以打印出来分发给学生。教师在授课时可以根据情况增加自己的幻灯片页面。
远程学习 Course Technology公司以在WebCT上提供在线教育服务而闻名,而黑板教学可以使学生们以最详尽、最大限度交互的方式进行学习。当教师为其部分课程提供网上教学方式时,不仅可以增加很多内容,如自测考题、相关连接和词汇表,更重要的是培养了学生了解21世纪获取重要信息资源的方法。希望各位教师能给其讲授的绝大多数课程同时提供在线教学和离线教学两种方式。如果需要进一步了解怎样为讲授的课程提供远程教学方式,请与所在地的Course echnology公司销售代表联系。
程序源代码 程序源代码同时以ANSI/ISO标准C++和标准C++种格式给出。它们既可以在网站www.course.com上获得,又可以在教学工具光盘(参见本书后面所附的“教学支持说明”)中获得。运行某些程序代码的输入文件也随源代码提供给读者。但是,运行程序时,这些输入文件需要存储在软盘并插入到计算机的软驱中。
解答文件 解答文件同时以ANSI/ISO标准C++和标准C++种格式给出。既可以在网站WWW.COurse.com上获得,又可以在教学工具光盘中获得。运行某些程序练习代码的输入文件也随源代码提供给读者。但是,运行程序时,这些输入文件需要存储在软盘并插入到计算机的软驱中。
致谢
许多人为本书的成功出版做出了重要贡献。在这里,笔者必须要向他们表示衷心感谢。首先,我要向William Newman博士表示感谢,他负责审校第二稿手稿,找出并改正错误,并且提出了大量的改进意见。必须要向我的学生们表示感谢,他们在我准备出版该书时主动地告诉哪些部分需要重新措辞以便于理解。要向长期以来不断支持本书出版项目的S.C.Cheng教授、John N.Mordeson教授和VasantRaval教授表示感谢。Randall L.Crist博士,他的办公室在我办公室的隔壁,在审校工作中随时帮我检查书稿,在这里向他表示感谢。必须要向Creighton大学技术转让办公室主任LeeI.Fenicle表示感谢,他积极地参与、支持此项工作,并在我感到灰心时不断地鼓励我。同时,也要向参加本书初稿审阅工作的那些不知名的工作人员表示衷心感谢,他们为本书的改进工作提出了许多宝贵意见。
在这里,向以下参加审阅的工作人员表示诚挚谢意。他们一丝不苟地审阅了本书当前版本的每一章节,并为本书的改进提出了宝贵意见。他们是:Wisconsin大学(位于RiverFalls)的Ahmad Abuheileh,North Carolina大学(位于Charlotte)的C. Michael Allen,Wisconsin大学(位于Milwaukee)的Paul Ambrose,Capitol学院的Julie Anderson,Kentucky大学的Carol Hannahs和Austin Com—munity学院的JudyScholl。此外,必须要向如下参加审阅本书的工作人员表示感谢,他们是:SLEdward's大学的James McGuffee和Austin Community学院的Thomas Murtagh。这些参加本书审阅的工作人员会认识到他们的建议没有被忽视。事实上,正是这些建议为本书的改进做出了重要贡献。感谢设计编辑Susan Gilbert,她认真编辑本书,并及时定版。如果没有高级编辑Jennifer Muroff的精心设计,本书也不会呈现在读者面前。在这里,要向Jennifer Muroff和制作编辑Aimee Poirier,以及Course Technology公司负责对代码进行认真测试的质量控制部门的工作人员表示诚挚的谢意。
本书献给我的父母!在他们祝福下本书得以顺利出版,我感谢他们。
最后,要感谢一直支持我工作的妻子Sadhana和女儿Shelly。特别是Shelly,在我编写本书遇到极大困难并感到万分沮丧的时候不断地鼓励我,并帮助我审阅修改的内容。Shelly总是能在我承担这种棘手的工作时为我带来欢乐。
欢迎读者对本书提出建议。建议可以发送至电子邮箱:malik@creighton.edu。