台湾地区高职教材《CC++程序设计》编写特及启示
摘要:本文讨论了C++课程的设置方法与定位,通识教育、高职生学习风格特点、C/C++的普及化等不同视角,分析了台湾地区高职教材《C/C++程序设计》的三个编写特:基础性、范例性和通俗化。
关键词:C++;程序设计;高职教材;通识教育;职业技术教育
1引言
从事程序设计教学以来,笔者选择教材时一直有一个偏好,就是要选择程序实例较多,较完整的教材,认为这样易教易学。如汇编语言曾选用张怀莲编的《宏汇编语言程序设计》;C语言曾选用谭浩强编著的《C程序设计》。本世纪初,当笔者接受高职C++语言的教学任务时,Decoder编著、中国铁道出版社于20022月出版的《C/C++程序设计》一书(以下简称“Decoder”),便以其丰富的例程和通俗的叙述立即进入笔者视野。这本教材是由中国铁道出版社推出的“21世纪台湾高职高专系列教材之一,笔者用它教过48个班约450名学生,教学效果非常好。这本教材究竟好在何处?它的编写特是什么?它又给了我们怎样的启示?本文是笔者对上述问题的一点思考,愿抛砖引玉与同行分享。
2关于C++课程设置与定位的讨论
课程设置与定位将直接决定教材的体系结构与教材内容取舍。在具体分析“Decoder编写特前,有必要先讨论一下C++课程的设置与定位。
2.1C++课程设置方法:
目前内地高校C++课程的开设日渐普遍,然而不同类型、不同层次学校的不同专业,开设C++的方法并不相同,概括起来可以分为以下4c语言暑期培训班:
(1) 作为第二语言课开设:即在先期C语言课的基础上开设。由于C语言教学的普及,学生已经具备程序和算法概念,已经学过面向过程编程的方法。在C++中只须重点讲C++C语言的扩展,重点讲面向对象的编程方法。将C语言和C++作为两门课分别在两个学期不同的阶段开设,是比较稳妥的作法,可以使学生学得更扎实。这种设置方法比较适合计算机专业,也适合已经学过一门高级编程语言的学生。
(2)C/C++直通车:C++是对C语言的扩展。它不仅支持面向对象编程,也支持面向过程编程,即是说C++兼容C语言。C++可视为C语言的超集,C语言则是C++的子集,从这一点出发,C++
一定以C语言为先导课。现在通行的作法是将C++分段,前期只讲与C兼容的内容,只讲面向过程编程,后期侧重点讲面向对象编程。前后两个阶段使用统一的C++标准,可以避免课程内容重复及不同语言版本的混淆。这样的教学安排适合作为方法学课程或非计算机专业的程序设计基础课。目前内地出版的C++主流教材多是依据这种教学安排所编写,例如刘璟编著、高等教育出版社于20011月出版的《高级语言C++程序设计》(以下简称刘璟本”),谭浩强编著、清华大学出版社于20046月出版的《C++程序设计》(以下简称谭浩强本”)等。
(3)C++/数据结构综合课:课程综合化是当代世界范围课程改革的潮流。科学技术日新月异的发展,一方面使学科分化越来越细;另一方面则是在学科高度分化基础上的高度综合。设置综合课程是高等教育应对信息化时代知识爆炸的挑战,加强学生综合能力、创新能力培养的必然选择。近年来内地已出版了反映“C++/数据结构综合课改革成果的多种教材,例如由美国阿姆斯特郎亚特兰大州立大学Y.Daniel Liang(王刚等译)、机械工业出版社于20087月出版的《C++程序设计》(以下简称“() Y.D. Liang”),王立柱编著、清华大学出版社于20083月出版的《C/C++与数据结构(3)》等。
(4) 作为专业课开设:由于C++至今仍是在软件开发中占主流的程序设计语言之一,内地软件学
院或公司培训机构往往选择VC++C++Build的最新版本编写培训教程,不仅讲基础、讲方法学,还要讲与软件实际开发有密切联系的MFC类库以及数据库编程,网络编程等内容。C++作为专业课开设的开课时机,最好选择在毕业设计阶段、职前培训阶段,否则学生由于缺乏必要的基础而不易掌握。目前一种比较流行的作法是将C++教材分为上、下两篇(基础篇和高级编程篇),也可以出两本教材。高级编程部分放在学习最后的阶段供有需求的学生选学。 2.2 “Decoder的内容与基础课程定位
“Decoder15,包括第0 认识C++(属概述);1 第一个C++程序,结合实例介绍流输入(cin)、流输出(cout)以及VC++上机操作基本方法;29章分别为变量与数据类型、运算符、决策与循环、函数、数组、结构与枚举、指针、重载,介绍面向过程编程方法,包括与C语言兼容的内容以及对C语言扩展的内容(引用参数、重载等);10章调试,介绍调试概念、方法以及VC++上机调试方法;1114章分别为对象与类、继承、成员函数的其它特性(虚函数、抽象类、友元函数、静态函数等)、文件与流,介绍面向对象编程方法。
从教材选取的内容看,它侧重的是C++语法规则、算法分析和程序设计方法的介绍,并未安排MFC类库等在实际软件开发过程中有重要作用的内容。因此,它是一本基础课程教材,而不是专业课教材。
3台湾地区高职教材《C/C++程序设计》编写特
3.1通识教育角度看“Decoder基础性
“Decoder编写的基础性特具体体现在哪些地方呢?首先,它将C/C++内容区分为基础和高级编程两部分,教材中只写了基础部分,至于C ++中和实际软件开发有关的较深入内容,放到后期实训教材中。其次,教材按基础先行对象适行(object-right)”顺序排列,先讲面向过程编程,再讲面向对象编程。这样的安排符合由浅入深的认识规律,降低了学生学习的台阶和难度,便于学生入门,便于学生掌握。在2005年之前的国际计算机科学教育大会(Computer Science Education,SIGCSE),对象早行(object-early)方法曾被广泛宣扬,后来的实践证明对象早行方法遇到挫折。在其他高级语言(JavaVB)的教学中也有类似的情况,这也可以反证编写教材遵循基础性是多么重要。
现在再从通识教育的角度对教材的基础性作进一步分析。既然“Decoder是高职教材,为什么它不将C++中那些在软件实际开发中有着重要应用的MFC类库等内容包括进去呢?我们也可以反问,究竟有多少学生毕业后会去做C++程序员,即便去做又能做几年?谈到课程设置,都强调市场需求、就业导向,解决学非所用,用非所学的问题。问题的另一面是不应当忽视市场需
多元化动态化的特征。也就是说,我们对学生的职业规划不可能嫁一从终。由于科学技术日新月异的发展,市场风云变幻莫测,在未来市场经济社会,一个人一生的职业变迁是常态,“用非所学也成了常态。台湾地区由于经济发展较早,在职业技术教育方面积累了一些经验。也曾经历过高职教育指向性过分狭窄的弯路,后来发现这并不符合真正的市场需求,也不符合学生及家长期望。后一点说的是相当多在职业技术院校就读的学生仍希望将来有继续深造的机会,能经过技能性工作锻炼,最终走向设计、管理等高层工作。这就要求提高学生素质,基础知识面放得更宽一些。现在台湾地区的职业教育已经形成了高级职业学校(相当于内地中等职业学校)、专科学校、职业技术学院,科技大学和研究所的梯次职教体系,并和普通高等教育有多个出、入口接轨。这就说明台湾地区高等职业教育仍然强调通识教育的重要性。通识教育的本质是注重学生能力培养与素质提高,而不是单纯知识技能传授与记忆。在这方面台湾铭传大学的经验也可以给我们有益启示。台湾铭传大学王立天教授介绍他们的经验主要有两条:(1)“学术顾问(Academic Advisor),学校为每一个学生安排全程咨询的学术顾问,依据每一个学生的特长、基础、兴趣爱好,帮助其确定主修课程,制订未来职业规划,体现以学生发展为本”;(2)“通识教育”(The General Education),就是对确立了不同个性化目标的学生抓好共同知识技能基础。以上背景介绍,可以使我们进一步认识“Decoder作为基础课程教材定位的合理性。
3.2从高职生学习风格特点看“Decoder范例性
凡是教过高职课的教师都有切身体验,那就是套用普高教材和教法效果欠佳,甚至会遭到学生抗拒(如上课说话、睡觉,逃课)。究其原因,需要从高职学生的培养目标,学习基础和学习风格等作多因素分析。首先,教师的第一反映往往是高职学生的学习基础不如普高生,好像这就是对问题顺理成章的解释。其次,高职学生的培养目标是高素质技能型人才,而不是研究型人才或一般意义上的应用型人才,这点虽然说起来明白,但很难落到实处,如高职教材经常编写成普本教材的浓缩版。至于高职学生的学习风格特点又有多少教师清楚呢?2006年秋,笔者在华东师范大学访学期间曾从事全纳教育实践研究,期间一个重要收获就是认识到美国教育心理学家柯勃(Kolb D.A)学习风格理论对实现全纳教育的重要意义。柯勃将学习风格区分为经验感觉型、抽象分析型、主动操作型、省思观察型(或每两类的组合)。不同类型的学生擅长不同的学习风格,高职学生一般都不太适应传统的概念演绎、逻辑推导的课堂教学方法,他们更适合范例学习、实践学习和交往学习的方法。所以,在程序设计教学中采用范例导向法比较适合高职学生的学习风格特点。这里所谓范例指的是典型的实例程序。每一个范例程序都是某些C++语法规则同求解某种问题的算法紧密结合的产物。范例导向法就是通过对典型例程的分析和运行演示,讲解蕴涵其中的概念,语法规则和算法,比较符合谭浩强教授在程序设计
教学中提出的提出问题——解决问题——归纳总结新三步曲法。“Decoder每一章节都详举完整例程,每一个概念、语法规则和算法都通过恰当例程阐释。现将“Decoder与笔者手头其他同类教材中所举的部分章节的例程,进行比较,如表1所示。
由表一可以看出,“Decoder中的例程简明、实用、有趣。例程不涉及高深数学(如积分求值、高次方程求根等)和复杂算法分析(汉诺塔八皇后),降低了学习的难度,有利于学生克服畏难情绪、增强学习信心。例程贴近日常生活、贴近应用、贴近读者,使学生乐学、易学。丰富的例程还很方便安排实践教学,无论教师演示还是学生上机都可以信手拈来。比如,构造函数和析构函数是C++中的一个难点。为了说明析构函数的功能及其何时执行的问题,“Decoder举出一个范例程序,程序中盒类(Box)的析构函数中加入输出信息“Box is Destructed! ”。教师让学生自行阅读这个程序并上机实验,观察运行结果。然后师生共同讨论,结果中为什么会有两个析构函数的输出信息?它们分别在何时执行?何以见得?紧接着改写程序(删除析构函数调用语句并在程序结束前插入输出语句cout<<”End!”<<endl;),再次运行并观察运行结果,就容易搞清问题所在。这是一种具有实践性、探索性和对话性的教学模式,它改变了教师先讲然后学生上机实验验证的传统教学模式,可以使学生学得主动、学得明白。显然,改变教法的尝试得益于范例程序的精妙。类似的例程为后来国内多本教材沿用,可见其经典性。
3.3C/C++的普及化看“Decoder通俗化
C++是当前软件开发领域占主流的程序设计语言之一,它原本是专业程序员所掌握使用的高科技知识和技术。随着信息技术的普及,现在C++正在成为各类高校普遍开设的课程,正是旧时王谢堂前燕,飞入寻常百姓家。C++走下神坛回旧大众化的过程,必然要求教材的表述形式脱下浓重的学术话语体系的外衣,而转向通俗化,即尽量使用生活化的语言、确切生动的比喻、深入浅出地讲解。让我们看看“Decoder中对C++一些重要概念是如何论述的:
关于构造函数:“发现了吗?构造函数的名称居然与类一模一样,这是一般函数与构造函数最大的差异所在
关于虚函数:“我们定义所有的animal(动物)都能call()(),也能eat()(),……但是所有动物call()eat()的方式都不一样,因此animalcall()eat()都是virtual()函数
关于友元函数:“日记是我们最私密的记录,应该不允许其他人来随意读取。对于好朋友,我们是愿意将自己的秘密交给他的。……C++的类在设计函数时也有所谓的朋友函数,因为当中也有一些秘密数据是不希望让外部程序随意读取的,但类的朋友却可以读取当中的秘密数据,这种叫作friend(友元)函数
以上的叙述是不是读来倍感亲切,让人乐于接受?
让我们再看看“Decoder怎样用生动确切的比喻说明抽象的概念:
孤儿”:“没有人会认得”——比喻使用内存动态分配(new)常会造成的内存中无法访问的区域。
超市成堆的苹果”:“想要取出下方的苹果,就必须将上方的苹果先一一取出才行。”——比喻栈的先进后出,后进先出的存储特性。
这样的比喻是不是也会给人留下深刻印象呢?
有人担心“Decoder这样通俗的叙述比较浅显学术水平不高”,其实这是一种误解。大音唏声,大象无形”,“Decoder叙述通俗却不乏深刻,比如书中动态数组及栈数组的范例程序都是有一定深度的程序,内地同类教材多未述及。究竟怎样的教材才是高水平的呢?依据教材评价标准而非学术著作评价标准,真正高水平的教材(特别是基础课教材)一定会是深入浅出的。教材的读者对象是初学者,它一定要写得使人容易读懂、学懂,一定要经得起读者和时间检验才算合格。众所周知,在我国计算机普及教育二十多年的发展中,谭浩强教授开创了程序设计教材大众化通俗化的写作新风。他的《BASIC语言》和《C程序设计》双双发行1000万册,创造了全球科技图书出版的奇迹,其中的秘诀又是什么呢?谭浩强教授在回答出版界
业内人士提问时说:“无非一个‘懂’字,写书的人必须要想到读书的人,使他们能看得懂。一个,答案竟是如此言简意赅而又发人深省。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。