徐新海1,2,林宇斐3
(1.高性能计算国家重点实验室,湖南 长沙 410073;2.国防科学技术大学 计算机学院,湖南 长沙 410073;
3.国防科学技术大学 研究生院,湖南 长沙 410073)
摘 要:基于“最近发展区”理论,借鉴ACM国际程序设计竞赛的形式,提出旨在激发学生编程兴趣、不断突破自我的C语言教学方法,阐述如何在打牢语法知识和调试能力基础的前提下分阶段组织教学内容,在每阶段末尾进行突击能力提升的课堂测试、测试用例与语法示例统筹设计,最终通过类ACM式的测试方法有效提高学生编程解决较难实际问题的能力。
教育期刊网 http://www.jyqkw.com
关键词 :C语言;教学设计;最近发展区;ACM;程序设计
基金项目:国家自然科学基金项目(61303071)。
第一作者简介:徐新海,男,助理研究员,研究方向为并行计算容错、通信与应用,xuxinhai@nudt.edu.cn。
1 背 景
维果斯基的“最近发展区”理论指出学生的发展存在两种水平,即通过基本学习能够独立完成一定任务的“现有发展水平”和在教师启发下经过自身努力可能达到的“潜在发展水平”,两者之间的差距就是“最近发展区”[1]。基于这一理论,教学应着眼于学生的“最近发展区”,通过合理的教学设计充分调动学生的主观能动性,激发其潜能,从而加深其对所学知识的理解,锻炼解决实际问题的能力。
由美国计算机协会主办的始于1970年的ACM国际大学生程序设计竞赛(简称ACM)是一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛,已经成为最具影响力的世界性大学生计算机竞赛,并成为一种全新的发现和培养计算机科学顶尖人才的途径[2]。
C语言作为典型的结构化程序设计语言,因其丰富的数据类型、运算功能和控制结构,高效的代码生成与执行效率,较好的可移植性,已经成为高等院校首选的入门级程序设计语言。针对C语言教学方法的研究一直是教改工作的热点之一,其中不乏基于“最近发展区”理论和ACM竞赛模式的研究。前期基于“最近发展区”理论的C语言教学主要关注教师如何通过在授课时设计循序渐进的问题启发学生理解并使用相关语法知识[3]。基于ACM模式的程序设计教学则侧重使用ACM式的程序设计实践替代传统课程实验,从而锻炼学生实践编程解决问题的能力[4]。
上述两种方法分别从课上知识讲授和课下实践动手两方面对程序设计教学进行改进。笔者将二者相结合,提出基于“最近发展区”理论的类ACM式教学方法,将由易到难的问题求解贯穿于理论知识讲授和实践技能训练的全过程,并以类ACM式的课堂测试完成跨越“最近发展区”的关键一步。
2 教学设计
“最近发展区”理论的一种通俗表述就是“跳一跳,摘桃子”。本节基于这一表述对第一作者在国防科学技术大学从事C语言程序设计课程教学过程中的教学设计展开介绍。
2.1 先下蹲——打牢语法和调试基础
“最近发展区”的基础是学生的“现有发展水平”,该水平的高低直接决定了“最近发展区”的起点与难度。第一作者在C语言语法知识点讲授的过程中,一直坚持文献[5]所给出的注重计算思维的启发式教学方法:语法与算法并重、从基础见思维,并针对各种语法规则设计相应的启发式案例,让学生深刻理解C语言定义各个基本语法规则的原因和形式,为其熟练使用正确的语法解决实际问题奠定基础。
提高编程解决实际问题的能力是C语言教学的最终目的,调试是加深知识点理解和提高编程能力的关键。在传统教学中,师生都可能存在因重结果轻过程而忽略调试能力训练的现象。在本文所述教学设计中,自开始编程完成作业起,就要求学生使用VC++6.0工作环境的调试功能:首先通过单步执行观察程序的执行流程;而后在遇到具体问题时,通过调试执行发现并纠正程序错误。
通过上述方法,学生可以打牢语法知识和调试能力基础,为后续在老师的引导下进一步激发潜能实现“跳一跳,摘桃子”做好准备。
2.2 再起跳——跨越“最近发展区”
有了高起点的“现有发展水平”,如何设计合理的“最近发展区”成为课程教学的关键。原则上,该区的跨度既要让大多数学生拥有经自身努力能够顺利通过的信心,又要让学生实现真正的跨越从而提高自身能力,为此,我们做了专门的教学设计。
首先,结合所使用教材《C++程序设计(第2版)》的章节编排[5],将C语言程序设计教学内容划分为图1所示的3个阶段,在完成每个阶段的正常课上学习和课下作业实践后,专门利用两学时(50分钟/学时)时间进行课堂测试,适当提高测试题的难度,测试成绩计入课程平时成绩。这样做的目的首先是及时发现学生在基本知识学习中的问题,避免问题的积累,另一个目的是实现“最近发展区”的跨越。
具体而言,第1阶段主要包括数据类型、运算符和表达式,输入输出,控制结构,函数4章内容,其中前两章为基本知识点,主要通过课下作业进行练习。在完成控制结构和函数两章的学习后,学生应该已经具备设计简单的算法和编写独立程序模块的能力,为此,教师很有必要为该阶段设计具有一定难度的问题,引导学生巩固基础知识提升程序设计能力。第2阶段主要包括数组和指针两章内容,这两章是C语言学习的重点与难点,因此该课程的启发式教学力求在将相关语法知识讲透彻的基础上,通过设计专门的课堂测试,求解相对较高难度的问题以提高学生理解和使用数组指针的能力。第3阶段主要包括结构、链表和文件3章内容,这3章的知识既可以起到巩固前两阶段知识的作用,又利于用程序表示客观世界。因此,教师也为此阶段设计了专门的课堂测试,以提高学生编程解决实际问题的能力。
其次,在设计本课程各阶段的测试题时遵从循序渐进的思路,将课上讲授语法知识点所使用的案例和测试所需要的案例联系起来,统筹设计,力求做到让学生感到熟悉但不简单。具体来说,测试案例的设计力争做到以下3个层次:衔接课上知识点原案例,巩固对已有知识的理解;又不同于原案例,使学生能触类旁通;加大难度或多种知识组合,突击提高程序设计能力,超越自我。
2.3 摘桃子——类ACM式课堂测试
除了高起点的“现有发展水平”和阶段性的“最近发展区”测试案例,课堂测试的组织形式也是课程设计成功与否的关键。好的课堂测试应能够充分调动学生的积极性,利用有限的课时突击锻炼学生的程序设计能力,为此,课程借鉴ACM程序设计竞赛的形式,精心设计了类ACM式的课堂测试组织方法。
类ACM式的课堂测试一方面保留ACM竞赛的基本形式,即要求参赛选手在规定的时间内完成给定问题的编程;另一方面,结合课上测试时间和学生编程水平的实际情况,对竞赛的题量、组队、评分、判题等形式进行相应调整。标准ACM竞赛与类ACM课堂测试比较见表1。
如表1所示,由于受到课时限制,类ACM测试将测试时间从5小时缩减为2学时,相对应的题量也由10道缩减至2或3道;测试形式由3人组队变为个人完成,这是因为对于C语言程序设计的初学者而言,首先需要训练个人能力,而不是训练其团队协作编程能力;评分形式则是由整题计分变为按点计分且各小点计分之和大于满分,这是因为测试案例大多包含由浅入深的几个子问题,按点计分有助于激发学习积极性,也利于引导学生完成较难问题的求解,而小点计分之和后大于满分也有利于学生获得较好的平时成绩。阅卷、判题根据教学平台的不同既可以选择机器判题,又可以选择人工判定。对于2学时的测试时间,我们进行了进一步细分,第1学时由学生独立完成测试并计分,第2学时先由教师对题目进行讲解和必要的程序演示,再留半小时给学生进行测试,但此时通过测试所获得的分值将有所降低。
3 “最近发展区”案例
基于第2节的课程教学设计,本节重点对基于“最近发展区”理论的类ACM式C语言教学方法中贯穿授课与测试的主体——案例展开介绍。篇幅所限,笔者只选取两个代表案例,介绍其考核的知识点、分点计分的各个小点、在语法知识讲授时的铺垫以及解题的基本思路。
3.1 长整数求“根”
求数“根”测试要求主函数从键盘读入一个整数,求出该整数的“根”,即对该整数的各位数字相加求和,若得到的和大于9,则对该结果的各位数字再次相加求和,直到结果小于10为止,这个小于10的整数就是长整数的“根”,如整数12345的“根”为6,因为1+2+3+4+5=15,而1+5=6。该案例主要用于考查学生对控制结构的理解,但学生也可以通过递归函数知识编写出正确的代码。案例设计了3个层次的计分点,难度逐步加大,具体如下:①输入整数的长度固定为7位;②输入整数的长度不定,但不超过9位;③输入整数的长度不定,但不超过100位。
作为铺垫,授课教师应在课堂举例或布置作业时将计分点1作为一个独立问题,给出编程思路交由学生思考求解,如先使用一个for循环进行定数循环,求解7位整数的和;再利用一个while循环判定和是否小于10,大于10则重复第一个求和的过程,小于10则输出结果。有了这一铺垫,进行类ACM式课堂测试时学生就比较容易理解题目要求,并能够较顺利地编写程序求解计分点1。对于计分点2,输入整数可直接存储在一个整型变量中,教师应在测试时提示学生使用两次while循环,即外层循环控制当前数是否小于10,内层循环用于求各位数字之和。计分点3的输入整数已超过整型的表示范围,教师可以提示学生先使用getchar函数,边读取输入整数边做一次按位求和,从而将计分点3的问题转变成计分点2的问题。
3.2 基于动态内存分配的扫雷
扫雷是类似Windows操作系统自带扫雷游戏的案例,主要考查学生对数组和指针的理解、掌握与使用情况,同样分为3个层次的计分点:①扫雷边界区域固定为20×20的网格,每个网格有雷的概率固定为0.2,要求程序能够在屏幕上输出雷的二维分布情况,即显示一个20行20列的字符信息(有雷打‘X’,无雷打‘O’);②在计分点1的基础上,要求在无雷处输出该网格周围雷的个数,即与Windows系统游戏类似的规则;③在计分点2的基础上,要求雷区的网格规模是动态输入决定的。
作为铺垫,教师在课上讲解随机数生成并基于随机数进行概率判定的方法,且在课件中给出详细代码,学生可以直接拷贝使用。在课堂测试时,针对计分点1的提示是用一个20×20的二维数组存储随机数结果,并根据随机数结果在屏幕上输出‘X’或‘O’;计分点2的提示是使用一个22×22的二维数组,边界元素均赋值为无雷,从而简化中间区域无雷网格的周边雷数计算过程;计分点3则提示学生使用指向指针的指针进行动态内存分配,需要说明的是指向指针的指针使用方法教师也已在课上举例时通过其他案例进行了介绍,学生只需要模仿编程即可。
通过上述两个案例的介绍,可以看出测试案例均具有一定难度。在传统程序设计教学中,对于没有编程基础的大一新生,往往很少能够接触到具有上述难度的习题,但本课程的实践结果表明,基于“最近发展区”理论,有了测试前课堂教学时的相关示例铺垫,学生对上述测试表现出了浓厚的兴趣,并能够在有限的课堂测试时间内显著加深对相关知识点的理解,提高程序设计水平。
4 教学成效
2014年春季,笔者在给国防科学技术大学大一新生高级班2班(高级班学员是通过以选择题为主的摸底考试选拔出来的,仅能反映其对计算机的理解较好,即大学计算机基础知识掌握较好,但并不代表其具备编程基础[5],如高级班2班仅4人在高中阶段接触过程序设计)讲授计算机程序设计课程时使用了基于“最近发展区”理论的类ACM式C语言教学方法。期末机试成绩见表2。
如表2所示,在学期末的机试考核中,高2班的平均分达到84.25分,及格率100%,优秀率39.39%,并有2人获得满分,各项指标均大幅高于全校整体水平(全校整体成绩数据已扣除高2班的人员影响),也明显高于另两个高级班。值得注意的是高1班的及格率低于全校整体的及格率,这也在一定程度上反映出高级班的学生在课程学习之前并不一定具有更好的编程基础这一事实。
上述统计数据尤其是平均分和优秀率数据表明,在同样的学习时间内,基于笔者所提出的C语言教学方法可有效激发学生的学习兴趣,帮助学生跨越“最近发展区”,显著提高编写程序解决实际问题的能力。
5 结 语
笔者结合在国防科学技术大学从事程序设计课程教学的经验,提出基于“最近发展区”理论,借鉴ACM程序设计竞赛模式的C语言程序设计教学方法——分阶段教学,进行类ACM式的阶段课堂测试,统筹设计课上语法知识示例与课堂测试用例。教学实践结果表明,使用该方法教学的高级班学生具备更好的通过编写程序解决实际问题的能力;在学期末的程序设计机试考核中,该班各项成绩指标都大幅领先全校以及其他高级班的学生。
教育期刊网 http://www.jyqkw.com
参考文献:
[1] 谭顶良. 高等教育心理学[M]. 南京: 河海大学出版社, 2006: 6-9.
[2] 朱月秀. 基于ACM竞赛的C++程序设计课程教学改革[J]. 漳州师范学院学报: 自然科学版, 2012(1): 96-99.
[3] 廖灵芝, 顾韵华.“最近发展区”理论在C程序设计教学中的应用[J].计算机教育, 2010(22): 101-104.
[4] 常子楠. 基于ACM模式的程序设计类课程实践教学探索[J]. 计算机教育, 2010(16): 144-146.
[5] 徐新海, 林宇斐. 注重计算思维的启发式C语言语法教学[J]. 计算机教育, 2014(17): 1-4.
(编辑:宋文婷)