VB程序设计的常用算法_第1页
VB程序设计的常用算法_第2页
VB程序设计的常用算法_第3页
VB程序设计的常用算法_第4页
VB程序设计的常用算法_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Visual Basic常用算法从逻辑结构上看,应用程序 = 算法 + 数据结构。(1)数据结构(Data-Structure),计算机将数据元素依据某种逻辑联系进行存储和组织的方式。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重依赖于是否选择了最优的数据结构。选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并由计算机程序处理的符号的总称。(2)算法(Algorithm),由基本运算及规定的运算顺

2、序所构成的完整解题步骤。一个算法应该具有以下五个重要的特征: 有穷性,算法必须保证执行有限步之后结束。 确切性,算法的每一步骤必须有确切的定义。 输入,算法有0个或多个输入,以描述运算量的初始值。0个输入是指算法本身包含了初始值。 输出,算法有一个或多个输出,以反映对输入数据加工后的结果。没有结果的算法是毫无意义的。 可行性,算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。计算机科学家尼克劳斯-沃思曾著过一本著名的书数据结构十算法= 程序,可见算法在计算机科学界与计算机应用界的地位。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入

3、什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。程序(Programme)就是用计算机语言描述的算法。流程图(Flow Charts)就是图形化的算法。解决同一问题可以有多种算法描述。实际问题的算法种类繁多,总体上可以分为两大类:数值算法和非数值法。对VB程序语言设计的初学者,可能会感到掌握控件的使用不难,难得的是理解和掌握算法。但是,算法是程序的核心、编程的基础,离开算法,一事无成。我们将介绍常用的VB算法。一、常见数学问题算法1、累加和连乘累加是在原有和的基础上在循环体中每次加上一个数,最后根据条件结束累加,最终得到累加和。连乘是在原有积得基础上在循环体中每次乘

4、以一个数,最后根据条件结束连乘,最终得到连乘积。此类问题都要结合循环结构实现,根据问题确定循环变量的初值、终值或结束条件。【注意】 累加和变量、连乘积变量必须在循环外赋初值。一般累加和初值为0、连乘积初值为1。 对于多重循环,赋初值在外循环体外还是在内循环体外根据实际问题决定。【计算的近似值】用公式:计算,直到最后一项的绝对值小于10-6 为止。Private Sub Form_Click( )Dim s As Integer, n As Single, t As Single, pi As Single t = 1 第一项 pi = 0 累加和初始值为0 n = 1 每一项的分母值 s =

5、1 第一项符号 Do While (Abs(t) = 0.) pi = pi + t 将每一项求和,得到/4的近似值 n = n + 2 产生每一项的分母值 s = -s 产生每一项的符号值 t = s / n 产生每一项 Loop pi = pi * 4 Print =; piEnd Sub【斐不拉齐数列】输出斐不拉齐数列(Fibonacci)的前40个项:1、1、2、3、5、8、13、数列中的第1、2项为1,其后每项都等于其前两项之和,其递推公式:Private Sub Form_Click( ) Dim f1 As Long, f2 As Long, i As Integer f1 =

6、1 数列第一项 f2 = 1 数列第二项 Print f1, f2, 打印数列前两项 For i = 3 To 40 循环输出第3至40项 f3 = f1 + f2 计算下一个数列项 Print f3, 打印输出下一个数列项 f1 = f2 为下一个数列项计算做准备 f2 = f3 为下一个数列项计算做准备 If i Mod 5 = 0 Then Print 当每行输出5个以后换行 Next iEnd Sub【计算e的近似值】求自然对数e的近似值,要求其误差小于0.00001,近似公式为:Private Sub Form_Click( ) Dim i%, n&, t!, e! e = 0 存放

7、累加和 i = 0 循环控制变量 n = 1 存放连乘积 t = 1 级数第i项初始值 Do While t 0.00001 e = e + t 将每一项加入累加和 i = i + 1 产生阶乘下一个乘数 n = n * i 乘以乘数i得到每一项的阶乘 t = 1 / n 产生每一项 Loop Print 计算了; i; 项的和是; eEnd Sub【计数统计】用随机函数产生100个0,99范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。使用数组来处理,用数组a(1 to 100)存放产生的确100个随机整数,数组x(1 to 10)来存放个

8、位上的数字分别为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) N),R表示余数。 输入两个正整数M和N,且MN; 计算M除以N得余数R; 如果R不为0时,使M=N和N=R后转移

9、到第2步再次计算; 如果R=0时,N就是所求的最大公约数。最小公倍数就是两个数的乘积再除以最大公约数的结果。Private Sub Command1_Click( ) Dim x, y, m, n, r As Integer x = Val(Text1.Text) : y = Val(Text2.Text)从文本框中输入连个正整数 If x y Then使得MN,即将两个正整数排序 m = x:n = y Else m = y:n = x End If Do求最大公约数 r = m Mod n m = n:n = rLoop While r 0求最小公倍数并分行打印出两个结果Label3.Ca

10、ption = 最大公约数为: & m & vbCrLf & 最小公倍数为: & x * y / mEnd Sub【说明】 x和y保存了两个正整数的原值,以便最后计算最小公倍数; If语句保证了mn,但省略If语句也不会出错,因为r = m Mod n :m = n : n = r会自动将较大的数交换到m中。#3、穷举法解方程将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现,也称为“枚举法”。这是一种“在没有其它办法的情况的方法”,是一种最“笨”的方法,然而对一些无法用解析法求解的问题往往能奏效,通常采用循环来处理穷举问题。【百钱买百鸡】我国古代数学家张丘建在算经中曾提出一个

11、有趣的“百钱买百鸡”问题。题意为:已知用5文钱可以买一只公鸡,3文钱可以买1只母鸡,用1文钱可以买3只小鸡,如果要用100文钱买100只鸡。请问公鸡、母鸡和小鸡应各买多少只?(1)分析:设变量x表示公鸡,y表示母鸡,z表示小鸡。则有方程组:上述方程组中,有3个求和数,但只有两个方程,帮方程组有多个解。为解决这类问题一般需要使用穷举法。即先对各求知数的所有可能进行穷举,然后再依次判断哪些值能满足要求。 Private Sub Form_Click( ) Dim x As Integer, y As Integer, z As Integer, num As Long For x = 0 To 1

12、00 For y = 0 To 100 For z = 0 To 100 num = num + 1 If (x + y + z = 100 And 5 * x + 3 * y + z / 3 = 100) Then Print 公鸡=; x, 母鸡=; y, 小鸡=; z End If Next z Next y Next x Print 方法一的If语句测试了; num; 次End Sub (3)通过分析可知,公鸡、母鸡和小鸡的可能值为:020、033、100-x-y。Private Sub Form_Click()Dim x As Integer, y As Integer, z As

13、Integer, num As IntegerFor x=0 To 20For y=0 To 33z=100-x-ynum=num+1If 5*x+3*y+z/3=100 ThenPrint “公鸡=”; x; “母鸡=”; y; “小鸡=”; zEnd ifNext y, xPrint 方法二If语句测试; num; 次End Sub 【说明】 通过num变量可以测试循环的次数,还可以使用系统变量Now测试循环使用的时间。 在方法二中两层循环的Next相邻时,可以合而为一:Next y, x。【注意】在多重循环中,为了提高运行的速度,要考虑对程序优化问题: 利用已知条件,尽量减少循环的次数。

14、 合理地选择内、外层的循环控制变量,即将循环次数多的放在内循环。 尽量少用变体型变量,在方法一中x、y、z使用变体型,运行的时间可由4s减少到19s。【换零钱程序】将一张面值为100元的人民币等值换成100张5元、1元和0.5元的零钞,要求每种零钞不少于1张,问有哪几种组合?Private Sub Form_Click( ) Dim i%, j%, k% Print 5元, 1元, 0.5元 For i = 1 To 20 For j = 1 To 100 - i k = 100 - i - j If 5 * i + 1 * j + 0.5 * k = 100 Then Print i, j,

15、 k End If Next j Next iEnd Sub#4、素数问题素数(质数)就是只能被1和它本身整除的整数。 如果整数m不能被2m-1之间的数所整除,则m是素数。反之,如果找到一个2 m-1之间的数能够整除m,则证明m不是素数。结合循环结构使用穷举法测试2 m-1。 实际上,如果整数m能被分解为两个因子a和b,那么其中较小一个因子必定小于m0.5。 只要找到一个能整除m的数x后,已经能证明m不是素数,x的后续数据可以不再验证,可使用Exit for有条件提前退出循环。【穷举法素数判断】输入一个正整数m,并判断m是否为素数。Private Sub Form_Click()Dim m A

16、s Integer, k As Integer, i As Integerm=Val(InputBox(“请输入一个正整数:”)k=Sqr(m)求m的平方根For i=2 To k从2到k测试是否为m的因子,如果是素数则正常退出循环If m Mod i=0 Then Exit For找到一个因子,不是素数则提前退出循环Next iIf ik Then根据结束循环的方式,打印素数判断的结果Print m,”是素数”Else Print m,”不是素数”End IfEnd Sub 【说明】如果程序是因为找到了一个能整除m的数,而通过Exit for语句退出For循环的,则ik)来判断“是素数”或“

17、不是素数”。【随机产生素数】随机产生20个两位素数。Private Sub Form_Click()Dim m As Integer, count As Integer, i As Integer, k As IntegerRandomizeDo Until count=20m=Int(Rnd*90)+10随机产生一个两位十进制数k=Sqr(m)判断该数是否素数For i=2 To kIf m Mod i=0 Then Exit ForNext iIf ik Then如果是素数则打印输出到窗体上,并计数加1Print m; ” ” ;count=count+1If count Mod 10=0

18、 Then Print一行打印输出10个End IfLoopEnd Sub 【说明】 首先通过随机函数产生一个两位整数,然后再判断该整数是否是素数。如果是素数,则素数计数器count加1;如果不是素数,则产生下一个随机数。程序反复执行,直到产生20个满足条件的随机素数为止。 外循环是一个Do UntilLoop循环,内循环是一个ForNext循环。 语句“If count Mod 10=0 Then Print”的作用,是保证每行输出10个素数。【寻找素数】找出100以内的素数。Private Sub Command1_Click( ) Dim i As Integer, m As Integ

19、er Text1.ForeColor = vbRed Text1.Text = For m = 2 To 100For i = 2 To m - 1If m Mod i = 0 Then GoTo NotS不是素数则停止判断,直接退出当前的两层循环Next iText1.Text = Text1.Text & & mNotS: Next mEnd Sub 上述循环体内只要能被i整除,就不可能是素数,可利用GoTo语句退出循环。但程序中尽量少用或不用GoTo语句,通过设计一个标志变量Flag,在循环体内用Flag记录素数的判断结果,在循环结束后再根据Flag显示判断结果。Private Sub

20、Command2_Click( )Dim i As Integer, m As Integer, Flag As Boolean Text1.ForeColor = vbBlue Text1.Text = For m = 2 To 100 Flag = True假设待判断的m为素数,将标志变量修改为True For i = 2 To m - 1 If m Mod i= 0 Then Flag = False不是素数,则将素数标志变量修改为False Next i If Flag Then Text1.Text = Text1.Text & & m Next mEnd Sub #5、最大值和最小

21、值在若干个数中求最大值,一般先假设一个较小的数为最大值的初值,若无法估计较小的值,则取第一个数为最大值的初值,然后将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,依次逐一比较。【最短残料】有一根长度为321m的钢材料,要将它截取成两种规格的短料,规格a、b的长度分别为17m和27m,每种至少1段,分隔成a、b各多少段后,剩余的残料r最少?该题利用二重循环求残料r的最小值正数,因为残料不可能为负。Private Sub Form_Click( ) Dim a%, b%, r!, ia%, ib%, t! r = 321 最小值初值取钢材料的长度 For b = 1 To Int(3

22、21 - 17) / 27) b最多的段数 For a = 1 To Int(321 - b * 27) / 17) a最多的段数 t = 321 - b * 27 - a * 17 当前的残料 If t = 0 And t =零并且比最短的残料小 r = t 求最短的残料 ia = a 最短残料时a的段数 ib = b 最短残料时b的段数 End If Next a Next b Print 最短残料时a的段数:; ia Print 最短残料时b的段数:; ib Print 最短残料为:; rEnd Sub【寻找最大值和最小值】从10个范围1, 100随机数中找出其最大值和最小值。Priva

23、te Sub Form_Click( ) Dim a(1 To 10) As Integer, i As Integer Dim min, max As Integer, minindex As Integer, maxindex As Integer For i = 1 To 10 a(i) = Int(Rnd * 100) + 1 Print a(i); Next i Print min = a(1): max = a(1):minindex = 1: maxindex = 1 For i = 2 To 10 If a(i) max Then max = a(i): maxindex =

24、i Next i Print 第 & minindex & 个数最小: & min Print 第 & maxindex & 个数最大: & maxEnd Sub#6、递推(迭代)“递推法”也称为“跌代法”,把一个复杂的计算过程转化为“简单过程的多次重复”。每次重复都从旧值的基础上“递推”出新值,并由“新值代替旧值”进行下一次递推。算法思想:对于一个问题的求解x,可由给定的一个初值x0,根据某一迭代公式得到一个新的值x1,这个新值x1比初值x0更接近要求的值x;再以新值作为初值,即:x1x0,重新按原来的方法求x1,重复这一过和直到|x1-x0| 0 Then Print x & 的平方根为:

25、; Fsqrt(x) ElseIf x = 0 Then Print 0的平方根为0! Else Print 此数不能求平方根! End IfEnd SubPrivate Function Fsqrt( a As single ) AS singleDim x0 As Single, x1 As Single x0 =a/2 迭代初值 x1 = 0.5*(x0 + a/x0) Do x0 = x1 为下一次迭代作准备 x1 = 0.5*(x0 + a/x0) Loop While Abs(x1 - x0) 0.00001 Fsqrt=x1End Function#7、二分法解高次方程假设方程f

26、(x)=0在区间(a, b)内有唯一的根x,则f(a)与f(b)的符号必然相反。二分法利用这个性质进过若干次迭代缩小根所在的区间,得到一个在一定误差范围内的近似根。(a)方程的根在中点左侧 (b)方程的根在中点右侧二分法求根示意图 取(a, b)的中点x0=(a+b)/2,将求根区间分成两半,开始缩小根的区间。 如果f(x0)与f(a)同号,则根的真值x在中点x0的右侧,如图(b)所示。这时根的取值区间缩小为(x0 ,b),即用x0取代a的位置。如果f(x0)与f(a)异号,则根的真值x在中点x0的左侧,如图(a)所示。这时根的取值区间缩小为(a, x0) ,即用x0取代b的位置。 根据新的区

27、间范围重复“取中点判断”,直到f(x0)=0或区间长度b-a 0.00001 x = (a + b) / 2求出根所在区间的中间点x f1 = a 3 + 4 * a 2 10求左边界点a的方程值 f = x 3 + 4 * x 2 10求中间点x的方程值 If f1 * f 0 Then a = x Else b = x根据两个方程值的符号异同,缩小根的区间范围 End If Wend Print x=; CInt(x * 10000) / 10000End Sub#8、牛顿切线法解高次方程给方程f(x)假定一个初值x0作为方程的近似根,牛顿切线法迭代公式为:,是的导数,经过若干次迭代后,当

28、时,就作为方程的高精度近似根。由图可知,牛顿切线法的实质是逐步以切线与x轴的交点来作为曲线与x轴交点的近似值。【牛顿切线法解高次方程】求方程f(x)=3x3-4x2-5x+13=0的根。Private Sub Form_Click( ) Dim x, x0, f, f1 As Double x0 = 3假设一个初始近似根 Do f = 3 * x0 3 - 4 * x0 2 - 5 * x0 + 13求近似根的方程值 f1 = 9 * x0 2 - 8 * x0 5求近似根的导数方程值 x = x0 - f / f1根据牛顿切线公式计算新的近似根x If Abs(x - x0) 0.00001

29、 Then Exit Do新的近似根x是否满足精度要求 x0 = x Loop Print x=; Int(x * ) / End Sub#9、数组与矩阵运算矩阵元素可以存放在二维数组中,对矩阵的各种运算也就变成了对数组的运算。【矩阵转置】对于nn的矩阵,转置实质上是:每个元素与下标交换后对应的元素交换数据,其中两条对角线上的元素和自身交换数据。例如,有二维数组a(5,5),要对它实现转置,有两种方法可以实现。Option Base 1Private Sub Command1_Click( ) Dim a(5, 5) As Integer, i%, j% Picture1.Cls: Pictu

30、re2.Cls For i = 1 To 5 矩阵a赋初始值并显示在Picture1中 For j = 1 To 5 a(i, j) = Int(Rnd * 9 + 1) Picture1.Print a(i, j); Next j Picture1.Print Next i For i = 1 To 4 将矩阵a转置 For j = i + 1 To 5 temp = a(i, j): a(i, j) = a(j, i): a(j, i) = temp Next j Next i For i = 1 To 5 转置结果显示在Picture2中 For j = 1 To 5 Picture2.

31、Print a(i, j); Next j Picture2.Print Next iEnd SubPrivate Sub Command2_Click( ) Dim a(5, 5) As Integer, i%, j% Picture1.Cls: Picture2.Cls For i = 1 To 5 矩阵a赋初始值并显示在Picture1中 For j = 1 To 5 a(i, j) = Int(Rnd * 9 + 1) Picture1.Print a(i, j); Next j Picture1.Print Next i For i = 2 To 5 将矩阵a转置 For j = 1

32、 To i - 1 temp = a(i, j): a(i, j) = a(j, i): a(j, i) = temp Next j Next i For i = 1 To 5 转置结果显示在Picture2中 For j = 1 To 5 Picture2.Print a(i, j); Next j Picture2.Print Next iEnd Sub【矩阵乘以常数】存在2行4列矩阵nx1,对矩阵各元素乘以常数n,把结果存入矩阵nx2中。Option Base 1Private Sub Form_Click( ) Dim nx1(2, 4) As Integer, nx2(2, 4) A

33、s Integer, x As Integer Print nx1数组为: For i = 1 To 2 For j = 1 To 4 nx1(i, j) = Val(InputBox(请输入nx1数组元素:) Print nx1(i, j); Space(8 - Len(Str(nx1(i, j); Next j Print Next i x = Val(InputBox(输入相乘的常数:) Print 乘以常数:; x For i = 1 To 2 For j = 1 To 4 nx2(i, j) = x * nx1(i, j) Next j Next i Print 输出nx2数组: F

34、or i = 1 To 2 For j = 1 To 4 Print nx2(i, j); Space(8 - Len(Str(nx2(i, j); Next j Print Next iEnd Sub【矩阵相加减】假设行、列相同的两个矩阵nx1和nx2,两个矩阵相加(减),即将两个矩阵中相对应得两个元素直接相加(减),结果存放在另一矩阵中。Option Base 1Private Sub Form_Click( ) Dim nx1(2, 3) As Integer, nx2(2, 3) As Integer, nx3(2, 3) As Integer Print 相加的第一个数组nx1: F

35、or i = 1 To 2 For j = 1 To 3 nx1(i, j) = Val(InputBox(输入nx1数组:) Print nx1(i, j); Space(8 - Len(Str(nx1(i, j); Next j Print Next i Print 相加的第二个数组nx2: For i = 1 To 2 For j = 1 To 3 nx2(i, j) = Val(InputBox(输入nx2数组:) Print nx2(i, j); Space(8 - Len(Str(nx2(i, j); Next j Print Next i For i = 1 To 2 For j

36、 = 1 To 3 nx3(i, j) = nx1(i, j) + nx2(i, j) Next j Next i Print 结果为第三个数组nx3: For i = 1 To 2 For j = 1 To 3 Print nx3(i, j); Space(8 - Len(Str(nx3(i, j); Next j Print Next iEnd Sub【矩阵相乘除】两个矩阵nx1和nx2相乘(除)的必要条件:nx1矩阵的列数必须等于nx2矩阵的行数。结果存放在矩阵nx3(nx1行数,nx2列数) 中。根据矩阵乘法定义,nx3矩阵中各元素的值为:(n为nx1的列数或nx2的行数)Option

37、 Base 1Private Sub Form_Click( ) Dim nx1(4, 2) As Integer, nx2(2, 3) As Integer, nx3(4, 3) As Integer Print 第一个数组nx1为: For i = 1 To 4 For j = 1 To 2 nx1(i, j) = Val(InputBox(输入第一个数组nx1:) Print nx1(i, j); Space(10 - Len(Str(nx1(i, j); Next j Print Next i Print 第二个数组nx2为: For i = 1 To 2 For j = 1 To 3 nx2(i, j) = Val(InputBox(输入第二个数组nx2:) Print nx2(i, j); Space(10 - Len(Str(nx2(i, j); Next j Print Next i Print 结果的第三个数组nx3为: For i = 1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论