VB程序连乘算法的教学设计 下载本文

内容发布更新时间 : 2024/12/29 14:10:54星期一 下面是文章的全部内容请认真阅读。

龙源期刊网 http://www.qikan.com.cn

VB程序连乘算法的教学设计

作者:何海燕

来源:《科技资讯》2015年第34期

摘 要:该文主要对程序设计课程中的连乘算法进行教学设计,结合实例介绍了连乘算法的关键点,对算法中经常会遇到的内存溢出问题进行解析,针对连乘算法的通用表达式进行了优化,使程序更易理解,达到加深理解,优化教学效果。 关键词:程序设计 算法 连乘算法 溢出

中图分类号:G64 文献标识码:A 文章编号:1672-3791(2015)12(a)-0220-02 在程序设计课程中,算法是课程的重点,同时也是难点,如何将算法原理向学生讲解透彻并可以让其轻松接受,是在教学过程中需要思考的一个问题。

在计算机中,算法(Algorithm)是对特定问题求解步骤的一种描述,它是指令序列的集合。程序设计就是设计算法、编写代码、调试运行的过程。显而易见,算法是程序设计的基础,程序设计是算法的具体实现。在程序设计课程的教学设计过程中,常用算法一般包括求最大/最小值、累加/连乘、穷举法、递推法等,该文将主要针对连乘算法进行分析。 1 连乘算法

在程序基础教学中,为了提高教学效果,针对刚入门的程序设计初学者,教师们一般采用任务驱动法[1]进行算法的分析,引导学生理解和掌握该算法的核心思想,进而再用程序的方式来描述与验证该算法。例如:

以上是一个典型的连乘算法,该算法描述的关键点可归纳如下: (1)每一项和每次连乘之积是变化量。 (2)因此,需要两个变量: ①用T表示每一项的值:T=T+1。 ②用S表示连乘之积:S=S*T。 (3)循环终止条件: 循环次数>n。 (4)初始化:S=1 。

龙源期刊网 http://www.qikan.com.cn

2 内存溢出问题

在讲解程序算法时,大多数程序设计教程都很少提及赋值或计算中的“溢出”问题,然而在学生的编程操作中,“溢出”却是经常会遇到的一个问题[2],这些问题常常会让学生觉得困惑,查找原因时却无从下手,导致学生出现畏难情绪。因此,教师有必要在授课过程中,对程序在内存中的存储方式进行初步讲解,让学生可以了解程序的运行机制,加深理解。

软件在运行过程中,如果程序调用的数据文件过大,或程序设计中存在着死循环等bug,软件写入内存中的数据量超过了系统分配给该软件的内存空间大小,则会发生内存空间装不下而溢出的现象,这种现象就叫内存溢出。在求阶乘的算法中,由于阶乘的结果累积速度较快较大,容易发生数据溢出。

让学生进行程序的调试与运行,当n=10和=50时运行结果如图1所示,但当n=100时,却弹出如图2所示的警告信息。 分析导致“溢出”错误的原因:

当程序运行发生“溢出”错误时,通过调试跟踪,在T=(2* i) ^ 2/((2*i-1)*

(2*i+1))语句处,把光标移至i变量上,可以发现溢出时i的值为91;当i=91时,表达式((2*i-1)*(2*i+1))=,该表达式的值为33123。程序将结果值S设置为double类型,当i=91时,结果为33123,这个值按道理应在double类型的数值范围内,但程序仍然发生了溢出错误,问题在哪里呢?

实际上,产生这个溢出问题的原因是由于VB本身的内存分配机制造成的,VB在进行计算过程中,它总是分配一个最省内存的临时内存空间去存储这些中间计算结果数值,这个最省的内存空间容量根据表达式中数据类型决定,如上述相乘的两个表达式(2*i-1)和

(2*i+1),他们当中的变量i是整型,因此,VB也将使用一个类型为整型的临时变量来存储两个表达式的乘积。所以,当i=91时,得到乘积结果33 123,此时即使是乘积结果变量S设置为double类型,但乘积结果(33 123)已超过了声明为整型的临时变量空间的极限(-32 768~+32 767),所以仍然会发生溢出错误。

根据上面的原因分析,可以从以下几方面进行修正: (1)将变量 i 定义为长整型或实数型或变体型。

(2)将错误语句中的变量 i或常量(1或2)其一操作数利用转换函数Clng(i)或Clng(1),以求足以容纳计算结果。

(3)避免大数相乘,可将错误语句改为T=(2*i)^ 2/(2*i - 1)/(2*i+1)。 (4)连乘算法的改进。

龙源期刊网 http://www.qikan.com.cn

同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。虽然上述方法解决了“溢出”问题,但是表达式T=(2*i)^2/(2*i-1)*(2*i+1)显得很笨重,表达式明显复杂。能否有办法可以降低复杂度,简化表达式以求程序优化呢?

可以把通项表达式T=(2*i)^2/(2*i-1)*(2*i+1)中的分子式分解开来,把问题理解为简单表达式T=A/B(其中A=(2*i)^2和B=(2*i-1)*(2*i+1),如此一来问题就变得较为简单且易于解决。因此,求∏的近似值的VB程序代码优化实现如下:

在此例中,关键点在于如何将复杂的通项表达式分解为简单表达式,进而实现连乘算法的优化。因此,如何构造通项表达式尤为关键,必须注意2点。

(1)通项表达式T=B/A中的A或B均可为常量或变量表达式,A和B可以继续分解;①若A=1, 则T=B;②若B=1, 则T=1/A;

(2)必须精选变量A与B的数据类型,避免出现“溢出”。 3 结语

该文对程序设计课程中关于连乘算法的问题进行了初步探讨,指出程序设计初学者中学习过程中经常会遇到的“溢出”问题,提出修正方法,并对连乘算法进行改进优化,加深理解,强化教学效果。 参考文献

[1] 杨晨霞,涂风涛.任务驱动教学法在Visual Basic程序设计教学中的应用[J].职教论坛,2012(18):79-81.

[2] 贾颖.“VB 程序设计”课程教学中的变量类型使用问题研究[J].Computer Education,2008(20):138-139.