计算机等级考试二级VB常用算法.docx

上传人:b****6 文档编号:8016830 上传时间:2023-01-28 格式:DOCX 页数:21 大小:148.40KB
下载 相关 举报
计算机等级考试二级VB常用算法.docx_第1页
第1页 / 共21页
计算机等级考试二级VB常用算法.docx_第2页
第2页 / 共21页
计算机等级考试二级VB常用算法.docx_第3页
第3页 / 共21页
计算机等级考试二级VB常用算法.docx_第4页
第4页 / 共21页
计算机等级考试二级VB常用算法.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

计算机等级考试二级VB常用算法.docx

《计算机等级考试二级VB常用算法.docx》由会员分享,可在线阅读,更多相关《计算机等级考试二级VB常用算法.docx(21页珍藏版)》请在冰豆网上搜索。

计算机等级考试二级VB常用算法.docx

计算机等级考试二级VB常用算法

一、字符处理1

1、算法说明

  1)加密解密

  最简单的加密方法是:

将每个字母加一序数,例如5,这时:

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

  解密是加密的逆操作。

  界面如下:

  

  代码如下:

Word-WRAP:

break-word"bgColor=#f3f3f3>以下是引用片段:

  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)统计

  问题提出

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

  算法说明

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

  请统计一段文本中英文字母在文本中出现的次数。

(不区分大小写)

  如:

Iamastudent.

  得到:

  A:

2d:

1e:

1I:

1m:

1n:

1s:

1t:

2u:

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函数转换为字符后,利用字符处理函数来解题。

2、实战练习

  1)补充代码(2003秋二(8))

  下面程序的功能是统计文件中英文字母(不区分大小写)出现的个数。

Word-WRAP:

break-word"bgColor=#f3f3f3>以下是引用片段:

  Option Base 1

  Private Sub Command1_Click()

  Dim alpha(26) As Integer,n As Integer

  Dim i As Integer,s As String

  Open "c:

\kav2003\readme.txt" For Input As #11

  Do While Not EOF(11)

  s= 

(1)

  s=UCase(s)

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

  n= 

(2)

  alpha(n)=alpha(n)+1

  End If

  Loop

  For i=1 To 26

  If alpha(i)<>0 Then

  List1.AddItem Chr(i+64)&":

"&CStr(alpha(i))

  End If

  Next i

  Close

  End Sub

  2)补充代码(2000秋二(6))

  下面程序的功能是:

统计当前盘当前文件夹中的顺序文件data.txt中共有多少个单词,约定连续出现的字母定义为一个单词。

以下是引用片段:

  Option Explicit

  Private Sub Form_Click()

  Dim Char() As String, St As String, Tem As String

  Dim Idx As Integer, Js As Long, Flen As Long

  Dim F As Boolean, W As String * 1

  

(1)

  Flen = LOF(10)

  St = Input(Flen, #10)

  Js = 1

  Do While Js <= Flen+1

  W = Mid(St, Js, 1)

  If 

(2) Then

  Tem = Tem + W

  F = True

  ElseIf F = True Then

  Idx = Idx + 1

  ReDim Preserve Char(Idx)

  Char(Idx) = Tem

  Tem = (3)

  F = False

  End If

  (4)

  Loop

  Print "共有"; Idx; "个单词"

  For Js = 1 To Idx

  Print Char(Js)

  Next Js

  End Sub

排序1

1、算法说明

  1)初等数学

  递推法

  又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。

每次重复都在旧值的基础上递推出新值,并由新值代替旧值。

  问题:

猴子吃桃子

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

问小猴子一开始共有多少桃子?

  分析:

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

  设第n天桃子数为xn,前一天桃子数是:

xn-1,则有关系:

  xn=xn-1/2-1

  程序如下:

Word-WRAP:

break-word"bgColor=#f3f3f3>以下是引用片段:

  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

  数论综合题

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

  历年题目有:

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

排序2

1)补充代码(2002秋二(10))

  找出由两个不同数字组成的平方数,并将结果按图中的格式显示在列表框List1中。

  

Word-WRAP:

break-word"bgColor=#f3f3f3>以下是引用片段:

  Option Explicit

  Private Sub Command1_Click()

  Dim I As Long, N As Long

  For I = 11 To 300

  

(1)

  If Verify(N) Then

  

(2)

  End If

  Next I

  End Sub

  Private Function Verify( (3) ) As Boolean

  Dim A(0 To 9) As Integer, I As Integer, Js As Integer

  Do While N <> 0

  (4)

  N = N \ 10

  Loop

  For I = 0 To 9

  Js = Js + A(I)

  Next I

  (5)

  End Function

  1)编程题(2004秋上机试卷08)

  一个正整数被称为奇妙平方数,如果此数的平方与它的逆序数的平方互为逆序数。

例如,

  12^2=144,21^2=441,12与21互逆,144与441互逆,12就是奇妙平方数。

找出1-300以内所有的奇妙平方数。

1、算法说明

  1)顺序查找

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

  代码如下:

Word-WRAP:

break-word"bgColor=#f3f3f3>以下是引用片段:

  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

2、实战练习补充代码(2002春二(9))

  C盘根目录下stu.txt文件中以下的格式保存着学生姓名及班号信息。

本程序的功能是:

读取该文件中的数据,再利用InputvBox输入要查找的学生姓名,通过顺序查找,给出找到或找不到的信息。

附图是某同学被找到时显示的信息窗口。

  张文,机械01

  李明,机械01

  王文卉,机械01

  …

  何宇宙,电子02

  

Word-WRAP:

break-word"bgColor=#f3f3f3>以下是引用片段:

  Option Explicit

  Option Base 1

  Private Sub Form_click()

  Dim stu() As String, glass() As String, i As Integer

  Dim n As Integer, name As String, k As Integer

  Open "c:

\stu\stu.txt" For Input As #11

  Do While 

(1)

  

(2)

  ReDim Preserve stu(n), glass(n)

  Input #11, stu(n), glass(n)

  Loop

  name = InputBox("输入欲查找的学生姓名:

")

  Call search(name, stu, k)

  If k <= n Then

  MsgBox (3)

  Else

  MsgBox "无此人。

"

  End If

  Close #11

  End Sub

  Private Sub search(name As String, stu() As String, k As Integer)

  Dim i As Integer

  For i = 1 To UBound(stu)

  If name = stu(i) Then

  (4)

  End If

  Next i

  (5)

  End Sub

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

  基本思路:

首先要找到插入位置或要删除的元素。

  1)插入

  

  代码如下:

Word-WRAP:

break-word"bgColor=#f3f3f3>以下是引用片段:

  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)14710131619222528

  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)

2、实战练习

  C盘根目录下文件Data4.txt的内容是:

2,4,6,8,10,1,3,5,7,9。

下面程序的功能是将文件后半部分的奇数分别按序插入到前半部分的适当位置,得到的新数列是:

12345678910。

(实现方法:

第一次调整后的数列是:

12468103579第二次调整后的数列是:

12346810579)。

Word-WRAP:

break-word"bgColor=#f3f3f3>以下是引用片段:

  Option Explict

  Private Sub Form_Click()

  Dim A(10) As Integer,i As Integer,J As Integer

  Open "c:

\Data4.txt" For Input As #12

  Do 

(1)

  J=J+1

  Input #12,A(J)

  Loop

  Call Insert(A)

  For i=1 To 10

  Print A(i);

  Next i

  Print

  Close #12

  End Sub

  Private Sub Insert(A() As Integer)

  Dim i As Integer,Putp As Integer,J As Integer

  Dim Getp As Integer,N As Integer,Tem As Integer

  N=UBound(A)/2

  Putp=1

  Getp=N+1

  For i=1 To N

  Tem=A(Getp)

  For J=Getp To Putp +1 Step -1

  

(2)

  Next J

  A(Putp)=Tem

  Getp=Getp+1

  Putp= (3)

  Next i

  End Sub

  补充代码

  下面程序得功能是将无序数组中相同得数只保留一个,其余得删除,并输出经过删除后的数组元素,删除相同数是通过将该数组元素后面的元素在数组内依次前移替换前一个元素的值实现的。

数组各元素的值从文件data.txt中读取。

  

以下是引用片段:

Option Explict

  Option Base 1

  Private Sub Form_Click()

  Dim I As Integer,J As Integer,K As Integer

  Dim A()As Integer,T As Integer,M As Integer

  Open "c:

\my documents\2000test\data.txt" For Input As #1

  Do While 

(1)

  I=I+1

  Redim Preserve A(I)

  Input #1,A(I)

  Loop

  M=1:

T= 

(2)

  Do While M 

  I=M+1

  Do While I<

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1