巧用教学模式,学习程序设计

来源:岁月联盟 作者:未知 时间:2010-08-15
摘要: 本文在课程整合理论和任务驱动教学思想的指导下,结合高中程序设计教学大纲,巧妙地把“提问-引导-探究性”教学模式应用到程序设计教学过程中,目的是充分借助信息化的学习环境、积极引导学生善于思考、勇于探究,从而不断地提高程序设计能力和增强程序优化的意识。
关键字:“提问-引导-探究性” 程序设计 循环语句 教学资源 程序优化
一 引言
(一)问题的提出
由于学生刚接触程序设计,很难把数学知识融入到循环结构的运用中,通常在学习中对书本上提供的程序容易理解,但只要把条件和要求略加变更或者在独立解决一些实际问题,这时学生表现为应变能力低,编程实现也就有点困难。
(二)解决问题的思路
思维是活跃的,程序是变化的,程序设计不能僵化于一种讲授模式,重在“启发引导”,就是呈现层次分明的“提问”内容,再结合问题的具体实际,因势利导,最终“引导”学生自己来“探究”完成任务。实践证明,充分运用“提问-引导-探究性”教学模式来加强程序设计教学中的引导,是提高程序设计能力与解决实际问题的应变能力的有效途径。
二 实践
在课程改革和信息技术与学科课堂整合的今天,教师是教学资源的提供者、研究探索的引导者。除了引导式的展示不同阶段学生思考的不同问题、提供必要的多媒体信息资源之外,还要指导学生依托信息技术所提供的丰富网络教学资源进行研究、讨论和发表见解的,拓展式、开放性的学习。在循环结构的教学中,我充分运用“提问-引导-探究性”的教学模式,循序渐进地提出层次性的问题,从而实现引导变通,这时,师生一起进入"聊天室"进行知识问答、交流谈心、专题探讨等活动(这种聊天式的讨论本身就是一种学习活动)。学生在交流探讨的过程中思维,学习新知,培养技能,提高汉字输入速度。具体实施如下:
(一)改变语句中的变量,加强语句的理解与应用
在程序设计的初始阶段,学生对某些语句的功能还不甚了解的实际,求和求积等基本问题入手,在及时纠正初编程序时所出现的语法错误和逻辑错误的基础上,引导对已编程序的某些语句或语句中的某些变量作力所能及的变通,以加强对语句的理解与应用的基本功。
呈现“求S=1+2+…+50”的例子:
Program cbh1;
var
t,s:integer;
Begin
s:=0;
for t:=1 to 50 do
s:=s+t;
writeln('S=',s);
readln
End.
要求学生关注以下三个问题:
1、循环中的循环变量是什么,其初值、终值分别为多少?
2、放累加和的变量是什么?每次的累加项是什么?
3、请注意累加项和累加和的值是如何变化的。
学生上机调试、分组讨论、结合网络资源,师生问答等方式来完成。学生解答这三个问题的过程,其实是对所学的变量、循环等概念的进一步理解、说明和归纳的思维过程。但并不意味着学生对程序的每个语句的功能清楚了。为了加深对赋值语句和循环语句的执行过程的理解,在这一简单程序基础上可引导学生做以下变化练习:
1、S =1+1/2+1/3+……+1/50
2、S =20 +21 +22 +……+210
3、S =1×2+2×3+3×4+……+99×100
4、S =10!=10*9*8*……*2*1
这种一题多变,一例多用的练习使学生从单纯的模仿阶段,通过自己的观察、对比、联系和想象,过渡到独立应用所学的概念和规则,灵活地、举一反三地、独创性解决问题,锻炼了学生思维能力,使其在思维的灵活性、批判性、深刻性、创新性方面都有所提高。通过以上一系列角度不同的变通,学生对每一个语句的认识深刻了,对语句中每一个变量的确定谨慎了。
引导对语句变量的改变,必须目的明确,同时,变化还要注意控制难度,先易后难,逐步深入,把引导与示范,引导与评价,引导与纠错有机结合起来。
(二)采用不同的程序设计方法,进一步认识语句与程序结构
循环结构的理解与运用是程序设计的基础,因此在学完循环基本结构的三种语句(for/repeat……until/while)后,为了加深对三种语句的理解,做到灵活应用,在处理程序设计时引导学生采用不同的方法进行设计,加强横向联系,启发学生自己进行,达到理想的教学效果。
呈现 “N!=1*2*3*……*10”例子:
先采用for语句设计发如下:
Program cbh2;
var
i,n:longint;
Begin
n:=1;
for i:=1 to 10do
n:=n*i;
witeln(n,'!=',n);
readln
End.
提出使用其它两种循环结构应该怎样设计?
学生经过探究、分组讨论、聊天室交流、程序调试、师生总结如下程序:
Program cbh2_1;
var
i,n:longint;
Begin
n:=1;i:=1;
repeat
n:=n*i;
i:=i+1;
until i>10;
writeln(n,'!=',n);
readln;
End.

Program cbh2_2;
var
i,n:longint;
Begin
n:=1;i:=1;
while i<=10 do
begin
n:=n*i;
i:=i+1;
end;
writeln(n,'!=',n);
readln;
End.
然后引导学生对三个程序进行比较,得出决定循环终止的条件是布尔表达式,同时得出不同循环结构的布尔表达式关系。
又呈现“求出下式中n的最大值:s=12+22+32……+n2<500”例子。
先向学生提问:用什么循环语句来设计程序?
通过讨论,学生自己得出结论:
1、用for语句无法设计;
2、只能使用repeat……until与while两种循环设计;
3、同时再次对repeat……until和while 两种循环中的布尔表达式之间的关系有进一步的认识;
正确的程序如下:
Program cbh3_1;
var
n,s:integer;
Begin
s:=0;n:=1;
repeat
s:=s+n*n;
n:=n+1;
until s>=500;
n:=n-2;
writeln('n=',n);
readln;
End.

Program cbh3_2;
var
n,s:integer;
Begin
s:=0;n:=1;
while s<500 do
begin
s:=s+n*n;
n:=n+2;
end;
n:=n-1;
writeln('n=',n);
readln;
End.
最后小组得出结论:三种语句实现循环结构,即for语句,while语句和repeat……until语句, 对于能确定循环次数且可利用一个简单循环控制变量(只能使用顺序类型数据)时,使用for语句最合适了;对于循环次数不能预先确定,宜使用while或repeat……until语句,但while 语句适用于有可能根据条件判断使其成为空语句的情况,而repeat……until 语句适用于不论什么条件至少要执行一次循环体的情况。
通过如此的引导,使学生对循环结构的三条语句使用得心应手,在编程过程中能够灵活应用;同时也培养了学生发散性思维。
(三)改变程序结构,达到程序优化
在掌握了基本语句的准确使用与简单程序编写的要领之后,要引导学生从“按步思维到灵活思维”的转变,注意从程序的结构与设计思路上考虑变通,培养结构化和优化的意识,迅速提高编程能力。
一个程序设计出来了,不能满足于没有语法错误,能上机通过等起码要求,有必要引导学生从以下几个方面作一些深层次的思考:
1、程序的结构是否合理?
2、程序的设计思路是否清晰?
3、程序占用的机器空间与时间是否合适?
4、能不能作进一步的优化?
呈现“S =1-1/2+1/3-1/4+……+1/99-1/100”例子。
表达式中各项正负相间,基本的设计思路是把右边表达式分成正与负两组考虑,可以用两组双重循环来实现,这样做,思路显然比较简单但程序的编码较多,结构也显复杂。能不能把两组双重循环简化为一组单重循环来实现呢?可引导学生使用一个符号变量f解决正负符号相间,设计出结构非常简明的程序:
program cbh4;
var
n,f,t:integer;
s:real;
begin
s:=0;t:=1; f:=1;n:=1;
while n<=100 do
begin
s:=s+t;
n:=n+1;
f:=-f;
t:=f/n;
end;
writeln('s=',s:10:8);
readln
end.
运行此程序会发现结果为1,为什么?引导学生自己分析,寻找原因,最后学生发现:感觉从第2项开始就没有参与运算,由于程序的说明部分,t是整型数,t无法等与一个分式的值(实型),始终为0。改程序的说明部分中的n为实型数即可。
这一设计打破了原来的正负分组的模式,从而优化了程序。
从设计思路,引导学生程序结构上变通,目的是培养程序的优化意识,寻求程序的优化途径,通过变通,具体建立程序的可读性比较,运行时间与占用空间的比较,结构化比较等优化概念,,对程序结构的变通较之前面对程序中某些语句某些变量的变通要深一个层次,要求更高,涉及面更广,因此,在变通的引导上要做到具体、细致,切忌简单了事,操之过急。

(四)构造合理算法,提高编程解决实际问题的能力。
算法是程序设计的依据。确定合理的算法是编程解决实际问题的前提与关键。引导对算法的变通,包括递归、搜索、迭代、递推、模拟等基本算法的改造,传统算法的推陈出新,必须紧密联系具体问题的实际。
呈现“一个整数的每位数字都是1,至少多少位才能使这个数被13整除呢?”例子。
这是一个有趣的实际问题,一般考虑的,无非是整除,一个个进行试商检验是基本的算法,一些学生往往“跃跃欲试”地编出程序:
Program cbh5;
Var
a,i:integer;
Begin
a:=0;i:=0;
repeat
i:=i+1;
a:=a*10+1;
until a mod 13=0;
writeln('i=',i);
readln
End.
在程序调试运行受阻之后,就要启发学生分析算法上的问题:当a的位数超过定义的整型数范围后,程序出错,然后引导学生思考:如果不用机,怎么求解?让学生在写出几步整数除法的竖式的基础上进行模拟寻求模拟变量(被除数、余数、商)建立模拟循环,从而设计出简练可行的程序:
Program cbh6;
var
b,i,a:integer;
Begin
b:=111,i:=3;
repeat
i:=i+1;
a:=(b*10+1) div 13;
b:=b*10+1-13*a;
until b=0;
writeln('i=',i);
readln
End.
由于以上程序中每次作整除运算所得的余数b要小于13,因此下一次的被除数B*10+1(体现增加一个“1”)不超出整数的范围,可确保整除的实现。可见, 算法的变通,有时直接关系到程序设计的成败。


所谓“提问-引导-探究性”教学模式,就是以提问为前提,引导为路径,探究为目的的教学。具体说它是指教学过程是以教师精心设计的问题为前提,在教师的启发诱导下,以学生独立自主学习和合作讨论为前提,以现行教材为基本探究内容,以学生周围世界和生活实际为参照对象,为学生提供充分自由表达、质疑、探究、讨论问题的机会,让学生通过个人、小组、集体等多种解难释疑尝试活动,将自己所学知识应用于解决实际问题的一种教学形式。
把“提问-引导-探究性”教学模式应用于程序设计的教学中,实施引导变通程序设计,课堂教学气氛活跃,教师和学生双方都参与活动,他们都将以导师和主人的双重身份进人课堂、辩谬纠错、比较鉴别、层次分明、思维灵活,可以在提高程序设计能力,增强程序优化意识上收到良好成效。
程序设计中“提问-引导-探究性”教学模式,究竟在哪几个问题上“设疑”,如何去“设疑引导”,本身就是“应变”的,并没有一成不变的模式可套,必须因课制宜,因题制宜,因不同专业特点和学生实际而异。“辩疑解难”的实施,关键在引导,切忌想当然,脱离实际,强加于人,代替学生去完成变通,最后进行“释疑巩固”,同时注意,“设疑”应有梯度,有针对性,不能面面俱到,贪广求深,欲速不达。


[1] 周春荔. 数学观与方法论. 北京:首都师范大学出版社,1996
[2]何克抗.教学结构与网络教学模式探讨.技术通讯.
[3]高文主编.教学的模式化研究.山东教育出版社,2000
[4]张武升.关于教学模式的探讨.教育研究.1988.
[5]夏惠贤 《当代中小学教学模式研究》 广西教育出版社 2001年