Visual Basic常用算法
从逻辑结构上看,应用程序 = 算法 + 数据结构。
(1)数据结构(Data-Structure)——计算机将数据元素依据某种逻辑联系进行存储和组织的方式。
许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重依赖于是否选择了最优的数据结构。选择了数据结构,算法也随之确定,是数据而不是算法成为系统构造的关键因素。这导致了多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。
【数据】是对客观事物的符号表示,在计算机科学中,是指能输入到计算机中并由计算机程序处理的所有符号的总称。
(2)算法(Algorithm)——由基本运算及规定的运算顺序所构成的完整解题步骤。
一个算法应该具有以下五个重要的特征:
有穷性,算法必须保证执行有限步之后结束。
确切性,算法的每一步骤必须有确切的定义。
输入,算法有0个或多个输入,以描述运算量的初始值。0个输入是指算法本身包含了初始值。
输出,算法有一个或多个输出,以反映对输入数据加工后的结果。没有结果的算法是毫无意义的。
可行性,算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
计算机科学家尼克劳斯-沃思曾著过一本著名的书《数据结构十算法= 程序》,可见算法在计算机科学界与计算机应用界的地位。
算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。
程序(Programme)就是用计算机语言描述的算法。流程图(Flow Charts)就是图形化的算法。解决同一问题可以有多种算法描述。实际问题的算法种类繁多,总体上可以分为两大类:数值算法和非数值法。
对VB程序语言设计的初学者,可能会感到掌握控件的使用不难,难得的是理解和掌握算法。但是,算法是程序的核心、编程的基础,离开算法,一事无成。我们将介绍常用的VB算法。
一、常见数学问题算法
1、累加和连乘
累加是在原有和的基础上在循环体中每次加上一个数,最后根据条件结束累加,最终得到累加和。
连乘是在原有积得基础上在循环体中每次乘以一个数,最后根据条件结束连乘,最终得到连乘积。
此类问题都要结合循环结构实现,根据问题确定循环变量的初值、终值或结束条件。
【注意】累加和变量、连乘积变量必须在循环外赋初值。一般累加和初值为0、连乘积初值为1。
对于多重循环,赋初值在外循环体外还是在内循环体外根据实际问题决定。
【计算π的近似值】用公式:计算,直到最后一项的绝对值小于10^-6 为止。
Private Function PAI( ByVal x )
Dim s As Integer, n As Single, t As Single
t = 1 '第一项
PAI = 0 '累加和初始值为0
n = 1 '每一项的分母值
s = 1 '第一项符号
Do While (Abs(t) >= x )
PAI = PAI + t '将每一项求和,得到π/4的近似值
n = n + 2 '产生每一项的分母值
s = -s '产生每一项的符号值
t = s / n '产生每一项
Loop
PAI = PAI * 4
End Function
【使用说明】调用该函数时将题目中规定了精度值(例如10^-6)传递给形参x,调用完该函数后π的近似值就保存在函数名PAI中。
Private Sub Form_Click( )
Print PAI ( 10 ^ -6 )
End Sub
【计算e的近似值】求自然对数e的近似值,要求其误差小于0.00001,近似公式为:
Private Function E_zhi ( ByVal x )
Dim i%, n&, t!
E_zhi = 0 '存放累加和
i = 0 '循环控制变量
n = 1 '存放连乘积
t = 1 '级数第i项初始值
Do While t > x
E_zhi = E_zhi + t '将每一项加入累加和
i = i + 1 '产生阶乘下一个乘数
n = n * i '乘以乘数i得到每一项的阶乘
t = 1 / n '产生每一项
Loop
End Function
【使用说明】调用该函数时将题目中规定了精度值(例如0.00001)传递给形参x,调用完该函数后e的近似值就保存在函数名E_zhi中。
Private Sub Form_Click( )
Print E_zhi ( 0.00001 )
End Sub
【斐不拉齐数列】输出斐不拉齐数列(Fibonacci)的前40个项:1、1、2、3、5、8、13、……
数列中的第1、2项为1,其后每项都等于其前两项之和,其递推公式:
Private Sub Fibo ( x( ) )
Dim f1 As Long, f2 As Long, i As Integer
x( Lbound(x) ) = 1 '数列第一项
x( Lbound(x)+1 ) = 1 '数列第二项
f1 = 1
f2 = 1
For i = Lbound(x)+2 To Ubound(x) '循环产生第3至最后一项
f3 = f1 + f2 '计算下一个数列项
x( i )=f3 '产生下一个数列项
f1 = f2 '为下一个数列项计算做准备
f2 = f3 '为下一个数列项计算做准备
Next i
End Sub
【使用说明】调用该子过程时,根据题目中规定的数列项数产生一个对应大小的数组(例如a( )),将数组传递给传递给形参数组x( ),调用完该子过程后斐不拉齐数列就保存在实参数组中。
Private Sub Form_Click( )
Dim a( 1 to 40 )
Call Fibo ( a( ) )
For i = 0 to 40
Print a(i);
If i mod 5 = 0 then Print
Next i
End Sub
【计数统计】用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。
使用数组来处理,用数组a(1 to 100)存放产生的确100个随机整数,数组x(1 to 10)来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x(1)中,个位是2的个数存放在x(2)中,……个位是0的个数存放在x(10)。
Private Sub Form_Click( )
Dim a(1 To 100) , x(1 To 10) As Integer
Dim i, p As Integer
For i = 1 To 100 '产生100个[0,99]范围内的随机整数,每行10个打印出来
a(i) = Int(Rnd * 100)
If a(i) < 10 Then
Print Space(2); a(i);
Else
Print Space(1); a(i);
End If
If i Mod 10 = 0 Then Print
Next i
'统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数,并将统计结果保存在数组x(1),x(2),...,x(10)中,将统计结果打印出来
For i = 1 To 100
p = a(i) Mod 10 '求个位上的数字
If p = 0 Then p = 10 '统计数字的个数
x(p) = x(p) + 1
Next i
Print "统计结果"
For i = 1 To 10 '打印计数统计的结果
p = i
If i = 10 Then p = 0
Print "个位数为" + Str(p) + "共" + Str(x(i)) + "个"
Next i
End Sub
2、最大公约数(最小公倍数)
求两个正整数X和Y的最大公约数,可以使用递推算法,辗转相除得到。用M表示被除数,N表示除数(M>N),R表示余数。
输入两个正整数M和N,且M>N; 计算M除以N得余数R;basic语言程序设计 如果R不为0时,使M=N和N=R后转移到第2步再次计算; 如果R=0时,N就是所求的最大公约数。
最小公倍数就是两个数的乘积再除以最大公约数的结果。
Private Sub GYGB ( ByVal x , ByVal y , MaxGY , MinGB )
Dim m, n, r
If x > y Then '使得M>N,即将两个正整数排序
m = x : n = y
Else
m = y : n = x
End If
Do '求最大公约数
r = m Mod n
m = n
n = r
Loop While r <> 0
MaxGY = m
MinGB = x * y / m
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论