4.7.1.1 《C语言程序设计》目标
计算机程序设计语言的理论基础是形式语言,自动机与形式语义学。目前,大部分学校在教授程序设计课程中,多采用传统的教授法和结合实验的上机操作实践来使学习者熟悉和巩固课堂上所讲解的内容。“著名的华裔科学家、美国伯克利加州大学前校长田长霖从对中外理工科教学方式的比较中,提出了理想的高层次理工科教学方式:教理工科的课不能推导公式,推导公式是最简单的,教学者可以不备课;在课堂上要讲的是公式的来龙去脉:人家发现这个公式时遇到了哪些困难,摸索的过程是什么情形,走过什么道路,最后怎么变成这个正确的公式,这个公式将来的发展趋势是什么,它还可以做什么钻研等等,上课时,这些内容应作启发性的讲解。高级语言程序设计的教学重点不在于如何解决某些实际问题上,这是因为,一方面受教学计划学时的限制;另一方面,学习者尚不具备解决实际问题的知识基础和经验积累。我们必须致力于讲授解决问题的思想和方法的教学方式,它尤其适用于高级语言程序设计的教学设计和课堂教学。”因此,在教学设计和实施具体教学过程中,必须明确培养和提高学习者的CT能力是最终目的,而具体的程序设计只是实现这个目的的一种手段。
4.7.1.2 基于计算思维的探究式教学模式在课程中的应用描述
对于CT的抽象等特点,通过“寓教于乐”的方式来培养学习者的CT能力能起到事半功倍的成效。下面,我们根据程序设计课程教学的特点以及CT一系列学习技巧和方法,构建以下教学模型,运用该模型进行程序设计课程教学,培养学习者的CT能力,提升教学效率和帮助学习者提高学习效果,从而使学习者掌握计算机方法论。该教学过程的模型分为教学者教学模型和学习者学习模型两个部分。
教学者教学时首先确定教学目标、分析学习者特征、分析教学内容,然后在此基础上进行培养学习者思维能力的问题设置、良好教学情境的创设,最后进行知识点的讲解。同时,运用“轻游戏”作为辅助教学的工具,让学习者熟悉游戏规则,对“轻游戏”获取一定的感性认识,并运用“轻游戏”辅助教学,观察学习者在课堂上听课的反应情况,让学习者参与进来一起讨论总结。
学习者在自主学习时首先应明确学习目标,将教学者所讲的知识转换内化,同时利用“轻游戏”巩固递归、赢得游戏的策略算法问题,并总结提高。如果效果良好,则对这个学习过程进行总结评价,为以后的学习打下更牢的基础;如果效果不理想,则回顾学习,并在教学者指导下更好地利用“轻游戏”辅助学习相应的知识,达到掌握知识,内化学习方法的目的。
4.7.1.3 各教学环节具体开展情况
作为算法领域内具有代表性的“汉诺塔游戏”和策略与对策领域具有代表性的“井字棋游戏”都属于“轻游戏”的典型,下面通过对这两款“轻游戏”的分析,验证教育游戏在程序设计课程中对学习者CT能力进行培养的研究。
以“汉诺塔”游戏为例:当我们的教学者在进行程序设计语言课程的“循环结构”教学时,一般会给同学们讲到“递归”,“递归”问题本身很抽象,因而无论教学者怎样讲解,学习者都不能很好地理解老师口中的“递归”问题。作为教学者,应该怎样让学习者明白知识点的同时又培养其程序设计的CT能力呢?所以,让学习者轻松愉快地掌握相应的知识点,合理运用“娱教技术”,在面对一些难讲难解的问题时就能很好地化解。下面我们运用“汉诺塔”游戏来解决 “递归”算法的典型问题——“汉诺塔”问题。题目如下所示:
天神让庙里的僧侣们将第一根宝石柱上的64个金圆盘借助第二根宝石柱全部移到第三根宝石柱上,即将整个塔迁移,同时定下3条移动规则:
(1)一次只能移一个盘子;
(2)金盘只能在三根宝石柱上存放;
(3)在移动过程中,任何时候大盘都不能放在小盘上面。
对于该例子,我们进行下面的问题描述和算法分析,并根据该算法设计相应的游戏。假设这三个柱子分别为源柱、工作柱、目的柱,“汉诺塔”的问题是:将n个圆盘从A柱(源柱),利用B柱(工作柱)搬移到C柱(目的柱)。
游戏设计的操作步骤如下:
第一步:如果n=1,则将1个圆盘由A移至C,结束过程;否则执行第二步;
第二步:由3小步组成:
(1)将A(源柱)上的(n-1)个圆盘移至B(目标柱),以C作为工作柱;
(2)将A上剩下的一个圆盘移至C;
(3)将B(源柱)上(n-1)个圆盘搬移到C(目标柱),以A为工作柱。
我们知道“汉诺塔”问题的解决方法是典型的“递归”算法,这种方法在解决问题时十分有用,利用它递推和回归的原理,使一些复杂的问题变得清晰而简单。根据它的特点建立相应的模拟移动数学模型,并根据数学模型设计相应的游戏,学习者按以上“操作步骤”移动源柱上的圆盘,圆盘可以垒起来,但是必须把小的放在大的上面,成功把圆盘顺序不变地堆到目的柱上则为此关通过,同时游戏者进行下一关游戏,此时源柱上的圆盘增加到4块,依次类推,学习者不断地闯关,源柱上的圆盘就一次次增加,直到搬完源柱上的264-1个模块为止。此时,学习者已经明白“递归”方法的原理,我们再设计出数学模型的算法,并根据算法写出求解问题的程序,完成相应的教学和学习任务。
对比传统的程序设计课堂教学:教学者在讲解了相应的方法之后,学习者就依照教学者的讲解编写程序并上机调试,本堂课的教学任务完成。这样的学习过程,学习者根本没有领会到“递归”算法的实质所在。但是,如果教学者通过“轻游戏”的方式进行相应知识的教学,让学习者通过游戏进行知识点的亲身体会,其结果就完全不同。因为游戏让学习者理解程序设计的算法,身临其境地感受“递归”算法,从而掌握“递归”算法。这样的教学过程,不但使得教学容易,而且学习者学习知识也能事半功倍。而在程序设计课程教学中,通过这样的教学能高效地培养学习者的CT能力。同时,这样的讲解也更好地为《C语言程序设计》后面的章节链表等用顺序结构的方法来实现“汉诺塔”问题是否一定只能用“递归”解决埋下伏笔,引导学习者一步一步探索新的方法。
4.7.1.4 具体案例实施——“五步法”掌握语言“循环控制”算法
在计算机基础程序设计教学过程中,“循环控制”是程序设计算法必须掌握的重点环节,因为许多题目都需要用循环控制的方法解决。因此,如果让学习者理解并掌握这一知识点,那么难点自然就突破了。但是,运用什么办法达到目的呢?那就需要教学者帮助学习者分析题目各个环节的联系,理清循环控制的来龙去脉,使学习者掌握循环控制的本质,内化知识技能并拓展运用到实际生活和工作中去。
第一步:提出“探究性问题”
作为教学者,要使学习者有强烈的学习心理去解决某类题目时,就需要提出能引起学习者关注并感兴趣的“问题”。对此,针对“循环控制”的理解掌握,我们可以设置以下具有代表性、应用性、兴趣性的题目。如下“猴子吃桃”问题:
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,但只剩下一个桃子了。求第一天共摘了多少个桃子。
这个例子对于学习者而言,不仅很有趣,还比纯粹的数字问题学习起来要快,而且具有显著特征。这会使学习者在兴趣中主动学习,从思想层面接受这个新知识,以此培养学习者的递归思维意识。
第二步:启发学习者思考思中学
在这一步骤中,学习者根据教学者提出的问题,思考解决问题的方法。作为主导作用的教学者要把控课堂,适时为学习者提供帮助,运用CT的各种方法启发学习者,提供学习策略上的引导。
所以对于以上“猴子吃桃”问题,教学者根据CT的特点和高效,启发学习者是否可以用CT的递归方法解决?学习者根据教学者的引导,运用CT的递归方法,逆向思维,从后往前推断,表示如下:
①定义变量day,x1表示第n天的桃子数,x2为n+1天的桃子数;
②while循环,当day>0时语句执行;(www.xing528.com)
③运用CT的递归思维得到:“第n天的桃子数是第n+1天桃子数加1后的2倍”,即是x1=(x2+1)×2;
④根据循环得知,把求得的x1的值赋给x2,即是x2=x1
⑤每往前回推一天,时间将减少一天,即是day—
⑥输出答案。
该案例在③④⑤步采用CT递归的方法发现并解决问题。通过这样的例子,将递归算法执行过程中的两个阶段递推和回归完全展现在学习者面前。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解上。第n天的桃子数等于n+1天桃子数加1个后的两倍,同时在递推阶段,必须要有终止递归的情况,比如到第10天时桃子数就为1个了;在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,我们知道第10天的桃子数为1个,即是后一天的桃子数加上1后的2倍就是前一天的桃子数,那么x1=(x2+1)×2。
在此例中,教学者引导学习者以递归算法的逆向思维进行问题求解,在学习过程中体会递归算法的思想过程,那么学习者就能在思考中学习,并掌握递归方法,当遇到类似问题时就会想到用这样的办法去解决问题。
第三步:协作学习者自主探究——学中做
在掌握了前面所学的技巧和方法的基础之后,学习者已经能够灵活运用所学知识进行该类问题的求解。对此,教学者需要尊重学习者的个性发展,继续启发学习者的思维,让他们进行自主探究学习,使学习者主动、积极地学习新知识,并培养他们的自学能力,使其举一反三,让学习者能在“学中做”。对此,我们可以继续“猴子吃桃”问题:
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,但只剩下一个桃子了。求第一天共摘了多少个?同时分别求出每天剩下多少个桃子?
根据递归方法我们可以得到如下流程:
①定义变量i为桃子所吃天数,sum为桃子总数;
②for循环控制变量i的值;
③运用CT递归方法得到sum=2×(sum+1);
④求出sum的值;
⑤for循环控制变量i的值;
⑥再次运用递归思维求出每天所剩桃子数sum=sum/2-1;
⑦输出i,sum的值。
该题中,第⑥步采用的递归方法是迁移了第③步递归方法的结果。通过这样的思维训练,让学习者在思考中学习,在学习中运用新的方法破解难题,培养学习者分析问题、解决问题的能力,锻炼学习者的数学建模能力,巩固知识的同时拓展了知识技能和技巧。
第四步:指导学习者小组协作——学中思
此时教学者可要求学习者完成Fibonacci数列前50项的数字,同时要求学习者先完成“古典兔子”问题:
有一对兔子(一雌一雄),从出生后第3个月起每个月都生一对兔子(一雌一雄),小兔子长到第三个月后每个月又生一对兔子(一雌一雄),假如兔子都存活,问每个月的兔子总数为多少?
在这里,教学者引导学习者让其进行知识的主动建构,以自己所掌握的知识经验为基础,再对现在的题目信息进行加工和处理,从而让学习者具备并掌握相应的能力。学习者运用已经掌握的CT递归方法分析得出兔子的规律为数列1,1,2,3,5,8,13,21……。此题目在前几题目的基础上,进而培养学习者分析问题及归纳、梳理知识的能力,循序渐进地引导和启发学习者思考,充分调动学习者的计算思维能力。流程如下所示:
①定义f1,f2为初始的兔子数,i为控制输出的f1和f2的个数;
②i的最大值取20项;
③循环开始前,首先输出f1,f2的初始值;
④判断,控制输出,每行四个;
⑤换行;
⑥递推算法,前两个月加起来赋值给第三个月。
学习者根据前面的思维训练后,已经学会了知识的迁移。因此,根据前面的分析我们知道,在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解上。如上例中求解f1和f2,把它推到求解f(n-1)和f(n-2),但在这里仍然用原变量名f1和f2表示。也就是说,为计算f(n),必须先计算和并计算f(n-1)和f(n-2),而计算f(n-1)和f(n-2),又必须先计算f(n-3)和f(n-4)。依次类推,直至计算f1和f2分别能立即得到结果1和1。在递推阶段,必须要有终止递归的情况,例如在函数f中,当n为1和1的情况。在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到f1和f2后,返回得到f1的结果,……,在得到了新的f1和f2的结果后,返回得到f2的结果,此时,学习者已经掌握了Fibonacci数列的解决办法。
第五步:总结拓展——学中用
当学习者对相应知识点掌握内化之后,教学者针对问题进行点评、总结,提出拓展性问题和迁移性知识等让学习者运用所学方法讨论、反思、互评、迁移、拓展知识。此时教学者可布置“机器人走迷宫、围棋游戏、博弈游戏”等类似问题让学习者运用所学知识去解决。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。