当前位置:文档之家› 计算思维和程序设计能力的培养

计算思维和程序设计能力的培养

计算思维和程序设计能力的培养摘要:随着信息化技术的发展加快,如何提高计算机人才的程序设计和开发能力显得尤为重要。

本文从算法的一题多解入手,探讨对学生计算思维能力的培养。

这一方法对培养学生学习兴趣和提高其程序设计及编程实践能力起到了极大的促进作用。

采用这个方法进行教学,能达到理想的教学效果。

关键词:算法;程序设计;计算思维;能力培养1研究背景数据结构是计算机相关专业的一门重要的专业基础课,是计算机科学的核心课程,是计算机理论与技术的重要基石。

它主要研究计算机加工对象的逻辑结构、在计算机中的表示形式以及实现各种基本操作的算法。

它是学习操作系统、编译原理、数据库原理、软件工程等计算机专业核心课程的基础,掌握好这门课程的内容,是学习计算机其他相关课程的必备条件。

学习数据结构可以培养学生的数据抽象能力、算法设计能力以及构造算法思维方法的能力。

数据结构的学习过程,是算法构造性思维方法的训练过程,技能培养的重要程度不亚于知识传授。

本门课程教学难点在于让学生理解、习惯算法构造思维方法。

培养学生的数据抽象能力、算法设计能力以及创造性思维方法,才能使其举一反三、触类旁通,从而达到应用知识解决复杂问题的目的。

通过数据结构的学习,培养和强化学生计算思维的能力。

程序设计在计算机学科知识体系中处于核心地位,对计算机专业的学生来说不仅是职业技能的培养,也体现着创造性思维的信息素质培养过程。

程序设计也是有形表达抽象思维的方法,在程序设计过程中贯穿阅读判断、分析思考、工具利用、抽象表达、综合创造等多项技能,对计算机专业人才素质的培养至关重要[1]。

如何培养学生的程序设计和计算思维能力,是我们在教学中思考的一个问题,我们将这一教学理念融入数据结构的教学中,取得了理想的效果。

2数据结构教学面临的困境我们根据实际应用需要,对数据进行有效地组织、存储和处理,并设计出相应的高效率的算法,这是数据结构课程所要研究和解决的问题。

由于数据结构具有抽象性和灵活性等特点,这给教学和学习带来一定的困难[2]。

学生学习起来比较吃力,有学生反映,他们课上听懂了,但是一下来做作业,就会不知道如何下手。

有部分学生感觉对学习数据结构缺乏兴趣,他们不知道数据结构能用在什么地方、到底有没有用。

3培养学生计算思维能力的重要性很多专家、学者、教授针对学生学不好的问题进行了积极的讨论和研究。

大部分人都认为,在如今的社会背景下,应该首先引导学生,培养学生的兴趣,从而培养他们分析问题、解决问题的能力。

随着科学技术的飞速发展,计算机的发展进步也非常迅速,新的知识大约每两年就成长一倍,学生大一所学的新知识,到大三可能就已过时。

那么,我们到底要给学生些什么呢?2010 年最迫切需要的十种工作,在2000年时可能根本还不存在。

因此,我们面临的挑战是要教学生面对目前还不存在的工作,使用现在还没有发明的科技。

不管我们的课程怎么设置,重点是要教会他们进入社会后能够解决没有想过,甚至没发生过的新问题。

在这个概念下,关心到学生真正的需要,如何从“学什么”(内容)转到“如何学”(过程)[3]。

不管环境、知识需求如何变化,有了良好的计算思维品质,就可以以不变应万变。

关键是看有没有这个思维,对这个问题是如何思考,有没有想法,有没有解决问题的办法。

所以,我们必须加强学生计算思维能力的培养。

4算法与计算思维4.1算法算法是解决问题的方法,根据图灵奖得主D.E.Knuth的定义:一个算法就是一个有穷规则的集合,其中规则规定一个解决某一特定类型问题的操作序列。

学生在学习程序设计课程时,将通过算法设计并由计算机语言实现来体验问题求解的思维训练。

算法的操作时序性确保问题求解过程是按步骤进行的,这种执行规则非常简单机械。

所以,教学过程中要使学生经历算法化过程并体验计算思维,它有利于培养学生的理性思维和形式逻辑能力。

培养学生通过计算机编程,最终形成计算思维[4]。

4.2计算思维4.2.1计算思维的概念计算思维一词由Jeannette M. Wing(周以真教授)于2006年提出[5],其定义是:运用计算机科学的基础概念去求解问题、设计系统和理解人类行为。

它包括了涵盖计算机科学之广度的一系列思维活动。

4.2.2计算思维能做什么计算思维是每个人的基本技能,不仅仅属于计算机科学家。

我们应当使每个孩子在培养解析能力时不仅掌握阅读、写作和算术(Reading, wRiting, and aRithmetic——3R),还要学会计算思维。

正如印刷出版促进了3R的普及,计算和计算机也以类似的正反馈促进了计算思维的传播。

当我们必须求解一个特定的问题时,首先会问:解决这个问题有多困难?怎样才是最佳的解决方法?计算机科学根据坚实的理论基础来准确地回答这些问题。

表述问题的难度就是工具的基本能力,必须考虑的因素包括机器的指令系统、资源约束和操作环境。

为了有效地求解一个问题,我们可能要进一步问:一个近似解是否就够了,是否可以利用一下随机化?计算思维就是通过约简、嵌入、转化和仿真等方法,把一个看来困难的问题重新阐释成一个我们知道怎样解决的问题。

计算思维是一种递归思维。

它是并行处理。

它是把代码译成数据又把数据译成代码。

它是由广义量纲分析进行的类型检查。

对于别名或赋予人与物多个名字的做法,它既知道其益处又了解其害处。

对于间接寻址和程序调用的方法,它既知道其威力又了解其代价。

它评价一个程序时,不仅仅根据其准确性和效率,还有美学的考量,而对于系统的设计,还考虑简洁和优雅。

4.3算法与计算思维二者的关系为了让人们对计算思维更易于理解,周教授提出计算思维是一种采用抽象和分解来控制庞杂的任务或进行巨大复杂系统设计的方法,是基于关注分离的方法(So方法);是一种选择合适的方式去陈述一个问题,或对一个问题的相关方面建模使其易于处理的思维方法;是按照预防、保护及通过冗余、容错、纠错的方式,并从最坏情况进行系统恢复的一种思维方法;是利用启发式推理寻求解答,也即在不确定情况下的规划、学习和调度的思维方法;是利用海量数据来加快计算,在时间和空间之间,在处理能力和存储容量之间进行折衷的思维方法。

计算思维最根本的内容,即其本质( Essence)是抽象(Abst raction)和自动化(Automation)[6-7]。

陈杰华老师[4]将算法分为三种形式。

1)生活算法:即完成某一项工作的方法和步骤,例如一天的学习计划、安排或打算;2)数学算法:即对一类计算问题的机械的、统一的求解方法,例如一个二元一次方程组的解;3)计算机算法:即问题求解的精确描述,它具有明显的自动化特征,数据计算准度高并具有严格的操作时序,这是与计算机系统本身紧密相关的,所以用计算机实现问题求解,需要充分利用计算机的速度和存储优势,尽量发挥计算机与计算思维的威力。

学生在面对计算机问题时,可依据已有的知识,提出问题求解方案,并用算法进行描述,最终由机器执行程序来检验问题求解的效果。

5一题多解与计算思维为了培养学生的计算思维能力,训练学生的计算思维。

我们以一个求线性表的逆置的例子来进行讨论。

“对一个线性表L,请编写一个算法将其逆置”。

对该题的训练可以帮助学生复习和巩固所学的线性表的顺序存储结构和链式存储结构,同时为下一章讲述栈结构作准备和铺垫。

5.1顺序存储结构在讲授时,先给出问题的描述,让学生积极思考,怎么解决,写出解决思路。

然后,通过草稿纸和笔将算法步骤详细列在纸上,通过引导逐步让学生在纸上写出其程序,假设线性表的长度为n。

有同学在想,将线性表求逆,那我只要反过来输出就可以了,从最后一个元素开始到第一个元素依次输出即可,于是,采用一个for循环结构即可完成,得到了下面的算法1——reverse(SqList L)。

在主函数中调用该算法,得到了所要的结果。

同学们又想:将一个线性表逆置,即最后一个元素放在第一个元素的位置,倒数第二个元素放在第二个元素的位置……直到第一个元素放到了最后一个元素的位置;采用两个变量i和j进行操作,为此采用一个二重for循环,首先将变量i从1开始,把所有元素往后移动一个位置,腾出第一个位置,然后将最后的第n+1个元素(下标为n)放入第一元素的位置即可。

然后将变量i从2开始,将第二个元素到第n个元素依次后移一个位置,腾出第二个元素的位置,把最后的第n+1个元素(下标为n)放入第二元素的位置即可,此时即变量i从0变到n-1;依次类推直到腾出第n个元素的位置,将第一个元素放入即可。

最后得出算法2——reverse1 (SqList L)。

但在主函数调用该算法,再遍历输出,结果没有变,没有得到理想的结果。

是算法有错吗?通过检查算法没有错误,再逐步引导学生检查,如果算法没有错误,那么问题会出现在哪里呢,通过引导,发现问题出在书写函数时,函数的形参上,形参中的参数L,没有使用指针。

因为,该算法涉及到数据的移动,要改变下标的值,因此参数L应该设计为一个指针。

为了作对比,我们将该算法另存为reverse2,见算法3。

并把形参中的L定义为指针,在主函数中调用,遍历后得到了满意的结果。

还有没有什么算法?继续引导同学们思考,将自己的想法在草稿纸上写下来,稍后,我们在讲解中,自己进行检验、核对,看自己的思路和解法与老师讲的有什么不同。

同学们会想:将一个线性表逆置,即最后一个元素放在第一个元素的位置,第一个元素放在最后一个元素的位置,相当于将最后一个元素和第一个元素交换;第二个元素与倒数第二个元素交换;;可以设置两个变量,一个变量从第一个元素开始,往后移动,另一个变量从最后一个元素往前移动,直到j-i=0;i--){printf(“%d\t”,L.items[i]);}return 1;}算法1int reverse1(SqList L)//形式参数未定义为指针,线性表不变化{int i,j,n;n=L.length;for(i=0;i=i;j--)L.items[j+1]=L.items[j];L.items[i]=L.items[n];}return 1;}算法2int reverse2(SqList *L) //形式参数定义为指针,线性表才体现其思想{int i,j,n;n=L->length;for(i=0;i=i;j--)L->items[j+1]=L->items[j];L->items[i]=L->items[n];}return 1;}算法3int reverse3(SqList *L){int i,j,n,tmp;n=L->length;i=0;j=n-1;while(1){tmp=L->items[i];L->items[i]=L->items[j];L->items[j]=tmp;if(j-iitems[i]);printf(“\n”);return 1;}算法45.2链式存储结构由于链式存储结构比顺序存储结构复杂,为便于理解,先给出一个图示,如图1所示。

相关主题