谭立兴,姜 枫
(南京理工大学泰州科技学院计算机科学与工程学院,江苏 泰州 225300)
随着人工智能技术的飞速发展,社会对计算机专业技能人才的要求也不断提升,不仅要求学生具备传统扎实的理论研究功底,而且对学生实践动手能力的要求也逐年提升。“C程序设计”是计算机科学与技术相关专业的一门通识基础课,旨在培养学生的逻辑思维能力、创新能力和解决实际问题的能力,为后续专业课程的学习奠定良好的基础[1]。最新TIOBE的权威统计报告显示,C语言长期位居编程语言排行榜前三甲,如图1所示。
图1 TIOBE编程语言排行榜
由此可见,C语言的重要性不言而喻。为了深度契合社会信息产业的发展需求,很多应用型高校都相应以科技竞赛为抓手推动人才培养机制改革,制定并完善了与之对应的相关制度。开展计算机学科竞赛,不仅是对学生所学专业知识和编程能力的有效检查,更是全面考察学生利用计算机分析和解决相关实际问题的能力。
本文以“C程序设计”课程为教学改革研究对象,以直面编程竞赛为目标,教学过程以案例式教学为主体,充分融入竞赛知识点和传统理论教学内容,以期实现“以赛促教,以赛促学和以赛促改”的总体思路。主要从以下几方面递进式地介绍基于竞赛模式的“C程序设计”教学改革:首先介绍传统的理论教学模式的不足之处;然后介绍基于案例式的教学模式;最后融合竞赛常见知识点和传统理论教学的内容,介绍了面向竞赛的案例式教学模式,亦简称为“竞赛模式”。
传统的理论教学模式是一种以教师、教材和课堂为中心,周期性观测学生学习活动的教学模式。教师可以结合教材内容和教学培养目标,对教学内容以及各类资源加以分类和整合,结合学生学习需求、教学进度和教学计划形成一整套培养体系。教师还可以围绕因材施教的教学理念,对学生个性需求实现分层教学设计,为不同的学生推荐相应的学习内容,将C语言基础知识与学生内在的需求相结合,实现资源灵活分配以及有效运用,学生也可以根据教师讲题的思路和解决步骤,形成思维框架。
该模式往往会形成教师单向灌输、学生被动接受知识的局面。虽然所授课程的理论知识全面具体,但由于课时限制、教学手段单一、实践教学环节松软等因素,通常会导致所学理论知识与编程实践相脱节,从而使学生学习兴趣大幅度下降,最后仅仅为了通过期末考试而被动学习。不难看出这种传统教学模式的缺陷是非常明显的,问题的关键在于作为认知主体的学生学习的主动性长期被忽视。换句话说,由于学生在整个学习过程中都始终处于被动接受知识的地位,导致其在学习过程中无法反馈学习体验,从而使之长期处于压抑状态。很明显,这种教学模式与新时代对计算机专业人才培养的要求是不相符的,其承担不了培养当今社会急需的高素质创新性人才的重担。因此,改变传统教学模式,打造适应新时代的“C程序设计”教学模式势在必行。
案例式教学(case-based teaching)实际上是传统讲座和基于问题学习的经典组合[2]。在此教学过程中,教师依据课程教学目标,按照教学内容设置多个教学案例,并通过讲解一个个的教学案例,让学生在具体的案例中参与问题的分析、讨论和交流等活动[3]。该模式起源于1921年,最初由美国哈佛商学院所倡导,强调以学生为中心,采用了一系列来自于商业管理真实情境中所特有的案例来实施教学。目前该模式已被广泛应用于各学科领域的教学过程中,帮助提高学生的学习兴趣,从而有助于学生主动积极地参与课堂讨论。
案例教学既是学生综合运用所学知识、激发和强化思维的过程,同时也是学习新知识、不断提高自身分析问题和解决问题能力的过程[4]。实施案例式教学法大致分为以下几个步骤:①授课教师课前做好准备工作,包括吃透教材相关知识点、确定案例所需强调的主题并设计好案例即将展示的方式,以便上课时能够准确详尽地将知识传授给学生。②教师亦需根据教材内容和相关案例,设置一些能充分体现教学重难点的问题,从而让学生带着问题去探索与之对应的理论知识,并且尝试编程实现这些问题;或者设计一些生动形象的教学情境,使学生能够在这些情境中去不断发现问题、分析问题并寻求解决问题的方法。③所设置的问题需符合学生当前的认知水平和思维能力。设置问题应由浅入深,由易到难,由课内拓展到课外,由案例到教材内容,难度适中且有针对性,能做到寓理于问题和情境之中。
案例式和竞赛式方法已在实际教学中得到广泛应用且两者的融合将对教学模式的持续改进产生深远影响。案例式教学属于内部驱动,而竞赛式教学属于外部驱动,两者各有优劣、相辅相成。将竞赛纳入大学教育体系已在很多专业得到初步实践,如在佐治亚理工学院,竞赛被纳入机电一体化教育[5]。
接下来,将融合案例式和竞赛式方法的优势,对“C程序设计”课程教学改革进行了深入研究与探索。
目前,本校“C程序设计”课程教学所有课时全部在机房进行,采用案例式教学模式,运用边讲边练的手段,将课程内容分解为数据类型、运算符与表达式、顺序程序设计、选择结构程序设计、数组、函数和指针等多个知识群,而每个知识群由多个实际案例构成。
因此,需要教师在讲解编程案例的同时穿插与之对应的知识点,以达到学以致用的目的。传统案例式教学只侧重于教材内容,而忽略了与实际问题更贴切的竞赛式编码能力。
然而,算法竞赛题目涉及领域非常广,对学生要求较高且在大三会开设对应的“算法分析与设计”课程。竞赛题目的难度可分为低难度、中等难度和高难度3个类型,主要包含穷举、排序、搜索、递归、回溯、数据结构、动态规划和图相关算法等主题。为了帮助低年级学生提前打好编程竞赛基础,可在设计“C程序设计”课程案例时充分融入常见的中低层次的竞赛知识点。
以竞赛算法中最为基础的穷举法为例,其数学本质上属于归纳推理范畴,即通过枚举求解问题的所有可能情况得出一般性的结论。接下来以中国古代数学家张丘建所著《算经》中提出的“百钱百鸡”问题为计算背景,充分融入“C程序设计”课程中的循环嵌套知识点来构建穷举算法教学案例。
案例提出:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
案例分析:一方面,从数学角度看,此问题可归结为三元一次方程组的求解。假设公鸡有i只,母鸡有j只,小鸡有k只,则方程组如下所示:
另一方面,从算法设计角度,首先明确该案例的枚举对象分别为i,j,k这3个大于0的整型变量;其次需确定这3个枚举变量的取值范围,根据循环嵌套的次序(即i→j→k),由上述方程组可知0i20,03j100-5i和0k300-15i-9j;最后使用循环语句枚举出所有可能的解。
案例求解:百钱百鸡算法流程如图2所示。
图2 百钱百鸡算法流程图
将竞赛的常见知识点融入教学案例后,C语言课题组针对基于竞赛模式的课程做了一些有效的探索,主要体现在以下几点。
3.2.1 分组教学,锤炼学生的团队意识
将班内学生每3名学生分成1个小组,设置组长1名,每次课后布置适当的编程试题。在下次上课前随机抽取1个小组讲解代码,另抽取1个小组设计与之对应的测试用例。这样既鼓励学生在设计代码时表现其独特的创造力,又能通过其所设计的测试用例观察他们考虑问题的完整性。
3.2.2 严控代码规范,提高学生的抗压能力
在给学生布置课后编程任务时,需向学生强调严格的代码规范问题,并及时下发相应的代码规范文档。验收任务时,需指出学生的每次代码规范问题。遇到不能通过的测试用例,教师需要逐步指导学生DEBUG代码。这样严格要求学生一段时间后,大部分学生的代码质量和DEBUG能力都将大幅度提升。
3.2.3 采用在线评测系统,使学生编码养成“自给自足”的好习惯
目前,国内很多免费的在线评测系统拥有大量的竞赛训练试题并提供了对应的测试用例。学生上传自己编写的代码后,在线测试平台会在结果页码提供详细的评测信息,如测试用例通过率、运行耗时、内存消耗等。引导学生正确利用网上计算资源的同时,也潜移默化地培养学生良好的编程习惯。
3.2.4 基于项目的交互式教学情境
以构建知识群的多个案例组建案例,制定恰当的目标,借助多样化的资源开展教学活动,在有限的时间内解决一系列问题。通过多个特定的项目来组织学习活动,将传统的以知识传授为中心的方法转变为交互式解决问题和实施任务方法。在此教学情境中,学生结合专业知识,把握总体任务,分解并规划编程步骤,积极探索学习途径,在教师的指导下完成任务。这种方法以学生为中心,以项目为导向。教师的角色从“教”转向“导”,既能培养学生思考问题、分析问题、解决问题的能力,又将理论知识运用到具体任务中,从而让学生加深对所学知识的理解。
3.2.5 针对部分晦涩难懂的知识点,采用翻转课堂模式
教师讲解部分较难理解的案例后,如果发现大部分学生对此案例对应知识点掌握不够好,可根据课时情况适度采用翻转课堂模式。主要目的是让学生展现他们对所讲知识点的掌握程度,以便教师制定针对性解决方案。如在学生讲解对知识点的理解时,如果教师发现错误可适时提出修改建议。
近3年的“计算机科学与技术”专业课程满意度调查问卷显示,学生对“C程序设计”课程的满意度逐年提升,学生参加竞赛的主动性逐渐加强且取得的竞赛成绩也越来越好。接下来以蓝桥杯大赛C/C++小组成绩为例,简要叙述课程改革后的初步成果。
蓝桥杯大赛C/C++小组获奖人数对比如图3所示。由图3可知,自2018年全面实施面向竞赛的教学改革开始,蓝桥杯大赛C/C++小组的省赛和国赛获奖人数逐年提升,近3年获奖人数累积达98人次,2019年被评为江苏赛区优胜学校。
图3 蓝桥杯大赛C/C++小组获奖人数对比图
该模式的优势主要体现在以下3方面:①团队协作方面,竞赛模式的教学采用3人结对的形式分组学习,团队成员之间可以相互监督、相互学习乃至共同成长。这种协调合作形式不仅增强了小组成员之间的合作意识,也进一步增强了学生主动学习的渴望。②梯度教学方面,引入在线评测系统作为辅助学习平台,便于不同水平和不同阶段的学生根据自己的实际编程能力选择恰当的训练难度,亦便于学生循序渐进地学习。由于不同学生的基础不尽相同,提供多种难易程度不同的训练试题有利于梯度教学的持续推进。③激发学生学习兴趣方面,学生作为竞赛教学模式的认知主体,其作用显而易见。竞赛模式既完整保留了传统理论教学的知识体系,又将与实际应用中更贴切的竞赛知识点融入到教学案例中。学生在学习的过程中,潜移默化地训练了其解决实际问题的能力。随着教学进度的推进,学生会因为自己能够将学到的知识学以致用而逐渐增强学习编程的信心。
编程竞赛能有效提高参赛学生的编程能力、抗压能力和团队意识,而案例式教学是一种开放互动式、基于问题和情境的教学模式,被广泛应用在各领域的教学场景中。本文探索了融合两者优势的基于竞赛模式的“C程序设计”课程教学,有效提高了课内学生的学习体验,使之在潜移默化中提升了学生的计算思维和编程实践能力。未来,C语言课题组将持续推进基于竞赛模式的课程改革,不断分析总结,为进一步优化课程内涵做好积极充足的准备,从而为学校培养更多优秀的C程序设计人才奠定坚实的基础。