完整word版,vb常用算法介绍

完整word版,vb常用算法介绍
完整word版,vb常用算法介绍

一、累加算法

如果在设计过程中遇到求1+2+3+……+100等连加问题时,就可以用累加算法来解决。

累加算法的一般做法是设一个变量s,作为累加器使用,初值为0,设一个变量用来保存加数。一般在累加算法中的加数都是有规律可循,可结合循环程序来实现。一个循环程序的设计,如果以下三方面确定下来:变量的赋初值、循环体的内容、循环结束条件,那么根据循环语句的格式,就很容易写出相应的循环程序。

例:求1+2+3++100的累加和,并打印输出

分析:

设累加器S,初值为0,加数用变量I表示

当I=1时,累加器S= S+I = 0+1=1

当I=2时,累加器S= S+I =1+2= 3

当I=3时,累加器S=S+I =3+3 =6

当I=4时,累加器S=S+I =6+4 =10

……

当I=100时,累加器S=S+100=1+2+3+……+99+100=5050

不难看出,I的值从1变化到100的过程中,累加器均执行同一个操作:S=S+I,S=S+I 的操作执行了100次,所以该程序段可写成:

Dim I As Integer, S As Integer

S = 0 ‘给累加器s赋初值

For S = 1 To 100

S= S + I ‘I既作为循环变量,又作为加数

Next I

Print "1+2+……100="; S

考虑一下:语句Print "1+2+……100="; S可以放在循环体中吗?

延伸一下:

上述算法对数值型数据,执行的是累加操作,如果对字符串型数据,完成的是字符串的连接。

例:从键盘上输入一串字符,要求将其加密后显示在文本框Text1中,加密的方法是将每一个字符转变为它的后一位字符,如:A转变为B,1转变为2。

分析:

因为涉及对每一个字符做相应处理再连接成一个新串,所以可以用类似累加的算法。定义一个变量str1用来接收输入的原始字符串,变量str2用来接收加密后的字符串,初值为空串。可用Len()函数得出字符串的长度,用循环控制,从左向右逐个取字符,截取字符的功能可用函数Mid()完成,由于要做加密操作,可利用Asc()函数获得字符的Ascii码,用Chr()函数获得Ascii码对应的字符。

程序段如下:

Dim str1 As String, ch As String * 1

Dim i As Integer, str2 As String

str1 = InputBox("输入原始字符串:")

For i = 1 To Len(str1)

str2 = str2 + Chr(Asc(Mid(str1, i, 1)) + 1) ‘将加密后的字符连接成串

Next i

Text1.Text = str2

由此可以看出:对字符串的连接操作,可用累加算法来完成,不过在字符串的操作中,经常要用到字符串处理函数,所以一些常用的函数功能和用法必须掌握。

考虑一下:如果要实现字符的逆序连接,该怎么办?

二、连乘算法

连乘算法的一般做法是定义一个变量t,作为乘法器使用,初值为1,设一个变量用来保存乘数。

例:求10!=1*2*3*……*10的结果并打印输出

分析:

与累加算法类似,只不过加法变成乘法。

设乘法器t,初值为1,设变量I存放乘数。

当I=1时,T=T*I=1*1=1

当I=2时,T=T*I=1*2=2

当I=3时,T=T*I=2*3=6

……

当I=10时,T=T*I=1*2*3*……*9*10

所以当I的值从1变化到10的过程中,乘法器均执行同一个操作:S=S*I,程序段可写成:

Dim I As Integer, T As long

T= 1

For I = 1 To 10

T = T* I

Next I

Print "1*2*3*……*10=";T

例:求1!+2!+……+10!的值

分析:

这一题总体上是累加题,只不过加数不再是简单的1、2、3等,而是1!、2!到10!,可考虑设一个变量s作累加器,设一个变量t存放每一次的加数,累加的次数是10次,分别加上1!到10!。设循环变量i值从1变化到10,每一次循环执行一次累加操作,每次累加的加数t为i!,所以在每次累加之前,应先用连乘算法计算I!的值,可设循环控制变量j,按如下程序段完成求i!:

t = 1

For j = 1 To i

t = t * j

Next j

结合累加算法,求!+2!+……+10!的程序段如下:

Dim i As Integer, j As Integer

Dim s As Long, t As Long

s = 0

For i = 1 To 10

t = 1

For j = 1 To i

内循环

t = t * j

Next j

s = s + t

Next i

Print "1!+2!+……+10!="; s

程序执行流程是:I=1,计算t=1!,s=0+1!=1!

I=2,计算t=2!,s=1!+2!

I=3,计算t=3!,s=1!+2!+3!

……

I=10,计算t=10!,s=1!+2!+3!+4!+5!+6!+7!+8!+9!+10!

考虑一下:

(1):语句t=1是否可以和s=0一样,放在外循环外?

(答案:不可以!循环初始化所放置的位置要牢记以下原则:外循环初始化应放在外循环的外面,内循环初始化应放在外循环体内,内循环体外。)

(2):变量s和t可以将其类型定义为Integer(整型)吗?

(答案:不可以!因为8!的值就已经超过整型所能表示的最大值32767,所以s和t必须定义成长整型(Long),否则会发生溢出。)

优化:

由于n!=(n-1)!*n,即2!=1!*2,3!=2!*3,……,10!=9!*10,所以上述程序段还可进行以下的优化:

Dim i As Integer, j As Integer

Dim s As Long, t As Long

s = 0

t = 1 ‘这时t=1不可放在循环体内

For i = 1 To 10

t = t * i

s = s + t

Next i

Print "1!+2!+……+10!="; s

执行流程为:

I=1,计算t=1*1=1!,s=0+1!=1!

I=2,计算t=1!*2=2!,s=1!+2!

I=3,计算t=2!*3=3!,s=1!+2!+3!

……

I=10,计算t=9!*10=10!,s=1!+2!+3!+4!+5!+6!+7!+8!+9!+10!

归纳一下:

所有累加次数确定的累加程序都可以采用如下的编程模式:

定义累加器s,初值为0或根据情况赋一个特定值,设变量t存放加数,假设累加次数为n 次,则程序段可按如下框架编写:

s = 0

For i = 1 To n

将加数赋给t

s = s + t

Next I

统计算法

如果在编程时需要计算满足某一条件的量有多少个时,就可以采用统计算法。统计算法的一般做法是定义若干个变量用来作计数器,专门来统计满足相应条件的量,有多少个统计要求,就定义多少个计数器,在程序设计过程中,分别判断是否满足指定条件,若满足条件,则指定的计数器加1。如果计数器太多,而且相互之间有联系时,一般会定义一个计数器数组。例:在文本框中输入一串字符,统计其中的字母、数字和其他字符的个数。

基本思路:

要统计满足指定要求的字符个数,应定义相应变量(如n)作为计数器,初值为0,每找到符合条件的字符,将指定计数器的值加1。

本题需要定义3个计数器n1、n2、n3,初值为0,对字符串的字符逐个判断,如果是字母,n1加1,如果是数字,n2加1,否则n3加1

Private Sub Command1_Click()

Dim str As String, i As Integer, ch As String * 1

Dim n1 As Integer, n2 As Integer, n3 As Integer

n1 = 0: n2 = 0: n3 = 0: str = Text1.Text

For i = 1 To Len(str)

ch = Mid(str, i, 1)

If UCase(ch) <= "Z" And UCase(ch) >= "A" Then

n1 = n1 + 1 ‘计数器n1加1

ElseIf ch >= "0" And ch <= "9” Then

n2 = n2 + 1 ‘计数器n2加1

Else

n3 = n3 + 1 ‘计数器n3加1

End If

Next i

Text2 = “字母的个数为" & n1 & Chr(13) & Chr(10)

Text2= Text2 & “数字的个数为” & n2 & Chr(13) & Chr(10)

Text2= Text2 & “其他字符的个数为” & n3

End Sub

求最大值和最小值

在N个数中求最大值和最小值的思路是定义一个变量假设为max,用来存放最大值,定义一个变量假设为min,用来存放最小值。一般将第1个数赋给max和min,将剩下的每个数分别和max、min比较,如果比max大,将该数赋给max,如果比min小,将该数赋给min,即让max中总是放当前的最大数,让min中总是放当前的最小值,这样当所有数都比较完时,在max中放的就是最大数,在min中放的就是最小数。

例:随机产生20个1到100之间的整数,打印输出其最大值和最小值。

任何一个随机整数 x都可通过随机函数来产生,随机函数Rnd( )可产生在0到1之间均匀分布的随机数。

要产生在区间[ M,N ]之间的随机整数x ,可用以下公式完成:

x = Int( Rnd*(N- M+1))+N

所以1到100之间的随机整数 x 的产生可用以下语句完成:

x = Int(Rnd*100)+1

按照求最大值和最小值的算法思想,可编写程序如下:

Private Sub Form_click()

Dim i As Integer, x As Integer

Dim max As Integer, min As Integer

Randomize ‘随机函数初始化

max = Int(Rnd * 100) + 1

min = max ‘给max和min赋初值

For i = 1 To 19

x = Int(Rnd * 100) + 1 ‘产生1到100间的随机数

If x > max Then max = x

If x < min Then min = x

Next i

Print “最大值是” & max

Print “最小值是” & min

End Sub

素数判断

一个数如果只能被1和其本身整除,而不能被其他任何数整除,那么这个数就称为素数。

我们通过下面的例子来说明判断素数算法的基本思路。

例:输入一个整数,判断它是否是素数,比如输入7,应输出“7是素数”的提示,输入24,应输出“24不是素数”的提示。

分析:

由素数的定义,判断任一个整数n是否是素数的算法是让n分别整除从2到n-1(或n/2、sqr(n))中的每一个数,如果有一个数能被n整除,则n不是素数,如果所有的数都不能被n整除,则n是素数。这也是一个典型的循环程序,可设一个循环变量为I,让I从2变化到n-1,如果有一个I能被n整除,说明n不是素数,下面就不用再进行判断,提前跳出循环;如果所有的I都不能被n整除,最后正常结束循环。

关键是如何知道跳出循环后是提前跳出还是正常退出?对于这种有两种判断结果的处理,一般采用标志变量。设一个变量,假设命名为Flag,让Flag的初值为True,如果提前跳出循环,Flag的值赋为False,跳出循环后可根据Flag的值判断是提前跳出还是正常结束。

程序如下:

Private Sub Command1_Click()

Dim i As Integer, n As Integer

Dim flag As Boolean

flag = True ‘给标志变量赋初值

n = Val(Text1.Text)

For i = 2 To n - 1

If n Mod i = 0 Then

flag = False ‘如果I能被n整除,将flag赋值为False

Exit For

End If

Next i

If flag = True Then ‘该条件也可写成If flag Then

MsgBox n & "是素数"

Else

MsgBox n & "不是素数"

End If

End Sub

另一种方法:

还可以在循环结束后通过循环控制变量的值来进行素数的判断。如果是素数,循环将正常结束,循环控制变量将超过终值;如果不是素数,肯定有一个数能够被n整除,循环会提前结束,循环控制变量小于等于终值。

程序如下:

Private Sub Command1_Click()

Dim i As Integer, n As Integer

n = Val(Text1.Text)

For i = 2 To n - 1

If n Mod i = 0 Then Exit For

Next i

If i = n Then ‘该条件也可写成If flag Then

MsgBox n & "是素数"

Else

MsgBox n & "不是素数"

End If

End Sub

求最大公约数

求任意两个正整数的最大公约数可用辗转相除法来求。

假设要求任两个整数m和n的最大公约数,用辗转相除法的步骤是:

求m和n的余数r,将n的值作为m的新值,将r的值作为n的新值,再不断的求新的m和n的余数r,直到r的值等于0为止,这时m的值就是要求的最大公约数。

注意:由于循环程序次数不确定,应采用do-loop循环结构。

例:在两个文本框Text1和Text2中分别

输入两个正整数,单击命令按钮Command1后在窗体上输出其最大公约数。

程序如下:

Private Sub Command1_Click()

Dim m As Integer, n As Integer

Dim r As Integer ‘定义存放余数的变量r

m = Val(Text1.Text)

n = Val(Text2.Text)

Print m; "和"; n; "的最大公约数为";

Do

r = m Mod n

m = n

n = r

Loop Until r = 0

Print m

End Sub

考虑一下:可以将第一条print语句放在执行循环以后吗?

(答案:不可以。因为执行完循环后m和n已经不是原来的数值了)

将以上程序添加相应语句就可完成求最小公倍数的功能(M和n的最小公倍数等于m*n/m和n的最大公约数)。

程序如下:

Private Sub Command1_Click()

Dim m As Integer, n As Integer

Dim r As Integer

Dim t As Integer

m = Val(Text1.Text)

n = Val(Text2.Text)

t = m * n ‘记录m*n的初始值

Print m; "和"; n; "的最大公约数为";

Do

r = m Mod n

m = n

n = r

Loop Until r = 0

Print m; ",最小公倍数为"; t / m

End Sub

穷举算法

穷举法是循环程序中具有代表性的基本应用之一。穷举是一种重复型算法。它的基本思想是对问题的所有可能状态都一一测试,直到找到答案或将全部可能状态都测试过为止。

循环控制有两种办法:计数法和标志法。计数法用于循环次数确定的情况下,一般用For-Next循环比较方便;标志法用于循环次数未知情况,表示达到某一目标后使循环结束。

例:搬砖问题:36块砖,36人搬,男搬4,女搬3,两个小孩搬一砖,要求一次全搬完,问男、女和小孩各有多少个?

分析:

假设男人用变量man表示,女人用women表示,小孩用children表示,有以下式子成立: men+women+children=36

4*men+3*women+children/2=36

如果用算术来解方程,可以看出这是一个典型的不定方程,可能有多个解。

穷举法的算法思想是将所有可能的情况全部列出来,逐一进行测试。

由条件可知:

男人(men)的可能取值范围为:0~8

女人(women)的可能取值范围为:0~11

可利用双重循环实现对所有可能的男人men和女人women的值进行选择

children=36-men-women

如果满足 4*men+3*women+children/2=36

则表示找到一个合理的解。

Private Sub Form_Click()

Dim men As Integer, women As Integer

Dim children As Integer

For men=0 To 8 ‘men取所有可能的值

For women=0 To 11 ‘women取所有可能的值

children=36-men–women ‘算出children的人数

If 4*men+3*women+children/2=36 Then

Print "男人有:"; men; "人"

Print "女人有:"; women; "人"

Print "小孩有:"; children; "人"

End If

Next women

Next men

End Sub

精确迭代算法

迭代是一个不断用新值取代旧值或用旧值推出新值的过程。

迭代算法的程序编制时要从三方面着手:确定迭代公式(也就是循环体的内容)、公式的初始化以及迭代的终止条件。

如果每次迭代都可以得到精确值,并且迭代的次数确定,这就是精确迭代算法。

例:兔子繁殖问题:

意大利数学家Fibonacci曾提出一个有趣的问题:设有一对新生兔子,从第三个月开始它们每个月都生一对兔子。按此规律,并假设没有兔子死亡,一年后共有多少对兔子。可以发现每月的兔子数组成如下数列:

1,1,2,3,5,8,13,21,34,……

打印数列的前20项,且一行输出5个

对数列1,1,2,3,5,8,13,21,34,……可看出:

数列从第3项开始,每1项都是其前2项之和。

假设第1项元素用f1表示,第2项元素用f2表示,每次新元素用f 表示

f1 f2 f

第3月 1 1 f=f1+f2=2

第4月 1 2 f=f1+f2=3

第5月 2 3 f=f1+f2=5

第6月 3 5 f=f1+f2=8

……

f1和f2初值为1

f=f1+f2

f1=f2

f2=f

可以看出:

每1个月的兔子数f 要由前面的兔子数f1和f2 推出,并在求下1个月的兔子数之前要用新值对f1和f2的值进行更新。这就是迭代算法。

如果迭代的次数确定,可以得到一个确定的值,这样的迭代称为精确迭代。

程序如下:

Private Sub Form_click()

Dim f1 As Integer, f2 As Integer

Dim i As Integer,f As Integer

f1 = 1: f2 = 1 ‘给f1和f2赋初值

Print f1; f2;

For i = 3 To 20

f = f1 + f2

f1 = f2

f2 = f

Print f; ‘输出每月的兔子数

If i Mod 5 = 0 Then Print ‘控制每行输5个

Next i

End Sub

近似迭代算法

一元高次方程的求解没有通用的求根公式,常用迭代法来求方程的近似根。

迭代法求方程f(x)=0的根是将其改写为:

x=ψ(x)

选取适当的初值x0,便可通过重复迭代构造序列:x0,x1,x2,……,xn,……

若该数列收敛,则极限值就是方程的一个解。

牛顿迭代法和二分迭代法都是对一元高次方程求解的近似方法。

(1)、牛顿迭代法

牛顿迭代法求f(x)=0的根是在根的附近找一个初值作为x0,过x0做方程的切线,与x 轴的交点为x1,再过x1作切线,交x轴于点x2,……。可以知道,只要给定一个初始值x,通过以上操作,可不断的得到新的值x,并且x无限的接近函数在x轴的交点,即方程的根。所以经过若干次迭代后,可得到方程较高精度的近似根。牛顿切线法迭代公式为

x i+1 = x i - f(x i)/f’(x i)

其中:f’(x i)是f(x i)的导数,当|x i+1-x i|≤ε或|f(x i)|≤ε时,x i+1就作为方程的近似根。

例:编写程序,利用牛顿迭代法求方程xe x -1=0在x0=0.5附近的一个根,要求精确到10-7算法分析:

1、循环初值 x=0.5

2、迭代公式 x = x-(xe x-1)/(xe x+e x) (循环体的内容)

3、结束条件: | xe x-1|<10-7

程序如下:

Private Sub Command1_Click()

Dim x As Single, Eps As Single

x=InputBox("输入初始值x:", "牛顿迭代法")

Eps=InputBox("输入允许误差Eps","牛顿迭代法")

Do

x =x-(x*Exp(x)-1)/(Exp(x)*x+Exp(x))

Loop Until Abs(x*Exp(x)-1)<=Eps

Text1.Text=Str(x)

End Sub

(2)、二分迭代法算法

例:设计一个用二分法求方程x3-x4+4x2-1=0在区间[0,1]上的一个实根。

算法思路:

若方程f(x)=0在区间[a,b]上有一个实根,则f(a)与f(b)一定异号。二分法的思想是在区间[a,b]上取中点c=(a+b)/2,若f(a)*f(c)<0,则实根在区间[a,c]中,将c赋给b;若f(a)*f(c)>0,则实根在区间[c,b]中,将c赋给a;构成新区间[a,b],再取中点c,继续做如上操作,直到|a-b|的值小于给定的误差精度值,这时a或b就是方程的根。

程序如下:

Private Sub Form_click()

Dim a As Single,b As Single,c As Single,e As Single

e = InputBox("请输入误差精度")

a = 0:

b = 1

Print “在误差” & e & “范围内,方程在[0,1]上的根为:”;

Do

c = (a + b) / 2

If (a^3 -a^4+4*a^2-1)*(c^3-c^4+4*c^2-1)<0 Then

b = c

Else

a = c

End If

Loop Until Abs(a - b) < e

Print a

End Sub

十进制转换为N进制

一个十进制正整数 m 转换成n 进制数的思想是:将 m 不断除以n 取余数,直到商为零,将余数逆序排放即可。

1、把任意一个十进制正整数转换成2进制数

(1)、可以看出:这是一个典型的循环程序,由于次数不确定,考虑采用Do-Loop型结构。

Do While m > 0

r = m Mod 2 ‘求余数

m = m \ 2

Loop

(2)、要将余数逆序连接成二进制数,可定义一个字符串变量str,利用字符串连接符进行连接。

str = r & str

程序如下:

Private Sub Command1_Click()

Dim m As Integer, str As String, r As Integer

m = Val(Text1.Text)

Do While m > 0

r = m Mod 2

str = r & str

m = m \ 2

Loop

Text2.Text = str

End Sub

Private Sub Command2_Click()

End

End Sub

2、把任意一个十进制正整数转换成8进制数

程序如下:

Private Sub Command1_Click()

Dim m As Integer, str As String, r As Integer

m = Val(Text1.Text)

Do While m > 0

r = m Mod 8

str = r & str

m = m \ 8

Loop

Text2.Text = str

End Sub

Private Sub Command2_Click()

End

End Sub

3、把任意一个十进制正整数转换成16进制数

可以看出:将十进制数转换为十六进制数时,由于余数r可能超过10,所以对超过10的余数要进行转换。

转换的对应关系为:

10 11 12 13 14 15

A(65) B(66) C(67) D(68) E(69) F(70)

对应的字符为: chr(r+55)

程序如下:

Private Sub Command1_Click()

Dim m As Integer, str As String, r As Integer

m = Val(Text1.Text)

Do While m > 0

r = m Mod 16

If r < 10 Then

str = r & str

Else

str = Chr(r + 55) & str

End If

m = m \ 16

Loop

Text2 = str

End Sub

N进制转换为十进制

一个N进制数转换成十进制数的思想是:将该N进制数各位数字按权展开再求和。

1、把任意一个2进制正整数转换成十进制数

( 1 1 0 1)2=1* 23+1* 22 +0* 21 +1* 20=(13)10

(1)、截取二进制字符串str的每个字符

ch =Mid (str ,i,1) i=1……len (str)

(2)、最高位的权值p为:

n=len (str) : p=2^(n-1)

(3)、用累加算法求转换后的十进制数s:

s=s+val(ch)*p : p=p/2 ‘产生下一个数的权值

程序如下:

Private Sub Command1_Click()

Dim i As Integer,n As Integer,p As Integer

Dim s As Integer,str1 As String

str1 = Text1.Text

n = Len(str1)

p = 2 ^ (n - 1)

For i = 1 To n

s = s + Val(Mid(str1, i, 1)) * p

p = p / 2

Next i

Text2.Text = str(s)

End Sub

2、把任意一个8进制正整数转换成十进制数

( 1 7 4 )8=1* 82+7* 81 +4* 80=64+56+4=(124)10

可以看出:把8进制数转换为十进制数的算法与2进制数转换为十进制数的算法完全相同。程序如下:

Private Sub Command1_Click()

Dim i As Integer,n As Integer,p As Integer

Dim s As Integer,str1 As String

str1 = Text1.Text

n = Len(str1)

p = 8 ^ (n - 1)

For i = 1 To n

s = s + Val(Mid(str1, i, 1)) * p

p = p / 8

Next i

Text2.Text = str(s)

End Sub

3、把任意一个16进制正整数转换成十进制数

( 1 7 C )8=1* 162+7* 161 +12* 160=256+112+12=(380)10

可以看出:把16进制数转换为十进制数的算法与其他算法相似,只不过当截取的字符为A 到F时,要将其转换为对应的数值。

转换的对应关系为:

A(Ascii码为65) B(66) C(67) D(68) E(69) F(70)

10 11 12 13 14 15

假设截取的字符为ch,则字符对应的数值为: asc(ch)-55

Private Sub Command1_Click()

Dim i As Integer, n As Integer, p As Integer

Dim s As Integer, str1 As String, ch As String

str1 = Text1.Text : n = Len(str1)

p = 16 ^ (n - 1)

For i = 1 To n

ch = Mid(str1, i, 1)

If ch >= "A" And ch <= "Z" Then

s = s + (Asc(ch) - 55) * p

Else

s = s + Val(ch) * p

End If

p = p / 16

Next i

Text2.Text = str(s)

End Sub

字符加密

将输入的原字符串的每个字符按指定的规则进行转换,得到新字符,将每个新字符连接成新串就可以实现对字符串进行加密。

对字符串的每个字符的解密过程与上述相同,只是规则正好与上面的加密规则相反。

例:输入一串字母,按以下规则进行加密:将每个原码字母在A-Z-A首尾相连的字母表上向后移6位为译码。如下表所示:

(1)、截取字符串str的每个字符

ch =Mid(str,i,1) i=1……len(str)

(2)、对字符串中每个字符的转换关系为:

A(Ascii码为65) B(66) C(67) D(68) …… T(84)

G(Ascii码为71) H(72) I(73) J(74) …… Z(90)

可以看出:转换后字符的Ascii码为n=asc(ch)+6

转换后的字符串str1=str1+chr(n)

考虑一下:当字符为U到Z时,转换后的字符就超过Z的范围。

(3)、对U到Z之间的字符的转换关系为:

U(Ascii码为85) V(86) W(87) X(88) Y(89) Z(90)

A(Ascii码为65) B(66) C(67) D(68) E(69) F(70)

可以看出:

当转换后字符的Ascii码n=asc(ch)+6超过90时

转换后的字符串str1=str1+chr(n-26)

程序如下:

Private Sub Command1_Click()

Dim str1 As String, str2 As String

Dim n As Integer, ch As String * 1, i As Integer

str1 = UCase(Trim(Text1.Text))

For i = 1 To Len(str1)

ch = Mid(str1, i, 1)

n = Asc(ch) + 6

If n <= 90 Then

str2 = str2 + Chr(n)

Else

str2 = str2 + Chr(n - 26)

End If

Next i

Text2.Text = str2

End Sub

VB常用算法

常用算法 1.判断素数 素数是指只能被1与自己整除的数是素数,最小的素数是2,如3,5,7等都是素数判断方法一: Private Function Prime(N As Integer)As Boolean Dim i As Integer For i=2 To N-1(或sqr(N)或N\2) If N Mod i=0 Then Exit For Next i (或N/i=Int(N/i)) If i=N Then Prime=True End Function 判断方法二: Private Function Prime(N As Integer)As Boolean Dim i As Integer For i=2 To N-1 If N Mod i=0 Then Exit Function Next i Prime=True End Function (2)求最大公约数(欧几里德算法,辗转相除法) 最大公约数是指两个数最大的公约数 Private Function Gcd(byval m As Integer,ByVal n As Integer)As Integer Dim r As Integer r=m Mod n Do while r<>0 m=n n=r r=m Mod n Loop Gcd=n End Function 利用递归实现判断最大公约数 Private Function Gcd(ByVal m As Integer,ByVal n As Integer)As Integer Dim r As Integer r=m Mod n If r=0 Then Gcd=n ELse M=n n=r Gcd=Gcd(m,n) End If

VB程序设计的常用算法填空题

VB程序设计的常用算法 例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。 将程序编写在一个GetTJput过程中,代码如下: Public Sub GetTJput() Dim a(1 To 100) As Integer Dim x(1 To 10) As Integer Dim i As Integer, p As Integer '产生100个[0,99]范围内的随机整数,每行10个打印出来 For i = 1 To If a(i) < 10 Then Form1.Print Space(2); a(i); Else Form1.Print Space(1); a(i); End If If Then 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 Next i Form1.Print "统计结果" For i = 1 To 10 p = i If i = 10 Then p = 0 Form1.Print "个位数为" + Str(p) + "共" + Str(x(i)) + "个" Next i End Sub 二、求两个整数的最大公约数、最小公倍数 m=inputBox("m=") n=inputBox("n=") nm=n*m If m < n Then r=m mod n Do While m=n n=r

VB常用算法介绍

常用算法介绍 VB 算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。 一、计数、求和、求阶乘等简单算法 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。 例:用随机函数产生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)。 将程序编写在一个GetTJput过程中,代码如下: Public Sub GetTJput() Dim a(1 To 100) As Integer Dim x(1 To 10) As Integer

Dim i As Integer, p As Integer '产生100个[0,99]围的随机整数,每行10个打印出来 For i = 1 To 100 a(i) = Int(Rnd * 100) If a(i) < 10 Then Form1.Print Space(2); a(i); Else Form1.Print Space(1); a(i); End If If i Mod 10 = 0 Then Form1.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 Form1.Print "统计结果" For i = 1 To 10

VB练习题

判断题: 1、VB中,每一种对象有着不同的属性设置,每一种对象能识别的事件也不同。(对) 2、Val(“123hello”) 和Val(“hello123”)返回值一样。(错) 3、赋值语句X=123+”123”和X=”123”+123中,X的值一样。(对) 4、赋值语句X=”123”+”123”和X=”123”+123中,X的值一样。(错) 5、执行Print 5*8 和Print “5*8 ”语句运行结果一样。(错) 6、标签框和文本框内容的最大区别就是在程序运行过程中标签框的内容不可编辑,而文本框的内容可编辑。(对) 7、用vb编写程序时,标签控件能代替文本框控件使用. (错) 8、VB程序代码中,Label1.Caption=””的作用是该标签框中得内容清除。(对) 9、变量名的长度最长可达1024个字符。(错)225个 10、sum和int.sum都可以作为VB的变量名。(错) 11、下列程序的运行结果是15 (对) Dim s as Double Dim i as Integer S=0 I=1 Do While i<=5 I=i+2 S=s+i Loop Label1.Caption=s 12、对于熟练的程序员,可以省略程序的调试过程。(错) 13、在VB中,使用if语句就可以根据条件改变程序的执行路径。(对) 14、VB编程的一般步骤应该是:分析问题——设计界面——编写代码——调试与运行程序。(对) 单项选择题 1、小明想用VB设计一个加法器程序,做了如下规划,下列说法错误的是。(D) A、程序运行时标题栏显示加法器 B、前两个标签框显示的内容分别为“+”和“=” C、Command1用来计算出结果 D、使用了三个命令按钮、两个标签框和三个文本框 2、从下面的对象属性可以看出,该对象的标题为(A)

VB程序设计的常用算法教案.doc

VB程序设计的常用算法教案 算法(algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。 一、计数、求和、求阶乘等简单算法 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。 例:用随机函数产生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)。 将程序编写在一个gettjput过程中,代码如下: public sub gettjput() dim a(1 to 100) as integer

dim x(1 to 10) as integer dim i as integer, p as integer '产生100个[0,99]范围内的随机整数,每行10个打印出来 for i = 1 to 100 a(i) = int(rnd * 100) if a(i) < 10 then form1.print space(2); a(i); else form1.print space(1); a(i); end if if i mod 10 = 0 then form1.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 form1.print "统计结果"

VB程序设计的常用算法4

VB程序设计的常用算法4 十、数制转换 将一个十进制整数m转换成→r(2-16)进制字符串。 方法:将m不断除r 取余数,直到商为零,以反序得到结果。下面写出一转换函数,参数idec为十进制数,ibase为要转换成数的基(如二进制的基是2,八进制的基是8等),函数输出结果是字符串。 Private Function TrDec(idec As Integer, ibase As Integer) As String Dim strDecR$, iDecR% strDecR = "" Do While idec <> 0 iDecR = idec Mod ibase If iDecR >= 10 Then strDecR = Chr$(65 + iDecR - 10) & strDecR Else strDecR = iDecR & strDecR End If idec = idec \ ibase Loop TrDec = strDecR End Function 十一、字符串的一般处理1.简单加密和解密 加密的思想是:将每个字母C加(或减)一序数K,即用它后的第K个字母代替,变换式公式:c=chr(Asc(c)+k) 例如序数k为5,这时"A"→"F","a""f","B""G"…当加序数后的字母超过"Z"或"z"则c=Chr(Asc(c)+k -26) 例如:You are good→ Dtz fwj ltti 解密为加密的逆过程 将每个字母C减(或加)一序数K,即c=chr(Asc(c)-k), 例如序数k为5,这时"Z"→"U","z"→"u","Y"→"T"…当加序数后的字母小于"A"或"a"则c=Chr(Asc(c)-k +26) 下段程序是加密处理: i = 1: strp = "" nL = Len(RTrim(strI)) Do While (i <= nL) strT = Mid$(strI, i, 1) '取第i个字符 If (strT >= "A" And strT <= "Z") Then iA = Asc(strT) + 5 If iA > Asc("Z") Then iA = iA - 26 strp = strp + Chr$(iA) ElseIf (strT >= "a" And strT <= "z") Then iA = Asc(strT) + 5 If iA > Asc("z") Then iA = iA - 26 strp = strp + Chr$(iA) Else strp = strp + strT End If i = i + 1 Loop Print strp

VB程序设计的常用算法

VB程序设计的常用算法 算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。 一、计数、求和、求阶乘等简单算法 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。 例:用随机函数产生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)。 将程序编写在一个GetTJput过程中,代码如下: Public Sub GetTJput() Dim a(1 To 100) As Integer Dim x(1 To 10) As Integer Dim i As Integer, p As Integer '产生100个[0,99]范围内的随机整数,每行10个打印出来 For i = 1 To 100 a(i) = Int(Rnd * 100) If a(i) < 10 Then Form1.Print Space(2); a(i); Else Form1.Print Space(1); a(i); End If If i Mod 10 = 0 Then Form1.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 Form1.Print "统计结果" For i = 1 To 10 p = i If i = 10 Then p = 0 Form1.Print "个位数为" + Str(p) + "共" + Str(x(i)) + "个" Next i End Sub 二、求两个整数的最大公约数、最小公倍数 分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数) (1) 对于已知两数m,n,使得m>n; (2) m除以n得余数r; (3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4); (4) m←n,n←r,再重复执行(2)。 例如:求m=14 ,n=6的最大公约数. m n r

VB常用算法——排序

VB常考算法(八)排序: 1、算法 1)选择法排序 算法说明:根据上例中求最小值的思路,我们可以使用如下方法进行从小到大排序:第一轮,以第一个元素逐个跟后面的所有元素比较,如果比后面的元素大就进行交换,经过一轮比较,第一个元素被确定为最小;同样的方法,下一轮以第二个元素跟剩下的所有元素进行比较确定下次小的元素;以此类推… 下面我们以图形的形式体现对5个数进行选择排序的过程: 第一轮:第二轮: 第三轮: 从上图可以发现对5个元素进行排序,总共经过了5-1=4轮,而每一轮中比较的次数也不相同,第一轮2、3、4、5号元素参与跟1号元素的比较,共4次,第二轮3、4、5号元素参与跟2号元素的比较,共3次,以次类推,比较次数逐步减少。经过四轮的比较,利用逐步求最小值的方法将5个数从小到大排好序。对于这样一个排序的过程,我们可以使用两个循环分别控制比较的轮数和每一轮的次数。 程序代码: Private Sub Command1_Click() Dim n As Integer n = InputBox("请输入数组元素的个数:") Dim a() As Integer, i As Integer, j As Integer Print "排序前:" ReDim a(n) For i = 1 To n a(i) = Int(Rnd * (99 - 10 + 1) + 10) Print a(i); 最小值 次小值

Next i For i = 1 To n - 1 For j = i To n If a(i) > a(j) Then temp = a(i) '交换元素 a(i) = a(j) a(j) = temp End If Next j Next i Print Print "排序后:" For i = 1 To n Print a(i); Next i End Sub 2)冒泡法排序 算法说明:相邻的元素进行比较,如果前面的元素比后面的元素大,则将它们进行交换,具体思路:设在数组a 中存放n 个元素,第一轮,将a(1)和a(2)进行比较,若a(1)>a(2),则交换这两个元素的值,然后继续用a(2)和a(3)比较,若a(1)>a(2),则交换这两个元素的值,以此类推,直到a(n-1)和a(n)进行比较处理后,a(n)中就存放了n 个数中最大的值;第二轮,用a(1)与a(2),a(2)与a(3),…,a(n-2)与a(n-1)进行比较,处理方法相同,这一轮下来,a(n-1)中存放n 个数中第二大的值;…;第n-1轮,a(1)与a(2)进行比较处理,确保最小值在a(1)中。经过n-1轮比较处理,n 个数已经按从小到大的顺序排列好。 下面我们以图形的形式体现对5个数进行冒泡排序的过程: 第一轮: 第三轮: 第四轮: 最大值

VB程序设计的常用算法

VB 程序设计的常用算法 算法( Algorithm ):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。 一、计数、求和、求阶乘等简单算法 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。 例:用随机函数产生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)。 将程序编写在一个GetTJput过程中,代码如下: Public Sub GetTJput() Dim a(1 To 100) As Integer Dim x(1 To 10) As Integer Dim i As Integer, p As Integer '产生100 个[0,99]范围内的随机整数,每行 1 0个打印出来 For i = 1 To 100 a(i) = Int(Rnd * 100) If a(i) < 10 Then Form1.Print Space(2); a(i);

VB常用算法——素数

VB常考算法(三)素数: 1、算法说明 所谓素数是指只能被1和它本身整除的数。 1)判断某数是否为素数。根据循环控制变量来判断。 算法说明:根据素数只能被1和它本身整除的性质,我们可以使用循环依次判断2到n-1(或者Sqr(n))之间有没有被它整除的数,一旦有退出循环,退出循环后通过检验循环变量的值来判断是不是素数。即,当循环正常退出,循环变量的值等于n时,该数是素数;当循环提前退出,循环变量的值小于等于n-1,该数不是素数。 程序代码如下: Private Sub Command1_Click() Dim n As Integer, i As Integer n = Val(Text1.Text) If n < 1 Then MsgBox "请正确输入数据" Else n = Val(Text1.Text) For i = 2 To n - 1 If n Mod i = 0 Then Exit For Next i If i = n Then MsgBox n & "是素数" Else MsgBox n & "不是素数" End If End If End Sub 2)判断某数是否为素数。根据标志位flg来判断。 Private Sub Command1_Click() Dim n As Integer, i As Integer Dim flg As Boolean flg = True n = Val(Text1.Text) If n < 1 Then MsgBox "请正确输入数据" Else n = Val(Text1.Text) For i = 2 To n - 1 If n Mod i = 0 Then flg = False Next i If flg = True Then MsgBox n & "是素数" Else MsgBox n & "不是素数"

VISUALBASIC常用算法汇总

VB常用算法(1):累加和连乘 1、算法说明累加形式:V=V+e连乘形式:V=V*e 其中:V是变量,e是递增表达式。累加和连乘一般通过循环结构来实现。 注意:需在执行循环体前对变量V赋初值。一般的,累加时置初值0;连乘时置初值为1. 举例求N!的结果。 Private Sub Command1_Click()Dim n%,i%,s& n=Val(InputBox("输入n"))s=1 For i=1To n s=s*i Next i Print s End Sub 错误的写法: Private Sub Command1_Click() Dim n%,i%,s& n=Val(InputBox("输入n")) For i=1To n s=1‘赋初值语句位置不对! s=s*i Next i Print s‘输出s的值为n,而不是n!End Sub 应用举例 根据下列公式,求自然对数e 的的近似值。 要求:误差小于0.00001 Private Sub Command1_Click() Dim i%,n&,t!,e! e=2 i=1 t=1 Do While t>0.00001 i=i+1 t=t/i e=e+t Loop Print"计算了";i;"项目和是:";e Print Exp(1)‘与上句输出值进行对比以证明算法的正确性 End Sub 解题技巧 1)由于这类题目往往是根据精度要求来求值,因此我们不能预知具体循环次数,所以这类题目一般用Do循环,很少用For循环。设定循环变量和通项变量,注意各变量的初值; 2)分解通项表达式中各因子,并分别将各因子用循环变量表示; 3)如果步骤2中有的因子比较复杂,难以直接用变量表示,此时可以考虑使用Function过程; 4)根据步骤1、2、3,写出通项表达式; 5)根据精度要求(往往是通项小于10负多少次方这样一个关系表达式),写出一条满足精度要求后跳出循环的语句。通常是用:if通项表达式>10^(-N)then exit do,注意这句话一般需放在累加或者连乘式之前。

VB程序设计的常用算法教案

VB程序设计的常用算法教案 算法(Algrith):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采 取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何 安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。 一、计数、求和、求阶乘等简单算法 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条,更要注意用来表示计数、和、阶 乘的变量的初值。 例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,,6,7,8,9,0的 数的个数并打印出来。 本题使用数组来处理,用数组a存放产生的确100个随机整数,数组x来存放个位上的数字分 别为1,2,3,4,,6,7,8,9,0的数的个数。即个位是1的个数存放在x中,个位是2的个数存放在x中,……

个位是0的个数存放在x。 将程序编写在一个GetTput过程中,代码如下:PubliSubGetTput DiaAsInteger DixAsInteger DiiAsInteger,pAsInteger '产生100个[0,99]范围内的随机整数,每行10个打印出来 Fri=1T100 a=Int Ifa<10Then Fr1PrintSpae;a;

Else Fr1PrintSpae;a; EndIf Ifid10=0ThenFr1Print Nexti '统计个位上的数字分别为1,2,3,4,,6,7,8,9,0的数的个数,并将统计结果保存在数组x,x,,x中,将统计结果打印出来 Fri=1T100 p=a d '求个位上的数字 Ifp=0Thenp=10

VB常用算法

VB常用算法(二)最值问题- - 1、算法说明 在若干数中求最大值,一般先取第一个数为最大值的初值(即假设第一个数为最大值),然后,在循环体内将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,直到循环结束。 求最小值的方法类同。 求若干数平均值,实质上就是先求和,再除以这些数的个数。 应用举例 随机产生n个1-100(包括1和100)的数,求它们的最大值、最小值和平均值。 Private Sub Command1_Click() Dim n As Integer, i As Integer, min As Integer, max As Integer, aver As Single, s As Integer n = Val(InputBox("输入个数:")) s = Int(Rnd * 100) + 1 max = s min = s aver = s Print "第1个数是:" & s For i = 2 To n s = Int(Rnd * 100) + 1 Print "第" & i & "个数是:" & s If s > max Then max = s If s < min Then min = s aver = aver + s Next i aver = aver / n Print "max="; max; "min="; min; "aver="; aver End Sub 解题技巧 最大值、最小值、平均值类型题目往往和数组放在一起考!有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列号。 2、实战练习 1)补充代码(2000春二(9)) 本程序的功能是在二维数组中查找鞍点元素,即该元素在所在行中为最大,且在所在列中为最小。在一个数组中可能存在,也可能不存在这样的元素。数组各元素的值从文件data.txt中读取。 Private Sub Form_Click() Dim a(3,3) As Integer,i As Integer,j As Integer Dim maxvr As Integer,col As Integer, As Integer Open data.txt For Input As #1 For i=1 To 3 For j=1 To 3 Input #1,a(i,j) Print a(i,j); Next j Print Next i For i=1 To 3 maxvr= (1) col=1 For j=2 To 3 If maxvr

VB常用算法总结

VB常用算法总结 一、变量值的交换 算法思想:若交换两个变量的值,必须引入第三个新的变量进行传递。 以下代码是错误的: X=12 :Y=34 :X=Y :Y=X 正确的代码是: X=12 :Y=23 :T=X :X=Y :Y=T 二、判断一个数是否能被另一个数整除 算法思想:可以用整除的定义(余数为0)或X除以Y等于X整除Y等表达式进行判断。 条件表达式可以为:X mod Y=0 或X\Y=X/Y 或Int(X/Y)=X/Y 如果以上条件表达式为True,则表示X能被Y整除。 三、累加、阶乘、计数和求平均值 算法思想:使用循环语句,并用一个变量存放累加的中间及最终结果。 注:累加求和时变量初值为0,计算阶乘时变量初值为1。 统计计个数(计数)时可用一个变量作为统计个数的累加变量,每次加1即可。 求平均值算法思想是先求和,再除以个数。 条件求和(或计数):在循环语句中加入If-End If判断语句。 例题:计算1到10之间所有整数的累加和以及10!。 n=10 sum=0 ‘累加求和时,变量的初值一定为0 prod=1 ‘累乘(连乘)时,变量的初值一定为1 For i=1 To n sum=sum+i prod=prod*i Next i Print sum,prod 例题:统计0—100之间能被3整除的数的个数、累加和及其平均值。 s=0 n=0 For i=0 To 100 If i mod 3 =0 Then s=s+i n=n+1 End If Next i Print n,s,s/n 四、随机数的产生 [a,b]之间的随机整数 Int((b-a+1)*rnd)+a (a,b)随机数 (b-a)*rnd +a 五、求若干个数中最大值或最小值 六、常用字符处理函数 Mid函数:从字符串指定位置取指定个字符,格式为Mid (字符,p,n) ,从第p个字符开始,向后截取n个字符(若n省略则取到最后)。 Left和Right函数:从字符串左边或右边取指定个字符,格式为Left (字符,n)和Right (字符,n)。 Len函数:测试字符串长度。 UCase和LCase函数:UCase将小写字母转换为大写字母;LCase将大写字母转换为小写字母。 Instr([首字符位置, ] 字符串1, 字符串2 [ , n]):在字符串1中查找字符串2,如果找到,返回字符串2的第一个字符在字符串1中出现的位置。首字符位置是可选的,如果不指定,从字符串起始位置开始查找;如果指明,从指定的位置开始查找。 Asc函数:返回字符串中第一个字符的ASCII码。 Chr函数:将一个数值转换为其所对应的字符。 字符的比较规则是按ASCII码顺序比较,规则为空格<”A”~”Z”<”a”~”z”

VB常用算法——查找

VB常考算法(六)查找元素: 1、算法说明 1)顺序查找 逐个元素找,如果有,则记录位置,然后跳出循环;否则,查找失败。 代码如下: Private Sub Search(a(), ByVal key, Index As Integer) Dim i% For i = lound(a) To UBound(a) If a(i) = key Then '找到,将元素下标保存到index中并结束查找 Index = i Exit Sub End If Next i Index = -1 '若没找到,则index值为-1 End Sub 2)二分查找 顺序查找效率低下,当数组有序排列时,可以使用二分法查找提高效率。 算法思路: 代码如下: Private Sub birSearch(a(), ByVal low%, ByVal high%, ByVal key, Index As Integer) Dim mid As Integer

If low > high Then '没有查找到 Index = -1 Exit Sub End If mid = (low + high) / 2 '取查找区间的中点 If key = a(mid) Then '查找到,返回下标 Index = mid Exit Sub ElseIf key < a(mid) Then '查找区间在上半部分 high = mid - 1 Else low = mid + 1 '查找区间在下半部分 End If Call birSearch(a, low, high, key, Index) '递归调用查找函数 End Sub 调用方法: Private Sub Command1_Click() Dim a(11) a(1) = 5: a(2) = 13: a(3) = 19: a(4) = 21: a(5) = 37 a(6) = 56: a(7) = 64: a(8) = 75: a(9) = 80: a(10) = 88: a(11) = 92 Dim ind As Integer Call birSearch(a, LBound(a), UBound(a), 21, ind) Print ind End Sub 2、实战练习 C盘根目录下stu.txt文件中以下的格式保存着学生姓名及班级号信息,本程序的功能是:读取该文件中的数据,在利用inputBox函数输入要查找的学生姓名,通过顺序查找,给出找到或找不到的信息。附图是某同学被找到时显示的信息窗口。 张文,机械01 李明,机械01 王文卉,机械01 … 何宇宙,电子02 代码如下: Option Explicit Option Base 1 Private Sub Form_Click() Dim stu() As String, glass() As String, i As Integer

高中学考选考VB常用算法

程序设计的常用算法 算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。 例:用随机函数产生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)。 将程序编写在一个GetTJput过程中,代码如下: Public Sub GetTJput() Dim a(1 To 100) As Integer Dim x(1 To 10) As Integer Dim i As Integer, p As Integer '产生100个[0,99]范围内的随机整数,每行10个打印出来 For i = 1 To 100 a(i) = Int(Rnd * 100) If a(i) < 10 Then Form1.Print Space(2); a(i); Else Form1.Print Space(1); a(i); End If If i Mod 10 = 0 Then Form1.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 Form1.Print "统计结果" For i = 1 To 10 p = i If i = 10 Then p = 0 Form1.Print "个位数为" + Str(p) + "共" + Str(x(i)) + "个" Next i End Sub 分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数) (1) 对于已知两数m,n,使得m>n; (2) m除以n得余数r;

VB常用算法——排序

VB 常考算法(八)排序: 1、算法 1)选择法排序 算法说明:根据上例中求最小值的思路,我们可以使用如下方法进行从小到大排序:第一轮,以第一个元素逐个跟后面的所有元素比较,如果比后面的元素大就进行交换,经过一轮比较,第一个元素被确定为最小;同样的方法,下一轮以第二个元素跟剩下的所有元素进行比较确定下次小的元素;以此类推… 下面我们以图形的形式体现对5个数进行选择排序的过程: 第一轮: 第二轮: 第三轮: 从上图可以发现对5个元素进行排序,总共经过了5-1=4轮,而每一轮中比较的次数也不相同,第一轮2、3、4、5号元素参与跟1号元素的比较,共4次,第二轮3、4、5号元素参与跟2号元素的比较,共3次,以次类推,比较次数逐步减少。经过四轮的比较,利用逐步求最小值的方法将5个数从小到大排好序。对于这样一个排序的过程,我们可以使用两个循环分别控制比较的轮数和每一轮的次数。 程序代码: Private Sub Command1_Click() Dim n As Integer n = InputBox("请输入数组元素的个数:") Dim a() As Integer, i As Integer, j As Integer Print "排序前:" ReDim a(n) For i = 1 To n 62415264152641516425最小值 1642516425146251264512645次小值 1264512465124651246512456

a(i) = Int(Rnd * (99 - 10 + 1) + 10) Print a(i); Next i For i = 1 To n - 1 For j = i To n If a(i) > a(j) Then temp = a(i) '交换元素 a(i) = a(j) a(j) = temp End If Next j Next i Print Print "排序后:" For i = 1 To n Print a(i); Next i End Sub 2)冒泡法排序 算法说明:相邻的元素进行比较,如果前面的元素比后面的元素大,则将它们进行交换,具体思路:设在数组a中存放n个元素,第一轮,将a(1)和a(2)进行比较,若a(1)>a(2),则交换这两个元素的值,然后继续用a(2)和a(3)比较,若a(1)>a(2),则交换这两个元素的值,以此类推,直到a(n-1)和a(n)进行比较处理后,a(n)中就存放了n个数中最大的值;第二轮,用a(1)与a(2),a(2)与a(3),…,a(n-2)与a(n-1)进行比较,处理方法相同,这一轮下来,a(n-1)中存放n个数中第二大的值;…;第n-1轮,a(1)与a(2)进行比较处理,确保最小值在a(1)中。经过n-1轮比较处理,n个数已经按从小到大的顺序排列好。 下面我们以图形的形式体现对5个数进行冒泡排序的过程: 第一轮: 第 第三轮: 第四轮: 最 大值 1 4 5 6 4 1 2 4 1 2 4

VB实验三

实验报告三 实验目的 (1)掌握一维数组(静态、动态)定义及使用 (2)掌握二维数组(静态、动态)定义及使用 (3)掌握“控件数组”的使用 (4)掌握数组相关算法(求最值,排序,查找) (5)通过数组巩固循环及多重循环程序设计 实验内容 【实验1】已知10个数为53、67、42、89、65、18、98、67、54、36,编写程序,使用Array函数存储这10个数并求和。程序运行界面如下图所示。(10分) 掌握一维静态数组的定义及使用 实验结果: 【实验1 代码】 Option Base 1 Private Sub Form_Click() Dim a(), sum% sum = 0 a = Array(53, 67, 42, 89, 65, 18, 98, 67, 54, 36) For i = 1 T o 10 Step 1 sum = sum + a(i) Next i Print "10个数字和为" & sum End Sub 【实验1 典型结果】 【实验2】动态数组声明及输入输出,程序运行界面如下图所示。(10分)掌握动态数组的使用

实验结果: 【实验2 代码】 Private Sub command1_Click() Dim a() As Integer n = 3 ReDim a(n) a(1) = 10 a(2) = 20 a(3) = 30 Print a(1), a(2), a(3) Print "用Redim Preserve a(n)改变数组大小" n = 4 ReDim Preserve a(n) a(4) = 40 Print a(1), a(2), a(3), a(4) End Sub 【实验2 典型结果】 【实验3】编写程序,定义一个二维静态数组,输出下列矩阵并分别计算矩阵两条对角线元素之和。(10分) 程序运行界面如下图所示。 掌握二维数组的定义及使用 实验结果: 【实验3 代码】 Option Explicit Option Base 1 Private Sub Form_Click() Dim a%(5, 5), i%, j%, sum%, n%, s1%, s2% For i = 1 T o 5 For j = 1 T o 5

VB常用算法典型例题及知识点

VB算法例题和解析 常用类型符号: 长整型Long & 整型Integer % 单精度型Single ! 双精度型Double # 字符型String $ 逻辑型Doolean (又称布尔型) VB常用算法: 产生随机数: Int(rnd *(终值-初值+1)+初值) 例:输出10个随机数区间为[80 , 200] For i = 1 to 10 C=int(rnd*121+80) Print c Next i 最大最小值: 最大最小值需要两者比较,所以在做的时候要把随便一个值先定义为最大值和最小值然后用for循环来逐个比较。 Max=a(1) 这里是第一步!将max和min 赋值好用来做下面的判断 Min=a(1) For i = 1 to 10 这里是第二步,判断A(I)的大小 If a(i)>max then max=a(i) If a(i) < min then min = a(i) Next i Print max Print min VB冒泡法 冒泡法是先拿出一个数字,然后一个一个判断过去.如果比他大,就放后面,比他小就放上面。

冒泡法万能代码: For i = n to 2 step -1 For j = 1 to j-1 If a(j)>a(j+1) then ----> 从大到小是 “ < “ 从小到大是 “ > ” T=a(j) a(j)=a(j+1) a(j+1)=T End if Next j Next i VB 素数代码: 素数的定义:除了1和该数本身之外,不能被其他任何整数整除的数。 思路: 1.先定义一个变量F=0 2.做一个循环,判断能不能被除了1和该数本身之外能不能被整除如果可以F 就变成1 3.如果最后F=0那么就是素数就输出它 素数代码模板: N=val(text1) F=0 For i = 2 to sqr(n) ----> sqr(n)也可以换成n-1 ,因为不能被1整除所以要从2开始循环 If n mod i =0 then f=1 Next i If f=0 then print “是素数” 水仙花数 定义:其各个位数的立方等于改数本身 思路:先要知道 个位,十位,百位, 怎么分离,分离出来之后判断 个位:K \ 100 十位:(K \ 10) Mod 10 百位: K Mod 10 输出100-999的水仙花数 代码 For i = 100 to 999 A= i \ 100 B= (i \ 10) Mod 10 C= i Mod 10 If a^3+b^3+c^3 =i then print i Next i 其他算法: 统计字符个数:总复习P292 逆向文字: 总复习 P307 模拟投掷骰子: 总复习 P289 工资扣税问题: 总复习 P 287 这个就是检查除了1和本身之外能不能被整除,如果被整除了。前面的标记F 就变成1 A B C 取出之后他们三个的立方如果等于I 那么就是水仙花数。

相关文档
最新文档