《易学C++》第一版于2007年10月完稿,由人民邮电出版社于2008年6月出版。全书共356页,约590千字。在第一版出版之前,上海的《青年报》对这本书的出版进行了报导。
80后一代再出手 大四学生一不小心搞出《易学C++》 2008-04-12 02:58 来源:青年报 作者:唐骋华 孔亮 《三国志》和C++程序,哪个更难?答案是:都很难。不过不用担心,就像《三国志》出了一个风趣幽默的讲解人易中天,如今C++领域,也有了面向民众的“导游”。不是易中天又进行跨领域研究,而是冒出一位“小易中天”———上海大学大四学生潘嘉杰。他用诙谐的语言、四两拨千斤的精妙比喻,带您走入程序设计的天地。 ●新闻背景 伴随着计算机的普及化,加之行业的竞争日趋激烈,越来越多的人不满足于仅有的计算机知识。尤其是年轻人,他们一直忙于参加各种计算机的培训,试图考出一张计算机证书,为自己今后踏上就业岗位增加筹码。 作为计算机知识架构中的一种,程序设计由于其难度较大,使得相当一部分年轻人们望而却步。但是也有一些年轻人勇于挑战这“难啃的骨头”,他们不但克服程序设计本身的难度,而且将自己的体会和学习方法写成教材出版,本文的主人公潘嘉杰正是这样一个人。 低调男生眼界比天高 潘嘉杰有一双“迷你”的眼睛,眼界却比天还要高。 “这本书估计能卖几本?”书,指即将诞生的《易学C++》,谈到它,潘嘉杰模仿起周星驰的无厘头腔调:“如果非要加一个上限,我希望是100万本。”这还不算狂的,大四就能编教材,我们问他是不是班上电脑水平最高的,他侧头略作思考,随后笑笑,算承认了。未来就像潘嘉杰手里的电脑程序,一切都顺理成章。 其实在老师和同学们印象里,潘嘉杰一直是“蛮低调”、“蛮内向”的乖男孩,但恐怕连他自己也未曾意识到,自信、搞笑乃至张扬这些80后的“标志色”,也同样悄悄烙上了他的青春———尽管对于80后的代表人物,潘嘉杰只说得出郭敬明和韩寒。 如今,“蛮低调”的潘嘉杰要出教材了,并且,由专门发行计算机书籍的人民邮电出版社出版。起点这么高,看样子,他想低调也低调不起来。我们特地登录几大著名网络书店搜索,发现关于C++程序的教材多达数十种,那么,潘嘉杰的这本教材,有什么与众不同呢? “目前C++教材都是专家、学者编写的,太学术、太专业,晦涩难懂。有的网友曾向我反映,读了好几本书如云山雾罩,仍然不得要领。而我这本书,最大的特点就是通俗易懂,用形象的比方来阐释各种语法和知识点。”潘嘉杰的得意之笔,是将“循环语句”比作成F1赛事,而其中某些可以跳过的环节,就被比作赛车进维修站。别人很难讲清楚的难点,他用四两拨千斤的比喻,迅速化解。 这样看来,潘嘉杰有些接近易中天。两个人都努力把外行人难以理解的学问,用灵活的语言和形式,进行普及推广。易中天自称搞的是萝卜史学、青菜史学,据此,我们不妨将潘嘉杰的方法称作“萝卜编程”或“青菜编程”。 自由精髓在于资源共享 不过最初,潘嘉杰的处女作有一个很不易中天的名称,《C++程序设计导论》,足以会扑灭初学者的信心和乐趣。后来听室友说了句“easy”,触动了潘嘉杰的灵机:easy,易学,轻松并亲切着,不是很好吗? 书名敲定,写作过程却并不easy。为了说清楚一个概念,他的联想力要在神经中艰苦跋涉,书中70%的例子,都是“自创”的。如“函数的重载”一节,他始终难以用形象化的语言进行描述,日思夜想、辗转反侧,和许多科学家一样,在梦里,给他逮着了:“函数的重载”用途广泛,像不像“多功能开瓶器”呢? “像!”学生们响亮的回答让潘嘉杰颇感欣慰———不,我们已跳出梦境,直击现场。现场,潘嘉杰转换了角色,站在电脑教室的大投影仪前,底下,是30多名高中生,电脑屏幕映照着他们青春期的脸庞。那是在2006年9月,年仅大三的潘嘉杰在大学期间的第一次志愿者活动竟是“客串”成了北郊中学教师的角色。 潘嘉杰的任务是开C++兴趣课呈,每周一次。受了10多年教育,他要教育人了。但第一堂课很失败,“讲得枯燥,我怀疑他们要么偷偷上网,要么昏昏欲睡。”大学里遇到类似情形,可能会有逃课现象,高中生虽老实,却不构成沦为庸师的理由。潘嘉杰开始反思。以后,他用活泼的语言、贴近生活的方法,教学生设计小游戏、设计一元二次方程的程序等,以此激发兴趣。经过四五节课的摸索,大获成功。 备课常常花掉潘嘉杰两三个小时,许多看似信手拈来的精彩比喻,都要绞尽脑汁。学业本已繁重,志愿者又基本没报酬,为什么还乐此不疲?“让别人了解计算机是件很快乐的事。”尽管Windows操作系统更为常用,潘嘉杰仍很激赏Linux开放源代码、免费提供的风格。“这就是网络精神,自由精神。”他说,自由的精髓在于资源共享———如教书,如编教材。 探寻未知世界的脉络 或许,潘嘉杰之所以激赏Linux,也来源于内心的一股隐秘冲动。 Windows是普及最广的操作系统,直观、便捷;相反,Linux显得原始、落后。潘嘉杰以U盘举例:在Windows界面下,U盘即插即用,而在大多数Linux界面下,插入后必须输入命令,才能使用。既然如此麻烦,Linux何以仍然受到欢迎,以至和Windows唱了那么久的“对台戏”? 潘嘉杰年纪轻轻,接触电脑则更早。小学一年级,绝大多数幼童还没搞明白什么是computer,潘嘉杰已经学会了不少基本知识。小手敲击键盘的模样,就像学习走路的双脚,蹒跚但充满希望。“我的启蒙老师是爸爸从前的同事,很巧,她也是上大(原上工大)毕业的。”同时,潘嘉杰的家里有许多电脑书籍,大多为上世纪80年代出版,教BASIC语言。至今,潘嘉杰还会使用这种“古老”的计算机语言。 到了初中,潘嘉杰已能独自设计一些简单的程序了,高中,他对计算机的痴迷达到了疯狂的地步。“天天窝在家里编程序,废寝忘食,做梦都在设计思路。”当时潘嘉杰的电脑是586兼容机,随着知识越来越丰厚,他开始自己排除故障,并为电脑升级。他先解决了内存的接触不良问题,随后又将16兆内存加至32兆。 “我从来没买过品牌机。”从编程到组装电脑,潘嘉杰逐渐摸清了电脑的各个部位。他的绝活是,在为电脑连线时,只要摸一下接口,就知道哪根线应该往哪儿插。 潘嘉杰的经历,足以解释他对Linux的偏爱。Windows与Linux最明显的差别是,前者多用鼠标,后者则多要输入命令行。点击鼠标也是输入命令,只不过是间接的,而潘嘉杰这类“骨灰级玩家”,更喜欢看着自己下达的指令,按部就班地展现。因此,潘嘉杰也很钟爱DOS。“现在某些病毒制作者水平低,只要在DOS下删除主文件,病毒就崩溃了。”话语里,透露着不屑。 老师眼中的编程奇才 “他?蛮低调蛮内向也蛮优秀的,而且一直在做志愿者。”上大计算机学院团委书记、潘嘉杰的辅导员宋华未老师如是说。 “以前只当他是个好学生,直到有一天他跑过来说:‘徐老师,您能帮我写个序吗?’我才知道,他居然出了本教材。”上大计算机学院党委书记、博士生导师徐炜民如是说。 踏实、低调、优秀……是老师们提到潘嘉杰时,最常蹦出嘴的“关键词”。的确,刚开始《易学C++》是挂在网络论坛上任人浏览的,如果不是被某出版社编辑慧眼相中,恐怕他永远想不到会把它付梓出版。潘嘉杰的初衷也很简单,供需要的网友交流、学习,这也体现了他津津乐道的“自由精神”。 即便书得以出版,在对内容比较自信之外,潘嘉杰依旧保持着谦虚,不住地感谢网友的帮助与切磋。书即将面世,但欣喜之余,他对目前中学计算机教育有些担忧。他认为,计算机虽然不是主课,但现在的课时安排还算合理,不过最严重的问题,一是讲解枯燥,引不起学生兴趣,二是脱离实际,缺乏可操作性。当年潘嘉杰迷恋编程,就与启蒙老师教他玩小游戏密不可分。日后成为80后心目中“怀旧经典”的《超级玛丽》,他就是在那时学会的。 潘嘉杰编写《易学C++》的动机,也就是想让更多青少年喜欢编程。“一般需要四五十万字,但这本书仅28万字,我就是不希望写成‘大部头’,把大家吓跑。”当然,如徐炜民老师所言,新教材肯定有不够完善的地方,但这件事本身就很有意义,“研究生都写不出来,何况他还是本科生。”徐老师更看重的,是潘嘉杰所体现出的社会责任感。 访谈结束前,询问潘嘉杰毕业有的去向,他说得很轻,我们只隐约听见“核工程”。一激动,想问问清楚,又觉得还是留点遐想空间吧。如果某天,能在某篇嘉奖令里同他邂逅,不是更好吗? |
《易学C++》第一版共有20章,章节编排如下:
第一篇 过程化的程序设计
第1章 良好的学习开端
1.1 软件与程序
1.2 程序设计要做什么
1.3 选好一种语言
1.4 C++能够做些什么
1.5 C语言、C++和Visual C++的关系
1.6 学习程序设计的方法和必要准备
1.7 总结
第2章 Hello,World
2.1 如何创建一个示例程序
2.2 创建自己的Hello,World
2.3 C++语言的输出与输入
2.4 方法指导
2.5 习题
第3章 各种各样的“箱子”——变量
3.1 会变的“箱子”——定义变量
3.1.1 C++数据类型
3.1.2 变量名
3.1.3 变量的初始化
3.2 常用的基本数据类型
3.2.1 整型(Integer)
3.2.2 实型(Real)
3.2.3 字符型(Character)
3.2.4 布尔型(Boolean)
3.3 不会变的“箱子”——定义常量
3.4 C++算术表达式
3.4.1 赋值
3.4.2 除、整除和取余
3.5 “箱子”的转换——数据类型转换
3.5.1 隐式转换
3.5.2 显式转换
3.6 方法指导
3.7 习题
第4章 要走哪条路——条件语句
4.1 如果……
4.1.1 条件——关系运算
4.1.2 条件——逻辑运算
4.1.3 &&和||的妙用
4.2 否则……
4.2.1 如果与否则
4.2.2 如果里的如果——if的嵌套
4.2.3 找朋友
4.3 爱判断的问号
4.4 切换的开关
4.4.1 多路开关——switch
4.4.2 巧用switch
4.5 方法指导
4.6 习题
第5章 有个圈儿的程序——循环语句
5.1 程序赛车
5.1.1 循环语句for
5.1.2 加加和减减
5.1.3 巧用for
5.2 退出比赛和进维修站
5.2.1 退出比赛——break
5.2.2 进维修站——continue
5.3 圈圈里的圈圈
5.3.1 C++循环的嵌套
5.3.2 怎么让输出的东西更好看
5.4 While循环
5.4.1 当型循环
5.4.2 导火索——do
5.5 方法指导
5.6 习题
第6章 好用的“工具”——函数
6.1 简单的“工具”——函数
6.1.1 “工具”的说明书
6.1.2 如何使用系统造好的“工具”
6.2 打造自己的“工具”
6.2.1 C++函数的声明
6.2.2 函数的定义
6.2.3 函数是如何运行的
6.2.4 返回语句——return
6.2.5 关于主函数
6.2.6 同名同姓——参数定义
6.2.7 函数存在的意义
6.3 多功能“开瓶器”——函数重载
6.4 自动的“工具”
6.4.1 默认参数
6.4.2 定义默认参数的顺序
6.4.3 默认参数和重载函数的混淆
6.5 给变量和参数起个“绰号”——引用
6.5.1 引用的声明
6.5.2 用引用传递参数
6.6 *函数里的函数——递归
6.7 方法指导
6.8 习题
第7章 好大的“仓库”——数组
7.1 让计算机处理更多数据——使用数组
7.1.1 C++中数组的声明
7.1.2 数组的操作
7.1.3 数组的初始化
7.1.4 省略数组大小
7.2 仓库是怎样造成的
7.2.1 内存和地址
7.2.2 C++数组在内存中的存储情况
7.2.3 字符的存储情况
7.2.4 字符数组在内存中的存储情况
7.3 向函数传递数组
7.4 C++二维数组
7.4.1 线与面——一维数组和二维数组
7.4.2 二维数组的声明和初始化
7.4.3 省略第一维的大小
7.4.4 二维数组在内存中的存储情况
7.4.5 向函数传递二维数组
7.4.6 二维数组转化成一维数组
7.5 方法指导
7.6 习题
第8章 内存里的快捷方式——指针
8.1 什么是指针
8.2 C++中指针变量的声明和使用
8.2.1 指针的类型
8.2.2 指针变量的声明
8.2.3 获取地址和指针变量初始化
8.2.4 特殊的值——NULL
8.2.5 指针的使用——间接引用
8.3 指针的操作
8.3.1 指针的加减运算
8.3.2 指针的关系运算
8.4 指针与保护
8.4.1 对内存只读的指针
8.4.2 指针型常量
8.5 指针与数组
8.5.1 数组名的实质
8.5.2 指针数组
8.6 指针与函数
8.6.1 指针作为参数
8.6.2 指针作为返回值
8.7 更灵活的存储——堆内存空间
8.7.1 如何获得堆内存空间
8.7.2 有借有还,再借不难——堆内存的回收
8.8 方法指导
8.9 习题
第9章 自己设计的箱子——枚举和结构
9.1 我的类型我做主——枚举类型
9.2 设计一个收纳箱——定义结构类型
9.3 C++结构与函数
9.3.1 结构作为参数
9.3.2 结构作为返回值
9.4 C++结构数组与结构指针
9.4.1 结构数组
9.4.2 结构指针
9.5 自行车的链条——链表
9.6 C++链表的实现
9.6.1 链表的创建和遍历
9.6.2 链表的查询
9.6.3 插入结点
9.6.4 删除结点
9.6.5 清除链表
9.7 方法指导
9.8 习题
第二篇 实战程序设计
第10章 高效阅读程序代码
10.1 整体把握法
10.1.1 阅读C++代码的顺序
10.1.2 整体把握语意
10.2 经验法
10.3 模拟法
10.4 方法指导
10.5 习题
第11章 调试程序代码技巧
11.1 再谈变量
11.1.1 标志符
11.1.2 C++全局变量和局部变量
11.1.3 静态局部变量
11.1.4 变量的作用域
11.1.5 变量的可见性
11.2 C++头文件的奥秘
11.2.1 如何创建一个头文件
11.2.2 C++程序中头文件的作用
11.2.3 头文件和源文件
11.2.4 细说#include
11.2.5 #include中尖括号和双引号的区别
11.3 更快更好地完成程序调试
11.3.1 如何检查语法错误
11.3.2 常见语法错误及解决方法
11.4 最麻烦的问题——运行时错误
11.4.1 见识运行时错误
11.4.2 查找错误点
11.5 调试工具——Debug
11.5.1 设置和移除断点
11.5.2 Go语句
11.5.3 Debug窗口
11.5.4 Watch窗口
11.5.5 用Debug找到错误
11.6 方法指导
11.7 习题
第12章 编写程序技巧
12.1 程序设计的基本步骤
12.2 三类C++编程问题
12.2.1 算法实现
12.2.2 匹配实现
12.2.3 功能实现
12.3 函数的递归
12.3.1 什么是栈
12.3.2 函数的调用机制
12.3.3 小试牛刀——用递归模拟栈
12.3.4 *递归的精髓
12.4 方法指导
12.5 习题
第三篇 面向对象的程序设计
第13章 初识对象
13.1 对象的定义
13.2 一个字符串也是对象
13.2.1 奇妙的点
13.2.2 对字符串的操作
13.3 面向对象特点一:封装性
13.4 从数组到向量
13.4.1 向量的性能
13.4.2 万用的模板
13.4.3 对向量的操作
13.5 方法指导
13.6 习题
第14章 再识对象
14.1 类是一种数据类型
14.1.1 类与结构
14.1.2 类的声明与定义
14.2 公有和私有
14.3 成员函数
14.3.1 成员函数的声明
14.3.2 常成员函数
14.3.3 成员函数的重载
14.3.4 成员函数的定义
14.4 对象、引用和指针
14.4.1 对象的引用
14.4.2 对象指针
14.5 方法指导
14.6 习题
第15章 造物者与毁灭者——对象生灭
15.1 麻烦的初始化
15.2 造物者——构造函数
15.2.1 构造函数的声明与定义
15.2.2 带参数的构造函数
15.3 先有结点,还是先链表
15.4 “克隆”技术——拷贝构造函数
15.4.1 拷贝构造函数
15.4.2 默认拷贝构造函数
15.4.3 拷贝构造函数存在的意义
15.5 毁灭者——析构函数
15.6 方法指导
15.7 习题
第16章 共有财产·好朋友·操作符
16.1 有多少个结点
16.1.1 静态成员数据
16.1.2 静态成员数据的初始化
16.1.3 静态成员函数
16.2 类的好朋友——友元
16.2.1 友元类
16.2.2 友元函数
16.2.3 使用友元的利与弊
16.3 多功能的操作符——操作符的重载
16.3.1 操作符作为成员函数
16.3.2 操作符作为友元函数
16.3.3 又见加加和减减
16.4 方法指导
16.5 习题
第17章 父与子——继承
17.1 剑士·弓箭手·法师的困惑
17.2 面向对象特点二:继承性
17.3 继承的实现
17.3.1 私有和保护
17.3.2 一个简单的例子
17.3.3 继承的方式
17.4 子类对象的生灭
17.4.1 子类对象的构造
17.4.2 子类对象的析构
17.5 继承与对象指针
17.5.1 父类指针与子类对象
17.5.2 猜猜它是谁——覆盖
17.6 面向对象特点三:多态性
17.7 多态与虚函数
17.7.1 多态的实现
17.7.2 无法实现多态的虚函数
17.8 虚函数与虚析构函数
17.9 抽象类与纯虚函数
17.10 多重继承
17.11 方法指导
17.12 习题
第18章 再谈输入与输出
18.1 cout和cin真正含义
18.2 输入输出的重定向
18.2.1 输入重定向
18.2.2 输出重定向
18.2.3 无法被重定向的cerr
18.3 文件的输入与输出
18.4 更巧妙地输入和输出
18.4.1 能整行输入的getline
18.4.2 能读取判断末尾的eof
18.4.3 能计数的gcount
18.4.4 能设置域宽的width
18.5 插入操作符的重载
18.5.1 插入操作符
18.5.2 插入操作符的常用重载方式
18.6 方法指导
18.7 习题
第19章 万用的模板
19.1 函数模板
19.1.1 声明与定义函数模板
19.1.2 函数模板与重载
19.2 类模板
19.2.1 类模板的声明和定义
19.2.2 链表类模板实例
19.3 方法技巧
19.4 习题
第20章 异常的处理
20.1 亡羊也要补牢——程序出错处理
20.2 处理异常
20.2.1 尽力尝试——try语句
20.2.2 抓住异常——catch语句
20.3 抛出异常——throw语句
20.4 方法指导
20.5 习题
《易学C++》第一版封面

《易学C++》亦于2008年12月版权输出至台湾地区,由悦知文化出版。
