回 帖 发 新 帖 刷新版面

主题:写了2年的初学者C++基础教程,今天终于出版了《易学C++》

[size=3][color=FF0000]本书已交由人民邮电出版社出版发行。[/color]

[b][size=4][color=0000FF]购买《易学C++》网址:[url]http://www.china-pub.com/39862[/url],欢迎大家捧场![/color] [/size][/b]

完整版含附录,其中包括C++常用关键字及含义、所有练习的参考答案等。[/size]
编写的主旨就是不要一下子把什么都说出来,而是一点一点循序渐进地增长读者的能力。
摒弃直接使用专业的术语,而是以形象地比喻来介绍程序设计中的内容,比如把变量比作箱子,把分支语句比作开关等等。对没有程序设计基础的朋友来说,也能够轻松地看懂。
同时也注重提高读者的实际能力,在书中穿插讲述一些常用的小算法和小技巧,尽量避免看得懂书却写不来程序的情况。
[color=FF0000][size=4]下载[/size]请到[url]http://www.tomatostudio.net.cn[/url]
e-mail:[email]tomatostudio@126.com[/email][/color]

回复列表 (共59个回复)

31 楼

ding 

32 楼

这次更新的周期实在是有点长了,主要是最近真的很忙,一边上课做单片机实验,一边ACM训练,一边帮论坛做手册,一边还在写着自己的书。
通过上次和一位学长的交流,我觉得还是有必要把主函数返回类型改为整型。的确,在有标准存在的情况下,不符合标准的教材就是不合格的产品,所以,无论如何应该贯彻这个标准。于是我把所有的主函数全都改为返回整型了。如有疏漏或写的不自然之处,欢迎来提建议!
本册更新的主要内容是如何编写程序,我从算、找、实现功能三方面作为分类,讲述如何解决问题,编写程序,并在“算法时间”中,指出了掌握好这三者的核心。接下来稍微介绍了一下驱动测试的程序设计,其实这也是偶然的机会在编译原理课上和别的同学讨论看到的,我觉得这种主导思想和我自己的想法很符合,而且很多时候我也是用类似与这样的方法来做一个程序的,所以也拿出来提一下。最后讲了递归,其实我自己并不爱好递归,平时也不经常使用,虽然也用来写过程序。我想主要是要交待一个调用函数的机制,这对了解高级语言和对以后数据结构的学习有好处。
本次内容节选:

当我们遇到一个问题,它往往不是一个直接用程序代码描述的问题,比如:统计销售量和利润,寻找出行的公交线路,将中文翻译成英语等等。所以我们先要把实际问题转化成一个电脑能够解决的问题,而大多数问题一般分为三类:
(1)算:计算利润,计算一元二次方程的根,计算一个数列的和等等。
(2)找:找最大的一个数,找最短的一条路径,找一个字符串的位置等等。
(3)实现功能:实现撤销、重做的功能,实现模拟某种操作的功能等等。有时候实现功能问题可以拆解为若干个“算”和“找”的问题。

可通过递归解决的问题往往能够转化为若干个解决步骤,并且第n步和第n+1步有着类似或相同的限制条件。比如一个数列的递推公式:
an=3an-1+2,an-1=3an-2+2,an-2=3an-3+2,……,a1=3a0+2,a0=1,它的相邻两项有着相同的关系,即求第n项和第n+1项有着相同的方法。唯一的不同就是a0=1,我们把这种与众不同的方法称为递归出口,不断调用函数的递归将在那里终止。

33 楼

非常好的一本书!!

34 楼

看了一下,恩,不错!继续。

35 楼

这次写的是一个短章节。终于开始面向对象啦!其实我觉得我认识的对象还是从VB开始的。一上来就说什么是对象,越说越不清楚。但是一旦先学会了使用对象,那么在使用中就会慢慢体会到什么是对象了。所以本章主要让读者学会使用字符串和向量。只要大家能够看懂程序,会自己改写就行了,不必去深究一些概念。下一章会从概念上更加详细地阐述什么是对象,什么是类。
  字符串和向量的使用中有出现迭代器的概念,虽然它是个非常重要而常用的东西,但是为了不增加大家的负担,我还是避开了这方面的知识。我会根据本章发布后的反馈情况来决定是否以后再补充这个知识点。

本次内容节选:

  其实单词Object更直观的翻译应该是物体。世界就是由各种物体组成的,比如某一辆汽车、某一个人、某一个杯子等等,这些都可以看作对象。
  任何一个对象往往有一些具体的属性,比如某汽车的品牌、型号、排量,某人的性别、身高、体重,某杯子的口径,材质等等。任何一个对象往往能进行一些操作,比如汽车可以开动、拐弯,人可以走路、吃饭,杯子可以被打破等等。
  所以,对象就是任何我们可以想象出来的具体的物体。

  在使用字符串类的时候,我们发现它和字符数组一个很明显的不同就是,我们无法对数据进行直接的修改和操作。如果有一个char a[]="Hello";,那么我们可以直接用a[0]= 'h';来修改存储在内存中的字符,甚至我们可以输出数组的首地址来了解这个数组到底存放在什么位置。而对于一个string a("Hello");,我们却无法直接修改它的数据,因为所有对a的操作都是由成员函数所定义的。我们只能了解这个字符串的存在,但它具体存储在于内存的什么位置,我们无法通过除了对应操作以外的简单方法得知。(如使用取地址操作符)
  由于我们不是字符串类的设计者,当我们对string进行种种操作时,我们只能了解到它的操作结果,而对它的操作原理和操作实现过程却无法得知。
  我们把类的数据不可知性和操作实现过程不可知性称为类的封装性。
  不难理解,作为使用者,我们不需要对数据和操作实现过程感兴趣。就好像买一个手机,我们只关心它是否能够正常通话,正常发短消息,却对它如何接通电话,如何把信号发送出去等等不感兴趣。类的封装性把类的设计者和类的使用者分隔开,使他们在设计程序时互不干扰,责任明确。

  在编写链表程序的时候,我们一定有这样的困惑:链表里面存储的数据类型可能是各种各样的,难道我们要为各种数据类型都写一个链表程序么?我们能不能写一个万用的链表程序呢?
  在PowerPoint之类的软件中,有一种模板功能。模板提供的文档框架是基本完整的,我们只需要在一些地方填写上自己需要的内容,就是一个完整的文档。在C++中,也有这么一种模板(Template),我们只需要在使用之前填写自己需要的数据类型,就是一个完整的程序。我们把具有模板功能的类称为模板类,向量就是一个模板类。在这一节,我们只需要了解如何使用模板类。关于更多模板的知识,将在后面的章节再作介绍。

36 楼


抽象东西具体化,形象化.
偶喜欢!

37 楼

谢谢,对我们很有用也

38 楼

我是一个新手,很多都不会,希望多些你那样热心的人指点指点!!!!!!!!!!!!!!
所以非常支持

39 楼

这一章竟然写了三个月,看来效率有点低下了。好在自己把一些主要的问题都讲清楚了,至于要想写得更好,还是以后再不断改进吧。我在面向对象的开头写了两章短篇,就是为了将最简单的问题讲清楚,而不给读者产生压力。试想如果学习一个完全不懂的概念,前两章就有半本书那么厚,读者一定会以为这个内容很难了。另外最近在高中里教书的时候发现一些初学者常见的问题,于是对前面的章节有所修改和加强。可见,实践是很重要的。
接下来写的思路是这样,面向对象的基本知识主要是围绕一个链表类的程序来说,比如什么构造函数,析构函数,静态成员数据,类模版等等;继承,多态,友元主要围绕一个文字RPG游戏来说。

本次内容节选:

我们已经了解了数据类型和变量的关系。数据类型是各个变量的归类,而变量则是某个数据类型的具体表现,我们称变量为数据类型的一个实例(Instance)。各个变量都有他们的属性:内容和占用内存空间等等;各个变量都有他们的操作:算术运算或逻辑运算等等。从这个角度来看,类和对象的关系就如同数据类型和变量的关系。我们不妨将类看作一种自定义的数据类型,那么对象就是一种属于该类型的变量。

所谓公有,就是外部可以访问的数据或执行的操作。比如一个人的身高(数据)是可以较直接地获得的,一个人吃东西(操作)是可以受外部控制的。私有就是外部不能直接访问的数据或执行的操作。比如一个人的心跳次数(数据)和消化过程(操作),虽然他们都是客观存在,但我们却不能直接地获取心跳数据或控制消化过程。
如果一个类的所有数据和操作都是公有的,那么它将完全暴露在外,同结构一样没有安全性。如果一个类的所有数据和操作都是私有的,那么它将完全与外界隔绝,这样的类也没有存在的意义。

由于数据封装在类的内部,在处理一些问题的时候就需要小心翼翼,不能把成员数据破坏了。以前我们介绍使用const来保护变量(就变成了常量),或保护指针所指向的内容,那么在类中,我们也可以使用const这个关键字来保护成员数据不被成员函数改变。我们把这种成员函数称为常成员函数。

40 楼

支持,我正准备学习c++

我来回复

您尚未登录,请登录后再回复。点此登录或注册