算法程序

2024-07-24

算法程序(精选十篇)

算法程序 篇1

一、明确教学目标

新课标指出:“算法部分旨在使学生进一步体验算法思想,了解算法在解决问题过程中的地位和作用,并能从简单问题出发,设计解决问题的算法。”递归算法的教学目标是学会用递归算法的思想分析问题。为了实现该目标,很多教师从递归函数代码的理解出发带领学生学习递归算法,而代码的反复调用很容易给学生理解造成困难。笔者认为指导学生利用递归思想来分析问题是最重要的,理解了递归思想以后,代码的编写就变得相对容易了。

二、学生知识准备

所有的知识都不是空中楼阁,必须有一定的前期知识准备。学生开始学习递归算法前应该已经熟练掌握了顺序结构、分支结构、循环结构,对程序设计语言有了一定的了解,能解决一些有一定难度的程序,有一定的分析问题的能力。而且,学生应该已经掌握了自定义函数,包括函数名、函数参数、函数参数之间的传递等知识。

三、理解递归过程

兴趣是最好的老师,越难理解的知识点越需要抓住学生的兴趣点。对于递归算法的学习,我们可以先让学生玩“汉诺塔”游戏。让他们把塔盘从少到多慢慢增加,一边玩一边总结游戏攻略。通过老师的引导及动画课件,学生应该可以总结出“N个塔盘从A移动到C”的问题可以转换成三个小问题:1.把N-1个塔盘从A移动到B;2.把第N个塔盘从A移动到C;3.把N-1个塔盘从B移动到C。教师只要适时地加以总结:“要想解决复杂问题,可以先把复杂问题转化成简单问题,把问题化解到最小,简单问题解决了,那复杂问题也随之解决。”并给出递归算法的概念:“直接或间接调用本身的算法”,以及递归算法的核心思想:递归分为两个部分,一是递推:大事化小;二是回归:由小及大。当然,教师也可以用“从前有座山”这个大家耳熟能详的故事加以补充说明。

四、把握分析思路

在学生初步了解递归思想后,教师不应急着进入代码的讲解,可以引导学生用递归思想来分析问题,从简单到复杂,从具体到一般。可以从分析求5!开始,分析并总结出求N!的方法。在讲解的过程中,教师可以借助黑板来板书分析思路。(如图)

当分析完5!的求解过程以后,教师可以让学生分析讨论出数学模型,其中包括:递归公式和边界条件

这是一个典型的双分支选择结构语句,可以用IF语句来实现。

五、结合分析完成代码

在学生分析透彻以后,可以让学生试着根据以往的函数知识完成代码的编写。这时可以利用“半成品”的形式,主要是让学生填写递归函数的主体(判断语句)。然后,教师结合代码再次说出递归的过程,学生的印象就很深刻了。这里学生可能会在两个地方出错:1.写成fac (n)=fac (n-1)*n,解释:函数的调用只能在表达式中,而等号是赋值语句,左边只能是变量而不能是表达式。2.函数数据类型和接受返回值的变量数据类型不符,解释:赋值语句等号左右两边数据类型必须相同。

六、适时巩固知识

N!数学模型讨论出以后,学生和教师一起经历了问题分析的过程。这时教师可以适当小结递归概念、递归核心思想、递归边界条件,来帮助学生巩固所学知识。

然后,学生可以用斐波那契数列来进行练习。之所以用斐波那契数列来练习,是因为这个数列学生能很快找到规律,但又因为有两处调用,有一定的难度提高。

当然还是采用从具体到一般的方法,先在学案上分析第5项的数的求法,同时请两位学生到黑板上来分析。再根据分析讨论出递归公式和边界条件(右图为笔者上课时学生书写的学案)。对这道题目的板书分析,以后在总结递归的缺点(重复调用)时也是可以利用的。

七、适当提高应用

在信息技术学科中,学生的能力存在较大差异。而递归算法又在理解上有一定的难度,自然学生达到学习目标的情况也会有所差异。英国现代教育学家沛·西能在《教育原理》中说:“一切教育努力的根本目的应该是帮助学生尽可能达到最高的个人发展。”所以,分层教学在信息技术中会经常运用到。本课内容可以采用难度稍高一点的递归题目作为提高题。笔者在教学的时候采用的是小球自由落体作为分层教学中的提高部分,同时采用小组讨论的形式完成该题的分析。有些教师会让学生编写“汉诺塔”程序,笔者觉得难度太大,会把学生难住,造成学生产生排斥心理。

总之,递归法的教学重点必须落在“算法”上而不是“代码”上。只要学生会用递归算法分析问题,那递归算法的代码就很容易写出来。而只有当学生会用算法的思想分析问题,他们才能真正地体验到算法的魅力,进而爱上《算法与程序设计》这门课。

参考文献

[1]算法与程序设计.教育科学出版社.

模糊控制算法c程序 篇2

#include

#include

#define PMAX 100

#define PMIN -100

#define DMAX 100

#define DMIN -100

#define FMAX 100 /*语言值的`满幅值*/

int PFF[4]={0,12,24,48};

/*输入量D语言值特征点*/

int DFF[4]={0,16,32,64};

/*输出量U语言值特征点*/

int UFF[7]={0,15,30,45,60,75,90};

/*采用了调整因子的规则表,大误差时偏重误差,小误差时偏重误差变化*/ /*a0=0.3,a1=0.55,a2=0.74,a3=0.89 */

int rule[7][7]={

//误差变化率 -3,-2,-1, 0, 1, 2, 3 // 误差

{-6,-6,-6,-5,-5,-5,-4,}, // -3

{-5,-4,-4,-3,-2,-2,-1,}, // -2

{-4,-3,-2,-1, 0, 1, 2,}, // -1

{-4,-3,-1, 0, 1, 3, 4,}, // 0

{-2,-1, 0, 1, 2, 3, 4,}, // 1

{ 1, 2, 2, 3, 4, 4, 5,}, // 2

{ 4, 5, 5, 5, 6, 6, 6}}; // 3

/**********************************************************/ int Fuzzy(int P,int D) /*模糊运算引擎*/

{

int U; /*偏差,偏差微分以及输出值的精确量*/

unsigned int PF[2],DF[2],UF[4]; /*偏差,偏差微分以及输出值的隶属度*/

int Pn,Dn,Un[4];

long temp1,temp2;

/*隶属度的确定*/

/*根据PD的指定语言值获得有效隶属度*/

if(P>-PFF[3] && P

{

if(P

{

Pn=-2;

PF[0]=FMAX*((float)(-PFF[2]-P)/(PFF[3]-PFF[2])); }

else if(P

{

Pn=-1;

PF[0]=FMAX*((float)(-PFF[1]-P)/(PFF[2]-PFF[1])); }

else if(P

{

Pn=0;

PF[0]=FMAX*((float)(-PFF[0]-P)/(PFF[1]-PFF[0])); }

else if(P

{

Pn=1; PF[0]=FMAX*((float)(PFF[1]-P)/(PFF[1]-PFF[0])); }

else if(P

{

Pn=2; PF[0]=FMAX*((float)(PFF[2]-P)/(PFF[2]-PFF[1])); }

else if(P

{

Pn=3; PF[0]=FMAX*((float)(PFF[3]-P)/(PFF[3]-PFF[2])); }

}

else if(P

{

Pn=-2; PF[0]=FMAX;

}

else if(P>=PFF[3])

{

Pn=3; PF[0]=0;

}

PF[1]=FMAX-PF[0];

if(D>-DFF[3] && D

{

if(D

{

Dn=-2;DF[0]=FMAX*((float)(-DFF[2]-D)/(DFF[3]-DFF[2])); }

else if(D

{

Dn=-1;

DF[0]=FMAX*((float)(-DFF[1]-D)/(DFF[2]-DFF[1])); }

else if(D

{

Dn=0;

DF[0]=FMAX*((float)(-DFF[0]-D)/(DFF[1]-DFF[0])); }

else if(D

{

Dn=1;

DF[0]=FMAX*((float)(DFF[1]-D)/(DFF[1]-DFF[0])); }

else if(D

{

Dn=2; DF[0]=FMAX*((float)(DFF[2]-D)/(DFF[2]-DFF[1])); }

else if(D

{

Dn=3; DF[0]=FMAX*((float)(DFF[3]-D)/(DFF[3]-DFF[2])); }

}

else if(D

{

Dn=-2;

DF[0]=FMAX;

}

else if(D>=DFF[3])

{

Dn=3;

DF[0]=0;

}

DF[1]=FMAX-DF[0];

/*使用误差范围优化后的规则表rule[7][7]*/

/*输出值使用13个隶属函数,中心值由UFF[7]指定*/ /*一般都是四个规则有效*/

Un[0]=rule[Pn-1+3][Dn-1+3];

Un[1]=rule[Pn+3][Dn-1+3];

Un[2]=rule[Pn-1+3][Dn+3];

Un[3]=rule[Pn+3][Dn+3];

if(PF[0]

UF[0]=PF[0];

else

UF[0]=DF[0];

if(PF[1]

UF[1]=PF[1];

else

UF[1]=DF[0];

if(PF[0]

UF[2]=PF[0];

else

UF[2]=DF[1];

if(PF[1]

UF[3]=PF[1];

else

UF[3]=DF[1];

/*同隶属函数输出语言值求大*/

if(Un[0]==Un[1])

{

if(UF[0]>UF[1])

UF[1]=0;

else

UF[0]=0;

}

if(Un[0]==Un[2])

{

if(UF[0]>UF[2])

UF[2]=0;

else

UF[0]=0;

}

if(Un[0]==Un[3])

{

if(UF[0]>UF[3])

UF[3]=0;

else

UF[0]=0;

}

if(Un[1]==Un[2])

{

if(UF[1]>UF[2])

UF[2]=0;

else

UF[1]=0;

}

if(Un[1]==Un[3])

{

if(UF[1]>UF[3])

UF[3]=0;

else

UF[1]=0;

}

if(Un[2]==Un[3])

{

if(UF[2]>UF[3])

UF[3]=0;

else

UF[2]=0;

}

/*重心法反模糊*/

/*Un[]原值为输出隶属函数标号,转换为隶属函数值*/ if(Un[0]>=0)

Un[0]=UFF[Un[0]];

else

Un[0]=-UFF[-Un[0]];

if(Un[1]>=0)

Un[1]=UFF[Un[1]];

else

Un[1]=-UFF[-Un[1]];

if(Un[2]>=0)

Un[2]=UFF[Un[2]];

else

Un[2]=-UFF[-Un[2]];

if(Un[3]>=0)

Un[3]=UFF[Un[3]];

else

Un[3]=-UFF[-Un[3]];

temp1=UF[0]*Un[0]+UF[1]*Un[1]+UF[2]*Un[2]+UF[3]*Un[3]; temp2=UF[0]+UF[1]+UF[2]+UF[3];

U=temp1/temp2;

return U;

}

void main

{

int a=0,e,ec;

/*int nowpoint,p1,p2=1;

FILE *in,*out;

in=fopen(

out=fopen(

while(1)

{

//fscanf(in,

//e=0-nowpoint;

//ec= p1-p2;

printf(

scanf(

printf(

scanf(

a=Fuzzy(e,ec);

//fprintf(out,

//printf(

printf(

//p2=p1;

}

//fclose(in);

//fclose(out);

算法与程序的常见错误 篇3

例1 画出求[S=1+22+32+…+102]的程序框图.

错解

正解 若将判断框左上方箭头上移就正确了(图中标注①).

错因分析 这样的结果是,由于没有了判断框,故程序执行时没有终止,即程序框将[S=1+22+32+…]一直进行下去,循环始终运行,程序为死循环.

二、程序框图中变量的初始值出现错误

例2 设计流程图求1+2+…+100的值.

错解

正解 为了不遗漏数“2”,通常需要改变始端赋值的数据或调整操作程序及末端输出条件而得正解.

解法1:将第二步“[i=2]”改为“[i=1]”而其他数据都不变.

解法2:将第三步与第四步互换,即先执行“[S=][S+i]”使“[S=1+2]”再执行“[i=i+1]”往下循环. 特别要注意此时判断框“[i<100?]”同时要改为“[i<101?]”,因为上一步的[i]到达100.

错因分析 这里先执行“[i=i+1]”使“[i=2]”变为“[i=3]”,再执行“[S=S+i]”使得一开始就是“[S=1+3]”,跳过了数2,最后求得的和实际为“[S=1+3+4+…+100]”的值.这就是循环结构出现变量的初始值出现错误.

三、程序框图中变量的输出出现错误

例3 设计求满足条件1+3+5+7+…+ >10000的最小整数的一个算法.

错因分析 因为要先检验条件“[S≤10000]”是否成立,如果成立,则重复循环体中的语句“[S=S+i],[i=i+2]”,只有当条件“[S≤10000]”不成立时,才结束循环.那么上述算法语句中的最后一次循环:“[S]的值大于10000,[i]的值仍然要增加2”,这样输出的[i]值会比所求的值大2.

四、程序框图中的控制条件出现错误

例4 设计流程图求[1×2×3×4×…×30]的值.

错因分析 判断框中应是“[i>29?]”,而不是“[i>30?]”,当“[i>30?]”时,输出[P]为“1×2×3×…×31”的值.

五、数学运算符与计算机运算符混淆

例5 某居民区的物业部门每月向居民收取卫生费,计费方法是:3人和3人以下的住户,每户收取5元;超过3人的住户,每超出1人加收1.2元.设计一个程序,根据输入的人数,计算应取的卫生费.

错解 设人数为[x],收费为[y]元,则[y=][5,03. ]

程序如下:

[INPUT “x=”;x

IF 0

y=5

END IF

IF x>3 THEN

y=5+1.2(x-3)

END IF

PRINT y

END]

正解

[INPUT “x=”;x

IF x>0 AND x<=3 THEN

y=5

END IF

IF x>3 THEN

y=5+1.2*(x-3)

END IF

PRINT y

END]

错因分析 计算机是无法识别“0

六、语法规则错误

例6 编写一个程序,对于函数[y=-x+1(x<0),0(x=0),x+1(x>0),]输入[x]的值,输出相应的函数的值.

错解

[INPUT x

IF x<0 THEN

y=-x+1

ELSE

IF x=0 THEN

y=0

ELSE

y=x+1

END IF

PRINT y

END]

[IF 条件 THEN

语句体

END IF]

(图一)

[IF 条件 THEN

语句体1

ELSE

语句体2

END IF]

正解 所以应在“PRINT y”前加一个“END IF”.

算法程序 篇4

中国科学院博士生导师、江西师范大学薛锦云教授提出了一种统一和系统的算法程序设计和证明方法PAR方法[1]———分划递推法(partition-and-recur)。这种方法可取代目前普遍使用的分治法、动态规划法、贪心算法等算法设计方法,是一种简单、统一的算法设计方法,适用于一般算法程序的开发。

使用PAR方法开发的Apla(Abstract Program Language)程序是一种抽象算法程序,它的正确性是可以得到保证的但是却无法直接运行。基于以上研究,我们希望设计一个程序自动转换系统,该系统能够将用PAR方法开发Apla语言描述的抽象程序转化成可执行程序例如用VB.NET描述的可执行程序。由于Apla是一种抽象程序设计语言,它具有简单易学、抽象程度高、易于描述程序的算法等特点,因而可以免去开发人员学习各种不同程序设计语言的困难,把他们从繁琐的代码编制工作中解放出来,将注意力集中在算法上而不是程序设计语言的细节问题上,从而能够极大的提高软件开发的效率。而VB.NET是目前比较流行的开发工具,若能够将Apla程序转化为VB.NET上直接运行的程序,则该自动程序转化系统就能应用到军事、科研、教学、商业、生产等各个领域,效提高软件开发的效率和软件的可靠性。

1 抽象算法程序———Apla程序

使用PAR方法开发的Apla程序是一种抽象算法程序,它的开发过程遵循严格的开发步骤,其中的每一步都经过严格的数学推导,因而Apla程序程序的正确性是可以得到保证的。下面我们给出一个Apla程序的具体实例:

例:数组元素的立方问题

该问题的Apla程序如下:

这就是一个具体的Apla程序,它的抽象级别是比较高的。

2 Apla程序到VB.NET程序的转换

前面介绍的Apla程序是抽象级别较高的算法程序,无法在计算机上直接运行,我们可以将其转换为VB.NET可执行程序,这里涉及到程序转换。

程序转换是指由一个程序转换到另一个满足其功能要求的程序。从软件自动化角度来看,程序转换分两类:一类为纵向转换,即由一抽象级别较高的程序转为另一满足其功能要求的抽象级别较低程序;另一类为横向转换,即在相同抽象级别上程序间的转换。从Apla程序到VB.NET程序的转换即是属于这一类型的转换。

程序转换包括很多方面,具体有程序编译、程序优化、语句重构、程序合成、软件重构和逆向工程。在这些诸多应用中,其中最重要的两个元素就是源程序和目标程序,在整个转换过程中,要特别注意语法树和转换规则的使用。

为了实现程序转换我们设计开发了Apla-VB.NET程序转换系统[2]。

Apla-VB.NET程序转换系统的功能是把Apla抽象算法程序转换为VB.NET程序,它根据Apla到VB.NET的转化规则来翻译文法,采用软件自动转化理论中的过程实现方式来完成转换。在转换过程中用到的基本技术主要有:词法分析、语法分析、简体语义分析、出错处理、代码生成、代码优化。

该转换系统的总体结构如图1所示。

系统包含的主要部分有:

1)词法分析器:从左到右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符的源程序改造成单词符号串的中间程序。

2)语法分析器:将从词法分析中得到的中间程序,按照语法图建立相应的语法树,对语法树进行递归处理,调用语义分析器。

3)规则库:是一组语义处理程序。规则主要定义了语言的变换规则,以及一定程度的类型匹配检查。在这里,规则以程序的形式表示。

使用该系统我们可以将前面介绍的Apla程序(数组元素的立方问题)转换为相应的VB.NET程序,转换结果如下:

这就是用我们最终得到的VB.NET可执行程序

3 结束语

综上所述,我们实现了从抽象算法程序———Apla程序到可执行程序———VB.NET程序的转换。因为Apla程序的正确性是可以保证的,从而由它转换得到的VB.NET可执行程序的正确性也得到了保证,这样就可以大幅度提高算法程序的效率和可靠性进而提高整个软件的可靠性和开发效率。

摘要:算法程序是用抽象程序设计语言或可执行的程序设计语言描述的算法。开发正确而有效的算法程序一直是计算机界的核心问题。分划—递推法(PAR方法)是一种统一的算法程序开发方法,采用这种方法开发的算法程序Apla程序是一种抽象算法程序,它的每一步都经过严格的数学推导,因而可以保证算法的正确性,采用程序转换技术将抽象算法程序转换为各种执行程序,可以大幅度提高算法程序的效率和可靠性。

关键词:算法程序,抽象程序设计语言,程序转换

参考文献

[1]薛锦云.算法程序形式化开发研究[J].云南大学学报,1997(19):283-288.

算法与程序设计的教案 篇5

一、学情分析

通过上学期《算法与编程》部分的学习,学生初步了解算法及其表示、比较熟悉流程图设计;

本学期课程为《算法与程序设计》,对算法的理解更加深入,要求能通过visual basic实现简单算法;

在本课之前,学生应了解了流程图的应用,熟悉在一组数中求极值算法,对于排序及冒泡排序,学生比较熟练。

对于本部分,学生可能会对选择排序算法的原理理解较为困难,需要教师的引导学习。学生应当在学习过程中认真听取教师对于算法的分析,在教师指导下能解释该算法的流程图,进而实现程序。

二、教学目标

知识性目标:

了解排序的概念、能在现实生活中列举出关于排序的实例

能对照冒泡排序,解释选择排序的优势,指出选择排序的策略,找出数字之间的逻辑联系

有迁移应用能力,能由此及彼,归纳排序中的数字规律,探索更有效率的排序算法

技能性目标:

具有模仿水平,在教师指导下可以表达出选择排序的思想,能对流程图作出解释

能独立完成流程图的绘制,对选择排序的各个环节比较熟练,并能在visual basic环境中规范地编写程序

情感、态度、价值观目标:

学生在学习过程中,通过亲身经历体验选择排序的实现过程,获得对此算法的感性认识

利用信息技术手段,开展交流合作,把自己对此算法的心得与他人交流,培养良好的信息素养,提升热爱科学的理念

三、重点难点

重点:对选择排序原理的理解,绘制流程图,数据交换,调试程序

难点:分析流程图

四、教学策略与手段

把握重点,先导入问题,复习排序定义,分析冒泡中数据交换次数多的问题,指出冒泡排序法效率不高,从而引出数据交换次数较少的选择排序算法

在教学过程中,可通过flash演示材料,比较直观地把抽象的问题简单化,由“流程图雏形绘制”-“逐步完善流程图”-“程序实现”-“调试”的过程,让学生熟练此算法与程序实现。

在教学中可灵活运用小组合作、分组讨论、小组间竞赛等手段进行教学,通过发散性思维的培养,增强学生对知识的探索能力。

五、课前准备

1.学生的学习准备:对流程图的绘制方法、vb语法作巩固,对选择排序算法作预习;学生分组:4人一组

2.教师的.教学准备:准备充分的演示材料、相关数据、相关软件安装。

3.教学环境的设计与布置:计算机教室

六、教学过程

简要点拨排序的概念。

演示已经学习过的冒泡排序flash动画。

[小组讨论]在冒泡排序算法中,我们知道冒泡排序是依次把数组中相邻两个数据进行比较,通过交换数据,把较小的数据逐次向上移动的算法。由于数据的移动是逐次进行的,数据交换的次数相当多。大家想想它的实质既然是将一堆数据中的最小数据移动到某个位置,有没有必要让这个数字逐个移动?比如,对于数组:4、8、3、9、6、5、11、10、2、9,如果要用冒泡法实现排序,第一遍冒泡其实是把这组数据中最小数“2”移动到最前边,第二遍冒泡把“3”逐次移到第二个位置,其它类推。它们的过程是逐次向前的,这样做很多无谓的交换。为了达到移动2到最前边的目的我们可以怎么简化这个过程?

[学生]直接把2最前面的数4交换,再把3与第二个位置的数8交换,其它类推

算法与程序设计教学探究 篇6

关键词:算法;程序设计;学习兴趣

一、教学中存在的客观问题

1.学生对该模块的畏难心理

算法和程序设计本身是选修模块,在掌握程度上没有压力,学生学习动力差,再加上程序设计本身比较抽象、枯燥和逻辑思维性强,学生普遍认为程序设计比较高深,对于学生而言,这部分学习内容的理论性和知识性都比较强,并且在编写程序的过程中,需要不断调试、修改程序,而且比起学习一些应用软件而能制作出各种各样有声有色的作品,显得枯燥乏味,所以学生对程序设计的学习存在畏难心理。这也是在在教学中一直存在“难教”和“难学”的原因,这就对教学的顺利进行产生了一定的困难。

2.内容多、课时少,教学目标不能很好地完成

算法与程序设计模块中包括两大块内容,一是算法部分,一是VB程序设计基础部分,基本上涵盖了程序设计中用到的所有知识,有大量的概念、数据、语句以及其他的过程和函数,这些理论知识学生都必须掌握并能在VB中熟练应用,因此教师需要详细地讲解,并让学生做大量的练习。但信息技术课程每周两节课,要学生全面理解算法并学会编程,教学难度可想而知。

3.学生差异问题

首先,高中生的起点水平参差不齐。很多学生在升入高中前,并未接触过算法与程序设计的相关知识。每班大约有超过百分之九十的学生在高中以前未曾接触过程序设计这方面的内容,因此,学生学习程序设计语言的基础较差。其次,编写程序还涉及本身的理科基础,特别是数学思维能力,每个学生的思维能力、理解能力是因人而异的。像实验班与普通班、文科班与理科班,他们的接受能力就不同,而同一个班级的学生,他们中有的思维敏捷能很快接受新的知识,有的却还需要反复讲解才能接受。现在我们教学要面向全体学生,让全体学生都接受一些困难。

二、教学中的实践尝试

面对上述问题与困惑,如何在有限时间内合理运用教材采取恰当的教学方法激发学生的学习兴趣也就是如何提高算法与程序设计课堂教学的有效性,我们不妨从以下几个方面去解决。

1.创设情境激发学生兴趣,提高学生学习信心

程序设计教学要从学生的兴趣入手,利用学生对事物的好奇心,选择学生身边的、有实际意义的程序,激发学生的学习兴趣。比如,第一堂课讲VB界面设计,可设计一个QQ登录界面,让学生将抽象的概念形象化,将自认为高深的知识与身边常用的小工具结合起来,打破学生对本模块知识的畏难心理。

2.深入浅出,消除学生对程序设计的畏难心理

在教学时,低起点,从一个个简单实例出发,让学生从自身的实践中感受到这个知识点的确很简单,从而让学生认为能够自己动手设计小程序,从中体会成功的喜悦。前两节课千万不能罗列过多的概念,让学生摸不着头绪,误认所学内容很难,打击学生的学习兴趣。不要把控件的每一个属性都细讲。需按问题需要设计界面来选用控件,以一个个鲜活的具体实例为切入点,在每个例子中适时、适量地渗透一些相关的概念和知识,使学生在完成任务的过程中,逐渐地、很自然地去体会控件、对象、事件的概念。由浅入深地逐渐介绍,让学生在编写程序的过程中总结控件的用法。

3.与其他学科相结合,加深学生对知识点的理解,提高教学效果

数学中很多问题都可以用程序设计的思维方法来解决。因此信息技术教师可以从学生在数学课上已经熟悉的知识点入手,在教学中多举一些这方面的事例,不仅可以提高学生的学习兴趣,而且还能提高学生研究问题、解决问题的能力。

例如对典型的求和问题:

S=1+2+3+……+100

S=0

for i=1 to 100

S=s+i

next i

可以引导学生尝试以下问题:

(1)如求S=100+99+……+1,应修改哪个语句?

(2)如求S=1*2*3*…*10,需要修改哪些地方?

(3)如求S=1+■+■……+■应做哪些变更?

通过以上一系列角度不同的变通,学生对每一个语句的认识加深了,对语句中确定每一个变量更加谨慎了。

4.分层次教学

现在各个学校的班级设置都有文科班和理科班、实验班,教学内容在难度上要有所变化。一个班级布置作业时要根据学生的能力分层次,设置难易不同的教学内容,这就要求教师在研究学生和教学内容上下功夫,备好课,更要“备”好学生,使学生都能够掌握所学知识的要点,在学习中都能找到乐趣。

三、切实落实以学生为中心和主体,以教师为主导的新课改思想

信息课教师绝大部分为青年教师,无论在教学理论还是教学经验上,都相当缺乏。特别是在教授程序设计内容时,不自觉地还是走向了以教师为主的教学模式。在课堂教学中,要鼓励学生质疑是激发学生的主体性、培养学生思维能力和创造能力的起点。因此,在教学过程中特别要注意设置恰当的问题,通过启发引导,体现教师的主导作用。集中学生的注意力,促进学生主动思考、主动探索,可以使学生在学习的过程中成为主体。

算法程序 篇7

一、创设情境, 激发学生的学习主动性

在教学中, 利用趣味图片引出递归, 让学生通过日常生活事例了解递归的含义和条件。

算法与程序设计 (VB) 的教学显得枯燥。如何激发学生的学习兴趣, 培养学生学习的主动性非常重要。心理学研究表明:“兴趣是学生最好的老师。”兴趣能使学生在愉悦的气氛中学习, 唤起学生强烈的求知欲望, 是教学成功的关键。在上课前, 教师给出下列图片, 这些图片有效地吸引了学生的注意力, 每一位同学在观察图片过程中都有自己的想法, 学生有一个直观的感受。

下下面面的的活活动动着着重重让让学学生生初初步步形形成成、建建立立递递归归算算法法的的概概念, 当学生发现在日常的生活学习中能找到递归算法的现实例子, 就降低学生学习递归算法的畏难情绪, 提高了学习兴趣。

例如, 排队报数。让一排数量不清学生排队, 教师要求学生通过报数得到学生的总数。一是正常报数, 从1报到最后一个, 最后得到学生总数。二是逆序报数, 前面的学生都询问其后面一个学生的号数, 逆序依次询问, 当问到最后一个学生时, 最后的学生报数为1, 其他学生加上1后依次回报, 最后开始的学生所报的数就是总数。这个例子形象具体地表现了递推和递归两过程, 学生极易接受。

二、解决递归问题的经典题型, 多样化分析递归过程

例:一只猴子摘了一堆桃子, 它每天吃掉当天剩余桃子数的一半, 每次又忍不住多吃一个, 这样到了第十天就剩下一个桃子了。问小猴子第一天共摘下了多少个桃子?

师:以小组为单位, 讨论此题应该如何解决?

学生口述此题的解决方法。

建立数学模型:

师:假设第n天 (n<10) 的桃子数为Tz (n) , 那么当n<10时, 就有Tz (n) =?

生: (Tz (n+1) +1) *2

师:此题的出口是什么?

生:第10天的桃子数是1个。

幻灯片出示自定义函数Tz的代码:

Function Tz (By Val n As Integer) As Integer

If n=10 Then

Tz=1

Else

Tz= (Tz (n+1) +1) *2

End If

End Function

【阶乘】VB中一个最常用的计算例子。如用递归函数实现计算N阶乘的求解。

建立数学模型:

师:假设N的阶乘为S (n) , 那么S (n) =?

生:S (n-1) *n。

师:此题的出口是什么?

生:1的阶乘是1。

学生尝试在上一题的基础上进行编程。

代码如下:

从上述分析中, 可以认为, 看问题能否用递归算法, 先不要考虑具体的执行过程, 只要满足上述构成递归的条件即可。在VB程序设计中使用递归时还应注意, 在定义递归函数或递归过程时, 一般先使用If语句进行递归测试, 找到递归结束的条件, 然后再进行递归调用。

讲课时以游戏的方式引入, 让学生初步明白“递归算法”。通过“猴子吃桃”问题, 运用游戏的思维引导学生掌握“递归算法”的解题过程, 再通过N!这个简单的数学问题, 使学生掌握了用“递归算法”解决此类题的方法。

学生在面对递归问题时, 很多时候是从心理上惧怕它。实际上, 关于递归的问题, 普通高中的信息技术课程中要求并不太高, 教师在讲解递归算法时切不可用太深奥的问题来引入, 这样会适得其反。运用递归算法解决问题时, 如果由浅入深来解决的话, 学生一般还是能够理解掌握的。

参考文献

[1]李艺.信息技术课程与教学[M].北京:高等教育出版社, 2006 (6) .

算法程序 篇8

一、当前的困惑

针对“算法与程序设计”模块教学现状, 笔者通过问卷调查、座谈等多种方式了解该模块开设率偏低的原因。同时查阅专业数据库, 综合全国其他教师的观点, 归纳出了当前开展“算法”模块教学存在的主要困难。

从学生角度来看, 开展“算法”模块教学主要有以下困难:1) 学习心理上有障碍, 学习内容实用性不强。教材上的案例多为数学问题, 一类为一眼就能看出答案的问题, 对这类例题学生产生的疑问是:“这么简单的问题为什么要这么麻烦, 要计算机来解决。”另一类是数学课上怎么都弄不明白的问题, 信息技术教师又在不停地重复着这些难题。2) 理论课枯燥, 没有联系实际生活, 趣味性不强, 难于激发学习兴趣。3) 没时间做作业, 头脑中的知识衔接出现断点[2]。

从教师角度来看, 开展“算法”模块教学的困难主要体现在以下几点:1) 难以激发学生学习程序设计的兴趣。教师大多采用传统的先讲后演示、学生先听后编程的教学方式。学生在听或者看的过程中往往注意力难以集中, 到实践编程时自然就无从下手。2) 基础知识与理论内容多, 不讲学生不明白, 讲多了学生没有耐心听。3) 课时少, 内容多, 课时安排时间间隔长, 遗忘率高。模块中包括大量的数据、语句、过程以及函数等基础知识, 需要教师详细地讲解, 学生在课堂上通过大量地训练才能熟练应用。讲解一个完整的算法往往需要一两节课时间, 而要让绝大多数的学生真正能自主编写, 甚至需要投入更多的时间, 要学生全面理解算法并学会编程难度偏大。

二、课程的核心价值

信息技术课程的发展经历了程序设计文化论、工具论、信息素养论等几个不同的阶段。社会发展与需求的变化推动信息技术日新月异地发展。作为信息技术学科的一线教师, 笔者也时常在想:“‘算法与程序设计’模块作为信息技术课程的一部分, 教学目标是什么?它的核心价值在哪里?究竟培养学生什么能力?能否挖掘一些该模块特有的东西?”

笔者结合多年的教学实践, 将本模块的教学目标定位于:打造程序设计文化, 培养计算思维以及算法思维。一线教师应站在更高的角度去审视课程, 不仅要教会学生编程及其他技巧, 还要通过编程将计算思维、算法思维等渗透于教学中, 充实和完善信息技术学科的价值。

信息技术, 尤其是程序设计, 在人类文化中占有一席之地。首先, 人类生存要运用工具, 特别是要运用工具来解决问题。计算机是大脑的延伸, 如何让人和计算机进行沟通, 就产生了计算机语言。而如何把人类的语言告诉计算机, 就产了程序设计语言, 也就是人们所说的程序设计文化。从最原始的计算的能力到人的自然思考方式, 再到机器语言、汇编语言、高级语言的出现, 以至现在的让计算机理解人们思想的自然语言, 程序设计语言的每一次发展都对人类产生了重大的影响。其次, 在工作生活与学习中, 很多时候解决问题需要有一种计算思维。比如有一首诗的内容为“白日依山尽, 黄河入海流。欲穷千里目, 更上一层楼”, 如果用计算思维的观点来看, 其实就是在六千多个汉字中选取20个汉字进行排列。六千多个汉字如果让计算机来排的话, 有很多种可能, 有些排列可能人类穷极一生都无法想到。但是诗人很容易地找出了20个汉字, 并且排列开来, 这就是诗人的一种灵性和智慧, 这是计算机所不具备的。这种情况下如何促进人与计算机的交流呢?这就需要人具备计算思维来告诉计算机该怎么做。最后, 人具备计算思维, 而如何用计算机的语言把它呈现出来, 就需要算法思想的指导。这种算法思想就是人的思维和计算机沟通的一种途径与方法。

三、教学策略及方法

1.深度挖掘课程思想

传统意义上对程序设计的理解是:用计算机编写程序解决问题, 经历分析问题、设计算法、编写程序、调试运行与检验结果等过程。在这种观念里, “程序”是低于“算法”的存在, 是具象的, 是由给定语言环境中的若干条代码组成的代码群。而“算法”则是高于“程序”的, 是相对抽象的。“算法”超越了具体语言, 是程序设计的灵魂, 因而更加贴近程序设计的本质。

但是, 学生对“算法”概念感觉生涩, 对“算法”的认知依然有许多困难。因为“算法”概念并不是最贴近学生生活经验的东西, 学生从生活经验中提取“算法”并将其迁移到真正的“算法”概念上来, 需要经历一个艰难的过程。显然, 基于“算法”概念走进程序设计, 不能算得上是一条令人满意的途径。

程序设计的本质是什么?程序设计无非是使用一组预设功能的指令集去完成特定的任务, 所谓的“一组预设功能的指令集”, 就是一套为了实现特定功能的人机对话, 而给出的一套人工语言。在“人机对话”这个意义上, “指令-程序-任务执行”更能彰显程序设计的本质, “算法”无非是建立在“指令-程序-任务执行”基础上并服务于具体任务的方法而已。需要注意的是, 这里的所谓“程序”已非前述“程序”, 前“程序”指的是一组代码, 此“程序”指的是解决问题的过程[3]。

或许教师要换一种思路开展程序设计的教学。在程序设计学习之初, 教师可以为学生提供一个需要解决的生活中的具体任务, 让学生分析解决该问题需要几步, 设计出解决问题的过程, 得到这个“程序”, 而后再引导学生提取其中的指令, 得到一组“指令集”。例如, 设计一个“抽签器”程序。教师提出问题之后, 首先分析设计程序界面, 有哪些对象, 需要哪些控件, 每个控件的功能是什么, 如何实现这些功能, 最终应用相应的代码来实现功能, 形成“指令集”, 整个过程完全没有涉及“算法”。

在此基础上, 教师可以让学生结合生活中的实例反复训练, 从而提高“指令集”的复杂程度。譬如先让学生在VB环境中进行问题解决, 分析需要经历哪些步骤, 其中的指令有哪些。并逐渐涉及分支、循环等结构, 得到功能逐渐强大的指令集。用这种方法学习到的“程序设计”, 是把握住通过人机对话实现问题解决的程序设计, 是将问题解决方法 (工具) 和问题解决过程融为一体的程序设计, 是面向贴近生活经验的问题解决的程序设计。

教师在开展“算法与程序设计”模块教学工作中, 遵循“提出问题-解决问题的过程-指令实现”这样一条线索, “解决问题的过程”即“程序”, 其中涵括算法。因而, “算法”变成位于“程序”之下的概念, 属于方法层面, 而“程序”在层次上则反超“算法”。这种教学策略不需要译码, 更贴近学生生活经验及学生的认知起点, 有利于启发学生的学习。

2.整合重组信息技术课堂

信息技术学科存在课时少、内容多、巩固难等实际困难。而《普通高中技术课程标准 (实验) 》中提出的“信息技术和数学课程内容的整合”为指导课堂教学提供了全新的理念。如, 人民教育出版社出版的高中《数学》第三册 (必修) 第一章“算法初步”介绍了算法与程序框图、基本算法语句以及算法案例等内容, 基本涵括了“算法与程序设计”模块中的程序设计基础知识。因此, 教师合理的做法是调整模块教学内容的次序, 将“可视化编程的概念与方法”移到模块最前面, 这样学生在学习初期就可以利用可视化编程动手解决一些小问题, 初步具备可视化编程的能力。当数学课堂完成“算法”教学内容之后, 教师再来讲述编程的基础知识, 自然就有事半功倍的效果。

在课时的安排方面, 目前大体有两种情况:一种为1周1课时的情况, 一个学年完成一个模块的教学工作;另一种为1周2课时, 一个学期完成一个模块的教学工作。不过, 绝大多数学校的2课时都是分开来排课的, 譬如星期二1节、星期五1节等。但是, 程序设计课作为实践性极强的一门课程, 1节课的时间既要学习新知识, 又要实践巩固它, 难以取得满意的效果。较好的做法就是两堂课连排, 共计80分钟, 教师大概用20多分钟精讲新知识, 剩下时间让学生动手编程实践, 深层理解, 巩固新知识, 避免出现知识衔接的断点。

针对各章节的基础知识及算法等精讲内容, 教师可以适度地开发一些微视频, 建立微课网站, 用于学生课前预习或课后复习巩固, 把有限的课堂时间更多地让位于师生讨论、交流与探究等活动。

传统教学过程是, 教师每讲完一个新知识, 随后布置任务让学生编程实现。学生往往觉得教师布置的任务并不是自身想要做的, 难以体现编程的价值, 久而久之学习编程的兴趣下降。比较恰当的做法是, 教师可设计开放式的实践任务, 要求任务主题明确, 有个性、有创意、内容积极向上即可。然后, 教师将整个班级分为若干个学习小组, 每小组4人, 从学生的生活与学习出发, 由小组的4个同学讨论确立小组任务的主题。主题确立之后, 通过小组交流、探究、合作互助等方式, 共同完成实践任务。设置开放性的任务, 不仅训练了学生编程的技巧, 更在开放的学习过程当中, 将学生的思维培养与能力培养更好地融入实践任务中[4]。

3.激发学生学习的兴趣

目前, 信息技术课的教学目标定位于:培养学生的信息素养, 即信息时代应具备的获取信息、处理信息、加工信息、交流评价信息的素养, 其着力点在于培养学生的技术素养。

技术素养是信息技术有别于其他学科的明显特征。哪些技术是深受学生欢迎和喜爱的呢?毫无疑问是实用性技术, 即能够帮助学生解决现实生活中的实际问题的技术。例如, 在讲授“可视化编程的概念与方法”这节内容时, 教师可以让学生编写一个倒计时程序, 用于班级辩论会等活动。学生会感觉到程序是有用的, 体验到成功的快乐, 获得学有所得的满足感, 学习积极性与主动性自然就高。

生活是取之不尽的教学源泉, 学生熟悉的日常生活经验对其学习和能力的培养具有持久而深刻的影响。因此, 教师在教学过程中要善于建立程序与生活实际的联系, 创设出贴近学生生活实际的问题情境, 把生活中喜闻乐见的问题逐步提升为编程思想, 从而激发学生的学习兴趣, 创造学生主动参与的学习氛围, 充分调动学生的积极性和主动性[5]。

如在讲述“穷举法”时, 教师可以首先通过猜密码来导入教学, 然后揭示QQ密码被破解之谜, 进而提出思考问题:如何防范密码被破解?从现场教学效果来看, 学生热情非常高。这样的教学情境引入法, 非常贴近学生的生活, 情境和任务的设计思路也非常贴近吻合, 所以很自然就将穷举的算法思想展现出来。

游戏教学法也是经常使用的教学技巧。游戏教学法就是在教学中尽可能将枯燥的语言现象转变为学生乐于接受的、生动有趣的游戏形式, 为学生创设良好的学习氛围, 使学生在玩中学, 在学中玩[6]。游戏教学法可以大大调动学生的学习兴趣和求知欲望, 培养学生的动手能力, 帮助学生深刻理解理论知识, 有助于学生的互助式学习。

在讲述“算法与算法描述”章节内容时, 学生对“什么是算法”、“算法的特征”等问题感到晦涩难懂, 教师可采取如下教学方法, 如在情境导入环节引入一个1-100之间的猜数字游戏, 看谁用最短的时间猜出结果, 继而剖析猜数字程序的算法实现过程, 学生对算法的理解肯定更加深刻。在讲述穷举、排序、递归等算法时, 适当地开发一些小游戏, 展示算法实现的全过程, 效果肯定比教师在课堂上干巴巴的讲授要好。

另外, 信息技术学科不是高考科目, 学生的学习主动性往往不足。针对这种情况, 教师需要适时地对学生进行教学评价, 及时进行教学反馈, 教师还可以通过评价激发学生的竞争意识, 营造出竞争的学习氛围。

4.半成品加工策略或程序填空

鉴于有限的教学时间、有限的教学空间和参差不齐的学生基础, “半成品加工”策略是很好的教学突破口。“半成品加工”提供了相对完整的作品, 只是对教学的内容某部分“留空白”, 让学生在短时间内体会到技术操作的方法和信息素养的内涵, 提高了讲解、理解和实践的效率, 并且优化学习的情景与练习的环境[7]。

“半成品加工”策略主要应用于课堂教学的演示。在教学中, 它可以配合讲解基本的方法与过程, 突出教学的重点。同时, 学生通过阅读程序, 了解别人的编程思路以及实现算法, 有利于培养算法思维。

应用“半成品加工”策略, 可以为学生提供学习情景, 回避技术盲点。所以提供的半成品往往是大半的成品, 只差一点就完成了。比如, 在“算法”模块教学初期, 由于学生尚不具备系统的编程知识, 动手编写完整的程序存在困难, 教师针对教学内容在程序某部分“留白”, 学生填空解决关键问题, 大大提高了课堂的效率。

5.恰当运用项目教学法

项目教学法就是在教师的指导下, 将一个相对独立的项目交由学生自己处理的方法。信息的收集、方案的设计、项目实施及最终评价, 都由学生自己负责, 学生通过处理该项目, 了解并掌握了整个过程及每一个环节中的基本要求[8]。

教学实践中, 我选取了高一年级2个平行班作为实验班, 运用项目教学法, 让学生设计项目, 应用VB技术, 完成教学内容“数据库管理软件的开发”。通过对比教学, 我发现实验班的学生对数据库管理系统的开发流程理解非常深刻, 对程序设计基础知识和VB可视化编程的概念和方法也有更深入的认识。其间通过笔试和上机考试考核学生的学习情况, 结果显示, 实验班大部分学生的基础知识理解、上机操作、界面设计、解决问题能力等都比非实验班有了明显的提高, 平均分比非实验班高出近10分。

项目教学法的关键, 在于设计和制定一个合适的项目, 项目既要适合教学目标的实现, 又要具备可操作性。项目开发中要进行有效分工, 每位学生根据自己的能力负责相应的子任务, 因此项目教学法的一个很大的优势就是能让不同层次的学生都参与到项目的开发过程中, 体现了分层教学的思想。

当前, 在开展“算法”模块教学过程中存在着一些困难, 但困难只是暂时的。因为“算法”模块本身具有无穷的魅力, 学生通过编写程序解决一个个鲜活的问题, 会给他们带来无限的学习动力。教无定法, 只要结合当地的学情, 有针对性地找到适合学生自身的教学策略与方法, “算法”模块定能焕发其应有的生命力。

参考文献

[1]顾建军, 李艺, 董玉琦, 等.普通高中技术课程 (实验) 解读[M].武汉:湖北教育出版社, 2004.

[2]曹雪丽.高中“算法与程序设计”教学四部曲[J].中小学信息技术教育, 2012 (7) .

[3]李艺, 朱彩兰.信息技术课程思想梳理思路简议[J].电化教育研究, 2014 (4) .

[4]周以真, 王荣良, 李冬梅, 等.信息技术课程的反思与计算思维教育的必要性[J].中国信息技术教育, 2013 (6) .

[5]喻文喜.“程序生活化”的误区及其反思[J].中小学电教, 2009 (12) .

[6]祝智庭, 邓鹏, 孙莅文.娱教技术:教育技术的新领地[J].中国电化教育, 2005 (5) .

[7]王爱胜.“半成品加工”策略“加工”啥?[N].中国教育报, 2005-6-13 (6) .

《算法与程序设计》教学之我见 篇9

《算法与程序设计》是高一下学期教学的重点和难点, 同时它又是高中信息技术学业水平结业考试的重要组成部分, 是学生比较陌生的学习领域。对此, 我在新学期开始的第一节课中就为学生做了简单介绍, 及时消除学生们的疑虑和担忧。在后续的课程学习中, 学生提出了以下疑问:1.《算法与程序设计》与学数学没有太大的区别, 为什么编程中的一些思维比数学还更难理解?2.算法里的代码都是字母或符号, 英语课程就够难学的, 更何况算法?

基于上述问题, 学生在学习《算法与程序设计》的过程中信心很自然地受到了影响, 甚至一开始就害怕学习这门课程。这对教师的讲课增加了难度, 也使本课的教学更具挑战性。

维果斯基的 “最近发展区理论”, 给了我很大的启发。“最近发展区理论”的基本观点是:在确定发展与教学的可能关系时, 要使教育对学生的发展起主导和促进作用, 就必须确立学生发展的两种水平, 一是其已经达到的发展水平, 表现为学生能够独立解决问题的智力水平;二是他可能达到的发展水平, 但要借成人的帮助, 在集体活动中, 通过模仿, 才能达到解决问题的水平。那么, 怎么在教学过程中很好地运用这个理论呢?显然这个“最近发展区”的设置尤为重要, 也特别需要技巧。即要让学生有“跳一跳, 摘到桃子”的感觉。不但要使学生“跳”了才能摘到“桃子”, 而且又不能让这个“跳”的高度超过学生的能力范围。简单地说, 就是要让学生在学习过程中享受到成就感。成就感能增强人在学习、生活中的自信心和进取心, 使人能积极主动地迎接挑战。要保持成就感, 就必须在确定下个目标时不要太大、太高, 目标要具体可操作, 这样就能在设定时间内顺利高效地完成一个又一个目标, 同时产生一次又一次的成就感。那么, 怎么在我们的课程中真正让学生感受到成就感所带来的喜悦呢?在具体的教学中我做了以下几点尝试。

1.借鉴实例, 让学生从模仿中学习。教师讲解完一个实例后再设计一个与讲解过的例子相类似的题目让学生去完成。例如, 在会考上机考试的三大道编程题型中最为简单的界面设计题。教师先举例完成“账号, 密码, 登陆”的设计窗口后, 请学生完成“出发地, 目的地, 动车查询”的界面设计。这样大多数学生都能从实例中受到启发, 将知识进行迁移, 很快就可以完成任务, 巩固所学的新知识, 同时轻松体验到成就感和满足感。

2.对于一些较难的题目, 教师可以安排学生分组进行。每个小组由5个成员组成, 组员之间互帮互助, 相互带动, 共同完成。这样, 不但让学生体验在小组中充当的角色, 还能学会在团体中协作, 而且在小组与小组之间也可以互相拼搏, 你追我赶。由此增加了课堂教学的趣味性, 学生的积极性也得到了极大地提高。

3.设计一些游戏的环节, 让学生在学中玩、玩中学。如在开学第一课我以玩“猜数游戏”作为教学主线, 首先让2名同学一组玩“猜数游戏”。学生甲心里想一个1~100之间的整数, 让学生乙猜。根据学生乙猜的数进行判断并反馈信息“大了”还是“小了”, 直到最终猜中, 相互交换角色, 看谁能用最少的次数猜中数。这样通过生生之间、人机之间相互玩猜数游戏的活动, 将计算机拟人化, 激发学生学习程序设计的兴趣。当然学生们也有了一展身手的欲望。这样开展教学就更加轻松顺利, 同时收到更好的效果。

总之, 在教学实践过程中, 教师应该积极尝试各种教学方法, 努力提高学生学习的积极性, 让学生体验成就感, 从而增强学生学习的兴趣, 收到良好的教学效果。

摘要:《算法与程序设计》是一门实践性很强的课程, 它作为选修模块之一列入我校高一信息技术课程, 是高中信息技术学业水平结业考试的重要内容。由于学生的计算机基础普遍较差, 因此在《算法与程序设计》的教学中, 教师应了解学情及教材特点, 精心设计教学流程, 从而让学生通过学习体验到编程的乐趣和成就感。

数据结构、算法和程序之间关系研究 篇10

一、数据结构的分析

对于一个家庭来说,不论是根据年龄关系还是父子、母子等关系,都可以在家庭成员之间得到一种线性结构。同样的,按照隶属关系,学校中的各部、系、院也能够得到一种层次结构。由此可见,所谓结构也就是一种用来对关系进行表现的形式[1]。当面对实际应用问题使用计算机来进行解决的时候,一般都有两种视图,分别是抽象视图与实现视图。其中,抽象视图重点关注的是已经在数据之间存在的某种特定关系,抽象视图本身是与计算机这个机器没有任何关联的,其所表现出来的结构也就是计算机领域中所说的数据的逻辑结构,这样一来,当算法设计者站在抽象视图这一层面进行算法设计的时候,所得到的也就是一种抽象算法。实现视图关注的是如何让计算机发掘数据以及存在在数据之间的逻辑关系,这样计算机才可以根据程序设计者所设计的程序来对发掘的数据进行处理。对于计算机来说,内存是其可视区,所以实现视图必须要把数据以及数据之间的逻辑关系完整地存储到计算机内存中。当数据之间的关系存储在计算机的时候,数据所对应的存储映像之间同样也会呈现出一种结构,这个结构也就是数据的存储结构。数据的逻辑结构体现的是数据之间的关系,是在分析阶段中得到的产物。而数据的存储结构回答的是如何在计算机空间中将这个产物存储进去的问题,所以也就出现了同一种逻辑结构能够映射成不同存储结构的现象。

二、算法与程序的分析

所谓算法,是在计算机中解决问题的一系列确定性的步骤过程,0个或多个输入、1个或多个输出、有效性、确定性、有穷性是算法必须要具备的五个要求,缺失了其中任何一个,算法便不能称之为算法。在描述算法的时候,一般都是通过自然语言或者是伪代码来对其进行描述。程序作为计算机算法的具体体现,其是计算机程序员使用一种能够被计算机识别的语言来对被实现算法的重新描述。在编译器的编译下,最终程序也就被转换成为了一系列指令,进而也就能够通过计算机来解决实际应用问题[2]。程序作为算法的实现,其与算法的设计既有可能是由同一个人负责完成的,也有可能是在不同的人的操作下完成的。

另外还有一点值得予以注意,在算法与程序之间还存在着一个最明显的不同之处,算法必须要具有有穷性这一特性,而程序则不用受到有穷性的限制。这是因为一旦算法失去了有穷性,其也就无法解决实际应用问题,算法也就不能称之为算法。换句话说,在算法中必然存在着触发条件使得求解结束。在执行程序的过程中,如果程序一直没有得到结束运行的指令,那么程序将会一直不停的运行下去[3]。

三、数据结构、算法与程序之间的关系

数据结构、算法与程序之间有着种种联系,在理清这三者之间所具有的关系的时候,必须要明确一点:与数据的逻辑结构相关的是算法的设计,与数据的存储结构相关的是算法的实现。当对某一个实际问题运用计算机来加以解决的时候,第一步要做的就是对实际问题进行建模,在得到了实际问题的抽象模型或数学模型之后才能够加以解决。因此从另一个角度来说,数据的逻辑结构就是抽象模型中的组成部分,计算机算法的设计者根据实际问题的相关信息来设计出解决该问题的具体算法。可见,对实际问题抽象化的好坏会直接决定建立在此基础之上的算法质量,也就是说,抽象模型决定了算法,而抽象模型中又包括了数据的逻辑结构。

在得到算法以后,接下来所要做的就是让算法被计算机读懂并且让计算机能够根据算法中制定的步骤与流程来处理并解决目标问题。在此过程中,需要将抽象模型映射到计算机的存储器中,同时也要将算法即将处理的数据以及数据之间的关系映射到该存储器中[4]。在将抽象模型映射到计算机存储器之后,计算机能够很直观的感知到这个抽象模型,然后便要将算法转换成为一种能够驱动计算机执行程序的一系列指令。

从上述可以得到,在得到了相应的计算机编译程序之后,计算机也就可以掌握并理解高级程序设计语言,但是必须要予以注意的是,计算机此时仍然无法理解伪代码或者自然语言[5]。因此,接下来要做的就是让计算机根据设计阶段中所得到的抽象算法来求解问题。而解决这一问题的关键就在于计算机程序员,这是因为程序员是既懂高级程序设计语言又懂伪代码或自然语言的计算机领域工作者。而程序指的就是程序员可以通过某种高级程序设计语言实现抽象算法后所得到的产物。计算机在理解了程度之后便能够执行程序,从而也能够根据相应的算法来求解问题[6]。

结语:

综上所述可知,数据结构、算法与程序都是计算机在解决实际问题的过程中所涉及到的三个关键内容,计算机产生的目的也就是为了方便实际问题的解决,因此,必须要正确认识数据结构、算法与程序之间的内在联系,保证能够合理运用好这三点来解决实际应用问题。

摘要:在社会发展的过程中,计算机行业的重要性十分突出,计算机水平更是衡量社会发展乃至国家综合实力的重要标准之一。而在计算机专业中,最重要的课程之一便是数据结构,数据结构作为计算机领域中的重要组成部分,关系到能否开发出可行性高且高效的计算机应用程序。在实际开发程序的过程中,处理好算法与数据结构之间的关系具有十分重要的意义,会对所开发的系统或程序的可行性、效率、稳定性等产生直接影响,因此这就要求必须要处理好数据结构、算法与程序之间的关系。本文主要就是对数据结构、算法与程序之间的关系进行研究,首先分别对数据结构、算法以及程序这三个内容进行了简要分析,并重点描述了这三者之间具有的关系,以期能够帮助人们更好的理清这三者之前所具有的关系与联系。

关键词:数据结构,算法,程序

参考文献

[1]刘晓静,王晓英,张玉安,黄建强,刘志强.以创新人才培养为目标的数据结构实验教学改革[J].实验技术与管理,2014,11:184-187.

[2]李文杰,姜淑娟,钱俊彦,王兴亚,鞠小林.基于对象引用关系的Java程序内存行为分析方法[J].电子学报,2015,07:1336-1343.

[3]李文明,叶笑春,张洋,宋风龙,王达,唐士斌,范东睿,谢向辉.BDSim:面向大数据应用的组件化高可配并行模拟框架[J].计算机学报,2015,10:1959-1975.

[4]徐慧,周建美,顾颀.强化课堂编程思维契合教学实践目标——《数据结构》教学方法探析[J].高教论坛,2013,01:24-28.

[5]S.Boccaletti,V.Latora,Y.Moreno,M.Chavezf,D.-U.Hwang,方爱丽,赵继军.复杂网络:结构和动力学[J].复杂系统与复杂性科学,2007,01:49-92.

上一篇:企业就业意愿下一篇:有线数字视频广播