vb计算机二级第二天比第一天难,计算机二级VB常用算法

计算机等级考试二级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 =

1 To n

s = s *

i

Next

i

Print

s

End

Sub

错误的写法:

Private

Sub Command1_Click()

Dim n%,

i%, s&

n =

Val(InputBox("输入n"))

For i =

1 To 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常用算法(2):最值问题

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

解题技巧

最大值、最小值、平均值类型题目往往和数组放在一起考!有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列号。

计算机等级考试二级VB常用算法(3):素数

1、算法说明

素数(质数):就是一个大于等于2的整数,并且只能被1和本身整除,而不能被其他整数整除的数。

判别某数m是否是素数的经典算法是:

对于m,从I=2,3,4,……,m-1依次判别能否被I整除,只要有一个能整除,m就不是素数,否则m是素数。

Private Function sushu(ByVal n As Long) As Boolean

Dim i As

Long

For i = 2

To n - 1

If (n Mod

i) = 0 Then Exit For

Next I

If I=n then sushu=True

End Function

很显然,实际上,我们可以改进上面

For i = 2 To n – 1

为:

For i = 2 To int(sqr(m))

这样可以很好的提高效率。

以上判断是否为素数的代码务必识记!

应用举例

求100-200之内素数。

Private Sub Command1_Click()

Dim j As

Integer

For j =

100 To 200

If sushu(j) = True Then

Print j

End If

Next

j

End Sub

解题技巧

识记判断素数的算法过程,根据题意,灵活调用!

计算机等级考试二级VB常用算法(4):进制转化

1、算法说明

1) 十进制正整数m转换为R(2-16)进制的字符串。

思路: 将m不断除r取余数,直到商为0,将余数反序即得到结果。

算法实现:

Private Function Tran(ByVal m As Integer, ByVal r As Integer) As

String

Dim

StrDtoR As String, n As Integer

Do While

m <> o

n = m Mod r

m = m \ r

If n > 9 Then

StrDtoR = Chr(65 + n - 10) & StrDtoR

Else

StrDtoR = n & StrDtoR

End If

Loop

Tran =

StrDtoR

End Function

2) R(2-16)进制字符串转换为十进制正整数。

思路:R进制数每位数字乘以权值之和即为十进制数。

算法实现:

Private Function Tran(ByVal s As String, ByVal r As Integer) As

integer

Dim n As

Integer, dec As Integer

s =

UCase(Trim(s))

For i% =

1 To Len(s)

If Mid(s, i, 1) >= "A" Then

n = Asc(Mid(s, i, 1)) - Asc("A") + 10

Else

n = Val(Mid(s, i, 1))

End If

dec = dec + n * r ^ (Len(s) - i)

Next

i

Tran =

dec

End Function

解题技巧

进制转化的原理要清楚,同时编写代码时候要留意16进制中的A-F字符的处理。

计算机等级考试二级VB常用算法(5):约数因子

1、算法说明

1) 最大公约数:

用辗转相除法求两自然数m、n的最大公约数。

(1) 首先,对于已知两数m、n,比较并使得m>n;

(2) m除以n得余数r;

(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行步骤(4)

(4) mßn nßr 再重复执行(2)

譬如: 10与5

分析步骤: m=10 n=5

r=m mod n=0

所以n(n=5)为最大公约数

24与9

分析步骤: m=24 n=9

r=m mod n=6

r≠0 m=9 n=6

r=m mod n=3

r≠0 m=6 n=3

r=m mod n=0

所以n(n=3)为最大公约数

算法实现

循环实现

Private Function GCD(ByVal m As Long, ByVal n As Long) As

Long

Dim temp

As Long

If m <

n Then temp = m: m = n: n = temp

Dim r As

Long

Do

r = m Mod n

If r = 0 Then Exit Do

m = n

n = r

Loop

GCD =

n

End Function

递归实现

Private Function GCD(ByVal m As Long, ByVal n As Long) As Long

Dim temp

As Long

If m <

n Then temp = m: m = n: n = temp

Dim r As

Long

r = m Mod

n

If r = 0

Then

GCD = n

Else

m = n

n = r

GCD = GCD(m, n)

End

If

End Function

2) 最小公倍数

m×n÷最大公约数

3) 互质数

最大公约数为1的两个正整数

解题技巧

该算法需要识记!

这种类型题目的扩展是约数和因子题型。

计算机等级考试二级VB常用算法(6):排序

1、算法说明

1) 选择法排序

(1) 从n个数中选出最小数的下标,出了循环,将最小数与第一个数交换位置;

(2) 除第一个数外,在剩下的n-1个数中再按方法(1)选出次小的数,与第二个数交换位置;

(3) 以此类推,最后构成递增序列。

譬如:

8 6 9 3 2 7

第一轮交换后 2 6 9 3 8 7

第二轮交换后 2 3 9 6 8 7

第三轮交换后 2 3 6 9 8 7

第四轮交换后 2 3 6 7 8 9

第五轮无交换 2 3 6 7 8 9

程序代码如下:

Private Sub xzPaiXu(a() As Double, sheng As Boolean)

'a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。

Dim i As

Integer, j As Integer

Dim temp

As Double

Dim m As

Integer

For i =

LBound(a) To UBound(a) -

1 '进行数组大小-1轮比较

m =

i '在第i轮比较时,假定第

'i个元素为最值元素

For j = i + 1 To

UBound(a) '在剩下的元素中找出最

'值元素的下标并记录在m中

If sheng

Then '若为升序,则m记录最小元素

'下标,否则记录最大元素下标

If a(j) < a(m) Then m = j

Else

If a(j) > a(m) Then m = j

End If

Next

j '将最值元素与第i个元素交换

temp = a(i)

a(i) = a(m)

a(m) = temp

Next

i

End Sub

调用该过程示例:

Option Base 1

Private Sub Command1_Click()

Dim b(6)

As Double

b(1) =

8

b(2) =

6

b(3) =

9

b(4) =

3

b(5) =

2

b(6) =

7

Call

xzPaiXu(b, True)

For i% =

1 To 6

Print b(i)

Next

End Sub

2) 冒泡法排序

选择排序法在每一轮排序时找最值元素的下标,出了内循环(一轮排序结束),再交换最小数的位置;而冒泡法在每一轮排序时将相邻的数比较,当次序不对就交换位置,出了内循环,最值数已经冒出。

譬如:

8 6 9 3 2 7

8 6 9 3 2 7

8 6 9 2 3 7

8 6 2 9 3 7

8 2 6 9 3 7

2 8 6 9 3 7

….

2 3 8 6 9 7

….

2 3 6 8 7 9

….

2 3 6 7 8 9

….

2 3 6 7 8 9

程序代码如下:

Private Sub mpPaiXu(a() As Double, sheng As Boolean)

'a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。

Dim i As

Integer, j As Integer

Dim temp

As Double

Dim m As

Integer

For i =

LBound(a) To UBound(a) -

1 '进行n-1轮比较

For j = UBound(a) To i + 1 Step -1 '从n到i个元素两两进行比较

If sheng

Then '若次序不对,马上进行交换

If a(j) < a(j - 1) Then

temp = a(j)

a(j) = a(j - 1)

a(j - 1) = temp

End If

Else

If a(j) > a(j - 1) Then

temp = a(j)

a(j) = a(j - 1)

a(j - 1) = temp

End If

End If

Next

j '出了内循环,一轮排序结束

'最值元素冒到最上边

Next

i

End Sub

调用该过程代码基本同上。

计算机等级考试二级VB常用算法(7):排序

1、算法说明数组中元素的插入和删除一般是在已固定序列的数组中插入或删除一个元素,使得插入或删除操作后的数组还是有序的。

基本思路:首先要找到插入位置或要删除的元素。

1) 插入

代码如下:

Private Sub Command1_Click()

Dim a(10)

As Integer

Dim i As

Integer, k As Integer

For i = 0

To

9 '生成数组

a(i) = i * 3 + 1

Print

a(i);

Next

i

Print

Print

"插入14"

For k = 0

To

9 '查找插入14在数组中的位置

If 14 < a(k) Then Exit For

Next

k

For i = 9

To k Step -1 '从最后元素开始逐个后移,腾出位置

a(i + 1) = a(i)

Next

i

a(k) =

14 '插入数14

For i = 0

To 10

Print a(i);

Next

i

Print

End Sub

2) 1 4 7 10 13 16 19 22 25 28

K

删除  代码如下:

Dim a() as integer

….

ReDim a(1 to n)

For i=k+1 to n

a(i-1)=a(i)

Next I

Redim preserve a(1 to n-1)

计算机等级考试二级VB常用算法(8):排序

1、算法说明

1) 顺序查找

逐个元素找,如果有,则记录位置,然后跳出循环;否则,查找失败。

代码如下:

Private Sub Search(a(), ByVal Key, Index As Integer)

Dim i%

For i = LBound(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%)

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

计算机等级考试二级VB常用算法(9):排序

1、算法说明

1) 初等数学

递推法

又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都在旧值的基础上递推出新值,并由新值代替旧值。

问题:猴子吃桃子

小猴子有若干桃子,第一天吃掉一半多一个;第二天吃掉剩下的一半多一个…..;如此,到第七天早上要吃时,只剩下一个桃子。问小猴子一开始共有多少桃子?

分析:可以最后一天桃子数推出倒数第二天的桃子数;再从倒数第二天推出倒数第三天桃子数………..

设第n天桃子数为xn,前一天桃子数是:xn-1,则有关系:

xn=xn-1/2-1

程序如下:

Private Sub Command1_Click()

Dim n%, i%

x =

1 '第七天桃子数

Print "第七天桃子数: 1只"

For i = 6 To 1 Step -1

x = (x + 1) * 2

Print "第" & i & "天桃子数:" & x & "只"

Next i

End Sub

穷举法

又称枚举法,即将所有可能情况一一测试,判断是否满足条件,一般用循环实现。

问题:百元买鸡问题。

假定小鸡每只5角;公鸡每只2元;母鸡每只3元。现在有100元,要求买100只鸡,编程列出所有可能的购鸡方案。

分析:

设母鸡、公鸡、小鸡分别x、y、z只,则有:

x+y+z=100

3x+2y+0.5z=100

程序一:

Private Sub Command1_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 + 0.5 * z = 100 Then

Print x, y, z

End If

Next z

Next y

Next x

End Sub

程序二(优化)

Private Sub Command1_Click()

Dim x%, y%

For x = 0 To 33

For y = 0 To 50

If 3 * x + 2 * y + 0.5 * (100 - x - y) = 100 Then

Print x, y, 100 - x - y

End If

Next y

Next x

End Sub

2) 高等数学

求积分

近似计算积分:s=∫13(x3+2x+5)dx

代码如下:

Public Function f(ByVal x!) '被积函数

f = x * (x * x + 2) + 5

End Function

Public Function trapez(ByVal a!, ByVal b!, ByVal n%) As Single

'b、a分别为积分上下限,n为等分数

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

调用:

Private Sub Command1_Click()

Print trapez(1, 3, 30)

End Sub

数论综合题

此类题目比较广泛,必须给以足够重视。

历年题目有:平方数、零巧数、拟互满数、回文数、酉完数、完数、幸运数、逆序数以及无暇素数、超级素数、因子和等。

计算机等级考试二级VB常用算法(10):字符处理

1、算法说明

1) 加密解密

最简单的加密方法是:将每个字母加一序数,例如5,这时:

“A”→”F”,”a” →”f”,”B” →”G”,”b” →”g”……”Y” →”D”, ”y” →”d”,”Z” →”E”,

”z” →”e”

解密是加密的逆操作。

界面如下:

代码如下:

Option Explicit

Private Sub Command1_Click()

Dim strInput$, Code$, Record$, c As String * 1

Dim i%, length%, iAsc%

strInput = Text1.Text

length = Len(Trim(strInput))

Code = ""

For i = 1 To length

c = mid(strInput, i, 1)

Select Case c

Case "A" To "Z"

iAsc = Asc(c) + 5

If iAsc > Asc("Z") Then iAsc = iAsc - 26

Code = Code & Chr(iAsc)

Case "a" To "z"

iAsc = Asc(c) + 5

If iAsc > Asc("z") Then iAsc = iAsc - 26

Code = Code & Chr(iAsc)

Case Else

Code = Code & c

End Select

Next i

Text2.Text = Code

End Sub

Private Sub Command3_Click()

Text1.Text = ""

Text2.Text = ""

Text3.Text = ""

Text1.SetFocus

End Sub

2) 统计

问题提出

统计字符或者数字出现的次数。

算法说明

以字符统计为例,设基本问题如下:

请统计一段文本中英文字母在文本中出现的次数。(不区分大小写)

如:I am a student.

得到:

A:2 d:1 e:1 I:1 m:1 n:1 s:1 t:2 u:1

分析:

由于不区分大小写,因此可定义一个大小为26(下标:0-25)的数组,每个元素依次记录A、B、C…Z字母出现的次数。

A(0)存放字母a出现的次数

A(1)存放字母b出现的次数

A(2)存放字母c出现的次数

A(3)存放字母d出现的次数

譬如:aabdc

代码如下:

Option

Explicit

Private

Sub Command1_Click()

Dim i As Integer, j As Integer

Dim zimu(25) As Integer

Dim allStr As String

Dim aStr As String

allStr = UCase(Text1.Text)

For i = 1 To Len(Text1.Text)

aStr = Mid(allStr, i, 1)

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

zimu(Asc(aStr) - Asc("A")) = zimu(Asc(aStr) - Asc("A")) + 1

End If

Next i

For i = 0 To 25

If zimu(i) <> 0 Then

j = j + 1

Text2.Text = Text2.Text & Chr(i + Asc("A")) & ":" &

str(zimu(i)) & " "

If j Mod 5 = 0 Then Text2.Text = Text2.Text & Chr(13) &

Chr(10)

End If

Next i

End

Sub

解题技巧

熟练运用字符处理函数,对于一些数论题,譬如逆序数等也可将数字通过CStr函数转换为字符后,利用字符处理函数来解题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值