1. 引言
C语言程序设计是信息类专业的必修课,同时也是数学相关专业,如应用数学、计算数学的专业基础必修课。根据专业培养方案要求,学生在掌握C语言语法和编程知识的基础上,熟悉编程技巧,培养程序设计和解决实际问题的能力。同时,对于数学专业本科生,通过对编程课程的学习,能够促进其它数学专业课程的学习,如数值计算、线性代数、数学建模等。
在实际教学过程中,上述培养目标达成面临着不小的挑战。一方面,C语言程序本身涉及知识点多、语法灵活,表达能力强,可移植性强,但是学生学习难度大,往往抓不住学习的重点,对于数学专业来说,由于课程设置原因,往往缺乏计算机学科的基础认知,比如不了解计算机内存结构、数制转换过程等,加深了学习的难度,在学习过程中容易产生畏难情绪、产生抵触心理。另一方面,程序设计课程非常注重实践过程,学会C语言语法仅仅是程序设计的第一步,培养严密的逻辑思维、提升计算思维才能高效利用计算机程序解决实际问题。从学科角度,理科专业的学生本身并不具备较强的实践动手能力,少数学生甚至对实验有抗拒情绪。更为重要的是,学生对于程序设计课程与其专业课程的关系认知不清,学习目标不明确,加上基础不一,缺乏长期坚持学习的动力。
基于OBE理念 [1] ,项目式学习(Project-Based Learning, PBL) [2] 强调学生在真实问题情境中探究学习,突出培养学生实践能力和解决问题的能力。本文将PBL教学方法应用于“C语言程序设计”课程实验教学,针对数学专业特点设计实验项目内容,以“验证型实验 + 综合性实验”结合方式,激发学生的主动性和创造性,重点培养学生的主动探究和解决问题能力。
2. 实验内容设计
“C语言程序设计”课程教学内容按难易度可以分为基本语法模块和高级语法模块,前者包括基本数据类型及运算、顺序、分支和循环三种程序结构,后者覆盖数组、函数、指针字符串及结构体以及文件等知识点。针对不同的知识点,设计针对数学专业的项目是开展项目式学习的前提,这些基础项目帮助学生理解所学的语法知识、验证程序设计逻辑并提升程序设计调试能力。
2.1. 验证型实验项目
在相应章节的教学过程中,针对不同的知识点设置不同的项目。这些验证型项目问题简单,定位于学生对C语言编程语法的记忆、理解和应用。通过上机实验,学生验证课堂上所学知识点,并掌握简单程序的设计与实现。在项目的选择上,基于数学专业人才的培养目标,将程序设计与数学专业紧密结合,既考虑当前所学C语言语法知识点,又要兼顾数学专业学生的基础。如表1所示,项目包括常见的算术计算、图形求解、方程求根、矩阵转置等问题,也有找零、贷款利息、商品折扣这些与生活紧密相关的问题,还有百钱百鸡等传统数学问题。

Table 1. Project selection scope in validation experiments
表1. 验证型实验项目选题范围
2.2. 综合性实验项目
根据布鲁姆分类法 [3] ,综合性项目定位于学生高阶认知能力的培养,包括综合、分析和评估能力,要求学生开放选题,通过团队协同完成一个模拟真实场景的项目。如图1所示,针对我校两个基本数学专业和一个衍生专业,提供了不同项目选题,突出面向专业的个性化实验教学。应用数学专业定位于利用数学模型或实验解决现实问题,因此项目设计侧重于常见算法层面,可选的题目包括查找、排序、智能优化算法等。信息计算专业的课程目标定位于利用科学计算方法求解优化问题以及概率相关数学问题,因此选题侧重于数值计算函数库的设计,范围包括不同数值计算、方程求根、矩阵运算等。信息管理专业是数学与计算机、管理学科的交叉专业,定位于利用数学和计算机知识实现信息的管理与决策,可选择的范围包括学生成绩管理、学籍管理、图书信息管理以及通信录、个人财务信息管理等。

Figure 1. Project selection scope in comprehensive experiments
图1. 综合性实验中项目选题范围
3. 教学方法与实施
3.1. 验证型实验的实施
为了给学生以及时的反馈,利用在线评测(Online Judgement)平台头歌网作为本课程的实验平台,头歌网以任务关卡方式组织项目,提供任务发布、代码编辑、在线编译、多样本测试以及实时评测功能。
验证型项目以课程章节内容为周期,教师依据每一章节知识点设计表1中相应的项目,在讲解完相应的教学知识点后,即时发布项目,学生带着问题去学习,实现“以学生为中心”的教学理念,激发学生的学习动力。如图2所示,窗口左边是项目任务的描述、涉及的知识点、求解过程中要解决的重难点问题及相应的提示;右边窗口是学生的开发平台,学生可以在线编写代码,自测运行程序,并进行评测。学生提交完成后,教师可以通过后台查看学生完成情况,包括学生总评成绩、完成耗时及评测次数等。

Figure 2. Project online development environment
图2. 项目在线开发环境
3.2. 综合性实验项目
综合性实验项目强调以团队为主,学生自发以小组为单位,自行选定项目,通过查阅资料、咨询老师、与同学讨论等多种形式,合作完成任务。在设计过程中,鼓励学生从不同角度、多种思维求解,同一问题可以用不同的算法去实现。在实现过程中,既强调学生独立思考、遇到问题多思考;同时教师也要积极参与,尤其在程序调试过程中,需要不断指导学生,帮助学生培养程序调试技巧,及时纠正学生对知识的理解偏差,并根据学生的结果分析学生的学习情况。在整个过程中,学生是主体,教师为辅导。
以高等数学中的求解定积分为例,常见的数值计算算法包括:1) 几何法:矩形法、梯形法、抛物线法等;2) 概论意义上的数值算法:平均值法、蒙特卡洛方法等。例如,根据定积分的定义和几何意义,设函数
在[a, b]上有界,在[a, b]中任意插入若干个分点
,把区间[a, b]分成n个小区间
:
,各个小区间的长度依次为
,在每个小区间
上任取一点
作函数值
,与小区间长度
的乘积并求和S,那么S的极限称为函数
在区间[a, b]上的定积分。
矩形法正是基于定积分的几何意义,如图3所示,学生可以根据计算过程设计相应的算法,然后定义形如以下形式的函数:
此处,[a, b]表示积分区间,n是划分间隔数目,参数p代表被积函数,实际调用时实参为函数名。考虑到同组学生,可以基于不同的算法来实现上述各个不同的求解算法,实现一题多解,不仅开拓了学生的计算思维,也反过来增强了学生对定积分概念的理解。

Figure 3. Illustration of rectangle method of definite integral calculation
图3. 矩形法求定积分
图4显示了实现上述项目过程中,对学生基础知识点的考核。数学基础知识方面,包括极限和定积分概念的理解。程序设计基础,主要涉及数据类型及运算、条件控制和循环控制语句以及函数的定义和实现。在程序实现过程中,学生可以对程序调试和测试有进一步的理解和把握。最后,在实现报告环节,学生可以锻炼其口头表述和报告书写能力。

Figure 4. Knowledge modules and assessment
图4. 知识模块与考核
4. 教学评价与反思
验证型实验评价由平台自动打分完成,结合教师的评价给出最终成绩。综合性实验项目采用教师评价、小组互评和反馈评价相结合方式,其中三者的比例是70%、20%、10%。如图5所示,对信息计算专业的33学生进行问卷调查,设置题目为“项目式学习对提升哪个方面能力有帮助?”的多项选择题。结果显示,超过80%的同学认为本课程的项目式学习,尤其是参与综合性实验项目有助于其巩固数学知识及C语言编程能力。其中,69%的学生认为对计算思维有了初步的认知,54%的同学认知到了算法设计的重要性。43%同学反馈程序调试能力和团队合作意识得到了一定的提升,原因是因为信息计算专业的实验项目集中在各类数值计算函数的设计,需要成员间协同较少。另外,29%的同学反馈工程思维得到了提升,符合项目设置预期。

Figure 5. Project-based learning and students’ capacity cultivation
图5. 项目式学习与学生能力培养
综合而言,数学各专业培养目标存在差异,综合实验项目的设计与其专业培养目标保持一致。但是,数学类专业课大多在大二或大三开设,一定程度上限制了学生的选题范围,需要不断地完善及优化项目选题。另一方面,在实际项目式学习过程中,学生的专业基础差异较大,尤其是在程序调试能力和综合问题分析方面,部分学生独立完成难度较大,后期教师或者助教提供实时指导是项目式学习成功实施的关键。
基金项目
本项目由广东省本科高校数学教学指导委员会教改项目(编号:GDSXJG35)和暨南大学教学质量与教学改革工程教学改革研究项目(编号:JG2023062)提供资助。