当前位置:文档之家› VB程序设计的常用算法09

VB程序设计的常用算法09

Visual Basic常用算法从逻辑结构上看,应用程序= 算法+ 数据结构。

(1)数据结构(Data-Structure),计算机将数据元素依据某种逻辑联系进行存储和组织的方式。

许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重依赖于是否选择了最优的数据结构。

选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。

这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。

数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并由计算机程序处理的符号的总称。

(2)算法(Algorithm),由基本运算及规定的运算顺序所构成的完整解题步骤。

一个算法应该具有以下五个重要的特征:①有穷性,算法必须保证执行有限步之后结束。

②确切性,算法的每一步骤必须有确切的定义。

③输入,算法有0个或多个输入,以描述运算量的初始值。

0个输入是指算法本身包含了初始值。

④输出,算法有一个或多个输出,以反映对输入数据加工后的结果。

没有结果的算法是毫无意义的。

⑤可行性,算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。

计算机科学家尼克劳斯-沃思曾著过一本著名的书《数据结构十算法= 程序》,可见算法在计算机科学界与计算机应用界的地位。

算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。

程序(Programme)就是用计算机语言描述的算法。

流程图(Flow Charts)就是图形化的算法。

解决同一问题可以有多种算法描述。

实际问题的算法种类繁多,总体上可以分为两大类:数值算法和非数值法。

对VB程序语言设计的初学者,可能会感到掌握控件的使用不难,难得的是理解和掌握算法。

但是,算法是程序的核心、编程的基础,离开算法,一事无成。

我们将介绍常用的VB算法。

一、常见数学问题算法1、累加和连乘累加是在原有和的基础上在循环体中每次加上一个数,最后根据条件结束累加,最终得到累加和。

连乘是在原有积得基础上在循环体中每次乘以一个数,最后根据条件结束连乘,最终得到连乘积。

此类问题都要结合循环结构实现,根据问题确定循环变量的初值、终值或结束条件。

【注意】① 累加和变量、连乘积变量必须在循环外赋初值。

一般累加和初值为0、连乘积初值为1。

② 对于多重循环,赋初值在外循环体外还是在内循环体外根据实际问题决定。

【计算π的近似值】用公式:Λ+-+-≈71513114π计算,直到最后一项的绝对值小于10^-6 为止。

Private Sub Form_Click( )Dim s As Integer, n As Single, t As Single, pi As Singlet = 1 '第一项pi = 0 '累加和初始值为0n = 1 '每一项的分母值s = 1 '第一项符号Do While (Abs(t) >= 0.000001)pi = pi + t '将每一项求和,得到π/4的近似值n = n + 2 '产生每一项的分母值s = -s '产生每一项的符号值t = s / n '产生每一项Looppi = pi * 4Print "π="; piEnd Sub【斐不拉齐数列】输出斐不拉齐数列(Fibonacci )的前40个项:1、1、2、3、5、8、13、……数列中的第1、2项为1,其后每项都等于其前两项之和,其递推公式:()()()⎪⎩⎪⎨⎧≥+=====--321112111n F F F n F n F n n nPrivate Sub Form_Click( )Dim f1 As Long, f2 As Long, i As Integerf1 = 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,近似公式为:∑∑=∞=+≈+=++++++=n i i i i n e 00!11!11!1!31!21!111ΛΛ Private Sub Form_Click( )Dim i%, n&, t!, e!e = 0 '存放累加和i = 0 '循环控制变量n = 1 '存放连乘积t = 1 '级数第i项初始值Do While t > 0.00001e = e + t '将每一项加入累加和i = i + 1 '产生阶乘下一个乘数n = n * i '乘以乘数i得到每一项的阶乘t = 1 / n '产生每一项LoopPrint "计算了"; 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)来存放个位上的数字分别为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 IntegerDim i, p As IntegerFor i = 1 To 100 '产生100个[0,99]范围内的随机整数,每行10个打印出来a(i) = Int(Rnd * 100)If a(i) < 10 ThenPrint Space(2); a(i);ElsePrint Space(1); a(i);End IfIf i Mod 10 = 0 Then PrintNext i'统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数,并将统计结果保存在数组x(1),x(2),...,x(10)中,将统计结果打印出来For i = 1 To 100p = a(i) Mod 10 '求个位上的数字If p = 0 Then p = 10 '统计数字的个数x(p) = x(p) + 1Next iPrint "统计结果"For i = 1 To 10 '打印计数统计的结果p = iIf i = 10 Then p = 0Print "个位数为" + Str(p) + "共" + Str(x(i)) + "个"Next iEnd Sub#######################################################################################2、最大公约数(最小公倍数)求两个正整数X和Y的最大公约数,可以使用递推算法,辗转相除得到。

用M表示被除数,N表示除数(M>N),R表示余数。

①输入两个正整数M和N,且M>N;②计算M除以N得余数R;③如果R不为0时,使M=N 和N=R后转移到第2步再次计算;④如果R=0时,N就是所求的最大公约数。

最小公倍数就是两个数的乘积再除以最大公约数的结果。

Private Sub Command1_Click( )Dim x, y, m, n, r As Integerx = Val(Text1.Text) : y = Val(Text2.Text) '从文本框中输入连个正整数If x > y Then '使得M>N ,即将两个正整数排序m = x : n = yElsem = y : n = xEnd IfDo '求最大公约数r = m Mod nm = n : n = rLoop While r <> 0'求最小公倍数并分行打印出两个结果Label3.Caption = "最大公约数为:" & m & vbCrLf & "最小公倍数为:" & x * y / m End Sub【说明】① x 和y 保存了两个正整数的原值,以便最后计算最小公倍数;② If 语句保证了m>n ,但省略If 语句也不会出错,因为r = m Mod n :m = n : n = r 会自动将较大的数交换到m 中。

###############################################################################3、穷举法解方程将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现,也称为“枚举法”。

这是一种“在没有其它办法的情况的方法”,是一种最“笨”的方法,然而对一些无法用解析法求解的问题往往能奏效,通常采用循环来处理穷举问题。

【百钱买百鸡】我国古代数学家张丘建在《算经》中曾提出一个有趣的“百钱买百鸡”问题。

题意为:已知用5文钱可以买一只公鸡,3文钱可以买1只母鸡,用1文钱可以买3只小鸡,如果要用100文钱买100只鸡。

请问公鸡、母鸡和小鸡应各买多少只?(1)分析:设变量x 表示公鸡,y 表示母鸡,z 表示小鸡。

则有方程组:⎪⎩⎪⎨⎧=++=++100100335z y x z y x 上述方程组中,有3个求和数,但只有两个方程,帮方程组有多个解。

为解决这类问题一般需要使用穷举法。

即先对各求知数的所有可能进行穷举,然后再依次判断哪些值能满足要求。

Private Sub Form_Click( )Dim x As Integer, y As Integer, z As Integer, num As LongFor x = 0 To 100For y = 0 To 100For z = 0 To 100num = num + 1If (x + y + z = 100 And 5 * x + 3 * y + z / 3 = 100) ThenPrint "公鸡="; x, "母鸡="; y, "小鸡="; zEnd IfNext zNext yNext xPrint "方法一的If语句测试了"; num; "次"End Sub(3)通过分析可知,公鸡、母鸡和小鸡的可能值为:0~20、0~33、100-x-y。

相关主题