论文部分内容阅读
【摘要】从程序设计课程的重要性出发,分析当前该课程教学中普遍存在的问题,结合我院目前教学改革的要求,从培养学生分析、解决问题的能力出发,提出一种基于支架式和抛锚式教学方法的新式教学方法,给出该方法在实际教学过程中的应用案例并对案例进行分析,是被实践证明了的符合建构主义教学模式要求的一种新的教学方法。
【关键词】建构主义;教学方法;程序设计
引言
计算机专业本科教学阶段,重点培养学生的编程能力、系统分析能力及系统设计能力,其中,编程能力的培养是系统分析和设计能力实现的基础和前提。此外,随着教学改革的不断实施,使得传统的教学模式已经被颠覆,取而代之的是各种新式的建构主义教学方法。如何提高程序设计课程的教学效果,并能在教学中实现对学生分析问题、解决问题及创新思维能力的综合培养,从而满足学科建设需要及社会发展的要求,这是摆在广大高校教师面前的一个严峻问题。
1.程序设计课程教学中存在的问题
当前的程序设计课程的教学中普遍存在一些难以克服的困难,很多学生在学习了该门课程后感到自己好像什么也没有学到,甚至不知所云。由此对一些相关的课程产生畏惧心理,从而出现对其所学专业的厌学情绪。另一方面,教师们在备课、上课及课后辅导中也是付出大量劳动,但却总有事倍功半的感觉。通过对我校教师和学生的实际情况进行分析,导致这种不良状况的原因主要有以下几个方面:
(1)c语言课程内容繁杂,知识体系庞大
(2)教学大纲中对于本课程所设定的课时数偏少
(3)教师主要以课堂教学为主且教学方法单一
(4)传统教学模式在教学中占主导地位
(5)学生缺乏自主性及协作精神
综上所述的几个原因,对于学生考试成绩普遍不理想的症结所在就一目了然了。由于对本课程的教学内容及教学学时的分配无法改变,不仅如此,为了加大学生的实践教学环节力度,我系还要进一步对课程学时进行压缩。因此,我们只能从后三个方面寻找突破口。根据我多年的教学经验并结合当前课程建设的需求,在此提出一种新式的教学方法以供广大教师参考。
2.新式教学方法在程序设计课程中的应用案例
笔者在C语言课程中采用的新式教学方法是依据以“学”为中心的教学设计原则提出的。以“学”为中心教学设计的原则主要包括以下几点:[1]
(1)强调以学生为中心;
(2)强调“情境”对意义建构的重要作用;
(3)强调“协作学习”对意义建构的关键作用;
(4)强调对学习环境的设计;
(5)强调利用各种信息资源来支持“学”(而非支持“教”);
(6)强调学习过程的最终目标是完成意义建构(而非完成教学目标);
(7)强调设计轻松有效的教学效果评价方法。
下面以c语言课程中的一维数组程序应用举例这节课的教学为例,具体说明新式教学方法的实施过程。
2.1 问题的提出
本节课开始讲课之前,对于一维数组的定义、引用、数组元素的输入及输出内容先做简单回顾,然后提出问题:假设我们班有10名学生参加了考试,考试结束后教师要根据考试成绩的分布情况画出成绩分布曲线图,为方便教师统计,首先要求大家将10个同学的考试成绩从高到低进行排列,如何编程实现?
2.2 问题的分析
首先由学生分小组进行简单讨论,讨论的内容分别是:10名学生的成绩使用什么数据结构来保存?成绩数据的类型是什么?采用何种方法输入数据?如何对10个数据进行排序?如何输出是什么?
经过激烈的讨论,全班同学达成一致,采用数组结构来保存10个数据,结合实际情况得出数据类型为浮点型数据,并给出其定义形式为:float score[10],因为在实际工作中教师需要将成绩录入计算机才能得到排序结果,因此数据的输入同学们选用了格式化输入函数scanf并借助循环结构来实现:scanf(“%f”,&score[i]),对于10个数据的排序,大部分的学生们都倾向于依次找出最大的数、次大的数……,最后利用循环结构进行输出。
2.3 问题的实施
请同学派代表发言,学生说老师写,把完整程序写在黑板上。在代表发言过程中如果有错误,班里同学可以随时提议修改,同时对于考虑不周的地方任何学生都可以随时补充,此时课堂气氛异常活跃,提高了学生们的学习兴趣和热情。下面是学生们第一次编出的程序:
#include"stdio.h"
main()
{float score[10],max;
int i;
for(i=0;i<10;i++)
scanf("%f",&score[i]);
max=score[0];
for(i=1;i<10;i++)
if(score[i]>max) max=score[i];
for(i=0;i<10;i++)
printf("%f",score[i]);}
在这个程序中,学生们设置了一个变量max用来存放找到的最大的数,但对于剩下的操作该如何实现马上没有考虑成熟。因此,教师提问:次大数找出后存放到什么地方?学生们讨论后说可以再定义一个变量,于是教师引导:需要多少这样的变量?用什么结构存放效果好?经过讨论之后又定义了一个数组用来存放排好序的数据。在上面程序的基础上进行修改得程序如下:
#include"stdio.h"
main()
{float score[10],b[10],max;
int i;
for(i=0;i<10;i++)
scanf("%f",&score[i]);
b[0]=score[0];
for(j=0;j<9;j++)
{max=score[j];
for(i=j+1;i<10;i++)
if(score[i]>max) max=score[i];
b[j]=max;}
for(i=0;i<10;i++)
printf("%f",score[i]);}
上面的这个程序,请同学进行验证,很快学生们就发现程序有问题,不能正确进行排序。原因是两轮循环中,外层循环用来实现对数组b的赋值,内层循环用来实现每个数的查找,但是查找过程中原始数据的位置没有改变,导致已经找到的数可能还在下次循环操作中被处理。根据“最临近发展区”的概念,教师提出:如何在每次循环过程中将已经找到的数排除?并且就该问题建立更进一步的“支架”(即提高一定的难度):要求只需定义一个数组来解决问题。经过讨论之后,学生代表继续对该程序进行修改,修改如下:
#include"stdio.h"
main()
{float score[10],temp;
int i,j;
for(i=0;i<10;i++)
scanf("%f",&score[i]);
for(j=0;j<9;j++)
{
for(i=j+1;i<10;i++)
if(score[i]>score[j])
{temp=score[i];score[i]=score[j];score[j]=temp;}
}
for(i=0;i<10;i++)
printf("%f",score[i]);}
经过分析验证,该程序能够解决所需时间的问题。教师可进一步为该问题搭建一个更高一级的“支架”:排序过程中需要不断进行两个数据的交换,对于内存单元的这种频繁操作势必造成大型程序运行时效率低的情况,如何解决?学生可以先思考,教师在学生思考的基础上提示:可否先找到最大数所在位置,然后将它与第一个数交换位置,然后依次类推……最后得出标准程序如下:[2]
#include"stdio.h"
main()
{float score[10],temp;
int i,j,k;
for(i=0;i<10;i++)
scanf("%f",&score[i]);
for(j=0;j<9;j++)
{k=j;
for(i=j+1;i<10;i++)
if(score[i]>score[k])k=i;
temp=score[k];
score[k]=score[j];
score[j]=temp;
}
for(i=0;i<10;i++)
printf("%.2f",score[i]);
}
2.4 问题求解过程总结分析
最后一个环节,教师要求学生对自己在问题求解过程中的一些想法进行评价,对于问题的分析和解决过程思路是否清晰,在问题结果过程中遇到的困难主要有哪些?如何解决?最后要求在此基础上思考对这些数据能够进行的下一步处理,由学生自己提出问题并分析解决。
3.案例分析
(1)教学目标设定分析
本节课是以学生学习了结构化程序设计的基本思想及一维数组的基本概念为前提展开的一次关于数组应用的实践课,因此教学的目标即是利用结构化程序设计的思想和数组结构对实际问题进行求解,该目标要高于学生原有的认知结构但却可以使学生经过思考之后能够达到,并且目标的设定以学生学生为中心,站在学生的角度思考问题,提出问题。
(2)情境创设真实性分析
本节课的教学围绕对于一维数组在现实中的应用实例提出对学生成绩进行排序的实际问题,符合建构主义教学理论中关于“情境”创设的要求,即学习总是与一定的社会文化背景相联系,可以使学生利用生动、直观的形象有效地激发联想,从而利用原有认知结构中的有关知识与经验去同化当前学习到的新知识,赋予新知识某种意义,主动构建自己(下转第63页)(上接第49页)的知识框架。
(3)自主学习设计效果分析
从上面的案例中我们不难看出,自始至终都是学生在思考——>解决——>遇到问题——>再思考——>再解决,教师只是在开始时抛出问题,这类似于抛锚式教学法中的“锚”,在教学过程中教师根据学生解决问题的情况适当给予提示或基于“最临近发展区”概念建立一个一个的支架,这又类似于支架式教学,教学的各个环节完全以学生为中心,充分发挥了学生的主动性和积极性,还有利于培养学生的首创精神。
(4)学习效果分析
对于学习效果的分析是以学生自评、互评为主,教师最后总结为辅进行。在这节课中,不仅提高了学生的自主学习能力,对于学生分析问题、解决问题及创新能力都得到加强,并且达到了对学习内容的意义建构的目的。
(5)强化练习设计分析
在问题解决之后,教师又针对实际应用提出进一步的要求,即对排好序的成绩进行分类汇总、查询、插入、删除等操作,对本节课的教学目标进行强化练习。
4.小结
编程能力是高校计算机专业对于学生最基本的要求,这是学生系统分析及设计能力的基础,它的地位显得尤为重要。本文以c语言课程为例展开,在实际教学中结合抛锚式和支架式教学方法的元素,因此定义为一个新式教学方法。在我的教学过程中已经多次采用,效果良好。而且,这种教学方法可以在类似的语言类教学课程中通用。我希望我的这种方法能够给从事软件编程教学的教师提供一些教学思路或参考,使大家感觉枯燥的程序设计课程变得生动有趣,并使师生都能从中获益。
参考文献
[1]刘成章.信息技术教育学[M].高等教育出版社,2002,8:86~88.
[2]谭浩强.C程序设计(第三版)[M].清华大学出版社,2007.9:131~135.
作者简介:南丽丽(1978—),女,山西运城人,2000年7月毕业于山西大学师范学院,获理学学士学位,2009年毕业于山西大学计算机科学与技术系,获工学硕士学位,现供职于运城学院计算机科学与技术系,从事C语言,多媒体技术及数据库技术的教学与研究。
【关键词】建构主义;教学方法;程序设计
引言
计算机专业本科教学阶段,重点培养学生的编程能力、系统分析能力及系统设计能力,其中,编程能力的培养是系统分析和设计能力实现的基础和前提。此外,随着教学改革的不断实施,使得传统的教学模式已经被颠覆,取而代之的是各种新式的建构主义教学方法。如何提高程序设计课程的教学效果,并能在教学中实现对学生分析问题、解决问题及创新思维能力的综合培养,从而满足学科建设需要及社会发展的要求,这是摆在广大高校教师面前的一个严峻问题。
1.程序设计课程教学中存在的问题
当前的程序设计课程的教学中普遍存在一些难以克服的困难,很多学生在学习了该门课程后感到自己好像什么也没有学到,甚至不知所云。由此对一些相关的课程产生畏惧心理,从而出现对其所学专业的厌学情绪。另一方面,教师们在备课、上课及课后辅导中也是付出大量劳动,但却总有事倍功半的感觉。通过对我校教师和学生的实际情况进行分析,导致这种不良状况的原因主要有以下几个方面:
(1)c语言课程内容繁杂,知识体系庞大
(2)教学大纲中对于本课程所设定的课时数偏少
(3)教师主要以课堂教学为主且教学方法单一
(4)传统教学模式在教学中占主导地位
(5)学生缺乏自主性及协作精神
综上所述的几个原因,对于学生考试成绩普遍不理想的症结所在就一目了然了。由于对本课程的教学内容及教学学时的分配无法改变,不仅如此,为了加大学生的实践教学环节力度,我系还要进一步对课程学时进行压缩。因此,我们只能从后三个方面寻找突破口。根据我多年的教学经验并结合当前课程建设的需求,在此提出一种新式的教学方法以供广大教师参考。
2.新式教学方法在程序设计课程中的应用案例
笔者在C语言课程中采用的新式教学方法是依据以“学”为中心的教学设计原则提出的。以“学”为中心教学设计的原则主要包括以下几点:[1]
(1)强调以学生为中心;
(2)强调“情境”对意义建构的重要作用;
(3)强调“协作学习”对意义建构的关键作用;
(4)强调对学习环境的设计;
(5)强调利用各种信息资源来支持“学”(而非支持“教”);
(6)强调学习过程的最终目标是完成意义建构(而非完成教学目标);
(7)强调设计轻松有效的教学效果评价方法。
下面以c语言课程中的一维数组程序应用举例这节课的教学为例,具体说明新式教学方法的实施过程。
2.1 问题的提出
本节课开始讲课之前,对于一维数组的定义、引用、数组元素的输入及输出内容先做简单回顾,然后提出问题:假设我们班有10名学生参加了考试,考试结束后教师要根据考试成绩的分布情况画出成绩分布曲线图,为方便教师统计,首先要求大家将10个同学的考试成绩从高到低进行排列,如何编程实现?
2.2 问题的分析
首先由学生分小组进行简单讨论,讨论的内容分别是:10名学生的成绩使用什么数据结构来保存?成绩数据的类型是什么?采用何种方法输入数据?如何对10个数据进行排序?如何输出是什么?
经过激烈的讨论,全班同学达成一致,采用数组结构来保存10个数据,结合实际情况得出数据类型为浮点型数据,并给出其定义形式为:float score[10],因为在实际工作中教师需要将成绩录入计算机才能得到排序结果,因此数据的输入同学们选用了格式化输入函数scanf并借助循环结构来实现:scanf(“%f”,&score[i]),对于10个数据的排序,大部分的学生们都倾向于依次找出最大的数、次大的数……,最后利用循环结构进行输出。
2.3 问题的实施
请同学派代表发言,学生说老师写,把完整程序写在黑板上。在代表发言过程中如果有错误,班里同学可以随时提议修改,同时对于考虑不周的地方任何学生都可以随时补充,此时课堂气氛异常活跃,提高了学生们的学习兴趣和热情。下面是学生们第一次编出的程序:
#include"stdio.h"
main()
{float score[10],max;
int i;
for(i=0;i<10;i++)
scanf("%f",&score[i]);
max=score[0];
for(i=1;i<10;i++)
if(score[i]>max) max=score[i];
for(i=0;i<10;i++)
printf("%f",score[i]);}
在这个程序中,学生们设置了一个变量max用来存放找到的最大的数,但对于剩下的操作该如何实现马上没有考虑成熟。因此,教师提问:次大数找出后存放到什么地方?学生们讨论后说可以再定义一个变量,于是教师引导:需要多少这样的变量?用什么结构存放效果好?经过讨论之后又定义了一个数组用来存放排好序的数据。在上面程序的基础上进行修改得程序如下:
#include"stdio.h"
main()
{float score[10],b[10],max;
int i;
for(i=0;i<10;i++)
scanf("%f",&score[i]);
b[0]=score[0];
for(j=0;j<9;j++)
{max=score[j];
for(i=j+1;i<10;i++)
if(score[i]>max) max=score[i];
b[j]=max;}
for(i=0;i<10;i++)
printf("%f",score[i]);}
上面的这个程序,请同学进行验证,很快学生们就发现程序有问题,不能正确进行排序。原因是两轮循环中,外层循环用来实现对数组b的赋值,内层循环用来实现每个数的查找,但是查找过程中原始数据的位置没有改变,导致已经找到的数可能还在下次循环操作中被处理。根据“最临近发展区”的概念,教师提出:如何在每次循环过程中将已经找到的数排除?并且就该问题建立更进一步的“支架”(即提高一定的难度):要求只需定义一个数组来解决问题。经过讨论之后,学生代表继续对该程序进行修改,修改如下:
#include"stdio.h"
main()
{float score[10],temp;
int i,j;
for(i=0;i<10;i++)
scanf("%f",&score[i]);
for(j=0;j<9;j++)
{
for(i=j+1;i<10;i++)
if(score[i]>score[j])
{temp=score[i];score[i]=score[j];score[j]=temp;}
}
for(i=0;i<10;i++)
printf("%f",score[i]);}
经过分析验证,该程序能够解决所需时间的问题。教师可进一步为该问题搭建一个更高一级的“支架”:排序过程中需要不断进行两个数据的交换,对于内存单元的这种频繁操作势必造成大型程序运行时效率低的情况,如何解决?学生可以先思考,教师在学生思考的基础上提示:可否先找到最大数所在位置,然后将它与第一个数交换位置,然后依次类推……最后得出标准程序如下:[2]
#include"stdio.h"
main()
{float score[10],temp;
int i,j,k;
for(i=0;i<10;i++)
scanf("%f",&score[i]);
for(j=0;j<9;j++)
{k=j;
for(i=j+1;i<10;i++)
if(score[i]>score[k])k=i;
temp=score[k];
score[k]=score[j];
score[j]=temp;
}
for(i=0;i<10;i++)
printf("%.2f",score[i]);
}
2.4 问题求解过程总结分析
最后一个环节,教师要求学生对自己在问题求解过程中的一些想法进行评价,对于问题的分析和解决过程思路是否清晰,在问题结果过程中遇到的困难主要有哪些?如何解决?最后要求在此基础上思考对这些数据能够进行的下一步处理,由学生自己提出问题并分析解决。
3.案例分析
(1)教学目标设定分析
本节课是以学生学习了结构化程序设计的基本思想及一维数组的基本概念为前提展开的一次关于数组应用的实践课,因此教学的目标即是利用结构化程序设计的思想和数组结构对实际问题进行求解,该目标要高于学生原有的认知结构但却可以使学生经过思考之后能够达到,并且目标的设定以学生学生为中心,站在学生的角度思考问题,提出问题。
(2)情境创设真实性分析
本节课的教学围绕对于一维数组在现实中的应用实例提出对学生成绩进行排序的实际问题,符合建构主义教学理论中关于“情境”创设的要求,即学习总是与一定的社会文化背景相联系,可以使学生利用生动、直观的形象有效地激发联想,从而利用原有认知结构中的有关知识与经验去同化当前学习到的新知识,赋予新知识某种意义,主动构建自己(下转第63页)(上接第49页)的知识框架。
(3)自主学习设计效果分析
从上面的案例中我们不难看出,自始至终都是学生在思考——>解决——>遇到问题——>再思考——>再解决,教师只是在开始时抛出问题,这类似于抛锚式教学法中的“锚”,在教学过程中教师根据学生解决问题的情况适当给予提示或基于“最临近发展区”概念建立一个一个的支架,这又类似于支架式教学,教学的各个环节完全以学生为中心,充分发挥了学生的主动性和积极性,还有利于培养学生的首创精神。
(4)学习效果分析
对于学习效果的分析是以学生自评、互评为主,教师最后总结为辅进行。在这节课中,不仅提高了学生的自主学习能力,对于学生分析问题、解决问题及创新能力都得到加强,并且达到了对学习内容的意义建构的目的。
(5)强化练习设计分析
在问题解决之后,教师又针对实际应用提出进一步的要求,即对排好序的成绩进行分类汇总、查询、插入、删除等操作,对本节课的教学目标进行强化练习。
4.小结
编程能力是高校计算机专业对于学生最基本的要求,这是学生系统分析及设计能力的基础,它的地位显得尤为重要。本文以c语言课程为例展开,在实际教学中结合抛锚式和支架式教学方法的元素,因此定义为一个新式教学方法。在我的教学过程中已经多次采用,效果良好。而且,这种教学方法可以在类似的语言类教学课程中通用。我希望我的这种方法能够给从事软件编程教学的教师提供一些教学思路或参考,使大家感觉枯燥的程序设计课程变得生动有趣,并使师生都能从中获益。
参考文献
[1]刘成章.信息技术教育学[M].高等教育出版社,2002,8:86~88.
[2]谭浩强.C程序设计(第三版)[M].清华大学出版社,2007.9:131~135.
作者简介:南丽丽(1978—),女,山西运城人,2000年7月毕业于山西大学师范学院,获理学学士学位,2009年毕业于山西大学计算机科学与技术系,获工学硕士学位,现供职于运城学院计算机科学与技术系,从事C语言,多媒体技术及数据库技术的教学与研究。