黎利辉 黄海 王联芳
摘 要: 针对普通高等院校C语言程序设计课程的教学,提出了三个具体的教学问题:①对于语法与算法的关系处理;②对编程实践的引导;③教学过程中的趣味性。对这些问题分别提出了具体、有针对性的解决办法,在实际的教学过程中采用这些方法收到了较好的效果。这些方法对普通高校C语言程序课程的教学来说具有普遍意义。
关键词: C语言; 语法; 算法; 教学; 编程实践; 趣味性
中图分类号:G424 文献标志码:A 文章编号:1006-8228(2013)08-58-03
0 引言
目前几乎所有普通高等院校(本文指一般本科院校或高职高专院校)的理工科专业都开设了C语言程序设计这门课程,在有的学校,这门又叫高级语言程序设计。在学习这门课之前,学生基本上都没有编程知识,对他们来说这门课程学习难度较大。普通高等院校的学生学习素质整体偏低,主要表现在两点:①学习的主动性较差;②没有足够的毅力来战胜学习过程中所遇到的困难。在这样的背景下,很多讲授这门课程的教师不能因地制宜地组织教学,出现了一些问题,本文归纳了这些问题,并提出了相应的解决办法,与各同行商榷。
1 对语法与算法的关系处理不当
C语言程序设计这门课有两个主要教学目标:①掌握C语言的基本语法;②掌握一些基本的算法。“算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作”[1]。“算法是灵魂,不掌握算法就像是无米之炊。语言是工具,不掌握语言,编程就成为空中楼阁”[2]。这两个目标都很重要,但相对来说,第一个目标难度偏低,第二个目标难度偏高。
我们对普通高等院校C语言程序设计课堂进行访查发现,有些教师将语法和算法孤立开来进行讲解,其结果是,单纯地讲语法,学生会觉得知识点零散,并且枯燥无味;单纯地讲算法,学生不知道算法如何用语言来实现。
在教学过程中,为了能体现教学的趣味性,将零散的知识点有效地组织起来,以吸引学习主动性和学习能力都不强的学生很好地参与到学习过程中来,采用的方式是以程序设计为主线,将算法和语法结合起来讲授。先提出问题,再分析解决这个问题的思路与步骤,即算法分析,然后再用C语言来实现,在实现的过程中将重点语法进行讲解。比如在开始讲解循环这一章时,针对“输出50000个星号”这一问题,首先进行算法分析:一条输出语句输出一个星号,把这个操作重复50000次,重复的操作需要利用循环来控制,这样算法分析就到此为止。接着教师要现场编写程序,通过具体的程序代码,来讲解for语句的语法细节:①三个表达式各自的作用及执行流程;②三个表达式省略的情况(要简单地讲解,不能让学生陷入语法的泥潭中)。
在教学过程中,很多教师过于侧重于语法细节的讲授,而忽略了对学生基本算法思维的训练。比如花很多时间来讲解各种数据类型在不同的编译环境中所占的存储空间,其实数据类型只需要掌握最常用的几种,并且知道每一种数据类型的数值范围有一定限制即可,不必深究具体的数值范围是多少和每种编译环境下每种数据类型各占多少个字节。一旦教师把学生的学习精力导向这些繁琐的语法细节,就会使学生感觉这门课枯燥无味,对于普通高校的学生,这样的授课方式会消磨他们的学习积极性。
从整体来说,语法细节的讲授应当尽量弱化(弱化的程度以编程基本够用为标准),要将主要精力放在培养学生用C语言来解决实际问题的能力上(即对算法的训练),学生有了一定的基础后,可以自学所需的语法细节。在语法与算法结合的教学过程中,语法与算法侧重点的选择,在不同的时期是不一样的。如果以一个学期为周期,在学期初教师要花主要精力来引导学生熟悉C语言的语法,比如在什么时候打逗号、分号、空格,如何进行代码缩进等,这一过程约花四分之一个学期。学生熟悉了C语言的常见语法规律和开发环境后,教师应当有意识的侧重于算法教学。如果以每一章的教学过程为周期,语法与算法的侧重点也是不一样的。在一章的教学初期,应当以语法为主,后期应当以算法为主。
2 对学生编程实践引导不足
C语言程序设计是一门实践性非常强的课程,对于入门者最好的学习方式就是多动手编写程序和调试程序,可是很多教师对学生入门阶段的编程实践引导不足,主要表现在两个方面。
2.1 授课时过于依赖课件,现场编程示范不足
笔者曾经就这门课的教学情况调查了广西崇左市的两所高校——广西民族师范学院和广西理工职业技术学院,发现在43名教师中,有39位教师授课时主要依赖课件(如PPT)来讲授,很少动手写代码,所占比率为90.7%,而这些教师普遍反应这门课教学难度大,学生难以理解。这其中一个重要的原因是教师授课时过于依赖课件,导致学生预习和复习巩固时,下意识地去翻阅课件而不是动手编程实践。普通高等院校的绝大部分学生即使动手实践,也只是简单的把教师的代码复制粘贴到编程环境下进行运行,仅满足于基本看懂并且运行通过这一层次,这一层次离真正掌握所学知识还差的很远。
教师在上课时,如果能脱离课件,将主要代码当场编写出来,并结合代码与注释讲解语法细节,这样做既可以加深学生的记忆,又可以无形中培养学生动手编写程序的意识。那么,学生在预习与复习巩固时,就会以编程实践为基础进行学习,达到事半功倍的效果。
笔者做过一次实验,在两个学生人数与整体素质相当的班级讲授这门课,其中A班依据课件进行讲解,很少现场编程示范,课后把课件发给学生进行巩固复习。在B班以现场编程的方式来讲解,在关键的地方用注释的方式来说明,课后将代码与课件都发给学生。期末两个班在同一个考场测验,A班的平均成绩为67.8分,B班的平均成绩为73.6分,相差5.8分。在对教师授课满意度反馈这一项,A班对教师的平均授课满意度为89.2分,B班为93.6分,相差4.4分。
2.2 对学生编程错误处理能力的训练不足
C语言初学者,困扰他们最多的是编译与连接时出现的错误;在入门后的提高阶段,困扰他们最多的是运行时出现的逻辑错误。如何解决这两类错误,对他们来说这是两个很大的挑战。因为错误提示都是英文,普通高等院校的理工科学生英语水平普遍不高,很多同学对英文的错误提示有畏惧心理,不能坚持读懂这些错误提示进而解决错误。故C语言的教师,帮助学生消除对英文错误提示的畏惧心理,提高学生解决错误的能力,是一个非常重要的教学目标。但是很多教师忽视了这一点,他们一般在上课前把代码写好,上课时把代码复制到编程环境下执行,在整个编译、连接、运行过程中避免出现错误,忽略了对一些典型错误的讲解。并且有些教师在学生动手编程的过程中,不进行有效地监控,对学生的错误不进行指导,这时相当一部分意志薄弱的学生,就会有挫败感,不断积累的挫败感会击垮他们学习的信心。
如何达到这一目标值得我们思考,对于编译与连接时的常见错误,首先,教师在编程示范时,可以在特定情景下故意写错,然后带着学生查看错误提示,教会学生解决这一类错误。比如在第一节课时,在程序正确运行后,教师可以故意将一个英文标点改为中文标点并遗漏一个分号,带领学生看错误提示时,让他们把其中常见的英文单词熟记于胸,通过这种方式教会学生解决这两类错误。对于学生普遍遇到的错误,可以把学生遇到的错误代码针对全班同学进行讲解。对于学习后期经常遇到的逻辑错误,应当教学生使用输出语句和断点调试这两个非常有用的方法来排除错误。
教是为了达到不需要教[3],授人以鱼不如授人以渔,在教师的引导下,如果学生具备了C语言的基本知识和基本的解决错误的能力,就代表学生具备了自学的能力,这时教师就可以多引导学生自学了。
3 教学过程中对学生趣味性体验的重视不足
教学过程中,教师对学生趣味性体验的重视不足主要表现在两个方面。
3.1 教态语态不够活跃,教学气氛沉闷
很多教师教学设计不严谨,对教学过程中的起承转折和教学内容重点难点没有很好地设计;而为体现教师的尊严和课堂的严肃性,教态过于严谨,缺失生动性,语言表述过于学术化和专业化。这门课程内容本身并不生动,如果以这样的教态进行教学就更容易出现教学气氛沉闷,学生听课疲倦的情况,如果学生学习主动性较差,其内在的学习驱动力不足,他们很容易对这门课失去兴趣。
成功的课堂应该是:教学设计严谨,教态语态生动。教师在教学前要进行严格的教学设计,实施教学环节时,应当在教态语态上放松,尽量用生动形象的口语来教学,现举一例如下。
变量对于C语言初学者是一个比较难掌握的概念,学生应当理解变量的如下几层含义:变量是用来保存值的,变量里的值是可以随时改变的;变量里只能保存一个值;变量有类型的区别;变量的地址与名字的区别。通过教学前的严格设计,在教学过程中可以这么来讲授:一个变量就像教室里的一个座位;变量是用来保存值的,座位上坐的人就相当于变量里保存的值;一个座位上只能坐一个人,变量里只能保存一个值,教师来给你调试错误时,你就得让座,第二次给变量赋值时,新值就把原来的值替换了;每一个座位有一个编号,如01,02等,每一个变量有一个内存地址,如oxfff1,0xfff5等;这些地址不好记忆,我们再给变量取一个容易记忆的名字,比如sum、max等,对应地我们可以把这个座位叫做“龙椅”、“太师椅”等。此时,学生往往就会哄堂大笑,但学生的欢笑声并不代表他们已经真正理解了这个概念,这时教师要把学生的情绪由兴奋引导到平静,思考变量与座位之间的关系。学生放松过后,一般愿意去思考,并且能深刻地理解变量这一概念。
3.2 教学过程中对学生学习成就感的体验关注不足
所谓学习成就感,实际上是学习者在学习过程中的一种积极的情绪体验,是在取得成功,达到愿望,实现自我价值,得到认可时产生的满足感和喜悦感。这种发自内心的满足感与喜悦感,是他们感受学习趣味性的一种最强烈的方式。当前绝大部分普通高等院校的教学评价机制不完善,很多教师认为,教师只需简单地将所要讲授的知识讲解清楚就可以了,学生学与不学,学得好与不好与己无关,有时候学生根本听不懂,但教师还是一成不变地按教学计划实施教学。C语言程序设计课程内容的连续性,决定了如果前面的知识没有理解,后面的课程内容将更加难以掌握,这样,学生就会感受到更多的挫败,而不是成就,在挫败感笼罩下,学生很难体会到本门课程的趣味性。
那么在普通高等院校针对这门课程,教师如何帮助学生获得成就感呢?除去普通意义上的提高教师授课水平外,笔者还摸索出以下两点思路。
在学习初期,教师可以要求学生用抄写原代码的方式来熟记C语言的语法细节。记忆是任何一门学科学习的必要手段。普通高等院校的学生,大部分在课后不会主动去记忆语法格式,教师可以通过这种方式来强迫学生去记忆,让他们尽快地去熟悉语法格式。这样在上课时,学生就会大大降低因为语法细节不熟悉而产生的挫败感,相反成就感会大大增加。
学生间的学习素质是有差异的,面对这种差异,很多教师都提出了因材施教策略,这固然是对的,但关键是在同一个课堂里如何因材施材。比较可行的方式是:教师在设计学习目标时,根据难度级别分为几个教学要求,教学时先从低难度的要求开始讲授,这一要求的内容,绝大部分的学生能够掌握,极个别学习较差的学生,多花一点精力也能掌握,通过降低难度,让所有学生都能获得成功的体验,这种内在的学习成就感会赋予他们继续学习的动力;接着教师把要求适当提高,难度级别也相应加大,注意难度提高的梯度不可过大,还是得保证绝大部分的学生可以掌握;课后可以把这个问题的要求继续提高、难度继续加大,让学习成绩好的学生去钻研。
例如在讲授C语言冒泡排序时,可以先按第一层要求来讲解,在黑板上分析从前往后进行比较这种思路,这一思路是非常简单的,每个同学都可以掌握;再提出第二层要求,将这种冒泡排序用C语言来实现,通过对这层要求的分析,让学生明白为什么要用数组,两层循环各自的作用是什么等关键知识点,这两层要求要让每一个学生都能达到,让学生获得学习成就感;接着提第三层要求,冒泡排序如果从后往前进行比较,那么应该如何实现,这时需要教师指明思路,简单讲解后交给学生自己去实现程序,培养学生的学习能力,因为有前面的成就感作为自我奖励,学生一般愿意去研究第三层要求;最后提出第四层要求,当全部数据已经按要求排好时,如何提前结束排序过程。在实施教学的过程中一定要注意表扬学习成绩差但是已经达到第一层和第二层要求的学生,让他们也能获得久违的学习上的赞美与肯定。
4 结束语
笔者在多年的实践教学过程中,采用以上办法收到很好的效果,教学中气氛融洽,学生学习的积极性高,都能较好地掌握本门课程的主要知识。凡是计算机语言类教学的课程,都有共同的特性,本文提出的教学中的问题,在普通高等院校的其他计算机语言类课程的教学中也同样存在,所以,本文提出的教学思想也同样适合于其他计算机语言类课程的教学。
参考文献:
[1] 严蔚敏,吴伟民.数据结构(C语言版)[M].清华大学出版社,2011.
[2] 谭浩强.C程序设计(第四版)[M].清华大学出版社,2011.
[3] 叶圣陶.叶圣陶语文教育论集[M].教育科学出版社,1980.