乔 良
(华北科技学院计算机学院,北京东燕郊 101601)
C语言具有功能丰富、表达能力强、目标程序效率高、可移植性好等特点,已成为计算机程序设计人员必须掌握的一种通用高级程序设计语言。加之其应用范围广泛,具备很强的数据处理能力,因此,C程序设计是国内许多高校工科专业必修的计算机课程,用来培养学生设计算法和动手编程的能力。本文作者根据教学经验,对C语言教学过程中遇到的主要问题进行分析,并提出了解决方法。
对于工科非计算机专业来说,很多学生往往会有这样的疑问,我又不是学计算机专业的,为什么要学C语言呢?这样的疑问来自于一个先入为主的想法:编程是计算机专业才去做的事情。有些老师往往忽视了这样的想法,上来就讲“hello world”,导致了学生带着疑虑学习,这种疑虑甚至会贯穿本门课程教学活动的始终。教师没有解决好“为何而学”,结果是学生学习的目的性不强。而学生如果长期处于这种学习目的不确定的状态,势必会造成心理上的障碍,结果一定会影响学习效果。
不少学生学习C语言的方法跟学习英语课一样,靠背书,喜欢下力气去记课本里面的各种语法规则,这是一个很大的学习误区。学生单单凭记忆很难记住所有的知识点,即便是记住了,在运用的时候也往往很难得心应手,表现就是学生感觉知识点都知道了,但写出的程序中总是误百出,怎么改运行都不通过。这种情况的发生,源自学生没有理清理论学习与动手实践的关系,还按照学习数学、物理那样,先背公式再做题的套路去看待C语言,这种思路在计算机编程语言的学习上是行不通的。而且,由于方法的错误,学生的学习往往见效较慢,容易倦怠,效果会很不理想。
学生缺乏主动性的表现很多,比如不进行课前预习,对提问表现不积极,不喜欢设计新算法等等,其中以上机课中的情况最为突出。辅导过C语言上机课的老师都有体会,在课堂上沉默寡言的学生突然都变得爱提问了,而问题一般集中在程序无法通过编译,或运行出错上。通过观察发现,为数不少的学生,一旦遇到程序编译出错或是程序运行结果不正确的情况,立刻就举手叫老师,而不是去找问题的原因。而教师如统统解答,结果就是教师事实上完成了程序的调试,而学生并没有真正参与其中,久而久之,容易使学生养成不爱动脑的习惯,有些学生直到期末结课时都看不懂编译器的错误提示,这样就使上机课彻底失去了应有的作用。
同时,学生求知欲低也是一个较为普遍的问题,主要表现在上课时位置靠后,睡觉、玩手机,编程作业抄袭或直接从互联网上查找答案等等。原因有很多种,前文提到的目的不明,定位不清,方法有误等因素都会导致学生失去对课程的兴趣。经与学生交流,最主要的原因是学生认为这门课程“没什么用”,学习就是为了最后能顺利通过考试而已。如果学生都以通过考试为最终目标,势必出现“六十分万岁,多一分浪费”的情况,学习效果不理想也就很容易理解了。
随着计算机的普及,很多地方在高中阶段已经开设了计算机课程。但各地计算机教育的水平还是参差不齐,导致学生的计算机基础水平也有很大区别。以我校大一新生为例,有的学生已经学过编程语言,可以独立设计算法,写出简单的程序;有的学生对计算机的认识只限于office办公软件的应用,还有少数学生甚至没有真正接触过计算机。面对基础相差如此巨大的学生,教师的教学内容却是一致的。教学活动参照的是平均水平,面向的是绝大多数,但这一定会导致部分学生“吃不饱”,还有部分学生“咽不下”,长此以往,势必会影响到教学质量。
受到学时和教材的限制,C语言课程往往无法将学生训练出理想的状态。这里的“理想”是指学生所设计算法的合理性和所编写程序的实用性,而原因在于当前的C语言教学内容缺乏实用性。举例来说,学生学了一学期的编程,写程序时变量名永远是“a,b,c,x,y,z”这样的简单字符,很少有学生会使用超过3个字符的变量名(数组名除外),更别提有意义的字符串了;写出的程序最多一二十几行,很多老师称之为“豆腐块程序”,不具备明显的实用价值;学生接触到的函数太少,使用C语言能完成的工作极其有限;指针等内容由于难度较大,同时学时不足,教学中浅尝辄止,没有体现出其真正的价值等等,这一系列的因素,导致学生最终能写出的程序是幼稚的,仅仅能应付考试而已。
针对以上教学中存在的问题,经过积极探索,从教师和学生两方面分析原因,并提出改进措施,以期帮助学生提高学习兴趣,提升教与学的效果。
想让学生较快的进入学习状态,首先就要明确课程开设的意义和目的。当学生搞清楚因何而学的时候,他们的学习行为才会更有目的,更为主动。因此,教师在设计教学内容时,很重要的一点,应该在第一次课上首先讲清楚C语言课程对于学生有何帮助,更通俗一点讲,要让学生心里明白“学了有啥用”。而此时教师也应避免向学生传达过于空洞或不太实际的内容,比如“C语言能锻炼逻辑思维能力,提高综合素质”等等,因为表达的事物过于抽象,学生听后往往如过耳烟云,没有印象。相反,如果能利用学生务实的心理,把C语言的作用与学生最关心的学业、工作等问题联系起来,效果就要好得多。比如,在面向电信专业的学生授课时,可以告诉学生目前电信行业中C语言的地位:绝大多数软件都由C语言编写,能够精通掌握C语言无疑在从事电信软件的相关工作时有很大的优势;再如,可列举一些较为突出的往届毕业生的收入状况等等,这些内容,对于大多数学生来说,往往具有很大的吸引力和驱动力。而学生明白了学习意义后,其积极性必然得到提高。
C语言的特点之一就是知识点庞杂零散,条条框框很多,编程时一不注意,容易出错。因此学生经常犯的一个学习方法上的错误就是:先去背书,把规则都记住了再去写程序。这样做有其合理性,就像学英语一样,单词都记不住,如何写文章呢?但是这种方法存在两个明显的弊端:第一,C语言中规则很多,单凭死记硬背很难全部掌握。第二,记住了一条条的规则,但实际使用效果并不好。背课本的学生常遇到一个问题,貌似规则都记住了,但是程序的结果就是不对。究其原因,C语言是一门实践性非常强的课程,与其说是看书记住的,不如说是编程练会的。因此,教师应向学生灌输和强调动手的重要性,一些编程的规则,通过学生反复使用练习,自然而然就成为一种习惯,而不需要去刻意记忆,这样的方法,相比背课本显然有效的多。
很多教师在教授C语言时,只是简单地将讲授内容做成电子教案,在课堂上照本宣科,按照程序语言语法、规则、变量、三种结构按部就班地一路讲来,学生却日益提不起兴趣,以至于对学习C语言产生倦怠心理,最后的教学效果会非常不理想。因此,教师要精心设计课堂内容,做好知识的引入和适时启发,用学生容易接受的方式进行讲解。比如,在学习函数一章时,很多学生对于函数如何使用很不理解,不知道何时该定义函数,何时该写调用语句。教师如果单单从头到尾一行行的讲程序,学生不好把握。应该从程序设计的一般步骤上向学生讲清这个问题。C语言的程序编写可分为四步,即:定义,输入,运算,输出。而子函数的引入,就是把原有的运算部分放到子函数中去,主函数中的运算语句换成函数调用语句。主函数中的四步变成了:定义,输入,调用,输出,而具体的运算过程由子函数完成。经过这样的讲解,学生就比较容易理解函数的定义和使用了。
教师在教学过程中,一定要注意培养学生自主学习,独立思考的能力和习惯,要让学生“断奶”。比如,在进行上机课辅导时,面对学生的提问,教师不能一味的帮学生找问题,调试程序。而是应该引导学生自己动脑动手去找到问题,解决问题。我校使用VC++6.0作为编程环境,学生开始对错误提示很不感兴趣,一是没有养成看提示信息的习惯,二是发现是英文,不愿意花时间去阅读。此时,教师可以在开始的几次实践课上先带领学生读错误提示,帮助学生判断问题,查找原因,逐渐教会学生使用VC的各个辅助功能,从而慢慢的让学生具备独立调试程序的能力。绝不能大包大揽,使学生过于依赖教师。
学生计算机基础不同是教师时常要面对的情况。有两个处理此情况的思路,一是实行差异化的教学。比如,对于有一定编程基础的学生,可以额外布置一些有一定难度的作业,引导其进行更深层次的思考;或是给学生创造实践的机会,参与某个具体的项目等等。此外,可以参照英语的分级教学的思路,实行编程语言分级教学。在开课之前,先对学生进行水平测试,根据成绩把学生分在不同层次的班级进行授课,授课内容当然有所不同,这样也可在一定程度上化解学生基础不同和教学内容一致之间的矛盾。总而言之,应该把学生之间的差异作为安排教学内容一个重要因素来考虑。
每一位教师都希望把学生个个都培养成编程高手,而这个愿望是不切实际的。教学的内容往往受多方面因素的影响:本课程的培养目标,学生的接受能力,课时的多少,教材的选用等等。以当前的实际情况来看,学生在一学期的学习后,还很难写出真正像样的程序:定义变量名没有实际意义(多是简单的单个字符),所编程序不具有实用价值(只能应付考试),不了解系统函数(学生能接触到的函数很有限),没有养成良好的编程习惯(不懂如何加注释)等等。可以说,学生从课堂上学到的只是C语言的皮毛,远远没有看到C语言的全貌。这其中,有教材的原因,一些教材上就是用的a,b,c这样简单的变量,就是十几行的简单程序,学生难免会依葫芦画瓢,因此,选用恰当的教材对培养学生的编程习惯非常重要。除了教材,也有课程安排的原因,C语言往往课时少,内容多,很多老师有这样的感觉,刚刚讲到精髓的地方,要结课了;学生刚学了点有深度的东西(指针),还没吃透,马上又要进行期末考试。当然,要在60-70学时内把C语言讲透很困难。但在课程设置时,应该考虑到课程的延续性,可以让学生在后续学期中选修C语言的高级内容,以利于学生对于本门语言的精通掌握。
作为一门重要的基础性编程语言,C语言在培养学生的编程习惯,算法设计能力,以及后续课程的学习,都有着重要的意义。本文从教学实践出发,列举了C语言教学中常面临的一些问题,并分析原因,同时提出了解决思路,为进一步做好C语言的教学工作,不断提升教学效果做出探讨。
[1] 程传鹏.基于大学生心理特点的C语言教学方法[J].计算机教育,2012,(01):68 -71.
[2] 方红琴.立体式C语言程序设计教学改革探讨[J].计算机教育,2012,(12):26 -28.
[3] 王巍.高级语言程序设计课程教学方法探析[J].计算机教育,2012,(08):44 -46.
[4] 陈高云,李蕊,王嘉昀.贯穿模块化编码的C语言教学过程[J].计算机教育,2012,(12):86-89.