基于翻转课堂的程序设计课程教学改革实践
2018-10-25翁佩纯马慧
翁佩纯 马慧
[摘 要]程序设计课程是一门实践性很强的课程,其教学效果将直接影响学生对后续专业课程的学习信心。翻转课堂强调以学生为主教师为辅的教学模式,通过延展学生课外学习时间,提高学生自主学习能力。通过分析翻转课堂模式带来的挑战,针对程序设计课程设计了翻转课堂的教学案例,为程序设计课程提供一种新的教学思路。
[关键词]翻转课堂;程序设计课程;教学案例
[中图分类号] G642.0 [文献标识码] A [文章编号] 2095-3437(2018)10-0089-04
翻转课堂的思想自2007 年由美国科罗拉多州的两位化学教师提出以来,已成为国内外教育界关注的热点,并取得了令人满意的教学效果。翻转课堂的核心思想是:课前学生自主通过线上的视频、测验等教学资源进行学习;课堂上学生通过各种教学活动,如小组讨论、实验操作等,达到知识的内化[1]。
程序设计课程是一门计算机核心基础课程,具有较强的实践性与应用性。在该门课程的授课过程中,通过培养学生的计算思维能力,强化学生的上机训练,从而提高学生的编程技能。其教学目标是培养学生解决问题的能力,并通过实际问题的编程实践培养学生的计算思维,强化学生的动手能力。在以往的教学中,学生的上机练习多以验证型为主,完成上机任务和课后作业,便极少投入时间加强编程能力的培养,学生对编程兴趣不高,学习积极性较差,属于典型的被动式学习。翻转课堂的思想是以学生自主学习为主,教师启发为辅。如何翻转课堂,变被动为主动,选择以生活中的实际问题和工程实际应用为背景的教学案例,从讲授编程语法为主转变为以启发学生的编程思维为主,从课堂上的被动学习转变为课后的主动学习,是进行程序设计课程翻转课堂实践的思考之一。
一、翻转课堂带给程序设计课程的挑战
翻转课堂的思想是学生先在课前通过在线教学课件、视频、练习等进行知识的获取和学习;在课堂上经教师的启发和引导,通过实际题目的演练来完成知识的内化[2];课后再通过在线练习、测验等方式进行知识的巩固。将传统的课堂中教师与学生之间的主辅地位翻转,形成“课前学习+课堂内化+课后巩固”的教学模式[3]。将翻转课堂应用于程序设计课程的实际教学过程中,面临以下3个方面的挑战。
(一)改革学生的学习方式,变“被动学习”为“主动学习”
翻转课堂要求学生自主安排时间上网学习视频资料并完成在线试题。对学生而言,最大的挑战则是需要改变原来被动接受知识的方式,培养主动学习,发现问题并总结问题的良好学习习惯。这需要学生有良好的自制能力和学习积极性。
(二)改革教师的授课方式,变“课堂授课”为“引导协助”
翻转课堂不仅需要教师根据教学资源,裁剪、整合、设计在线学习资料和练习,还需要教师充分发挥在线教育的统计和分析能力,在上课前先根据学生网上学习的记录、学习过程中反馈的问题,结合教学内容,设计适合课堂进行的教学活动计划。在翻转课堂,教师不再占主导地位,而是协助学生分析问题、组织学生解决问题,答疑解惑、组织向导式学习的引导者。
(三)改革成绩评定方式,变“传统笔试”为“上机考试”
改革成绩评定方法,建立以上机考试和编程能力为主的客观评价体系。打破以往期末成绩占大头的总评方法,完全取消卷面笔试,改为上机考试。上机考试采用机器自动评分的考试平台,并借助考试平台对学生的答卷进行数据统计分析,使学生可以通过上机测验查漏补缺,教师可以针对学生的薄弱环节精讲精练。为了客观公正地考核学生的编程实践能力,所建立题库必须做到题型多样化,覆盖面广等要求。
二、翻转课堂在程序设计课程中的实施
程序设计课程的授课重点,不仅在于语法结构,更重要的是让学生通过实战训练去锻炼程序设计的思维。翻转课堂的线上线下结合正好可以作为程序设计课程有效的实施手段。为此,可将每个章节的语法知识提炼并录制视频,布置小测验让学生在线上学习并验证学习效果。再将实际案例设计为课堂小组协作题目,组织学生运用已学的知识点在课堂上开展讨论、分工、编程和协作。
在翻转课堂的教学内容和实践练习的设计上,应注意把握以下几个方面。
(1)应多一些设计性的实践内容,少一些验证性的实践内容。弱化学生对编程知识和语言本身的关注,着重对知识的运用。
(2)课堂教学案例的设计应该逐步提高、前后连贯,要能紧密联系实际,让学生在实践中巩固课堂知识的同时,进一步增强学生独立分析问题、解决问题的能力。
(3)在进行课堂教学时,由教师对实践题目进行分解,组织学生讨论,并制定解决方案,再以小组协作形式进行实践,使学生学习如何按“分而治之”策略解决一个具有相当规模与复杂性的实际问题。
(4)鼓励学生在实践题目的基础上进行一定程度的创新,培养学生的创新能力。
(5)在翻转课堂上,每组学生完成任务后,请一位代表进行课堂演示和答辩,组织全班同学对各组完成作品进行投票,并作为课程的考核方式之一。这样一方面可以锻炼理科学生的演讲能力,另一方面也能帶动班级的学习气氛。
以C++程序设计为例,在讲授“类与对象”这一概念时,传统的实践练习一般局限于验证性实验的形式,强调某个语句格式、某个语法问题等。例如,定义class A, 然后定义对象Aa。这种“重语法”的实践教学太过强调程序语言本身的要素,忽视了对知识综合运用和实践能力的培养。因此在设计翻转课堂教学时,可以先提炼出语法的知识点让学生在线学习,实际课堂可以组织一些设计性的实践内容,少一些验证性实践内容。例如,课前让学生在线学习如何定义类、如何定义对象、如何通过对象调用成员函数等等。而在课堂环节,组织学生通过小组分工,设计并实现一个电子时钟,通过任务分解、课堂讨论、小组协作等方式让学生在实践中巩固课堂知识的同时,进一步增强学生独立分析问题、解决问题的能力。把抽象的概念用具体的实例展示给学生,使学生能融会贯通。课后通过布置学生在线作业,帮助学生巩固疑难点和遗漏点。
1.课前资源准备
根据“类与对象”的知识点和理解难点,设计了4个相应的小知识模块提供给学生在线学习,包括:①类的定义;②数据成员的定义;③对象的定义;④成员函数的调用。学生在学习完视频之后,需要完成一份在线测验,其中包括选择题、判断题、程序题等,经过分析思考或进一步看书、上网查询资料后验证所学知识。如果学生对知识点理解有疑问,可以在线提问和讨论。教师在线检查学生的完成情况,记录学生成绩,并根据学生的在线答题统计数据来修改和完善教学计划。
在本例当中,学生在线学习之后,要完成下列编程题目。
定义一个电子时钟类,模拟如图1的电子时钟的功能,要求实现:
l初始化时间(可初始为:00:00:00)
l设置时间(小时,分钟,秒)
l显示时间(格式如图所示)
学生通过分析该题目,回答以下问题:
l起个类名?(知识点:类的定义)
l有哪些属性?(知识点:数据成员的定义)
l如何初始化时间?(知识点:构造函数的定义)
l有哪些功能?(知识点:成员函数的定义)
通过以上问题,学生可以梳理出如下类的定义。
class Timer
{
public:
Timer(); //构造函数,用于初始化时间
void setTime(int h, int m, int s); //设置时间
void showTime(); //显示时间
private:
int hour;
int minute;
int second;
};
Timer::Timer()
{
hour = 0;
minute = 0;
second = 0;
}
void Timer::setTime(int h, int m, int s)
{
hour = h;
minute = m;
second = s;
}
void Timer::showTime()
{
cout << hour << “ : ”
<< minute << “: ”
<< second << endl;
}
2.课堂教学活动
翻转课堂的关键在于课堂教学活动的设计,教师通过组织课堂活动来完成知识的内化。教师首先在课前对学生在线学习与测试的数据进行统计分析,了解学生学习时遇到的难点和理解误区,为课堂的教学活动提供设计参考。在课堂上,教师首先对学习难点及学生普遍存在的问题进行统一讲解。其次,设计实践题目组织学生进行小组讨论和协作开发。所设计题目尽量兼顾实用性和趣味性。实践案例的内容应注重前后知识运用的综合性和连贯性,后续案例以前续案例为基础。例如,在讲授类与对象的知识时,设计的案例除了包含如何类的定义和实现,成员函数的调用等内容外,还应结合前面的基础,如数组,指针,选择结构,循环结构等编程语言要素。这样一方面可以复习前面的知识,一方面可以培养学生系统化意识,以帮助学生建立知识体系。另外,为了避免学生面对一个实践任务时毫无头绪,可将任务分解为一个个小任务,组织学生通过课堂讨论等形式,由易入难,逐步推进。针对“类与对象”这一知识点,设计了如下题目让小组进行讨论。
【任务1】完成Timer类的定义之后,组织学生进行小组讨论:
问题1:如何使用Timer类定义对象?
问题2:如何设置时间?
问题3:如何调用showTime函数来显示时间?
在课堂上开展讨论之后,让学生拟出解决的方案,并通过上机编程验证。
int main()
{
Timer timer1;
timer1.setTime(1,59,59);
timer1.showTime();
return 0;
}
教师通过以上实例,讲解“类与对象”的概念,加深学生对这个概念的理解,使学生搞懂本次课程的所有内容,从而帮助学生完成知识的内化。在完成以上编程之后,教师可以设置以下编程任务。
【任务2】针对以上完成的内容,提出改进的方向。
(1)目前显示时间的功能仍不完善,例如01:59:59,会显示为1:59:59。
(2)如何让电子时钟的时间真正走起来?
在課堂上再次开展讨论之后,让学生拟出解决的方案:
①解决时间的显示问题可以用setw()和setfill()函数,该知识点属于“格式化输出”,在之前的章节讲授过,在此可以帮学生复习并梳理下思路。参考代码如下:
cout << setfill('0') << setw(2) << hour << “:”
<< setfill('0') << setw(2) << minute <<“:”
<< setfill('0') << setw(2) << second << endl;
②让时间走起来,可以每次暂停1秒,并在当前时间上累加1秒,清屏后再重新显示时间。这里可以提供给学生以下函数: (注:需包含头文件:windows.h)
System(“cls”); //清屏
Sleep(1000); //使程序暂停1秒
③要考虑时、分、秒的进位问题。
通过上机编程进行验证,学生为Timer类新增了一个成员函数increase():
void Timer::increase()
{
second++;
if(second == 60)
{
second = 0;
minute++;
}
if(minute == 60)
{
minute = 0;
hour++;
}
if(hour == 24)
{
hour = 0;
}
}
修改showTime()函数,代码如下:
void Timer::showTime()
{
while(1)
{
system(“cls”);
cout << setfill(‘0) << setw(2) << hour << “:”
<< setfill(‘0) << setw(2) << minute <<“:”
<< setfill(‘0) << setw(2) << second << endl;
Sleep(1000);
increase();
}
}
通過上述的上机练习,学生基本能掌握类的定义、构造函数的含义与作用、对象的使用等,此时在原基础上提出实践进阶要求,学生只需在已完成的项目上略加修改即可,较容易被接受。
【任务3】丰富电子时钟的功能,模拟如图2的电子时钟的功能(日期+时间)。
要求可由用户设置日期和时间,能显示日期、时间和星期。
学生分析这个任务不难发现,可以在电子时钟的基础上进行扩充,得出如下类的定义。
class DateTime
{
public:
void setTime(int h, int m, int s);//设置时间
void setDate(int y, int m, int d);//设置日期
void showTime();//显示电子钟时间
void showDate();//显示年月日
void getDay();//获得星期几
void weekDay();//计算星期几
private:
int year;
int month;
int day;
int hour;
int minute;
int second;
int weekday;
};
这个任务虽然看似简单,却包含了许多知识点,如星期的换算,闰年的判断等。可以组织学生以2~3人的团队形式进行讨论和课后开发,再由团队进行演示,从而加深学生对“类与对象”概念的理解。从教学效果来看,多数学生都能完成以上题目,其中有不少学生还考虑到字体颜色、背景颜色等效果,锻炼了学生的创新能力。
3.课后在线巩固
在课堂教学结束后,学生主要通过在线练习和测试来巩固知识,在OJ平台上进行编程并提交程序。该平台能自动根据教师提前设计的测试例子,评判学生所提交程序的对错,能实时显示各种排行榜,激发学生自主学习的积极性。教师根据学生的正确题目数给予相应的平时成绩奖励,其成绩记入期末总评分数。此外,学生可以通过论坛分享学习经验,提出疑问,教师根据学生容易出现的问题进行整理总结,在线进行答疑。
三、翻转课堂在程序设计课程中的效果
翻转课堂教学是对传统课堂教学的一次全新改革,教师需要颠覆原来的一套教学习惯,学生则要自主利用碎片时间,通过手机、PC机等设备,随时随地自主完成学习和测试。翻转课堂教学改革已在我校计算机专业进行了两个学年,得到了学生和老师的普遍认可。在教学过程中,研发适合翻转课堂形式的教材,设计适合在线学习的微课,以及开发在线测试的题库,都是实现翻转课堂的关键因素。翻转课堂的教学思路有一定的实际意义,进一步推动程序设计类课程教学效果的提高,为程序设计类课程教学改革提供了新思路。
[ 参 考 文 献 ]
[1] 陈晋音,俞山青,毛国红.面向C++ 程序设计课程的翻转课堂教学改革[J].计算机教育, 2015(19):39-44.
[2] 裴大容.翻转课堂在应用型本科C语言程序设计课程中的教学应用探索[J].电脑知识与技术,2017(32):173-174.
[3] 李文彬,杨勃,潘理,吴岳芬.基于微课的翻转课堂教学模式在《C语言程序设计》课程中的探索与实践[J].现代计算机(专业版),2017(6):58-61.
[责任编辑:黄紧德]