版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Visual Basic 常用算法从逻辑结构上看, 应用程序 = 算法 + 数据结构。( 1)数据结构( Data-Structure ),计算机将数据元素依据某种逻辑联系进行存储和组织的方式。 许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重依赖于是否选择了 最优的数据结构。 选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。 这 种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。数据是对客观事物的符号表示, 在计算机科学中是指所有能输入到计算机中并由计算机程序处理 的符号的总称。( 2)算法( Algorithm
2、 ), 由基本运算及规定的运算顺序所构成的完整解题步骤。 一个算法应该具有以下五个重要的特征: 有穷性 ,算法必须保证执行有限步之后结束。 确切性 ,算法的每一步骤必须有确切的定义。 输入 ,算法有 0 个或多个输入, 以描述运算量的初始值。 0 个输入是指算法本身包含了初始值。 输出 ,算法有一个或多个输出,以反映对输入数据加工后的结果。没有结果的算法是毫无意 义的。 可行性 ,算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。计算机科学家尼克劳斯 -沃思曾著过一本著名的书数据结构十算法 = 程序,可见算法在计算 机科学界与计算机应用界的地位。算法的描述 :是对要解决一个问题
3、或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输 入什么数据、输出什么结果) 、采用什么结构、使用什么语句以及如何安排这些语句等。程序( Programme )就是用计算机语言描述的算法。 流程图( Flow Charts )就是图形化的算法。 解 决同一问题可以有多种算法描述 。实际问题的算法种类繁多,总体上可以分为两大类: 数值算法 和 非数值 法。对 VB 程序语言设计的初学者,可能会感到掌握控件的使用不难,难得的是理解和掌握算法。但是, 算法是程序的核心、编程的基础,离开算法,一事无成。我们将介绍常用的 VB 算法。、常见数学问题算法最终得到累加和。最终得到连乘积。0、连
4、乘积初值为11、累加和连乘累加是在原有和的基础上在循环体中 每次加上一个数,最后根据条件结束累加, 连乘是在原有积得基础上在循环体中 每次乘以一个数,最后根据条件结束连乘, 此类问题都要结合循环结构实现,根据问题确定循环变量的初值、终值或结束条件。【注意】 累加和变量、连乘积变量必须在循环外赋初值。一般累加和初值为 对于多重循环,赋初值在外循环体外还是在内循环体外根据实际问题决定。【计算n的近似值】用公式:Private Sub Form_Click()10A-6为止。 1 -11 -计算,直到最后一项的绝对值小于4357Dim s As In teger,t = 1pi = 0n = 1s
5、= 1第一项累加和初始值为0n As Sin gle,t As Sin gle,pi As Sin gle每一项的分母值 第一项符号pi = pi + tn = n + 2 s = -s t = s / nLooppi = pi * 4Print n =; piDo While (Abs(t) = 0.000001)将每一项求和,得到n /4的近似值产生每一项的分母值产生每一项的符号值e二11 丄-上1!2!3!二 1、- i=e i!n!i!产生每一项【斐不拉齐数列】输出斐不拉齐数列(Fibonacci)的前40个项:1、1、2、3、5、8、13、F1n = 1数列中的第1、2项为1,其后每
6、项都等于其前两项之和,其递推公式:F1n = 2Fn = Fn J Fn 0.00001e = e + t i = i + 1 n = n * i t = 1 / n将每一项加入累加和产生阶乘下一个乘数乘以乘数 i 得到每一项的阶乘 产生每一项Print 计算了 ;i; 项的和是 ; eLoopEnd Sub计数统计】 用随机函数产生 100 个0,99范围内的随机整数,统计个位上的数字分别为1,2,3, 4,5, 6,7,8, 9,0 的数的个数并打印出来。使用数组来处理, 用数组 a(1 to 100)存放产生的确 100 个随机整数, 数组 x(1 to 10) 来存放个位上的数字分别
7、为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范围内的随机整数,每行1 0个打印出来a(i) = Int(Rnd * 100)If a(i) N ),R 表示余数。 输入两个正整数 M和N,且MN : 计算M除以N得余数R : 如果R不为0时,
8、使M=N 和N=R后转移到第2步再次计算; 如果R=0时,N就是所求的 最大公约数。最小公倍数 就是两个数的乘积再除以最大公约数的结果。Private Sub Command1_Click( )Dim x, y, m, n, r As IntegerIfx yThe nm=xn =yElsem=yn =xEndIfDor =mMod nm=nn =rLoopWhile r 0x = Val(Textl.Text)y = Val(Text2.Text)从文本框中输入连个正整数使得MN,即将两个正整数排序求最大公约数求最小公倍数并分行打印出两个结果Label3.Caption = 最大公约数为:
9、& m & vbCrLf & ” 最小公倍数为:” & x * y / m End Sub【说明】 x和y保存了两个正整数的原值,以便最后计算最小公倍数;If语句保证了 mn,但省略If语句也不会出错,因为r = m Mod n : m = n : n = r会自动将较大的数交换到m中。#3、穷举法解方程将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现,也称为“枚举法”。这是一种“在没有其它办法的情况的方法”,是一种最“笨”的方法,然而对一些无法用解析法求解的问题往往能奏效,通常采用循环来处理穷举问题。5x 3y - -10013x y z = 100【百钱买百鸡】 我国古代
10、数学家张丘建在算经 中曾提出一个有趣的“百钱买百鸡”问题。题意为: 已知用5文钱可以买一只公鸡, 3文钱可以买1只母鸡,用1文钱可以买3只小鸡,如果要用 100文钱买 100只鸡。请问公鸡、母鸡和小鸡应各买多少只?(1)分析:设变量x表示公鸡,y表示母鸡,z表示小鸡。则有方程组:上述方程组中,有 3个求和数,但只有两个方程,帮方程组有多个解。为解决这类问题一般需要使用 穷举法。即先对各求知数的所有可能进行穷举,然后再依次判断哪些值能满足要求。Private Sub Form_Click()Dim x As In teger, y As In teger, z As In teger,num A
11、s 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) The nPrint 公鸡=;x,母鸡=;y,小鸡=;zEnd IfNext zNext yNext xPrint方法一的If语句测试了 ; num;次”End Sub(3)通过分析可知,公鸡、母鸡和小鸡的可能值为:020、033、100-x-y。Private Sub Form_Click ()Dim x As In teger,y As In teger
12、,z As In teger, num As In tegerFor x=0 To 20For y=0 To 33z=100-x-ynum=nu m+1If 5*x+3*y+z/3=100 The nPrint 公鸡=” ;x;母鸡=” ;y; 小鸡=” ;zEnd ifNext y, xPrint 方法二If语句测试;num; ”次”End Sub【说明】 通过num变量可以测试循环的次数,还可以使用系统变量Now测试循环使用的时间。 在方法二中两层循环的Next相邻时,可以合而为一:Next y, x。【注意】在多重循环中,为了提高运行的速度,要考虑对程序优化问题: 利用已知条件,尽量减少
13、循环的次数。 合理地选择内、外层的循环控制变量,即将循环次数多的放在内循环 。 尽量少用变体型变量,在方法一中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 20For j = 1 To 100 - ik=100 - i - jIf 5 * i + 1 * j + 0.5 * k = 100The nPrint i, j,
14、kEnd IfNext jNext 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
15、 As In teger,k As In teger, i As In tegerm=Val(InputBox( “请输入一个正整数: ” )k=Sqr(m)For i=2 To k If m Mod求 m 的平方根从 2 到 k 测试是否为 i=0 Then Exit Form 的因子,如果是素数则正常退出循环找到一个因子,不是素数则提前退出循环Next iIf ik Then 根据结束循环的方式,打印素数判断的结果 Print m, ”是素数 ”ElsePrint m, ”不是素数 ”End IfEnd Sub【说明】如果程序是因为找到了一个能整除 m 的数,而通过 Exit for 语句
16、退出 For 循环的,则 ik)来判断“是素数”或“不是素数”。【随机产生素数】 随机产生 20 个两位素数。Private Sub Form_Click ()Dim m As Integer, count As Integer, i As Integer, k As Integer RandomizeDo Until count=20 m=Int(Rnd*90)+10 k=Sqr(m)For i=2 To kIf m Mod i=0 Next iIf ik ThenPrint m; ” count=count+1随机产生一个两位十进制数判断该数是否素数Then Exit For 如果是素数则
17、打印输出到窗体上,并计数加1JIf count Mod 10=0 Then Print 一行打印输出 10 个End IfLoopEnd Sub【说明】 首先通过随机函数产生一个两位整数,然后再判断该整数是否是素数。如果是素数,则素数计数器count加1;如果不是素数,则产生下一个随机数。程序反复执行,直到产生20个满足条件的随机素数为止。 外循环是一个 Do Un tilLoop循环,内循环是一个 ForNext循环。 语句“If count Mod 10=0Then Print”的作用,是保证每行输出 10个素数。【寻找素数】 找出 100以内的素数。Private Sub Command
18、1_Click( )Dim i As Integer, m As IntegerText1.ForeColor = vbRedText1.Text = For m = 2 To 100For i = 2 To m - 1If m Mod i = 0 Then GoTo NotS不是素数则停止判断,直接退出当前的两层循环Next iText1.Text = Text1.TextIIIINotS: Next mEnd Sub上述循环体内只要能被 i整除,就不可能是素数,可利用 GoTo语句退出循环。但程序中尽量少用或 不用GoTo语句,通过设计一个标志变量 Flag,在循环体内用Flag记录素数的
19、判断结果,在循环结束后再 根据Flag显示判断结果。Private Sub Comma nd2_Click()Dim i As In teger,m As In teger,Flag As Boolea nText1.ForeColor = vbBlueText1.Text =For m = 2 To 100Flag = True假设待判断的 m为素数,将标志变量修改为TrueFor i = 2 To m - 1If m Mod i= 0The n Flag = False不是素数,则将素数标志变量修改为FalseNext iIf Flag The n Text1.Text = Text1.T
20、ext & mNext mEnd SubIf If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If IfII II II II II II II II II II II II II II II II II II II II II II II II II II II II II
21、 II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II5、最大值和最小值在若干个数中求最大值,一般先假设一个较小的数为最大值的初值,若无法估计较小的值,则取第一 个数为最大值的初值,然后将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,依次逐 一比较。【最短残料】有一根长度为321m的钢材料,要将它截取成两种规格的短料,规格a、b的长度分别为17m和27m,每种至少1段,分隔成a、b各多少段后,剩余的残料r最少?该题利用二
22、重循环求残料r的最小值正数,因为残料不可能为负。Private Sub Form_Click()Dim a%,b%,r!, ia%, ib%, t!最小值初值取钢材料的长度b最多的段数a最多的段数当前的残料当前的残料 =零并且比最短的残料小r = 321For b = 1 To In t(321 - 17) / 27)For a = 1 To In t(321 - b * 27) / 17)t = 321 - b * 27 - a * 17If t = 0 And t rThe nr = t求最短的残料ia = a最短残料时a的段数ib = b最短残料时b的段数End IfNext aNeXt
23、bPrint 最短残料时a 的段数: ;iaPrint 最短残料时b 的段数: ;ibPrint 最短残料为:; rEnd Sub【寻找最大值和最小值】 从 10个范围 1, 100随机数中找出其最大值和最小值。 Private Sub Form_Click( )Dim a(1 To 10) As Integer, i As IntegerDim min, max As Integer, minindex As Integer, maxindex As Integer For i = 1 To 10a(i) = Int(Rnd * 100) + 1Print a(i);Next iPrintm
24、in = a(1) : max = a(1) :minindex = 1: maxindex = 1For i = 2 To 10Ifa(i) maXThenmaX= a(i) :maXindeX = iNeXtiPrint第&minindeX& 个数最小:& minPrint第&maXindeX& 个数最大:& maXEnd SubII II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II
25、II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II IIa a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a6、递推(迭代)“递推法” 也称为 “
26、跌代法 ”,把一个复杂的计算过程转化为 “简单过程的多次重复” 。每次重复都 从旧值的基础上 “递推” 出新值,并由 “新值代替旧值” 进行下一次递推。算法思想:对于一个问题的求解 x,可由给定的一个初值 X0,根据某一迭代公式得到一个新的值 X1, 这个新值X1比初值X0更接近要求的值X;再以新值作为初值,即: X1TX0,重新按原来的方法求 X1,重复 这一过和直到|X1-XO| 0 The nPrint x &” 的平方根为:”;Fsqrt(x)ElseIf x = 0The nPrint 0的平方根为0!ElsePrint 此数不能求平方根! ”End IfEnd SubPrivate
27、 Function Fsqrt( a As sin gle ) AS sin gleDimx0 As Sin gle,x1 As Si nglex0 =a/2迭代初值x1 = 0.5*(x0 + a/x0)Dox0 = x1为下一次迭代作准备x1 = 0.5*(x0 + a/x0)Loop While Abs(x1 - x0) 0.00001Fsqrt=x1End FunctionIf If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If
28、If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If IfII II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II I
29、I II II II II II II II II II II II II II II II II II II II II II7、二分法解高次方程假设方程f(x)=0在区间(a, b)内有唯一的根x,则f(a)与f(b)的符号必然相反。二分法利用这个性质进 过若干次迭代缩小根所在的区间,得到一个在一定误差范围内的近似根。(a)方程的根在中点左侧(b)方程的根在中点右侧二分法求根示意图 取(a, b)的中点X0=(a+b)/2,将求根区间分成两半,开始缩小根的区间。 如果f(x。)与f(a)同号,则根的真值x在中点X。的右侧,如图(b)所示。这时根的取值区间缩小为 (X0 ,b),即用X0取代
30、a的位置。如果f(x0)与f(a)异号,则根的真值x在中点X0的左侧,如图(a)所示。这 时根的取值区间缩小为(a, X0),即用X0取代b的位置。 根据新的区间范围重复“取中点判断”,直到f(x0)=0或区间长度b-a则X0即为方程f(x)=0的近似根,误差小于。【二分法求解方程】求方程x3+4x2-10=0在区间(1,4)内的实数根。要求精确到小数点后第4位。Private Sub Form_Click()Dim a, b, x As Doublea = 1:b = 4While b - a 0.00001x = (a + b) / 2fl = a A 3 + 4 * a A 2-10f
31、= x a 3 + 4 * x a 2-10求出根所在区间的中间点x求左边界点a的方程值求中间点x的方程值If f1 * f 0The na = x Else b = x根据两个方程值的符号异同,缩小根的区间范围End IfWendPrint x=; Cln t(x * 10000) / 10000End SubIf If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If If
32、 If If If If If If If If If If If If If IfII II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II&牛顿切线法解高次方程给方程f(x)假定一个初值 X0作为方程的近似根,牛顿切线法迭 代公式为:Xi* =Xi 一 f/x), f/(Xi )是f
33、(x )的导数,经过若干次f (x )迭代后,当 为卅-xl兰E时,Xi卅就作为方程的高精度近似根。由图可知,牛顿切线法的实质是逐步以切线与X轴的交点来作为曲线与X轴交点的近似值。【牛顿切线法解高次方程】求方程f(x)=3x 3- 4x2-5 x+13=0的根。Private Sub Form_Click()Dimx, x0, f, f1 As Doublex0 =3假设一个初始近似根Dof =3 * x0 a 3 - 4 * x0 a 2 - 5 * x0 + 13求近似根的方程值f1=9 * x0 a 2 - 8 * x0 -5求近似根的导数方程值X=x0 - f / f1根据牛顿切线公式
34、计算新的近似根XIfAbs(x - x0) 為 nx1i,k nx2k,j心(n为nx1的列数或nx2Option Base 1Private Sub Form_Click()Dim nx1(4, 2) As In teger,n x2(2, 3) As In teger,n x3(4, 3)Print第一个数组nx1为:”For i = 1 To 4For j = 1 To 2nx1(i, j) = Val(lnputBox(输入第一个数组 nx1 :)Printn x1(i, j);Space(10 - Len (Str( nx1(i, j);Next jPrintNext iPrint第
35、二个数组nx2为:”For i = 1 To 2For j = 1 To 3nx2(i, j) = Val(lnputBox(输入第二个数组 nx2 :)Printn x2(i, j);Space(10 - Len (Str( nx2(i, j);Next j矩阵的列数必须等于 nx2矩阵的行 nx3矩阵中各元素的值为:的行数)As In tegerPrintNext iPrint 结果的第三个数组 nx3 为:For i = 1 To 4For j = 1 To 3nx3(i, j) = 0For k = 1 To 2 nx3(i, j) = nx3(i, j) + nx1(i, k) *
36、nx2(k, j)Next kPrint nx3(i, j); Space(10 - Len(Str(nx3(i, j);Next jPrintNext iEnd SubII II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II IIIl II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026全国海船船员考试(船长及甲板部(航海学9209))历年参考题库含答案详解
- 2026年定边县秋季公开临聘引进医学卫生类专业技术人员(60人)笔试备考试题及答案解析
- 2026住院医师规培-湖南-湖南住院医师规培(急诊科)历年参考题库含答案详解
- 2026住院医师规培-河南-河南住院医师规培(耳鼻咽喉科)历年参考题库含答案详解
- 2026住院医师规培-江苏-江苏住院医师规培(放射科)历年参考题库含答案详解
- 四川奥库科技有限公司招聘总账会计岗位笔试备考题库及答案解析
- 2026年定边县秋季公开临聘引进医学卫生类专业技术人员(60人)考试模拟试题及答案解析
- 新版药品GCP考试模拟试卷及参考答案
- 曼氏血吸虫病治疗模拟试卷及参考答案
- 北师大版数学 1.2从立体图形到平面图形(第2课时) 学案 含答案
- 2025年农业发展银行(江西省分行)校园招聘笔试考试题库及答案详解
- 2026年甘肃高考政治真题试卷(含答案)
- 董明珠的人物介绍
- 《餐饮行业碳减排量核算指南 减少食品浪费》
- 电缆施工方案大全(3篇)
- GB/T 3871.4-2025农业拖拉机试验规程第4部分:后置三点悬挂装置提升能力
- 配电线路巡视培训课件
- 2025至2030中国毛呢防寒外套行业发展趋势分析与未来投资战略咨询研究报告
- 2026年轨道交通行业面试题详解
- 湖北中烟工业限责任公司2025年下半年招聘83人(管理技术类)易考易错模拟试题(共500题)试卷后附参考答案
- 印度舞课件教学课件
评论
0/150
提交评论