程序设计教学中促进高中生创新思维的发展

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1程序设计教学中促进高中生创新思维的发展上海市松江二中杨晓峰算法和程序设计是上海市高中信息科技教学三个选学模块之一。通过这一模块的学习,高中学生可以体验专业性的算法思想,学习并使用程序设计语言解决一些实际问题。在历届的上海市高中信息科技等级考试中,关于算法和程序设计的内容都超过了50%的比例。另外有两个方面也促进了上海高中生对程序设计的学习热情。首先,享有高考加分政策的上海市高三程序设计竞赛和信息学奥林匹克竞赛(NOI)上海选拔赛,都是以程序设计为比赛形式。这些竞赛吸引了众多高中学生学习程序设计,参加竞赛。其次,在上海的二期课改中,高二的数学教学中专门用一章的内容学习算法并作为高考的考试内容。学习好程序设计对于高中生在高考取得好成绩也是大有帮助的。因此,程序设计在上海的高中生中有着众多的学习者。程序设计教学中应该实现怎样的教学目标是笔者在多年的高中程序设计教学中一直在思索的问题。如果把程序设计学习的目标仅仅定位在获得高考的加分或取得等级考试的好成绩无疑是非常狭隘的。能够在竞赛中脱颖而出的佼佼者毕竟是少数。对于大部分将来并不会从事计算机专业的同学来讲,真正能够让他们受益的是在程序设计学习中促进他们能力的发展。一、问题的提出《上海市中小学信息科技课程标准》中指出信息科技课程应该让中小学生“学会利用信息技术发展批判性思维和创造性思维,培养解决真实、开放问题的能力。”高中生的思维活跃,容易打破惯有思维模式的束缚。在学习了必要的专业知识以后,程序设计为他们提供了解决实际问题,发展创新思维的平台。2007年,美国国际教育技术协会颁布了新版“国家学生教育技术标准”(NETSS-2007)。对照中国高中信息技术标准与NETSS-2007的维度对应关系,我们不难发现,我国的高中信息技术标准中缺失了“创造力和创新”这一维度。创新是民族进步的灵魂,我国高中信息技术标准中这一维度的缺失无疑是一大不足。这不仅要求我们高中信息科技教师在日常教学中有意识的进行引导,也为我们在这一方面开展课题研究提供了空间。创新思维通常以流畅性、灵活性、独创性、细致性或发散思维为特征。在高2一信息科技的教学中,算法的多样性、程序设计的灵活性,无疑为学生进行独创性的思维活动、编写个性化的程序提供了有效的平台,也为发展他们的创新思维创设了条件。通过国内外相关现状的比较,结合笔者多年一线教学的实践,我将高中程序设计的教学目标定义为促进高中生创新思维的发展。围绕这一目标,我在自己的教学中进行了探索和实践,初步形成了一些行之有效的教学策略。二、程序设计教学中促进创新思维发展的教学策略1、在专业知识学习阶段应用基于问题的学习方法(Problem-BasedLearning,PBL)。程序设计专业知识的学习相对一些计算机应用软件的学习要枯燥很多,尤其需要学生思维主动的、积极的投入。笔者发现高中学生在这一阶段表现得兴趣不大,有了疑问也不愿意主动向老师求解。对于这样的情况,仅仅将原因归咎于学习内容枯燥或学生的“懒”,并不能真正解决问题。通过与学生的访谈,我发现真正的原因在于学生并不清楚学习程序设计的用处在哪里?因此在程序设计知识的讲授阶段,我采用了基于问题的学习方法。在这种方法中,我给出一些学生容易理解、切合实际的问题,然后围绕这些问题开展知识点的教学。基于问题的学习方法具有明确的学习指向性,容易引发学生的学习兴趣,进而产生学习的动力。在求解问题的过程中,学生会提出各种各样的新观点、新想法。(1)利用简单问题,有效衔接各个知识点。案例1、从分支结构引出循环结构在分支结构的教学中,我首先使用分支结构解决了只允许输入1次的密码验证(见图1)。然后启发学生使用分支结构的嵌套解决了可以输入2次的情况(见图2)。这个时候,我提出了问题:如果允许输入100次,该如何求解?这个时候,学生如果沿着思维的惯性,继续采用分支结构的嵌套,将非常的困难。其解决方案也必定非常的低效。在学生进行了一定时间思考后,我再引出循环结构并利用循环结构方便、轻松了解决了这个问题(见图3)。学生顿时感到豁然开朗,也引发了对循环结构的学习兴趣。3图1分支结构图2分支结构嵌套图3循环结构(2)利用复杂问题,覆盖多个知识点的教学。案例2、验证歌德巴赫猜想我首先引导学生将这个问题定义为:用户输入一个大于6的偶数n,程序给出2个素数x和y,并且x+y的和是n。我将求解这个问题的算法关键步骤细化如下:第1步:找到2个数x和y,并且x+y的和是n第2步:判断x和y是否同时为素数,若是,则输出x和y后退出,否则重复第1步。在具体的教学中,我首先指导学生学习循环结构,解决了“如何判断一个数是否为素数”这个问题。其次在找x和y这两个数时,我指导学生学习了枚举算法。利用枚举算法,学生从1到n/2逐一列举x的值,并利用y=n-x得到y的值。最后,学生通过学习双重循环,在外部循环中通过枚举算法逐一列举x和y,每列举一次,利用循环结构判断x和y是否同时为素数,最终解决了“验证歌德巴赫猜想”这个比较复杂的问题。(3)活用流程图,实现知识的有效建构通常绘制流程图,一般按照从上向下的画法。这样的画法符合我们平时的书写规律,但并不符合学生思维活动的过程。通过活用流程图,我们可以顺着学生思考的过程去绘制流程图。而这个从无到有的过程,也是学生进行知识建构的过4程。案例3、求10个同学分数的总和首先,引导学生如何计算总和。学生回答:输入一个分数x,然后累加,sum=sum+x。这时候,我在黑板上画出这2个关键步骤的流程框图。然后提问:如何把下一个同学的分数也累加上去?学生回答:画流线形成循环。接着提问:这样的循环什么时候结束呢?学生回答:添加判断条件并且类加变量每次增加1。最后,教师补上必要的条件,形成完整的流程图。绘制过程见图4。图4:模拟学生思维活动的流程图绘制过程2、在编程解题阶段,发展学生的批判性思维编写程序、解决问题是学生灵活运用所学习到的程序设计知识进行自由创作的过程。这一阶段是培养学生创新思维的最佳阶段。我以为,这一阶段的学习要注重学生批判性思维的培养。在学生批判错误、纠正不足的时候,一些新颖的个性化的想法正在生成。我在教学中常用的策略如下。(1)帮助同学改错在学生的课后作业中,挑选具有典型错误的程序在课堂上请同学们判断是否有错误,该如何改进。学生对于纠正别人程序中的错误远比自己编写程序更加热情,尤其是同龄人程序编写中的错误更是引发他们浓厚的兴趣。在纠正他人错误的同时,一些正确的概念在他们的头脑中的印象更深了。需要指出的是,为了避免伤害被选中同学的自尊心,我一般从其他班级选择错误程序,并且隐去学生的真名。(2)一题多解5一题多解有利于学生打破已有思维模式的束缚,容易引发学生个性化的思考,进而推动创新思维的培养。在程序设计教学中,我积极引导学生寻求与老师不同的求解方案。在一题多解的求解过程中,一些新颖的方案冒了出来,学生的发散性思维得到了发展。案例4、求100-1000之间的水仙花数求解水仙花数的关键是将一个三位数整n,提取出其百位数a,十位数b和个位数c。我首先通过传统的求解方式,先用n除以100取整的方法得到a,然后用n除以10取余数的方法得到c,最后在a和c的基础上得到b。具体程序见图5。然后,我要求学生思考其他的求解方法。在经过一段时间的思考以后,一些新颖的解决方案出现了。有些方法是我以前都不曾考虑过的。如图6。图5:教师程序图6:学生程序事实证明,在我们教会学生必要的程序设计知识以后,学生就会象童年时“搭积木”一样,编写出很多个性化的程序。这个新想法、新程序不断涌现的过程,同时也是学生积极思考,创新求异的过程。(3)程序优化促进学生创新思维发展的另一个途径是引导学生对现有的程序进行优化。优化也是要求学生在现有的基础进行改进、创新。成功的优化能够让学生体会到创新的价值,创造新成果的成就感,激发他们不断创新的动力。案例5、对百钱买百鸡问题的优化百钱买百鸡问题:100文钱买100只鸡,公鸡5文钱一只,母鸡3文钱一只,小鸡1文钱三只,问公鸡、母鸡、小鸡各买几只?我首先利用三重循环编写了程序(见图7),其中外部循环列举公鸡数目a:1-100,内部循环列举母鸡数目b:1-100,在内部循环再使用内部循环列举小鸡鸡数目c:1-100。在演示程序、求出正确答案后,我启发学生思考这个程序一共循环了多少次,是否可以进行优化?学生思考后回答,循环了100万次,可以缩小a、b、c的取6值范围。从题意上分析a的取值范围是1-20,b的取值范围是1-33,c的取值范围是3-99。经过修改,程序的循环次数降低为65340次,比前面的程序有了明显优化。具体程序见图8。但是我仍不满足,提示学生是否还能够减少循环的次数,可以从a、b、c三个变量的相互关系上去考虑。学生在思考后发现,当a、b两个变量的值确定了以后,其实c的值也就确定下来了。于是改进程序如图9,循环次数降低为608次。图7:原始程序图8:第一次优化图9:第二次优化(4)上机调试学生编写的程序,往往含有比较多的逻辑错误。对于其中比较典型的错误,老师可以挑选出来,引导学生一起纠正。但是如果对所有的错误,老师都要一一纠正不仅占用太多时间而且很不必要。老师可以要求学生将编写的程序输入到计算机,进行上机调试。对于语法上的错误,老师可以帮助解决。对于逻辑上的错误,如得到了不正确的结果,应该让学生独立分析、修正、改进程序。以PASCAL为例,教师可以教会学生如何设置观察变量和程序单步执行。这样学生通过观察程序执行到每一步时,各个变量值的变化,分析出产生错误的原因。上机调试,不仅是学习程序设计的必要技能,也是学生修正自己错误思维的过程。3、构建学习共同体,促进小组合作学习对于较为复杂的问题,可以将学生组成小组,共同解决。在小组合作解决问题的过程中,学生的思维在进行交流、碰撞,更容易在群体智慧的基础上产生创Fora:=1to100doForb:=1to100doForc:=1to100doIf(a*5+b*3+c/3)=100and(a+b+c=100)thenWriteln(a,b,c)Fora:=1to20doForb:=1to33doForc:=1to99doIf(a*5+b*3+c/3)=100and(a+b+c=100)thenWriteln(a,b,c)Fora:=1to19doForb:=1to32doBeginc:=100-a-b;If(a*5+b*3+c/3)=100and(a+b+c=100)thenWriteln(a,b,c);End;7新性的想法。案例6、结构化程序设计思想的内容在以往的教学中,对于结构化程序设计思想的内容往往总是匆匆而过。老师一般感觉这部分内容比较理论化,很难给学生切实的感性体验。我对这部分的教学内容进行了设计,通过教学让学生明确了“合作”和“分工”的重要性,并形成了小组进行合作学习。首先,我引导学生分析举办一次班级文艺晚会的各项工作(见图10),让学生理解在程序设计时采用“自顶向下、逐步求精”的实施方法。然后我引导学生将其中的“评委打分”问题分解成4个模块(见图11)。图10:文艺晚会的工作安排图11:“评委打分”问题的4个模块其次,学生形成4人小组。学生之间进行分工,各自完成一个模块。学生完成各自的模块以后,再一起合成完整的程序,解决了这个比较复杂的问题。在这个案例中,学生不仅加深了对结构化程序设计思想的理解,更清楚了程序设计中的“分工”和“合作”的重要性。在以后对于解决相对复杂的问题时,学生也经常以学习小组的形式进行讨论。4、构建课程体系,满足不同学生的学习需要高一的算法和程序设计课程是面向全体学生,主要学习程序设计的一些基本结构、一些基本的算法以及实现这些算法必须的程序设计知识。对于学有余力,并希望对程序设计进行进一步深入学习的同学,我开设了选修课和活动课两个模块。在选修课中,学生系统学习程序设计语言和常用的算法如贪心算法、分治算法、穷举算法等。学生可以解决利用程序设计编程解决一些较为复杂的实际问题。在社团课中,学生学习数据结构等比较专业的计算机知识。这些学生主要是8对

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功