主题:[讨论]C++教学教材中的改革与创新尝试
山寨捉鼠猫
[专家分:0] 发布于 2010-09-12 10:38:00
谢谢大家!1531
最后更新于:2011-12-06 08:51:00
回复列表 (共26个回复)
沙发
eastcowboy [专家分:25370] 发布于 2010-09-13 20:00:00
楼主辛苦,写书很不容易,把书写好就更不容易了。我不是什么专家,不发表意见,只说说我的看法。
1、关于变量的“声明”和“定义”。
“什么样语句称为声明,什么样语句称为定义?”这是一个好问题,但您给出的答案我觉得还是欠妥。
(1) “定义变量”的效果其实包含了“声明变量”的效果。
(2) “定义变量”这个动作无法被重复,而“声明变量”这个动作则是可以重复的。
上述两点我认为比较重要,如果了解这两点,可以在编程中避免一些错误。而您的答案没有体现这些内容,也不容易由您的答案联想到这些内容。其它方面不谈,但在这个细节上,您的答案甚至比不上“传统教材”。
2、关于“存间”。
您发明了一个新的术语。
这样做是否太激进了?我们知道C++是很复杂的语言,通常一本书无法介绍其全部。因此一个很重要的事实就是,读者读完您的著作,往往还需要再读别的著作,当他们参加编程工作时,当他们编程遇到问题时,还会与别人交流。到时,您的读者都用“存间”这个术语来进行技术交流,而别的读者可能使用“存储空间”“内存空间”“存储单元”“内存单元”“变量空间”,甚至是另外作者发明的新术语“储间”等。倘若大家都使用各自认为正确的新术语,但却造成理解困难,甚至因此争论不休,这让大家情何以堪?
3、关于“引用”。
“全书直用‘别名’作叙述”。您摒弃了一个常用术语。
参见第2点,这样的做法同样会对交流造成障碍。
引用的实质就是别名,但这不意味着引用就等于别名。我们可以很自然的说“const引用”“非const引用”,但如果改为“const别名”“非const别名”,这就别扭了。
撇开中文术语不谈,多数的英文书籍也都是使用“reference”而非“alias”。
4、关于章节排布顺序
这个就见仁见智了。我没有写过书,没什么见解。但我觉得“门槛”这样的东西是存在的。即使是经典的Hello, World程序,短短数行代码,其实知识点已经很多了(include、注释、函数、int类型、main函数、printf函数、return语句、返回值,等等)。真正想做到“前面的知识点与后面的无关”这种绝对的循序渐进,是极其困难的。而且我认为这也没有必要。
您先讲指针,再讲函数。那么“指向函数的指针”又应该放在何处讲解呢?若放在指针一起讲解,则当时还没有讲到函数,不妥。若放在函数一起讲解,那不也一样是“事先不作铺垫”“临阵磨刀”吗?其实这个本来不是问题,只是您太强调循序渐进了,我觉得即使是您所说的“传统教材”,在这个问题的处理上也并不算是有问题。
5、关于您提到的几个教学难点
您讲了很多。言之有物,足以说明您是一位拥有长期经历和经验的老师。不过仔细推敲的话,我觉得还是存在一些小的问题。
我没有听说过“端口”、“模式”这样的术语。不知道是不是您自己定义的。如果是的话,参见第2点,这样的做法会对交流造成障碍。
“流类的主要数据成员”这个也是我没有听说过的,但C++标准库应该不会对这些进行任何规定。每个平台的iostream实现,都可以自由的定义各种数据成员。
以现今C++标准库的定义来看,现在的iostream其实不是类,而是typedef,这样做是为了同时支持char和wchar_t这两种字符类型,比如,与cout对应的有wcout。
一个与iostream关系非常密切的类型是streambuf,这个类型跟您所描述的“端口”有点像,它负责真正的输入输出。但您所说的“端口”恐怕并非C++标准,而这里的streambuf却正是属于C++标准。
像istream, ostream, iostream, ifstream, ofstream, fstream, istringstream, ostringstream, stringstream,这些都是存在继承关系的,其间错综复杂,但如果整理清楚的话,相信对学习会有不小的帮助。
输入输出流还有locale的概念。比如,输出一个整数,需要每三个数字添加一个分节号(逗号),这些就可以通过locale来做。又比如,需要支持某个国家的文字,等等。
总的来说,通过您的发言,我了解到的也就是这些。您虽然花费了不少心思,但我对于它的效果并不看好。写一本好的教程,可谓任重而道远,这样程度的努力并不能取得最终胜利。您很有创新精神,有魄力,但如果能多一些谨慎、严谨的态度,相信会做得更好。
板凳
强强 [专家分:4740] 发布于 2010-09-13 23:39:00
[quote]楼主辛苦,写书很不容易,把书写好就更不容易了。我不是什么专家,不发表意见,只说说我的看法。
1、关于变量的“声明”和“定义”。
“什么样语句称为声明,什么样语句称为定义?”这是一个好问题,但您给出的答案我觉得还是欠妥。
(1) “定义变量”的效果其实包含了“声明变量”的效果。
(2) “定义变量”这个动作无法被重复,而“声明变量”这个动作则是可以重复的。
上述两点我认为比较重要,如果了解这两点,可以在编程中避免一些错误。而您的答案没有体现这些内容,也不容易由您的答案联想到这些内容。其它方面不谈,但在这个细节上,您的答案甚至比不上“传统教材”。
2、关于“存间”。
您发明了一个新的术语。
这样做是否太激进了?我们知道C++是很复杂的语言,通常一本书无法介绍其全部。因此一个很重要的事实就是,读者读完您的著作,往往还需要再读别的著作,当他们参加编程工作时,当他们编程遇到问题时,还会与别人交流。到时,您的读者都用“存间”这个术语来进行技术交流,而别的读者可能使用“存储空间”“内存空间”“存储单元”“内存单元”“变量空间”,甚至是另外作者发明的新术语“储间”等。倘若大家都使用各自认为正确的新术语,但却造成理解困难,甚至因此争论不休,这让大家情何以堪?
3、关于“引用”。
“全书直用‘别名’作叙述”。您摒弃了一个常用术语。
参见第2点,这样的做法同样会对交流造成障碍。
引用的实质就是别名,但这不意味着引用就等于别名。我们可以很自然的说“const引用”“非const引用”,但如果改为“const别名”“非const别名”,这就别扭了。
撇开中文术语不谈,多数的英文书籍也都是使用“reference”而非“alias”。
4、关于章节排布顺序
这个就见仁见智了。我没有写过书,没什么见解。但我觉得“门槛”这样的东西是存在的。即使是经典的Hello, World程序,短短数行代码,其实知识点已经很多了(include、注释、函数、int类型、main函数、printf函数、return语句、返回值,等等)。真正想做到“前面的知识点与后面的无关”这种绝对的循序渐进,是极其困难的。而且我认为这也没有必要。
您先讲指针,再讲函数。那么“指向函数的指针”又应该放在何处讲解呢?若放在指针一起讲解,则当时还没有讲到函数,不妥。若放在函数一起讲解,那不也一样是“事先不作铺垫”“临阵磨刀”吗?其实这个本来不是问题,只是您太强调循序渐进了,我觉得即使是您所说的“传统教材”,在这个问题的处理上也并不算是有问题。
5、关于您提到的几个教学难点
您讲了很多。言之有物,足以说明您是一位拥有长期经历和经验的老师。不过仔细推敲的话,我觉得还是存在一些小的问题。
我没有听说过“端口”、“模式”这样的术语。不知道是不是您自己定义的。如果是的话,参见第2点,这样的做法会对交流造成障碍。
“流类的主要数据成员”这个也是我没有听说过的,但C++标准库应该不会对这些进行任何规定。每个平台的iostream实现,都可以自由的定义各种数据成员。
以现今C++标准库的定义来看,现在的iostream其实不是类,而是typedef,这样做是为了同时支持char和wchar_t这两种字符类型,比如,与cout对应的有wcout。
一个与iostream关系非常密切的类型是streambuf,这个类型跟您所描述的“端口”有点像,它负责真正的输入输出。但您所说的“端口”恐怕并非C++标准,而这里的streambuf却正是属于C++标准。
像istream, ostream, iostream, ifstream, ofstream, fstream, istringstream, ostringstream, stringstream,这些都是存在继承关系的,其间错综复杂,但如果整理清楚的话,相信对学习会有不小的帮助。
输入输出流还有locale的概念。比如,输出一个整数,需要每三个数字添加一个分节号(逗号),这些就可以通过locale来做。又比如,需要支持某个国家的文字,等等。
总的来说,通过您的发言,我了解到的也就是这些。您虽然花费了不少心思,但我对于它的效果并不看好。写一本好的教程,可谓任重而道远,这样程度的努力并不能取得最终胜利。您很有创新精神,有魄力,但如果能多一些谨慎、严谨的态度,相信会做得更好。[/quote]
佩服
3 楼
山寨捉鼠猫 [专家分:0] 发布于 2010-09-18 09:09:00
感谢eastcowboy和强强两位网友对我主贴的关注和给了我两封同样的回贴。我的回复如下。
(一)关于定义和声明
从您俩的回贴来看,对我下列论点没有提出什么异议:
(1)传统教材中把建立不建立存储空间作为划分是否定义语句的标准,这是与常规理解相悖的。
(2)定义语句的特点是,定义项和被定义项存在等同关系,若不存在此等同关系就不是定义语句。
您俩认为(1) “定义变量”的效果其实包含了“声明变量”的效果。(2) “定义变量”这个动作无法被重复,而“声明变量”这个动作则是可以重复的。上述两点我认为比较重要,如果了解这两点,可以在编程中避免一些错误。而您的答案没有体现这些内容,也不容易由您的答案联想到这些内容。其它方面不谈,但在这个细节上,您的答案甚至比不上“传统教材”。
是否可请您俩举些例子来具体说明这两点,并具体说明我的答案比不上传统教材。我很愿意听取不同的意见,但需要具体一些,谢谢!
(二)关于存间
您俩认为(1)发明了一个新的术语“存间”,太激进了。(2)与别人交流时,您的读者都用“存间”这个术语来进行技术交流,而别的读者可能使用“存储空间”“内存空间”“存储单元”“内存单元”“变量空间”,甚至是另外作者发明的新术语“储间”等。倘若大家都使用各自认为正确的新术语,但却造成理解困难,甚至因此争论不休,这让大家情何以堪?
我认为目前的情况是对于变量的存储空间,没有一个专用名称,用名比较杂乱,并带有随意性。例如,同一本传统教材的同一节中,同是叙述变量的存储空间,却用了九个不同的名称。对这种情况,整改的方向应该是取用一个专用名称为好。否则我想,如果是三人进行技术交流,都随心所欲各自都用九个不同名称(打比方说),则将会有27个不同名称出现在交流会的桌面上,这将更要争得不可开交啦。这就是不进行整改的后果。
照理应该由一个专门取名委员会对变量存储空间取一个专用名称。不过,目前还做不到。但是,拙著中能克服用名的随意性,全书采用一个深思熟虑的专用名称,并且阐明其所具有的属性,这总比传统教材中目前情况要前进一步吧。传统教材在一小节中就带随意性地采用了九个不同名称,而拙著全书只采用同一个专用名称,拙著前进了一步是很明显的。
拿上述三人来说,若有一人读过拙著,则不同名称数将减为19;若有二人读过,则减为10;若三人都读过,则减为0;这将是改革创新的效果。因此,在“锐意改革,自主创新”的大政方针下,这点“激进”劲儿还是应有的。特别是年轻人,更应意气风发改革创新。
不必担心年轻人不能理解和接受“存间”这个新名称。您看,成百上千的网络语言新名词:“菜鸟”、“大虾”、“驴友”、“粉丝”…,不是都被年轻人广泛使用了吗?何况“存间”是“存储空间”的简称,符合简称习惯,在交流会上,根据上下文很快就能理解和接受的。
(三)关于别名
您俩认为我“全书直用‘别名’作叙述”,摒弃了一个常用术语。这样的做法同样会对交流造成障碍。
引用的实质就是别名,但这不意味着引用就等于别名。我们可以很自然的说“const引用”“非const引用”,但如果改为“const别名”“非const别名”,这就别扭了。
撇开中文术语不谈,多数的英文书籍也都是使用“reference”而非“alias”。
拙著中介绍别名概念的开头一段是:“别名俗称外号或绰号。在C++中把别名雅称为‘引用’。现考虑到‘引用’有‘引而用之’的意思,名词成为动词了,难免会产生二义性。为避免二义性,本书就直用‘别名’作叙述。”
可见拙著中并没有完全摒弃“引用”,而是因其有二义性而改用“别名”作叙述。这主要是为了使初学者易于理解相关内容。免得受二义性的干扰。您俩二位已经是过来人了,但不可忘记学生年代受二义性干扰的困苦。编写教材特别要考虑尽量使读者易于读懂。
您俩谈到用“别名”感到别扭,但这只是个人的感受。编写教材不能由着个人感受来,归根结底应以读者能读懂为本,这是当教师所应遵循的基本原则。
外文书籍可以参考,但要根据我们自己的情况进行“自主创新”。
(四)关于“端口”和“模式”
“端口”和“模式”,是我个人提出的。在我的主贴中,我只是从正面分析了流类的属性,说明了应该将“端口”和“模式”作为流类的数据成员。但我没有提供这个论点的佐证。这是我的疏忽,以致使二位多方求证,不得要领。深感歉意。
其实,从构造函数和open函数的两个参数来看,第一个参数就是端口数据(端口名char *name),第二个参数就是模式数据(模式状态字int mode)。这两个参数显然就是流类对象的两个数据成员。这两个数据一经确定,通过构造函数和open函数对流类对象进行了初始化,流类对象就创建起来。
这样,流类的概念就和前面所讲的类的概念取得一致,都具有数据成员和成员函数。从而使流类对象的声明和初始化,以及通过对象调用基类或派生类成员函数等情况就完全和前面所学的内容接轨了,用前面的理论解决流类的具体问题,达到前后内容共吃透。
我觉得,由此可打开I/O流教学的新思路,从而打开I/O流教学的新局面。
我只是在目前教材内容范围内考虑的,没有考虑更多的问题。是不是有错?请您二位多多指正。
4 楼
山寨捉鼠猫 [专家分:0] 发布于 2010-09-18 09:11:00
此贴与上贴相同,故删掉。
5 楼
cgl_lgs [专家分:21040] 发布于 2010-09-18 22:18:00
1)我沒有看懂您到底想表達什么?聲明與定義二詞表示的東西不一樣了?您還是用代碼舉若干個例子吧。比如:
變量部分:
extern int a; // 聲名
int a; // 在非函數體中:定義;在類/結構/聯合中:聲名
函數部分:
沒有函數體的是聲名,有函數體的是定義(或實現)。
上面這些是傳統的,您打算改成什么樣?
6 楼
cgl_lgs [专家分:21040] 发布于 2010-09-18 22:22:00
另:關于修改習慣詞語的問題,我必然是會持反對態度!
因為如果如此修改,用你教材培養出來的人,我們還能不能用?跟他們溝通都成了問題,最后變成一個最簡單的問題都要以英文交流才能OK,那英文不好的人還活不活啦?
7 楼
强强 [专家分:4740] 发布于 2010-09-19 22:04:00
楼主误会了,我只是对东方牛仔兄的耐心表示敬佩,您所说的东西因为我水平实在不行,所以不能发表什么见解,呵呵,不好意思
8 楼
山寨捉鼠猫 [专家分:0] 发布于 2010-09-21 16:24:00
2010-9-21回复:
谢谢cgl_lgs网友对我主贴子的关注和回贴。现在我不知道网友们对“定义”一词的理解和我的理解有什么不同。现在我讲个故事,提出问题,看看我们的看法是否一致。故事如下:
某团长召开连长以上干部会议,会议中把合格身高定为1.8~2.0米。排长考虑到本排多数人身高为1.85米。就问连长:“1.85米是不是合格身高?”连长答:“1.85米是合格身高”。排长很高兴,就在全排队列前给大家传达说:“连长把1.85米定义为合格身高”,然后命令:“合格身高者全留下,其余解散”。结果留下的个个都是身高1.85米。而身高1.83、1.88、1.9、1.96米、…都没有留下。
现在提出如下两个问题:
(1)排长命令合格身高者全留下,全留下了吗?
(2)排长的“合格身高者”概念和团长会议的概念是否相同。若不相同,问题出在何处?
请广大网友们思考上述问题,该怎么回答,我也参与讨论。我的看法不一定对。我们共同研讨,共同提高。促使C++教材中正确地使用“定义”名词。
9 楼
nyra [专家分:4800] 发布于 2010-09-24 11:47:00
舍本逐末,这些概念关系真的如些重要吗?我看未必。
C++重点在于学会C++思考的方式,概念一致就好,不必强求明确,易懂。
什么是C++思考的方式,从抽象->理论->设计,用代码来解决具体问题。
更多的是要教案例。让学生体会这个抽象如何结合理论变成设计。而不是在指针,
迭代器,定义还是声明上纠缠。
我更想看到,学生能举出所有声明的形式,定义的方法,而不需要知道声明和定义
在概念上有什么区别。
10 楼
强强 [专家分:4740] 发布于 2010-09-24 14:13:00
[quote]舍本逐末,这些概念关系真的如些重要吗?我看未必。
C++重点在于学会C++思考的方式,概念一致就好,不必强求明确,易懂。
什么是C++思考的方式,从抽象->理论->设计,用代码来解决具体问题。
更多的是要教案例。让学生体会这个抽象如何结合理论变成设计。而不是在指针,
迭代器,定义还是声明上纠缠。
我更想看到,学生能举出所有声明的形式,定义的方法,而不需要知道声明和定义
在概念上有什么区别。
[/quote]
鄙人也有同感,如果楼主真想取得突破的话不妨想想怎么样用浅显的语言和生动的例子来表述比较难的问题,如果这样的话我想会更有市场
我来回复