论文部分内容阅读
摘要 本文通过《程序设计》课程教学中的一个教学案例,探讨了斯金纳的教学理论在《程序设计》课程教学中的具体应用。教学实践表明这种教学理论在《程序设计》课程教学中的应用能取得较好的教学效果。
关键词 程序设计;斯金纳;教学理论;小步子原则;教学案例
AbstractThis paper discussesthe application of B.F.Skinner's teaching theory in programming teaching by a teaching case on programming course. The teaching practice indicates that better teaching effect can be obtained in programming teaching.
Key wordsprogramming ;Skinner; teaching theory;small step principle; teaching case
中图分类号G642 文献标识码 B
引言
《程序设计》是高校计算机专业的一门极其重要的专业基础课程,其基本教学目标应是使学生们通过本门课程的学习,熟练掌握某种高级程序设计语言( 如C语言)的基本语法,深刻理解结构化的编程思想,并能应用结构化的编程思想和相应高级语言的基本语法编写较简单的程序,使他们具备初步的程序设计能力,为进一步学习其它专业课程打下良好的基础。然而,由于种种原因,特别是由于《程序设计》这门课程的内容具有非物理的特性以及其内容描述手段的形式化,因此,要真正学好这门课程,需要学生具有较好的计算思维能力即高度的抽象思维能力和严密的逻辑推理能力[1],能够将要求通过编写程序解决的问题模型化,但是,这些能力对于刚刚跨入大学校门的大多数新生而言特别是对很多来自落后地区其高中阶段很少接触计算机的学生而言却是较为缺乏的,因此,他们在学习本课程的过程中困难重重,学习效果很不理想,甚至有相当数量的学生最后干脆完全放弃了对本课程的学习,以至于对整个计算机专业课程的学习完全失去信心和兴趣。
如何帮助学生克服本课程学习中的困难,实现本课程预期的教学目标,这是承担本课程教学任务的教师需要认真对待的问题。教学活动是一个以学生为主体,以教师为主导的双向交流活动。为了提高教学效果,帮助学生克服学习中的困难,提高他们的自信心,应充分发挥教师的主导作用。本文以多年的《程序设计》教学经验为基础,探讨了斯金纳的程序教学理论和小步子原则在《程序设计》课程教学中的具体应用。
一、斯金纳的程序教学理论
B·F·斯金纳是美国著名的教学心理学家,他通过动物实验建立了操作行为主义的学习理论,并据此提出了程序教学理论及其教学模式,这种程序教学理论及其教学模式曾给20世纪50年代的美国和世界的中小学教育带来广泛而深远的影响[2]。
斯金纳认为,人类的学习是一种操作反应的强化过程,可以设计一个完整的学习环境,在这个环境中通过一系列层次性的手段,将学习行为引导到预期的最终结果。在斯金纳看来,教师在教学过程中必须充分考虑在规定的时间里教学的内容是什么,如何有效地安排教学环节,也就是说,教师如何对教学目标进行分解,把非常复杂的行为模式逐渐精致地化为一个一个的较小的单位或者步骤,确保每个步骤的行为都得到及时的强化。
斯金纳提出的程序教学理论要求教师在教学过程中要遵循积极反应原则、小步子原则、即时反馈原则、自定步调原则和低错误率原则。其中小步子原则的主要思想是把教材分解为许多片段知识,并将这些片段知识编成一个逐渐增加难度的、有次序的序列,使任何相邻的两个小步子之间的难度相差很小,前一步的学习为后一步的学习作铺垫,后一步的学习在前一步学习后进行,这样在无形中降低学习的难度,使学生容易感受到学习的成功并自我强化,从而建立起学习的自信心。按照这些原则,斯金纳设计出了经典的程序教学模式即直线式程序教学模式,在这一教学模式中,教师要将教学材料分解成一系列连续的小步子,每一步一个项目,内容很少,系列的安排由浅入深,由简到繁。
二、课程教学中的案例设计
循环控制结构是程序设计语言中的基本结构之一,其执行过程并不复杂,但对初学程序设计的学生来说,用此结构编写程序还是会碰到不少困难。本节以在介绍了循环控制结构知识点后经常会碰到的一个具有代表性的问题做为案例,运用斯金纳的小步子原则和直线式程序教学模式的基本思想,将该问题分解为6个小问题,6个小问题的难度逐步加大,但相邻两个小问题的难度相差较小,从而有效地降低了问题的难度,并能使学生对循环控制结构知识点的理解和掌握得到不断强化,教学实践表明这种方法能取得较好的教学效果。
问题:编程求
sin(x)= x/1!-x^3/3!+x^5/5!-x^7/7!+...直至最后一项的绝对值小于10e-5。
(1)求n!
这是从原问题分解出的最简单的一个问题,在介绍了for 循环语句这一知识点后大多数学生能较轻松地编写出源程序。但需向学生指出的是表示阶乘值的变量的类型最好定义成double类型,这样n 的值可稍大一些,若定义成int类型,则对较小的n值就可能发生溢出(如n取为17),从而得出错误的结果。相应程序的代码很简单,故略去。
(2)求1!+2!+...+n!
此问题比第一个问题稍微增加了一点难度,因为既要求阶乘又要求累加和。不少学生只想到用双重循环来编程,但这样的程序其时间复杂度为O(n2) ,应帮助学生分析其累加和与和式中一般项之间的关系,用单循环来编程,使时间复杂度降为线性阶。程序主要代码如下:
void main( ) {//求1!+2!+...+n!
int i,n;
double fac=1,sum=0; //与第一个小问题相比,增加了一个变量sum的定义
printf(“请输入一个正整数:”);
scanf(“%d”,&n);
for(i=1;i<=n;i++) {
fac=fac*i;
sum+=fac;//与第一个小问题相比,只增加了此语句}
printf(“\nsum=%.lf\n”,sum);}
(3)求1/1!+1/2!+1/3!+...;直至最后一项小于10e-5
只要搞清第二个小问题的编程思路,本问题便能较轻松的解决,因为本累加和中的一般项是上一个小问题中的一般项的倒数,因而可增设一个变量t来表示本题中的一般项,它是上一题中一般项fac的倒数。另外,还要让学生们注意到,本题中没有具体指定被累加的项数,故不宜使用for语句,最好使用while语句,并以t>=10e-5 作while循环的条件,当然也不再需要表示项数的变量n。相应程序的主要代码如下:
void main() {//求1/1!+1/2!+1/3!+...;直至最后一项小于10e-5
int i=1;double fac=1,t,sum=0;
t=1/fac;
while(t>=10e-5) {
sum+=t;i++;
fac=fac*i;//本题中被累加的一般项t的分母,即上一小题中被累加的一般项
t=1/fac; //本题中被累加的一般项t }
printf(“\nsum=%lf\n”,sum);}
(4)求1/1!+1/3!+1/5!...;直至最后一项小于10e-5
本问题比第三个小问题又稍微增加了一点难度,原因在于本题中相邻两项的分母不是连续整数的阶乘,但均相差一个常数2 ,利用此特点便可对第三个小问题的程序稍作修改,从而轻松地得到本题的程序。程序的主要代码如下:
void main() {//求1/1!+1/3!+1/5!...;直至最后一项小于10e-5
int i=1;double fac=1,t,sum=0;
t=1/fac;
while(t>=10e-5) {
sum+=t; i=i+2;// 比较第三个程序的相应语句i++;
fac=fac*(i-1)*i;// 比较第三个程序的相应语句fac=fac*i;
t=1/fac;}
printf(“\nsum=%lf\n”,sum);}
(5)求1/1!-1/3!+1/5!-1/7!+...;直至最后一项的绝对值小于10e-5
本题与上一小题所不同的是被求累加和的各项正负交替出现,通常解决这种问题的方法之一是定义一初值为1的变量如sn,然后每循环一次使此变量的符号改变一次,即将 -sn值给sn,并通过此变量来交替改变一般项的符号。相应程序的主要代码如下:
void main( ) {//求1/1!-1/3!+1/5!-1/7!+...;直至最后一项的绝对值小于10e-5
int i=1,sn=1;//与第四个程序相比,只增加了一个变量sn 的定义
double fac=1,t,sum=0;
t=1/fac;
while(fabs(t)>=10e-5) {
sum+=t;i=i+2;fac=fac*(i-1)*i;
sn=-sn; //与第四个程序相比,只增加了这一条执行语句
t=sn/fac;//与第四个程序相比,通过变量sn交替改变一般项的符号}
printf(“\nsum=%lf\n”,sum);}
(6)求x/1!-x^3/3!+x^5/5!-x^7/7!+...;直至最后一项的绝对值小于10e-5
解决了上述五个小问题后,原有问题就显得较为简单了。事实上,考虑到原题的累加和中任意相邻两项之分子只相差一个因子x^2,因而,在第五个程序的基础上,只要增加两个变量(x与x2)的定义,x2为x初值的平方,然后每循环一次使表示一般项分子的x变为 -x*x2,并使新的x成为新的一般项t的分子。相应程序的主要代码如下:
void main( ){//求x/1!-x^3/3!+x^5/5!-x^7/7!+...;直至最后一项的绝对值小于10e-5
int i=1;
double fac=1,t,sum=0,x,x2;//与第五个程序相比,只增加了二个变量x与x2的定义
printf(“请输入一个实数:”);
scanf(“%lf”,&x);//与第五个程序相比增加对x变量的键盘输入
x2=x*x;//相邻两项之分子相差一个因子x^2
t=x/fac;
while(fabs(t)>=10e-5) {
sum+=t;i=i+2; fac=fac*(i-1)*i;
x=-x*x2;//与第五个程序相比增加了这一条语句,并通过此语句
//交替改变一般项的正负号
t=x/fac;}
printf(“\nsum=%6.4lf\n”,sum);}
本案例具有一定的普遍性,当学生们真正掌握了上述6个小问题的程序设计后,一方面,对循环控制结构知识点的理解将更为深刻,运用将更加灵活;另一方面,对于很多类似的求累加和的问题,将能很轻松地写出相应的程序。如:根据公式cosx=(-1)nx2n/(2n)!,编程求cosx的近似值,当某项的绝对值小于10-5时不再累加。
三、结束语
《程序设计》是计算机专业的第一门最具基础性的课程,能否学好这门课程往往直接决定了学生们能否有信心、有兴趣进一步学习和学好计算机专业的其它课程。因此,必须重视学生们在学习本课程时所碰到的各种困难,将课程中重要的、较难的知识点尽可能溶入到经过精心选择的程序设计教学案例之中,对于较难的程序设计问题,可运用斯金纳程序教学理论的小步子原则和直线式程序教学模式的基本思想,尽可能将问题分解为若干个小问题,使各小问题的难度逐步加大,但相邻两个小问题的难度相差较小,从而有效地降低问题的难度,增强学生们学习的自信心,并能使他们对所涉及到的有关知识点的理解和掌握得到不断强化,教学实践表明这种方法能够取得较好的教学效果。
参考文献
[1] 蒋宗礼.试论计算学科抽象第一的基本教育原理[J].计算机教育,2004,(11):54-58.
[2] 谢应宽.B·F·斯金纳强化理论探析[J].贵州师范大学学报(自然科学版),2003,(1):110-114.
[3] 谭浩强.C程序设计[M],第二版.北京:清华大学出版社,1999.12.
作者简介:吴国兵男(1962-),籍贯:江苏东台,汉族,讲师,主要研究方向:数据挖掘和粗糙集理论等.
注:“本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。”
关键词 程序设计;斯金纳;教学理论;小步子原则;教学案例
AbstractThis paper discussesthe application of B.F.Skinner's teaching theory in programming teaching by a teaching case on programming course. The teaching practice indicates that better teaching effect can be obtained in programming teaching.
Key wordsprogramming ;Skinner; teaching theory;small step principle; teaching case
中图分类号G642 文献标识码 B
引言
《程序设计》是高校计算机专业的一门极其重要的专业基础课程,其基本教学目标应是使学生们通过本门课程的学习,熟练掌握某种高级程序设计语言( 如C语言)的基本语法,深刻理解结构化的编程思想,并能应用结构化的编程思想和相应高级语言的基本语法编写较简单的程序,使他们具备初步的程序设计能力,为进一步学习其它专业课程打下良好的基础。然而,由于种种原因,特别是由于《程序设计》这门课程的内容具有非物理的特性以及其内容描述手段的形式化,因此,要真正学好这门课程,需要学生具有较好的计算思维能力即高度的抽象思维能力和严密的逻辑推理能力[1],能够将要求通过编写程序解决的问题模型化,但是,这些能力对于刚刚跨入大学校门的大多数新生而言特别是对很多来自落后地区其高中阶段很少接触计算机的学生而言却是较为缺乏的,因此,他们在学习本课程的过程中困难重重,学习效果很不理想,甚至有相当数量的学生最后干脆完全放弃了对本课程的学习,以至于对整个计算机专业课程的学习完全失去信心和兴趣。
如何帮助学生克服本课程学习中的困难,实现本课程预期的教学目标,这是承担本课程教学任务的教师需要认真对待的问题。教学活动是一个以学生为主体,以教师为主导的双向交流活动。为了提高教学效果,帮助学生克服学习中的困难,提高他们的自信心,应充分发挥教师的主导作用。本文以多年的《程序设计》教学经验为基础,探讨了斯金纳的程序教学理论和小步子原则在《程序设计》课程教学中的具体应用。
一、斯金纳的程序教学理论
B·F·斯金纳是美国著名的教学心理学家,他通过动物实验建立了操作行为主义的学习理论,并据此提出了程序教学理论及其教学模式,这种程序教学理论及其教学模式曾给20世纪50年代的美国和世界的中小学教育带来广泛而深远的影响[2]。
斯金纳认为,人类的学习是一种操作反应的强化过程,可以设计一个完整的学习环境,在这个环境中通过一系列层次性的手段,将学习行为引导到预期的最终结果。在斯金纳看来,教师在教学过程中必须充分考虑在规定的时间里教学的内容是什么,如何有效地安排教学环节,也就是说,教师如何对教学目标进行分解,把非常复杂的行为模式逐渐精致地化为一个一个的较小的单位或者步骤,确保每个步骤的行为都得到及时的强化。
斯金纳提出的程序教学理论要求教师在教学过程中要遵循积极反应原则、小步子原则、即时反馈原则、自定步调原则和低错误率原则。其中小步子原则的主要思想是把教材分解为许多片段知识,并将这些片段知识编成一个逐渐增加难度的、有次序的序列,使任何相邻的两个小步子之间的难度相差很小,前一步的学习为后一步的学习作铺垫,后一步的学习在前一步学习后进行,这样在无形中降低学习的难度,使学生容易感受到学习的成功并自我强化,从而建立起学习的自信心。按照这些原则,斯金纳设计出了经典的程序教学模式即直线式程序教学模式,在这一教学模式中,教师要将教学材料分解成一系列连续的小步子,每一步一个项目,内容很少,系列的安排由浅入深,由简到繁。
二、课程教学中的案例设计
循环控制结构是程序设计语言中的基本结构之一,其执行过程并不复杂,但对初学程序设计的学生来说,用此结构编写程序还是会碰到不少困难。本节以在介绍了循环控制结构知识点后经常会碰到的一个具有代表性的问题做为案例,运用斯金纳的小步子原则和直线式程序教学模式的基本思想,将该问题分解为6个小问题,6个小问题的难度逐步加大,但相邻两个小问题的难度相差较小,从而有效地降低了问题的难度,并能使学生对循环控制结构知识点的理解和掌握得到不断强化,教学实践表明这种方法能取得较好的教学效果。
问题:编程求
sin(x)= x/1!-x^3/3!+x^5/5!-x^7/7!+...直至最后一项的绝对值小于10e-5。
(1)求n!
这是从原问题分解出的最简单的一个问题,在介绍了for 循环语句这一知识点后大多数学生能较轻松地编写出源程序。但需向学生指出的是表示阶乘值的变量的类型最好定义成double类型,这样n 的值可稍大一些,若定义成int类型,则对较小的n值就可能发生溢出(如n取为17),从而得出错误的结果。相应程序的代码很简单,故略去。
(2)求1!+2!+...+n!
此问题比第一个问题稍微增加了一点难度,因为既要求阶乘又要求累加和。不少学生只想到用双重循环来编程,但这样的程序其时间复杂度为O(n2) ,应帮助学生分析其累加和与和式中一般项之间的关系,用单循环来编程,使时间复杂度降为线性阶。程序主要代码如下:
void main( ) {//求1!+2!+...+n!
int i,n;
double fac=1,sum=0; //与第一个小问题相比,增加了一个变量sum的定义
printf(“请输入一个正整数:”);
scanf(“%d”,&n);
for(i=1;i<=n;i++) {
fac=fac*i;
sum+=fac;//与第一个小问题相比,只增加了此语句}
printf(“\nsum=%.lf\n”,sum);}
(3)求1/1!+1/2!+1/3!+...;直至最后一项小于10e-5
只要搞清第二个小问题的编程思路,本问题便能较轻松的解决,因为本累加和中的一般项是上一个小问题中的一般项的倒数,因而可增设一个变量t来表示本题中的一般项,它是上一题中一般项fac的倒数。另外,还要让学生们注意到,本题中没有具体指定被累加的项数,故不宜使用for语句,最好使用while语句,并以t>=10e-5 作while循环的条件,当然也不再需要表示项数的变量n。相应程序的主要代码如下:
void main() {//求1/1!+1/2!+1/3!+...;直至最后一项小于10e-5
int i=1;double fac=1,t,sum=0;
t=1/fac;
while(t>=10e-5) {
sum+=t;i++;
fac=fac*i;//本题中被累加的一般项t的分母,即上一小题中被累加的一般项
t=1/fac; //本题中被累加的一般项t }
printf(“\nsum=%lf\n”,sum);}
(4)求1/1!+1/3!+1/5!...;直至最后一项小于10e-5
本问题比第三个小问题又稍微增加了一点难度,原因在于本题中相邻两项的分母不是连续整数的阶乘,但均相差一个常数2 ,利用此特点便可对第三个小问题的程序稍作修改,从而轻松地得到本题的程序。程序的主要代码如下:
void main() {//求1/1!+1/3!+1/5!...;直至最后一项小于10e-5
int i=1;double fac=1,t,sum=0;
t=1/fac;
while(t>=10e-5) {
sum+=t; i=i+2;// 比较第三个程序的相应语句i++;
fac=fac*(i-1)*i;// 比较第三个程序的相应语句fac=fac*i;
t=1/fac;}
printf(“\nsum=%lf\n”,sum);}
(5)求1/1!-1/3!+1/5!-1/7!+...;直至最后一项的绝对值小于10e-5
本题与上一小题所不同的是被求累加和的各项正负交替出现,通常解决这种问题的方法之一是定义一初值为1的变量如sn,然后每循环一次使此变量的符号改变一次,即将 -sn值给sn,并通过此变量来交替改变一般项的符号。相应程序的主要代码如下:
void main( ) {//求1/1!-1/3!+1/5!-1/7!+...;直至最后一项的绝对值小于10e-5
int i=1,sn=1;//与第四个程序相比,只增加了一个变量sn 的定义
double fac=1,t,sum=0;
t=1/fac;
while(fabs(t)>=10e-5) {
sum+=t;i=i+2;fac=fac*(i-1)*i;
sn=-sn; //与第四个程序相比,只增加了这一条执行语句
t=sn/fac;//与第四个程序相比,通过变量sn交替改变一般项的符号}
printf(“\nsum=%lf\n”,sum);}
(6)求x/1!-x^3/3!+x^5/5!-x^7/7!+...;直至最后一项的绝对值小于10e-5
解决了上述五个小问题后,原有问题就显得较为简单了。事实上,考虑到原题的累加和中任意相邻两项之分子只相差一个因子x^2,因而,在第五个程序的基础上,只要增加两个变量(x与x2)的定义,x2为x初值的平方,然后每循环一次使表示一般项分子的x变为 -x*x2,并使新的x成为新的一般项t的分子。相应程序的主要代码如下:
void main( ){//求x/1!-x^3/3!+x^5/5!-x^7/7!+...;直至最后一项的绝对值小于10e-5
int i=1;
double fac=1,t,sum=0,x,x2;//与第五个程序相比,只增加了二个变量x与x2的定义
printf(“请输入一个实数:”);
scanf(“%lf”,&x);//与第五个程序相比增加对x变量的键盘输入
x2=x*x;//相邻两项之分子相差一个因子x^2
t=x/fac;
while(fabs(t)>=10e-5) {
sum+=t;i=i+2; fac=fac*(i-1)*i;
x=-x*x2;//与第五个程序相比增加了这一条语句,并通过此语句
//交替改变一般项的正负号
t=x/fac;}
printf(“\nsum=%6.4lf\n”,sum);}
本案例具有一定的普遍性,当学生们真正掌握了上述6个小问题的程序设计后,一方面,对循环控制结构知识点的理解将更为深刻,运用将更加灵活;另一方面,对于很多类似的求累加和的问题,将能很轻松地写出相应的程序。如:根据公式cosx=(-1)nx2n/(2n)!,编程求cosx的近似值,当某项的绝对值小于10-5时不再累加。
三、结束语
《程序设计》是计算机专业的第一门最具基础性的课程,能否学好这门课程往往直接决定了学生们能否有信心、有兴趣进一步学习和学好计算机专业的其它课程。因此,必须重视学生们在学习本课程时所碰到的各种困难,将课程中重要的、较难的知识点尽可能溶入到经过精心选择的程序设计教学案例之中,对于较难的程序设计问题,可运用斯金纳程序教学理论的小步子原则和直线式程序教学模式的基本思想,尽可能将问题分解为若干个小问题,使各小问题的难度逐步加大,但相邻两个小问题的难度相差较小,从而有效地降低问题的难度,增强学生们学习的自信心,并能使他们对所涉及到的有关知识点的理解和掌握得到不断强化,教学实践表明这种方法能够取得较好的教学效果。
参考文献
[1] 蒋宗礼.试论计算学科抽象第一的基本教育原理[J].计算机教育,2004,(11):54-58.
[2] 谢应宽.B·F·斯金纳强化理论探析[J].贵州师范大学学报(自然科学版),2003,(1):110-114.
[3] 谭浩强.C程序设计[M],第二版.北京:清华大学出版社,1999.12.
作者简介:吴国兵男(1962-),籍贯:江苏东台,汉族,讲师,主要研究方向:数据挖掘和粗糙集理论等.
注:“本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。”