C语言课程的教学改革与实践

2013-04-29 17:57:48朱清华
教书育人·高教论坛 2013年6期
关键词:语句学期编程

朱清华

程序设计课程在计算机科学(Computer Science, CS)专业新生的教学中起着相当基础的作用,CS专业包括计算机科学与技术、软件工程和网络工程。尽管近年来涌现了很多新的程序设计语言,如java, C#, Python和Ruby等,但C和java语言从2002年以来一直是两种最流行的语言[1]。C语言经常名列软件界知名的“TIOBE Programming Community Index”(TIOBE程序论坛指数)排行榜首位。所以,我们依然选择了C语言这种非脚本语言作为一年级新生的必修程序设计课程的语言。

随着信息技术日新月异的发展,社会需求越来越多的CS专业毕业的学生。Internet已经渗透到人们日常的工作、学习和生活当中,一年级CS专业的学生与上世纪90年代相比也发生了很大的变化。在我们学校,2001年到2003年计算机科学与技术专业的学生入学平均成绩在全校几十个专业位居第一;然而,10年之后的2011年,已经降至第28名。PC机和Internet的普及和十年前相比不可同日而语。这些新的变化迫使任课老师必须采用新的方法以应对入门程序语言课程教学的新需求变化。

本文其它部分组织如下:在第二节分析了教学过程中存在的问题之后,将在第三节提出一些方法来解决这些新出现的问题,最后第四节进行小结。

一问题分析

在过去几年的教学中,我们发现,把这门课程安排在一个学期内完成学习,很多学生感觉吃力,在后续课程学习过程中会表现出遇到实际问题编程能力较弱。甚至有少数一些学生不知该如何下手写一个新的程序。本节我们从教和学两个方面挖掘分析其中存在的问题。

1对计算机科学缺乏兴趣

C语言安排在一年级,很多学生在入学前对这个专业认识很肤浅。可以说入学前,几乎所有学生对今后的计算机职业生涯规划都一无所知。换言之,只有相当少数的学生对CS专业有他们自己的爱好兴趣,曾经学习过编程,他们对专业或程序的兴趣可使得以后的学习是自我驱动式的。然而,总有一些学生在C语言课程的初始阶段是毫无兴趣可言。据我们经验来看,很大程度上,课程结束时考试成绩差进一步导致他们对后续专业课程学习缺乏信心。兴趣才是最好的老师。任课老师应该从课程一开始就激发学生的兴趣,才能在后续教学过程中使学生的潜能得以发挥。

2缺乏编程的调试能力

编程新手经常苦于如何像挤牙膏似的写程序开始的代码段,而且,在好不容易写出程序后,不知道如何找出隐藏在其中的错误和漏洞,不知道如何分析程序找出错误。特别是对于成绩较差的学生,即使写很简单的程序,他们也看不出程序到底是错在哪里或者为什么得出不正确的结果,不知从哪里开始排查和定位错误。这样的情况在我们每一届每个班的教学中都会遇到。实际上,即使是熟练的程序员,调试程序的能力都是必不可少的,特别是在开发复杂软件程序的时候。

3优秀生和差生之间的差距问题

在我们计算机学院,招生人数从2001年的359人翻一番到2011年的790人。学生来源于从大城市到农村等不同地区。在第一次课时,我们都会做过简单调查,发现只有少数一些学生在高中学习过程序设计,一般学习BASIC或PASCAL语言,有的学生曾经参加过国家奥林匹克信息学竞赛(NOI)等相关课外活动;大多数学生并没有学习过程序设计。在一年级第二学期,将会有优秀的学生能在ACM广东省赛区比赛中获得奖励。再看成绩较差的学生,在第一次上机课时,他们连键盘的布局都不知道,不知如何开机关机和基本的操作,因为以前从未使用过PC机。这样,优秀生和较差生的差距比十年前扩大了。如果我们教学过程较多顾及后者,前者将不能充分利用好课堂时间发挥他们的潜力。这就会任课老师带来新的挑战。

二改革教学方法

1在课堂教学中提高学生对计算机科学的兴趣

通过和本课程相关的故事,让学生了解计算机科学技术发展史的同时,激发他们对计算机技术的热爱和对科学执着追求及探索精神,逐渐培养兴趣。例如,在第一课时,在讲C语言历史时将介绍C语言之父丹尼斯·里奇(Dennis Ritchie)的故事,他虽然不是像比尔·盖茨那样为大众所知,但他和肯·汤普逊(Ken Thompson)对C语言和UNIX操作系统做出了杰出贡献。在C语言和这两位著名计算机科学家互相交织的历史故事当中,学生将体会到什么是科学精神,什么是对计算机科学的贡献和创新。当然,在课程的后续教学过程中仍然会花几分钟加入一些相关故事活跃课堂气氛。学生乐于在课堂中听到这些一般不为人知的故事,潜移默化地增加了兴趣。

另外一个途径是介绍和C语言关联密切的应用实例。虽然C语言被用于开发操作系统和嵌入式系统,但是,这些应用不易于新手所理解。所以,在讲到相关知识时,我们选择一些简短的应用程序演示其运行甚至浏览一下源代码,有些有趣的应用就作为实验课的任务,让学生完成编程。曾做过2个班级对同一个实验内容的比较,一个班级要求编程完成的是与实际应用需求相关的任务,另外一个班级要求完成的是等价的数学问题,实践表明:前者能激发学生解决问题的求知欲望,提高学习兴趣,并且更多的学生进行热烈的讨论和进一步思考,效果较好。

2运用可视化工具促进学生对程序的理解

可视化工具是促进学生直观理解程序运行过程一个重要的有效的方法。我们采用了吴伟民教授开发的名为Anyview的一套软件[2],从2009级的部分班级开始试用,2010级所有学生使用。从2010年开始正式建设题库,到目前为止已经达300题(共9章教学内容的习题)。它由web服务器端和客户端两部分组成。服务器端存储了实验任务的题目数据库和学生写的源程序文件,包括正确完成的程序以及未完成或有错误的源程序。客户端安装能够通过校园网或Internet连接服务器的 PC机上,学生用来编写程序。

使用Anyview与原来教学相比有较好效果。Anyview打破了课堂实验教学的时间限制,学生在宿舍或者其它地方能连接通过Internet的PC机上用它编程。Anyview有助于初学者理解、调试程序。可以为不同的教学层次的学生设立不同作业表,使学生编写程序的题目不同。例如,曾经根据重修班级学生的学习情况,专门设置1个题库,让学生重点练习薄弱环节。布置的上机题目分必做和选做,因材施教,使不同层次学生都能得到提高。

课堂教学用Anyview演示程序的运行。程序能在其中编辑、运行和调试。可以使程序一步一步的运行过程或设置断点,学生就能观察运行过程中所有变量值的变化情况。对一年级的新手来说,它操作很简单,结果直观可见,有助于学生理解for语句、while语句等控制流程语句的执行过程。在实验课上,我们鼓励学生使用多种IDE开发工具(Integrated Development Environment)配合Anyview一起学习。

从老师的角度来说,我们能够通过教师端程序详细地实时地了解每个学生编写程序的进度。有助于老师督促较差学生,可以通过教师端软件看到哪些学生完成情况差,实时掌握学生学习情况;反馈到课堂教学有的放矢。并且可以知道优秀学生学习水平如何,有哪些学生的自学能力较强,有的学生可以在开课2个月内完成整个课程的题目,在2009级之前通过作业或提问往往不能发现所有优秀生。随着题库建设完善,我们将进一步用Anyview进行实验课限时测验,让不同班级的任课老师自主设置每个班级的题库作业表。

3从一开始就强调学习调试

调试是用于发现或减少程序中错误缺陷的分析过程。在课程教学中使用了3种工具。下表对它们的优缺点做了比较小结。

新手容易掌握Anyview的使用,而且他们可能对操作Windows上的软件工具不熟悉,所以在课程开始的前几周,我们教学生使用Anyview。新手往往很难学会TC的环境配置,我们在教学实践中发现较差的学生在课程接近结束时都对配置感到迷惑。VC还是受到编程相对熟练的学生的欢迎,他们可以用VC写一些自己感兴趣的稍大的程序,甚至完成包括窗口图形界面程序的编写。

在第1次实验课上,我们就告诉学生如何用工具查看变量的值。在后面的教学中,要求学生掌握如下调试技术,告诉他们什么时候选择其中之一来进行调试[3]。经验表明,学生越早学习使用调试技术,将能更好地提高调试程序的能力。

(1)单步执行。每步执行一条语句,选择一些变量加入观察窗口。(2)跳越函数执行。这将在讲函数这一章时讲。学生可观察一些变量的值在执行完函数后的变化。(3)在指定语句处设置断点。(4)在程序中的某些语句后加入打印语句,以便在程序运行后观察某些变量在运行过程的中间结果。方法3和方法4将在讲完循环控制语句后学习。

4改为2个学期学习该课,改革课程考核方式

为了切实提高大多数学生的基本编程能力,充分发挥优秀生的潜力[4,5],我们进行了两项改革。在2009级之前,本课程在一年级的第1或第2学期开课,在一个学期内完成教学,理论课堂教学与实验课教学分别占56和16课时;学生普遍感觉时间很紧,没有足够的时间在机器上编写代码实践。而在2010级开始,我们改革教学安排,分成2个学期完成该课教学,第1学期理论与实验分别占32和24课时,第2学期分别占24和16课时。这样的调整安排使学生有更多的实验课时间花在编写代码实践上面,以用促学。

另外,从2011级开始我们在第2个学期根据学生在第1个学期的学习综合评价进一步把学生分成2个教学班组,大概25%较优秀的学生安排在A组班级,其余安排在B组班级。在第2学期A组学生要求完成1个较大的程序设计任务,或称为课程设计任务,包括编写代码和编写相应的文档。对B组学生重点强调基本编程方法的教学。当然在Anyview系统中我们布置给他们的编程任务也有所区别。实践表明,由于这种因材施教,A组学生的能力提高更快能够挑战难度更大的任务,而又使相对较差的B组学生获得了更多基本的编程训练并为以后学习建立了更强的自信心。

老师能用Anyview查询查看到每个学生写的每个程序并评分。当然给程序评分并不是一件容易完成的工作[6],需要有更好的算法。下图是2012年秋季的一个班级共46人的Anyview综合评定成绩排名与期末考试笔试成绩排名的差值,其中x轴表示学生序号1~46,y轴表示这2个排名的差值。数据为(Anyview排名,期末考试排名):(46,46),(13,6),(6,4),(23,22),(19,23),(10,27),(13,2),(11,28),(31,32),(29,40),(41,20),(4,7),(36,37),(33,39), (32,18), (1,9), (2,11), (45,31), (8,26), (23,33), (35,38), (9,1),(13,24), (5,12), (18,35), (42,25), (20,15), (28,43), (22,16), (43,36),(20,30),(23,10),(17,3),(12,34),(27,41),(34,19),(44,42),(7,14),(29,13),(3,5),(16,8),(38,17),(26,44),(39,45),(37,21),(40,29)。这说明,很多学生平时实际编程能力与笔试表现有出入,所以最后课程的成绩评定中期末考试占一定的比例,还必须考虑平时实际编程能力表现。

总之,C语言是一门在本科一年级开设的基础课程。我们进行的教学改革实践表明培养学生对本专业课程的兴趣是很重要的,本文分析了如何解决学生调试能力差的问题,介绍了用一个可视化工具作为调试器和新生有效学习助手的经验。如何对不同学生进行个性化教学是一个挑战性任务,我们改革了教学学时安排和进行了分组教学,使得优秀生和较差生都能得到尽可能大的进步。

参考文献

[1]吴伟民.试论软件基础课程程序设计环境的可视化[J].广东工业大学学报:社会科学版, 2007(B06): 156-157.

[2]Pengfei Yu, Lijun Yang, Programming Skills Training in Programming Language Courses[C].2010 International Conference on Educational and Information Technology, V3: 14-16.

[3]Andreas Zendler, Christian Spannagel, and Dieter Klaudt. Marrying Content and Process in Computer Science Education[J].IEEE Transactions on Education, 2011(8): 387-397.

[4]Raymond Lister and John Leaney, First Year Program ming: Let All the Flowers Bloom[C]. 2003 Proceedings of the fifth Australasian conference on computing education, Volume 20: 221-230.

[5]JoséLuis Fernández Alemán, Automated Assessment in a Programming Tools Course [J]. IEEE Transactions on Education, 2011,54(4):576-581.

[6]KonstantinosAntonis,ThanasisDaradoumis,SpyrosPapadakis, and Christos Simos,Evaluation of the Effectiveness of a Web-Based Learning Design for Adult Computer Science Courses[J].IEEETransactionsonEducation,2011(8):374-380.

猜你喜欢
语句学期编程
我家有只编程猫
我家有只编程猫
我家有只编程猫
我家有只编程猫
新的学期 新的尝试
少先队活动(2021年9期)2021-11-05 07:31:12
期末冲刺高二上学期期末模拟卷
重点:语句衔接
精彩语句
八年级(上学期)期末测试题(D)
如何搞定语句衔接题
语文知识(2014年4期)2014-02-28 21:59:52