《程序设计语言》实验课教学改革研究
2018-12-11徐利军韩彦岭冯国富葛艳贺琪沈晓晶郑宗生袁小华赵丹枫
徐利军 韩彦岭 冯国富 葛艳 贺琪 沈晓晶 郑宗生 袁小华 赵丹枫
摘要:《程序设计语言》是一门重要的专业基础课,具有很强的实践性,为改善实验课的教学效果,我校围绕在线评测系统重新设计了实验教学环节。实践结果表明现在的实验课模式取得了良好的教学效果。
关键词:程序设计;在线评测系统
中图分类号:G434 文献标志码:A 文章编号:1674-9324(2018)50-0271-02
一、引言
《程序设计语言》是我校计科相关专业学生的一门重要的专业基础课。教学大纲要求学生通过该课程的学习,既要掌握高级编程语言(C/C++)的语法规则,又要学习程序设计的方法和思路,学生能够熟练运用C/C++进行程序设计,具备利用计算机求解实际问题的能力,初步具备一定的工程实践能力。《程序设计语言》作为一门实践性很强的课程,必须通过大量的编程训练和工程仿真实践,才能更好地达到课程教学要求。我校将《程序设计语言》课程学习分为两学期:大一上学期授课内容为面向过程的C语言,理论学习与上机实验时间之比为3∶2;大一下学期传授面向对象的C++语言,理论学习与上机实验之比为2∶1。此外,为培养学生的工程实践能力,在大一下学期期末集中安排一周的时间完成一个中等规模的项目。从时间安排来看,为切实提高学生的动手能力,我们安排了充足的实验时间,但实际执行效果却不佳,在大一结束时,学生动手能力差仍旧是一个普遍问题。这主要因为,同其他编程语言相比,C/C++语言概念复杂、规则众多,对初学者是一个不小的挑战。由于大一新生还没有培养出必要的计算思维能力,编程的时候,不少同学只能简单照抄现成程序,不能灵活运用,常因为一个简单的运行时错误或者逻辑错误便束手无策,而老师和助教的数量有限,难以及时协助学生解决问题。对于此类矛盾明显的问题,我们可以通过增加助教来缓解这个问题,但其实实验课中还隐藏着一个更为严重的问题,由于学生编程经验的匮乏,无法自行编写合适的测试用例,往往学生以为正确的程序其实是不完善的,而老师也不可能逐一验证程序,导致实验课上遗留了很多本来可以解决的问题。教师布置的课后作业,目的是培养学生的自主学习能力,但是因为在编程过程中无法得到及时反馈形成良好的互动,也无法达到目的。教学中老师的精力不得不放在解决代码正确性的问题,忽视培养学生养成良好的代码编写习惯,而大一作为培养学生遵守代码规范的黄金时间却因老师的精力有限无暇顾及而浪费了。
二、改革探索
针对实验教学中存在的问题,我校以在线评测系统(Online Judge)为核心,重新构建了实验教学环节。
1.在线评测系统介绍。在线评测系统起源于ACM国际大学生程序设计竞赛,它是基于B/S架构的程序代码评测系统,采用黑盒测试验证程序正确性。用户提交源代码后,系统会即时编译成可执行代码,使用预先设定的测试用例,从程序的运行时间、占用内存和运行结果的正确性等各方面检查代码,并返回详细的评测结果。评测结果包括:(1)正确;(2)格式错:程序输出可能包含了多余的空格或空行;(3)答案错:算法不正确;(4)运行错:除零、错误指针、下标越界等运行时错误;(5)编译错:语法错误;(6)超时:算法效率太低或存在死循环;(7)程序输出数据超出限制:输出太多数据。在线测评系统应用极为广泛,不仅可用于实验教学、课后作业和课程考试,而且可以用于学生平时的自我训练以及程序设计竞赛。基于不同测试用例的评测结果可以有效地协助学生查找程序错误。对于测试失败的用例,系统会提示代码可能存在的问题,学生不断修改的过程就是一个不断自我完善的过程,这个过程带来的成就感可以极大地调动学生学习的积极主动性。
2.实验课课程设计。课前准备,教师依照理论课的授课顺序和内容安排实验课的实验内容。在每次上课前,教师除了准备传统实验课的内容讲解,还需要在线評测系统后台准备实验方案。课中安排。授课教师首先简单复习理论课的内容,主要进行重要知识点讲解,之后学生登录在线评测系统完成实验内容,系统会自动记录学生的练习进度和练习时间,教师可随时查看个体学生报告和全体学生的总报告,针对错误率较高的知识点进行重点讲解。对于知识点内容较多的实验课,可以预先对知识点进行分组,对应这些知识点设置多个针对性实验方案。比如,按照教学计划讲授C语言循环结构时共安排了两次实验课,第一次实验课的内容是熟悉while、do…while和for语句的语法,第二次实验课是学习break和continue语句的使用。以其中第一次实验课为例:(1)课前,教师依据知识点将本次实验课分为两组实验方案,第一组实验方案包含的知识点有while和do…while语句的基本语法以及while和do…while语句的区别与联系;第一组实验方案涉及的知识点有for语句的基本语法和for语句的多种使用方式。授课教师登录在线评测系统后台,依据知识点完成实验方案的组织。(2)上课时,教师首先回顾while和do…while语句的知识点,随后学生选择第一组实验方案进行自测答题。教师可随时登录系统查看学生练习情况报告,就实验中出现的易错题或者学生感觉难度较高的题目进行重点讲解。第一阶段实验完成后,教师继续讲授for语句的知识点,学生打开并完成第二组实验方案。教师随后根据练习情况再次进行重点讲解。(3)下课后,因为在线评测系统安装在校园网服务器中,仍存有疑问的同学可使用个人电脑自行登录系统,进一步强化学习。使用在线评测系统的实验课组织模式,与传统实验课组织方式相比,优点明显,为师生双方提供了极大的便利。传统实验课中教师经常会被多个学生同时提问分身乏术,导致学生长时间等待教师解答而影响学习效果,而现在学生在练习时遇到的问题大部分能够得到及时准确的解答。新的实验课模式显著提高了学生学习的主动性,实验课的学习气氛有了明显改善,对比传统实验课得过且过的学生数量大大减少。在线评测系统显著地减少了教师的工作量,而且教师通过练习结果的报表分析功能也能及时掌握学生的学习状况,在随后的教学过程中专注于重难点问题的分析讲解,做到有的放矢。在实行实验课教学改革之后,学生的考试成绩和编程能力都有了明显的提高。
三、强调遵守代码规范
我校在教学中还有一个突出的特点,强调代码规范的重要性,争取让学生在初始阶段就培养出良好的编码习惯。虽然遵守代码规范并不能改善程序的性能,但遵守代码规范能够使程序具有更好的可读性、可维护性,而且还能减少不必要的语法错误和逻辑错误。良好的编码习惯是软件工程师良好专业素质的重要体现。代码规范包括以下几个方面。
1.适当的缩进:根据程序逻辑,以缩进格式书写代码。
2.适当的空行:函数与函数之间增加必要的空行,使得程序结构一目了然。
3.适当增加代码注释:子函数的开头需有注释说明该函数的作用、参数的含义;程序中重要业务逻辑的部分加入注释说明该段代码的思路以及算法。
4.代码块要用花括号界定。即使代码块里只有一行代码,也尽量使用花括号来界定代码块。
5.变量和函数的命名。尽量使用自说明的标志符来命名变量和函数,通过名称即可大致了解变量的用途和函数的作用。
虽然目前无法通过系统自动检查程序是否符合代码规范,但是相对于验证程序的正确性,该项任务仅需要较少的工作量。我们通过演示示例代码、点评典型代码和评分时额外加分引导学生遵守代码规范。通过编码规范的强调和实施,对提高学生的专业素养具有潜移默化的作用。
四、结语
实验教学改革以来,在线评测系统辅助的实验课模式有效地激发了学生的学习兴趣,培养他们的自主学习能力,同时该方式也极大了减少了教师的工作量,使教师有时间关注于培养学生良好的编程习惯。实践表明在线评测系统辅助的实验课模式取得了良好的教学效果。