VB常用算法总结大全.ppt

上传人:李医生 文档编号:6229527 上传时间:2020-10-05 格式:PPT 页数:83 大小:311.50KB
返回 下载 相关 举报
VB常用算法总结大全.ppt_第1页
第1页 / 共83页
VB常用算法总结大全.ppt_第2页
第2页 / 共83页
VB常用算法总结大全.ppt_第3页
第3页 / 共83页
VB常用算法总结大全.ppt_第4页
第4页 / 共83页
VB常用算法总结大全.ppt_第5页
第5页 / 共83页
点击查看更多>>
资源描述

《VB常用算法总结大全.ppt》由会员分享,可在线阅读,更多相关《VB常用算法总结大全.ppt(83页珍藏版)》请在三一文库上搜索。

1、常用算法总结算法是对某个问题求解过程的描述,一、基本算法 1.累加、连乘,1100的5或7的倍数的和 Sum = 0 For i = 1 To 100 If i Mod 5 = 0 Or i Mod 7 = 0 Then Sum = Sum + i End If Next i Print Sum,310的乘积 t = 1 For i =3 To 10 t = t * i Next i Print t,思考:若把循环体前面置各变量初值的语句放在循环体内,程序运行时会产生什么情况?,例求自然对数e的近似值,要求其误差小于0.00001,近似公式为: 该例题涉及两个问题: (1)用循环结构求级数和的

2、问题。本例根据某项值的精度来控制循环的结束与否。 (2)累加:e=e+t 循环体外对累加和的变量清零 e=0 连乘:n=n*i 循环体外对连乘积变量置1 n=1 Private Sub Form_Click() Dim i%,n e End Sub,2.求素数 判别某数m是否为素数最简单的方法是: 对于m 从i=2,3,m-1判别m能否被i整除,只要有一个能整除,m不是素数,否则m是素数。 For m = 2 To 100 For i = 2 To m - 1 If (m Mod i) = 0 Then exit for Next i if Im-1 then msgbox str(m)+”是

3、素数” Else msgbox str(m)+”不是素数” End If Next m,m是否为素数,求100以内的素数,3.穷举法 “穷举法”也称为“枚举法”或“试凑法”, 即将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现。 例百元买百鸡问题。假定小鸡每只5角,公鸡每只2元,母鸡每只3元。现在有100元钱要求买100只鸡,编程列出所有可能的购鸡方案。 设母鸡、公鸡、小鸡各为x、y、z只,根据题目要求,列出方程为: x+y+y=100 3x+2y+0.5z=100 三个未知数,两个方程,此题有若干个解。 解决此类问题采用“试凑法”,把每一种情况都考虑到。 方法一:最简单三个

4、未知数利用三重循环来实现。 方法二:从三个未知数的关系,利用两重循环来实现。,方法一: Private Sub Form_click() Dim X%,y%,z% For X=0 To 100 For Y=0 To 100 For Z= 0 To 100 If X+y+z=100 And 3*x+2*y+.5*z=100 Then Print X,y,z End If Next Z Next Y Next X End sub,方法二: For X= 0 To 33 For Y= 0 To 50 Z=100-x-y If 3*x+2*y+.5*z=100 Then Print X, Y, Z E

5、nd If Next Y Next X,4.递推法 “递推法”又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都从旧值的基础上递推出新值,并由新值代替旧值。 例 猴子吃桃子。小猴在一天摘了若干个桃子,当天吃掉一半多一个;第二天接着吃了剩下的桃子的一半多一个;以后每天都吃尚存桃子的一半零一个,到第7天早上要吃时只剩下一个了,问小猴那天共摘下了多少个桃子? 分析:这是一个“递推”问题,先从最后一天推出倒数第二天的桃子,再从倒数第二天的桃子推出倒数第三天的桃子。 设第n天的桃子为xn,那么它前一天的桃子数是xn -1。,已知:当N=7第7 天的桃子数为1,则第6天

6、的桃子数由公式得4个,依次类推,可求得第1 天的桃子数。 程序如下: Private sub form_click() Dim I as integer x=1 print “第7 天的桃子数为:1只” for I=6 to 1 step 1 x=(x+1)*2 print “第”; I; ” 天的桃子数为:” ; x ; ”只” next I End sub,5.最小、最大值 在若干个数中求最大值,一般先假设一个较小的数为最大值的初值,若无法估计较小的值,则取第一个数为最大值的初值;然后将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值;依次逐一比较。例随机产生10个100200之

7、间的数,求最大值。,Private Sub Command1_Click() Max = 100 For i = 1 To 10 x = Int(Rnd * 101) + 100 Print x; If x Max Then Max = x Next i Print Print 最大值=; Max End Sub,6、求最大公约数,Private Sub Command1_Click() Dim m, n, r As Long m = Val(Text1.Text) 取数据M n = Val(Text2.Text) 取数据N If m Int(m) or m Int(n) or n 1 The

8、n Text3.Text = 数据错误! Else Do 求最大公约数 r = m Mod n m = n n = r Loop Until r = 0 Text3.Text = CStr(m) 输出最大公约数 End If End Sub,判断数据是否合法,Private Sub Form_Click() For i = 1 To 9 For j = 1 To 9 Print i; *; j; =; i * j; Next j Print Next i End Sub 执行本程序,窗体上将显示九九乘法表。,For j = 1 To i,7、关于循环嵌套(一个循环体内又包含了一个完整的循环结构

9、称为循环的嵌套.),换行!,作用?,例:xh2.vbp Ssfrm.frm,思考:打印上三角或下三角程序如何改动?要打印下三角? 8. 打印图形 见下页,编写程序打印如右边图形: Private Sub Form_Click() For i = 1 To 4 Print Space(5 - i); For j = 1 To 2 * i - 1 Print *; Next j Print Next i Print End Sub,* * * *,* * * *,外循环用来控制输出的行数及每行第一个字符的输出位置,内循环用来控制每行输出的字符个数。,例:xh2.vbp shjs.frm,9.判断同

10、构数(复习材料 P39 第7题),10.找亲密对数 P111 例5-10 11.判断完数 实验P55 实验7-2 12.计算多项式 的和 实验P51 实验6-3 13.求一个正整数K的各位数字之和 复习材料P33 4.4练习题 第1题 14.报数问题 P114 例5-12 15.判断回文数 复习材料 P41 第10题 或P81 习题4,16.求自然数的因子 P81 习题5,Private Sub Command1_Click() Dim a As Integer, I% a = InputBox(输入一个自然数) Label1.Caption = Str(a) + 的所有因子: For I =

11、 1 To a-1 If a Mod I = 0 Then List1.AddItem (Str(I) End If Next End Sub,二、数组的算法,1. 数组元素的赋初值 (1)用循环 For i = 1 To 10 A(i)=0 Next i for I=1 to 10 for J=1 to 10 B(I,J)=0 next J next i,(2) Array函数 Dim ib As Variant ib = Array(abc, def, 67) For i = 0 To UBound(ib) Picture1.Print ib(i); ; Next i,注意: (1)利用A

12、rray对数组各元素赋值,声明的数组是可调数组或连圆括号都可省,并且其类型只能是Variant。 (2)数组的下阶为零,上界由Array函数括号内的参数个数可决定,也可通过函数Ubound获得。,2数组的赋值 在VB6.0中,提供了数组直接对数组的赋值。 例如: Dim a( ) As Variant, b( ) As Variant, i% a = Array(1, 2, 3, 4, 5) ReDim b(UBound(a) b = a,For i = 0 To UBound(a) b(i) = a(i) Next i,相当于,注意:赋值号左边的数组只能声明为 Variant的可调数组或简单

13、变量。,3. 数组的输出 输出方阵SC中的下三角元素 For i = 0 To 4 For j = 0 To I j=0 to 4 则输出整个数组 sc(i, j) = i * 5 + j Print sc(i, j); ; Next j Print 换行 Next I,4. 将数组中各元素交换(P115习题1) For i =1 To 152 t=A(i) A(i)=A(10-i+1) A(10-i+1)=t Next i,5、对数组的行/列操作(行、列的和),P115习题3:求二维数组每行的和数与每列的和数,数组元素为19之间的随机数。,Option explicit Option bas

14、e 1 生成数组 Private Sub Command1_Click() For I = 1 To 4 For J = 1 To 5 A(I, J) = Int(9 * Rnd) + 1 Picture1.Print A(I, J); Next J Picture1.Print Next I End Sub,求列和 Private Sub Command2_Click() For J = 1 To 5 L(J) = 0 For I = 1 To 4 L(J) = L(J) + A(I, J) Next I Text2 = Text2 next j print Next I End sub 除

15、法:除法操作必须先判别分母不为零,然后再进行对应元素的除法操作。,7、求数组靠边元素之和, 不靠边元素之和 P115习题6,Option base 1 Private sub form_click() Dim X%(4,5), s%(4), sum% For I=1 to 4 s(I)=0 for j=1 to 5 x(I,j)=i next j Next i For J=1 to 5 S(1)=S(1)+X(1,J) S(4)=S(4)+X(4,J) Next j,1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4,For I=2 to 3 S(2)=S(2)+X

16、(I,1) S(3)=S(3)+X(I,5) Next i for I=1 to 4 SUM=SUM+S(I) Next i print SUM End sub,8,求数组对角线元素之积或和,Option base 1 Private sub form_click() Dim X%(4,4), S1 Next J Print Next I For I = 1 To 5 MAXI(I) = A(I, 1) For J = 1 To 8 If MAXI(I) A(I, J) Then MAXI(I) = A(I, J) Next J Print 第; I; 行的最大值是:; MAXI(I), Ne

17、xt I Print,生成数组并输出,求每行最大 并输出,9.求二维数组中每行/列元素的最大/最小,For J = 1 To 8 MAXJ(J) = A(1, J) For I = 1 To 5 If MAXJ(J) A(I, J) Then MAXJ(J) = A(I, J) Next I Print 第; J; 列的最大值是:; MAXJ(J), If J Mod 5 = 0 Then Print Next J End Sub,求每列最大 并输出,10求鞍点元素,该元素所在行为最大,所在列为最小,P115 习题7 生成数组 Private Sub Command1_Click() Dim

18、I%, J% M = InputBox(请输入数组的行数) N = InputBox(请输入数组的列数) ReDim A(M, N) For I = 1 To M For J = 1 To N A(I, J) = Int(90 * Rnd) + 10 Picture1.Print A(I, J); Next J Picture1.Print Next I End Sub,10求鞍点元素,该元素所在行为最大,所在列为最小,P115 习题7 找鞍点数 Private Sub Command2_Click() Dim I%, J%, Max%, Col%, Flg% For I = 1 To M M

19、ax = A(I, 1) Col = 1 For J = 2 To N If Max A(J, Col) Then Exit For Next J If J N Then Text1.Text = 鞍点元素是 next j print Next i For I=1 to 5 for j=1 to 3 y(I,j)=int(100*rnd)+1 print y(I,j) next j print Next i,11、矩阵乘法,For L=1 to 4 for J=1 to 3 Z(L,J)=0.0 for I=1 to 5 Z(L,J)=Z(L,J)+X(L,I)*Y(I,J) next i n

20、ext j Next L For I= 1 to 4 for j=1 to 3 print z(I,j); next j print Next i End sub,12、矩阵转置 P116 习题10/复习资料P60 第5题,Option Explicit Option Base 1 Dim A() As Integer, B() As Integer, N% Private Sub Command1_Click() 生成数组 Dim I%, J% N = InputBox() ReDim A(N, N) For I = 1 To N For J = 1 To N A(I, J) = Int(R

21、nd * 100) + 1 Text1 = Text1 (2)除第1个数外,其余n-1个数再按(1)的方法选出次小的数,与第2个数交换位置; (3)重复(1)n-1遍,最后构成递增序列。,Private Sub Command1_Click() Dim Sort(10) As Integer, temp% Dim i As Integer, j% Randomize For i = 1 To 10 Sort(i) = Int(Rnd * 99) + 1 Text1 = Text1 Next i End Sub,例: 排序运动员的成绩,已知8名运动员100米成绩,请排出他们的名次(成绩相同名次相

22、同,成绩由键盘输入),本题的难点并不在排序,可以很轻松地用冒泡法或选择法排序进行成绩从小(快)到大(慢)的排列。问题是排序后的成绩对应于哪一个运动员,一维数组是无法记录的。因此就要定义一个二维数组,其中第一列放运动员的成绩,第二列存放成绩对应的运动员号。按二维数组的第一列排序后,产生交换不仅要交换第一列的数组元素,还要交换第二列的数组元素,这样运动员的编号就能跟着成绩“跑了”。在输出名次时,也要注意成绩相同、名次相同的问题。,排序过程(选择法排序) Private Sub sort(cj() As Single) Dim temp As Single For i = 1 To 7 For j

23、= i + 1 To 8 If cj(i, 1) cj(j, 1) Then temp = cj(i, 1): cj(i, 1) = cj(j, 1): cj(j, 1) = temp temp = cj(i, 2): cj(i, 2) = cj(j, 2): cj(j, 2) = temp End If Next Next End Sub,输出名次过程 Private Sub output(cj() As Single) Dim j As Integer, p As Integer p = 1 Print 第; 1; 名是; cj(1, 2); 号运动员,成绩是:; cj(1, 1) For

24、 j = 2 To 8 If cj(j, 1) = cj(j - 1, 1) Then Print 第; p; 名是; cj(j, 2); 号运动员,成绩是:; cj(j, 1) Else Print 第; j; 名是; cj(j, 2); 号运动员,成绩是:; cj(j, 1) p = j End If Next Print End Sub,窗体事件过程 输入运动员成绩 Private Sub Form_Click() Dim i As Integer Dim pro As String, cj(8, 2) As Single Randomize For i = 1 To 8 pro = 请

25、输入第 + Str(i) + 位运动员的成绩: cj(i, 1) = InputBox(pro) cj(i, 2) = i Print cj(i, 1); Next Print Print Call sort(cj) Call output(cj) End Sub,15.数组元素的插入与删除 (1) 插入 排序 复习材料 P50 第23 在有序数组a(1 to n)(原有n-1个元素)插入一个值Key元素, 算法: 查找要插入的位置k(1=k=n-1),腾出位置,把最后一个元素开始到第K个元素往后移动一个位置, 第k个元素的位置腾出,就可将数据Key插入,Private sub command

26、1_click Dim a%( 11), I%,J% ,X% For I= 1 to 10 a(I)=I*5+1 通过程序自动生成有规律的数组 Next I X=Inputbox(“输入任意数X:”) For I= 1 to 10 查找欲插入数X在数组中的位置 if Xa(I) then exit for 找到插入的位置下标为I Next I For J=11 to I+1 step 1 从最后元素开始往后移,腾出位置 a(J)=a(J-1) Next J A(I)=X End sub,(2) 删除重复元素见 P113 例5-11 首先也是要找到欲删除的元素的位置k;然后从k+1到n个位置开始

27、向前移动;最后将数组元素减1。例如,要将值为13的元素删除的过程为:,Dim a() as integer 声明为动态数组 . Redim a( 1 to n) 声明为有N个元素的数组 查找到要删除的元素下标为K For I=k+1 to N 从K+1个元素开始往前移 A(I-1)=a(I) Next I 最后一个元素的位置空出,利用数组重新声明减少一个元素,但要保留原来值 Redim preserve a( 1 to n-1),排序法有:选择、冒泡、插入法排序及合并排序等。 前两种排序欲排序的数据全部输入后,再进行排序; 插入法排序每输入一项,马上插入到数组应在的位置,数组始终有序。用插入排

28、序法输入不多于20个数,使数组保持递增的序列。对数组中已有N-1个有序数,当输入某数X时,插入排序法实现的步骤: (1)输入欲排序的数据项x;在数组a中找x应所处的位置j; (2)从数组的最后一个元素开始到下标j依次往后移,使j位置空出; (3)将x放入位置j处,一个数据插入完成; (4)有若干个数重复(1)(3)。 对于若干个数输入,只要调用插入排序过程即可。,Dim n As Integer Sub insert(a() As Single, ByVal x!) Dim i%, j% j = 1 Do While j a(j) j = j + 1 Loop For i = n - 1 To

29、 j Step -1 a(i + 1) = a(i) Next i a(j) = x End Sub,Private Sub Text1_KeyPress(KeyAscii As Integer) Static bb!(1 To 20) Dim i% If n = 20 Then MsgBox 数据太多!, 1, 警告 End End If If KeyAscii = 13 Then n = n + 1 Call insert(bb(), Val(Text1) Picture1.Print Text1 For i = 1 To n Picture2.Print bb(i); Next i Pi

30、cture2.Print Text1 = End If End Sub,数组的合并排序,从键盘读取数组a和b(各5个元素),a,b都是严格递增的(即元素从小到大排列,且无重复元素),将a,b合并成c数组,使C也严格递增。 若a,b中有相同的元素只保留一个,最后输出数组C。编写通用过程OutPut,在窗体上打印数组。,Option Explicit Dim a(5) As Integer, b(5) As Integer, c() As Integer Private Sub output(d() As Integer) 输出数组的通用过程 Dim i As Integer For i = 1

31、To UBound(d) Print d(i); Next i Print End Sub,Private Sub Command1_Click() 数组输入 Dim i As Integer For i = 1 To 5 a(i)=InputBox(“输入数组a(“+str(I)+”)”) Next i Print 数组A: Call output(a) For i = 1 To 5 b(i)=InputBox(“输入数组b(“+str(I)+”)”) Next i Print 数组B: Call output(b) End Sub,Private Sub Command2_Click()

32、数组合并输出 Dim p As Integer, q As Integer, r As Integer Dim i As Integer p = 1: q = 1: r = 1 Do While p b(q) Then c(r) = b(q) r = r + 1 q = q + 1 ElseIf a(p) b(q) Then c(r) = a(p) r = r + 1: p = p + 1 Else c(r) = a(p) r = r + 1: p = p + 1: q = q + 1 End If Loop,If p = 5 Then ReDim Preserve c(r) For i =

33、q + 1 To 5 c(r) = b(i): r = r + 1 Next i End If If q = 5 Then ReDim Preserve c(r) For i = p + 1 To 5 c(r) = a(i): r = r + 1 Next i End If Call output(c) End Sub,16、查找: (1).顺序查找 P104例5-4 顺序捡索捡索(search):又称为查找,就是从一组数据中找出所需的具有某种特征的数据项。 它是数据处理中应用很广泛的一种操作,最简单的检索方法是顺序捡索。其方法是从一组数据的第一项开始逐个比较,直到找到该数据项,或全部数据都比

34、较完也没找到该数据为止。,Option ExplicitPrivate Sub Form_Click() Dim Search(10) As Integer, I As Integer Dim S As Integer For I = 1 To 10 Search(I) = Int(Rnd * 100) + 1 Print Search(I) Next I S = Val(InputBox(输入要查找的数) For I = 1 To 10 If Search(I) = S Then Exit For Next I If I = 10 Then Print 要找的数是 Search(; I; )

35、 Else Print 没找到 ! End IfEnd Sub,(2)二分查找 P106 例5-5 其方法是:1)、找出中间位置Mid,判断查找数椐K与A(Mid) 是否相等,若相等则已找到。(2)、如果KA(Mid)则表明K可能在A(Mid)与A(Bot)区间内,因此重新设置: TopMid1 (3)、如果KA(Mid)则表明K可能在A(Top)与A(Mid)区间内,因此重新设置: BotMid1 重复以上步骤,每次查找区间减少一半,如此反复,其结果是查到此数,或查不到此数。,Private Sub Cmd生成数组_Click() Dim V As Variant Search = Arra

36、y(12, 17, 23, 28, 30, 39,_ 41, 46, 57, 61, 78, 83, 85, 89, 93) For Each V In Search Text1 = Text1 chr(j+64);“=”;a(j); Next j End sub,(4).字符串处理 编写一个英文打字训练的程序.要求如下: (1)在标签框内随机产生30个字母的范文; (2)当焦点进入文本框时开始计时,并显示当时时间; (3)在键入文本框按产生的范文输入相应的字母; (4)当键入满了30个字母结束计时,禁止向文本框输入内容 ,键入的字符逐一范文比较,显示打字的速度和正确率。,Private Su

37、b Command1_Click() 产生30个字母的范文 Randomize Text1 = For i = 1 To 30 a = Chr$(Int(Rnd * 25) + 65) 随机产生大写字母 Text1 = Text1 + a 产生的大写字母送入范文框 Next i End Sub,Private Sub Command2_Click() End End Sub Private Sub Text2_GotFocus() 输入文本框获取焦点,开始计时 t = Time End Sub,Private Sub Text2_KeyPress(KeyAscii As Integer) If

38、 Len(Text2) = 30 Then 输入满30个字符 t2 = DateDiff(“s”, t, Time) 计算速度 Text3 = t2 & “秒” 显示速度 Text2.Locked = True 不允许修改 y = 0: n = 0 For i = 1 To 30 比较正确率 If Mid(Text1, i, 1) = Mid(Text2, i, 1) Then y = y + 1 Else n = n + 1 End If Next i y = y / (y + n) * 100 Text4 = y & % End If End Sub,5.密码翻译 实验P55 实验6-66

39、.字符串颠倒后输出 实验P52 实验6-4,四、数值计算算法,(1).高次方程求根 有牛顿迭代法、二分法、弦截法等 (1)牛顿迭代法 迭代公式: 思想: 对方程给定一个初值x0作为方程的 近似根,利用迭代公式,求得x1, 当 x1为求得的近似根,否则x1作为x0再迭代。,P78例4-9 用牛顿迭代法求方程xex-1=0在0.5b附近的根。 Private Sub Command1_Click() Dim x as single, x1 as single, eps As Single x = InputBox(输入初始值X:, 例4-8) eps = InputBox(输入允许误差EPS:,

40、例4-8) Do x1 = x x = x1 - (x1 * Exp(x1) - 1) / (Exp(x1) * (x1 + 1) Loop Until Abs(x - x1) = eps Text1.Text = Str(x) End Sub,(2) 二分法求根P83 习题13 思想: 已知求根区间a,b有一根,每次把求根区间缩小一半,直到找到解或求根区间足够小。 方法:求a,b的中点c,判断 f(c)=0, c为求得的根,结束; f(a)与f(c)同号,则a,c无根,代替a; 否则c,b无根,c代替b; 使求根区间缩小一半,重复上述步骤,直到区间小于精度。,Private Sub Comm

41、and1_Click() Dim a!, b!, c!, fa!, fb!, fc!, eps! a = InputBox(输入初始值A:, 习题P80-16) b = InputBox(输入初始值B:, 习题P80-16) eps = InputBox(输入允许误差值eps:, 习题P80-16) fa = a 3 - a 4 + 4 * a 2 - 1 fb = b 3 - b 4 + 4 * b 2 - 1 End Sub,If fa * fb 0 Then a = c Else b = c End If Loop Text1.Text = Str(c) Else Text1.Text

42、= 该方程在 & a & 到 & b & 之间无根! End If,(3).数值积分 有矩形法、梯形法、抛物线法(又称辛卜生法)等。 梯形法积分的思想是: 将积分区间a,bn等分,小区间的长度为, 第i块小矩形的近似面积为: 整个积分的结果为这n块小面积的累加,即 :,Public Function trapez(ByVal a!, ByVal b!, ByVal n%) As Single Dim sum!, h!, x! h = (b - a) / n sum = (f(a) + f(b) / 2 For i = 1 To n - 1 x = a + i * h sum = sum + f(x) Next i trapez = sum * h End Function,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1