基于建构主义的循环结构课堂教学设计

2019-02-26 06:45:46张荣茜郑小静
计算机教育 2019年12期
关键词:素数语句案例

崔 玲,张荣茜,郑小静

(北京工业大学 信息学部,北京 100124)

0 引言

C 语言程序设计课程实践性较强,是最能体现计算思维的一门课程,对于非计算机专业的学生来说有一定难度。语法点多、内容抽象,即使掌握了语法,学生在分析问题和解决问题时仍会感到无从下手,久而久之,一些同学丧失学习积极性,一些同学虽然很努力,但是因为初次接触程序设计,显得非常吃力。课堂教学如何引导学生快速接受程序设计理论,是一线教师着重思考的问题。

1 基于建构主义的教学方法

建构主义学习理论[1-2]强调要以学生为中心,在学习过程中充分发挥学生的主动性,能够让学生在原有知识和经验的基础上主动学习、构建新的知识。建构主义学习理论的主要教学方法有3种:支架式教学、抛锚式教学、随机进入教学。

1.1 支架式教学

支架式教学指的是为学习者建构知识的概念框架,该思想来源于心理学家维果斯基的“最近发展区”理论[3-4]。维果斯基认为,学习者对于所要解决的问题和原有能力之间存在差异,这个差异就是“最近发展区”,而教育就是要消除这个差异,同时引导学习者进入更高水平的“最近发展区”。支架式教学主要由以下环节组成。

(1)搭建脚手架。围绕知识点,按照“最近发展区”的要求建立概念框架。

(2)进入情境。将学生引入一定的问题情境。

(3)独立探索。教师给予适时提示,让学生独立探索,在概念框架中不断提升自己。

(4)协作学习。学生进行协商讨论,在集体讨论的基础上完成对知识的意义建构。

(5)学习效果评价。对学习效果的自我评价和相互评价。

1.2 抛锚式教学

建构主义认为,学习者获取知识应该主动去学习、体验,而不是由教师传授。该方法也被称为案例教学,或者基于问题的教学。

抛锚式教学主要由以下环节组成:①创设情境。为学生提供与实际情况类似的问题情境。②确定问题。为学生选择与当前学习主题相关的问题作为学习的主要内容。③自主学习。为学生提供求解问题线索,让学生主动搜集信息、思考方案来解决问题。④协作学习。⑤学习效果评价。

1.3 随机进入教学

对于复杂问题,学生可选择不同途径、不同方式进入同样教学内容的学习,这就是“随机进入教学”。随机进入教学主要由以下环节组成:①呈现基本情境。②随机进入学习。③思维发展训练。教师提出的问题要有利于促进学生认知能力的发展,要有利于建立学生的思维模型。同时还可提出一些延伸问题培养学生发散性思维。④协作学习。⑤学习效果评价。

2 循环结构的课堂教学设计

在建构主义学习理论的指导下,结合程序设计课程的特点,进行课堂教学设计,引导学生在原有知识基础上快速构建新知识。

2.1 设定问题引入知识点,激发学生学习兴趣

学习循环之前,学生已经学会如何输出1 行“Happy New Year!”,接下来让学生思考:如何输出10 行“Happy New Year!”?学生可能回答:复制、粘贴,那么可以再问:如果输入1 000 行呢?

在给出对应的for 循环代码之后,可以让学生继续思考:

如何输出1 到10?

如何输出1、3、5、7、9 的序列?

编写程序验证学生的想法,最后让学生总结语句的执行顺序,以及影响输出结果的语句都有哪些。

通过以上实例,教师可以自然地引出for 循环的语法格式,并指出for 循环的四要素:循环变量初值、循环条件、循环变量变化规律和循环体。

再比如,讲解例题“输入n 个学生成绩,计算平均分”之后,让学生思考如何编程实现“输入班级学生成绩,计算平均分(其中班级人数未知,可用-1 表示输入结束)”。学生根据已经学习过的for 语句可以编程实现,但是会发现循环条件与循环变量无关。此时教师可引出while 语句,并通过比较,分析for 语句和while 语句的相似和不同之处。最后进行总结:虽然for 语句、while 语句均可实现循环问题的求解,但由语法形式可知,for 语句更适合循环次数已知的问题,而while 语句则适合循环次数未知的问题。

2.2 渐进式教学,不断推进学生的“最近发展区”

不仅例题讲解要由浅入深,而且实践练习也要由易到难,如掌握了for 语句的基本语法格式之后,教师可以设计与例题相似的题目,让学生进行编程练习。

练习1:输出A 到Z;

练习2:输出AaBb……Zz;

练习3:输出100 到1 000 之间的偶数。

对于练习1,可以提示学生,利用已学知识解决问题:①字符类型可以参与算术运算,如ch=ch+1;②语法中未规定循环变量必须是整型。

练习2 有一定难度,虽然与练习1 相似,但是多数学生无法一下总结出AaBb……Zz 的规律。此时教师可以提醒:在已学过的分支语句中,执行的语句可以是复合语句,那么循环语句中的循环体也可以是复合语句,将Aa、Bb、Cc 视为一组即可找到规律:

练习3 难度再次增加,循环体是分支语句,这是循环语句与分支语句的简单混合应用。

再比如,循环嵌套是学习的一个难点,通过对已有案例的升级改造,可以让学生在已有知识基础上,轻松接受循环嵌套。

案例1:已知如何输出1 到10,思考如何输出10 行的1 到10。

由该案例引出双重循环,此处要重点分析内层循环变量和外层循环变量的变化规律。同时可让学生练习如何输出九九乘法表、三角图形等。

案例2:已知如何计算n!,思考如何计算1+2!+3!+…+n!。

在该案例中,要着重注意变量初值及其所在位置问题。存储求和结果的变量初值应为0,放在外层循环之前。内层循环用于求阶乘,那么存储求阶乘的结果,初值为1,应放在内层循环之前外层循环之内。素数问题是循环结构的典型问题,也是枚举算法的一个典型应用。在讲解素数问题之后,可给出以下两个案例,继续学习循环的嵌套用法,也可让学生进一步了解枚举算法的基本思想。

案例3:已知如何判断一个数是否是素数,思考如何输出100 到1 000 之间的素数。

案例4:通过讲解鸡兔同笼问题,让学生练习百钱买百鸡、搬砖等问题。同时,还可让学生思考有无多种解法,如鸡兔同笼问题的常规解法是二重循环,思考是否可用一重循环解决。

2.3 启发式教学,调动学生学习主动性

素数问题对于非计算机专业的学生来说,问题简单,但实现时容易出错。关键点在于什么时候给出判定结果,很多同学往往在循环中直接给出判定结果,如:

教师在讲解时不用立即否定学生想法,可运行程序进行测试,通过运行结果学生会逐渐意识到问题所在。这时教师和学生再一起思考解决方法,在这样不断尝试不断修改的过程中逐步理清思路,达到求解问题的目的。这个过程会让学生有种成就感。

同一问题往往有多种解法,在练习素数问题时,会有不少学生的解法思路都很巧妙。教师可让学生展示给大家,然后一起分析其优劣。

方法一:

该方法定义了变量flag,表示能整除n 的个数,循环结束后,如果flag 为零,表示n 为素数,否则n 不是素数。

容易理解大于n/2 的数不会整除n,程序中循环条件为i<n/2,比i<n 减少了循环次数,提高了运行效率。

方法二:

方法二较方法一有3 点变化:①变量flag 的含义。flag 为1 表示n 是素数,flag 为0 表示n不是素数。这种变量称为逻辑型变量,常用于逻辑判断问题,一般取值为1 或0,表示是或否、真或假。②可以证明,一个素数的两个因数,至少有一个小于等于根号n。sqrt(n)是判断素数的最小临界条件。因此该方法中循环条件是i<=sqrt(n),进一步减少了循环次数。③break的应用。只要某个i 可以整除n,则执行break,跳出循环,再次减少循环次数。对于复杂程序来说,减少循环次数会极大提高程序运行效率,教师可以借此向学生介绍一下算法复杂度问题,让学生认识到算法在程序设计中的重要性。

方法三:

该程序非常简练,但不易理解,该程序思路可由方法二推出。方法二中使用了break 语句,如果满足n%i==0,则结束循环,也就是说n%i!=0 是循环条件之一。因此循环条件是n%i!=0&&i<=sqrt(n),循环结束表示这两个条件至少有一个不满足。如果不满足n%i!=0,表示存在一个数可以整除n,则n 不是素数。

2.4 支架式教学,帮助学生轻松构建知识框架

2.4.1 将应用问题分类,提高学生求解问题能力

编程的难点不在于语法格式,而是如何将实际问题的求解方法转化为符合语法格式的程序语句。教师可以将应用问题进行分类,为学生求解问题提供思路,帮助学生逐步提高利用程序求解问题的能力。一般来说,可用循环结构解决的应用问题有如下几种:①有规律输出问题,如输出Fibonacci 序列。②累加累乘问题,如求n!。③连续输入并进行计算的问题,如输入班级学生成绩并求平均分、最高分。④枚举问题,如素数、鸡兔同笼问题。

每类问题可讲解1~2 个案例,然后让学生独立求解类似问题加以练习。也可对案例进行改编,如将问题:“根据公式,计算前n 项之和,求解π 的近似值”,改编为“根据公式,求解π 的近似值,直到最后一项的绝对值小于10-6”。

2.4.2 将求解步骤模式化,重复训练,培养学生计算思维能力

思维能力的培养离不开大量重复的训练。对每一个案例,均按照“问题描述、问题分析、算法描述、程序实现、运行结果、程序分析”6 个步骤[5],进行问题求解,逐步引导学生掌握程序设计的基本方法,培养学生计算思维能力。

以位数分解问题为例。

(1)问题描述。

输出1 至10 000 之间每位数的乘积小于每位数的和的数。

(2)问题分析。

类似解数学题,首先分析题意。该题最终要求输出一些数,这些数的范围是1 到10 000。由此可知输出是一个循环,循环范围是1 到10 000。该部分算法可描述如下:

再分析,输出的数是要满足一定条件的,即每位数的乘积小于每位数的和。算法修改如下:

最后分析如何求和、求乘积,题目要求的是i 的每位数的乘积与每位数的和。因此要求和与积,首先要分解i,得到它的每个位数。

如何分解一个数呢?在学习算术运算时,已经学过如何分解位数确定的数,如i 是三位数,则i%10 即个位数,(i/10)%10 即十位数,(i/100)%10 即百位数。但是该题目中位数可能是1、2、3、4、5,该如何分解出它的每位数呢?分解操作何时结束呢?我们只能尝试寻找有无规律可循。先用实际的数进行尝试,然后试着总结规律,见表1。

通过实例分析可知,分解位数可由循环实现,重复的操作是:

什么时候停止重复操作?当m 为0 时。

分解位数的目的是求其和与积,因此在分解的同时计算和与积。该部分算法描述如下:

表1 分解位数实例分析

(1)算法描述。

根据问题分析,求解问题的完整算法如下:

(2)程序实现。

类似中英文翻译,将算法转换为C 语言代码。

(3)程序分析。

该例的难点在于如何分解一个不确定位数的数。已知确定位数的分解方法,那么可以尝试总结不定位数的求法是否与之有相同之处。容易知道,个位数为m%10,十位数对于m/10 来说也是个位数,百位数对于(m/10)/10 也是个位数,因此可以把问题归结为求个位数,问题就变得简单且有规律,通过几个实例分析可得出求解规律。

另外要注意,该例程序中的m=i,为什么不直接用i 呢?原因在于m 是变化的,最终的m 会为0,而i 则是要输出的数,而且i 是外层循环的循环变量,不能轻易改变。初学者容易犯的错误就是在循环中不小心改变了循环变量的值,而这种错误属于逻辑错误,难于察觉,很难找到错误所在。由此还可以给学生介绍一些调试程序的方法,比如在可疑语句前后加入输出语句查看变量变化,或者直接使用编译软件提供的调试工具。

2.5 对比式教学,深入理解知识点,培养学生思辨能力

do-while 语句较为简单,可对比while 语句学习。与while 语句不同,do-while 语句是至少执行一次循环体,而while 语句则可能一次都不执行。

上述程序段中while 循环条件不满足,不会进入循环,执行之后,s=0,n=3。而下面程序段中do-while 语句会先执行一次循环体,再退出循环,执行之后,s=3,n=4。

同样,可以对比学习break 和continue。在循环中,break 是结束循环,类似于游戏中的“Game over!”;continue 是结束本次循环,类似于游戏中的“Try again!”。

上述程序段输出1、2、3、4,随后跳出循环。而下面的程序则会进入死循环,因为x 会一直停留在5,循环条件一直未能打破。

2.6 机房授课,边讲边练,强化学生实践能力

对于实践性较强的课程来说,课堂教学安排在教室上课,非常不利于学生实践能力的培养。我校从2010 年开始,将C 语言程序设计等计算机公共基础课程安排在机房上课,授课模式由讲练分离变为边讲边练,在学习一个知识点之后即刻让学生进行练习。由近几年的教学评价来看,这种模式有助于激发学生学习兴趣,培养学生实践能力,提高教学效果。

3 结语

循环结构是C 语言程序设计的重点和难点内容,基于建构主义的教学方法可以让学生在原有知识基础上,由易到难、由浅入深逐步引导学生主动去分析问题、解决问题。多年教学实践证明,该方法有助于培养学生的计算思维能力,有助于激发学生的学习兴趣,培养学生的自主学习能力。

猜你喜欢
素数语句案例
孪生素数
两个素数平方、四个素数立方和2的整数幂
案例4 奔跑吧,少年!
少先队活动(2021年2期)2021-03-29 05:40:48
重点:语句衔接
关于两个素数和一个素数κ次幂的丢番图不等式
随机变量分布及统计案例拔高卷
精彩语句
发生在你我身边的那些治超案例
中国公路(2017年7期)2017-07-24 13:56:38
奇妙的素数
一个模拟案例引发的多重思考
中国卫生(2015年4期)2015-11-08 11:16:06