vb算法数组实例

  • 格式:doc
  • 大小:111.00 KB
  • 文档页数:16

1.互不相等的随机数的生成算法P rivate Sub CmdStart_Click()'生成10个[1,100]范围内互不相等的随机整数Dim R(1 To 10) As Integer '保存生成的10个数Dim i As Integer, j As Integeri = 1Do While i <= 10'生成一个随机数,并保存在r(i)中R(i) = Int(Rnd * 100) + 1'将r(i)与已经生成的r(1)~r(i-1)进行比较For j = 1 To i - 1If R(i) = R(j) Then Exit ForNext jIf j >= i Then 'j>=i说明r(i)没有与r(1)~r(i-1)的任何一个数相等i = i + 1 'i加1,下一次生成新的,否则,i保持原值,下一次重新生成r(i)End IfLoopFor i = 1 To 10Print R(i);Next iPrintEnd Sub2.选择排序Private Sub CmdOrder1_Click()Form1.ClsConst N = 10Dim A(1 To N) As IntegerDim i As Integer, j As Integer, k As Integer'生成并输出10个[1,100]范围内互不相等的随机整数Print " 系统生成数据:";i = 1Do While i <= NA(i) = Int(Rnd * 100) + 1For j = 1 To i - 1If A(i) = A(j) Then Exit ForNext jIf j >= i ThenPrint A(i);i = i + 1End IfLoopPrint'开始排序For i = 1 To N - 1'将a(i)与a(i+1)~a(N)每一个数进行比较For j = i + 1 To NIf A(i) < A(j) Then '如果a(i)<a(j),交换a(i),a(j)temp = A(i)A(i) = A(j)A(j) = tempEnd IfNext j'输出第i轮排序的结果——找到a(i)~a(N)中的最大数,并放在a(i)中 Print "第" & i & "轮排序结果:";For k = 1 To NPrint A(k);Next kPrintNext iEnd Sub3.选择排序优化:Private Sub CmdOrder2_Click()Form1.ClsConst N = 10Dim A(1 To N) As IntegerDim i As Integer, j As Integer, k As Integer, Pos As Integer'生成并输出10个[1,100]范围内互不相等的随机整数Print " 系统生成数据:";i = 1Do While i <= NA(i) = Int(Rnd * 100) + 1For j = 1 To i - 1If A(i) = A(j) Then Exit ForNext jIf j >= i ThenPrint A(i);i = i + 1End IfLoopPrint'开始排序For i = 1 To N - 1'寻找a(i)~a(N)中的最大数的下标,并保存在变量Pos中Pos = iFor j = i + 1 To NIf A(Pos) < A(j) Then Pos = jNext j'如果Pos<>i,交换a(i),a(pos)If Pos <> i Thentemp = A(i)A(i) = A(Pos)A(Pos) = tempEnd If'输出第i轮排序的结果Print "第" & i & "轮排序结果:";For k = 1 To NPrint A(k);Next kPrintNext iEnd Sub4.冒泡排序及其优化Private Sub CmdOrder3_Click()Form1.ClsConst N = 10Dim A(1 To N) As IntegerDim i As Integer, j As Integer, k As Integer, Pos As Integer'生成并输出10个[1,100]范围内互不相等的随机整数Print " 系统生成数据:";i = 1Do While i <= NA(i) = Int(Rnd * 100) + 1For j = 1 To i - 1If A(i) = A(j) Then Exit ForNext jIf j >= i ThenPrint A(i);i = i + 1End IfLoopPrint'开始排序For i = 1 To N - 1'依次比较a(1)和a(2),a(2)和a(3),.....,a(N-i)和a(N-i+1),如果前数<后数,交换If A(j) < A(j + 1) Thentemp = A(j)A(j) = A(j + 1)A(j + 1) = tempEnd IfNext j'输出第i轮排序的结果——找到了a(1)~a(N-i+1)中的最小数,并放置在a(N-i+1) Print "第" & i & "轮排序结果:";For k = 1 To NPrint A(k);Next kPrintNext i'冒泡排序的冒泡方向可以从前往后,也可以从后往前,思路相似,代码略有差异End Sub5.冒泡排序优化:P rivate Sub CmdOrder4_Click()Form1.ClsConst N = 10Dim A(1 To N) As IntegerDim i As Integer, j As Integer, k As Integer, Pos As IntegerDim IsChanged As Boolean'生成并输出10个[1,100]范围内互不相等的随机整数Print " 系统生成数据:";i = 1Do While i <= NA(i) = Int(Rnd * 100) + 1For j = 1 To i - 1If A(i) = A(j) Then Exit ForNext jIf j >= i ThenPrint A(i);i = i + 1End IfLoopPrint'开始排序For i = 1 To N - 1'利用变量ischanged来监视是否发生数据交换,如果没有交换,表示数据排序已经完成,可以提前推出IsChanged = FalseIf A(j) < A(j + 1) Thentemp = A(j)A(j) = A(j + 1)A(j + 1) = tempIsChanged = TrueEnd IfNext j'输出第i轮排序的结果——找到了a(1)~a(N-i+1)中的最小数,并放置在a(N-i+1) Print "第" & i & "轮排序结果:";For k = 1 To NPrint A(k);Next kPrintIf Not IsChanged Then Exit ForNext iEnd Sub6.数组中元素的插入Private Sub CmdStart_Click()Dim a() As IntegerReDim a(1 To 10)'生成原始数据a(1)~a(10)Print "原始数据:";For i = 1 To 10a(i) = Int(Rnd * 100) + 1Print a(i);Next iposition = Val(InputBox("请选择插入数据的位置(1~11)"))x = Val(InputBox("请输入数据"))'为数组扩容ReDim Preserve a(1 To 11)'移动插入位置后面的数据,注意移动的顺序和所移动的数据,不要多移、少移For i = 10 To position Step -1a(i + 1) = a(i)Next i'插入数据a(position) = x'输出新的数据PrintPrint "新的数据:";For i = 1 To 11Print a(i);Next iPrintEnd Sub7-1开始插入Option Base 1Option ExplicitDim a() As IntegerPrivate Sub CmdStart_Click()'函数说明:'lbound(数组名):返回数组的下标下限'ubound(数组名):返回数组的下标上限Dim x As Integer, Pos As Integer, i As Integerx = Val(InputBox("请输入准备插入数组的数据"))'为数组扩容ReDim Preserve a(UBound(a) + 1)'寻找数据x的插入位置pos——数组中第一个大于x的数据的位置 Pos = LBound(a)Do While (a(Pos) <= x And Pos <= UBound(a) - 1)Pos = Pos + 1Loop'移动插入位置后面的数据For i = UBound(a) To Pos + 1 Step -1a(i) = a(i - 1)Next i'插入数据a(Pos) = x'输出新的数据PrintPrint "新的数据:";For i = LBound(a) To UBound(a)Print a(i);Next iPrintEnd Sub7-2生成数据并排序Private Sub Command1_Click()ReDim a(10)Dim i As Integer, j As Integer, Pos As IntegerDim Temp As Integer'生成原始数据a(1)~a(10)For i = 1 To 10a(i) = Int(Rnd * 100) + 1Next i'排序For i = 1 To 9Pos = iFor j = i + 1 To 10If a(Pos) > a(j) Then Pos = jNext jIf Pos <> i ThenTemp = a(Pos): a(Pos) = a(i): a(i) = TempEnd IfNext iPrint "原始有序数据:";For i = 1 To 10Print a(i);Next iPrintEnd Sub8.数组中元素的删除先随机生成数据:Private Sub Command1_Click()ReDim a(10)Dim i As Integer, j As Integer, pos As IntegerDim Temp As Integer'生成原始数据a(1)~a(10)Print "原始数据:";For i = 1 To 10a(i) = Int(Rnd * 100) + 1Print a(i);Next iPrintEnd SubOption Base 1Option ExplicitDim a() As IntegerPrivate Sub CmdStart_Click()'函数说明:'lbound(数组名):返回数组的下标下限'ubound(数组名):返回数组的下标上限Dim x As Integer, pos As Integer, i As Integerx = Val(InputBox("请输入准备删除的数据"))'查找需要删除的数据是否存在For pos = LBound(a) To UBound(a)If a(pos) = x Then Exit ForNext posIf pos > UBound(a) Then '需要删除的数据不存在MsgBox "需要删除的数据不存在,删除动作立即停止!", vbOKOnly + vbCriticalElse'通过移动数据达到删除数据的目的For i = pos To UBound(a) - 1a(i) = a(i + 1)Next i'数组缩容ReDim Preserve a(UBound(a) - 1)'输出新的数据PrintPrint "新的数据:";For i = LBound(a) To UBound(a)Print a(i);Next iPrintEnd IfEnd Sub9.顺序查找法Private Sub CmdStart_Click()'函数说明:'lbound(数组名):返回数组的下标下限'ubound(数组名):返回数组的下标上限Dim x As Integer, pos As Integer, i As Integerx = Val(InputBox("请输入查找的数据"))pos = LBound(a)Do While pos <= UBound(a)If a(pos) <> x Thenpos = pos + 1ElseExit DoEnd IfLoopIf pos > UBound(a) Then '数据不存在MsgBox "数据不存在!", vbOKOnly + vbInformationElseMsgBox "数据在数组中的下标是" & pos, vbOKOnly + vbInformation End IfEnd Sub10.折半查找Private Sub Command2_Click()Dim x As Integer, l As Integer, r As Integer, m As Integerx = Val(InputBox("请输入查找的数据"))l = 1r = 10Dom = (l + r) / 2If a(m) > x Thenl = m + 1ElseIf a(m) < x Thenr = m - 1End IfLoop While (l <= r And a(m) <> x)If a(m) = x ThenMsgBox "数据在数组中的下标是" & m, vbOKOnly + vbInformationElseMsgBox "数据不存在!", vbOKOnly + vbInformationEnd If'注:折半查找的查找效率高于顺序查找,但是需要以数据的有序性作为前提'实际应用中,排序并不需要每次都进行,排序值需要完成一次即可'而且利用插入排序可以使得数据在输入完成的时候即可完成排序End Sub11.回文判断法1:Private Sub Command1_Click()Dim s As Strings = Text1.Textl = Len(s)For i = 1 To l / 2c1 = Mid(s, i, 1)c2 = Mid(s, l - i + 1, 1)If c1 <> c2 ThenExit ForEnd IfNext iIf i <= l / 2 ThenLabel2.Caption = "不是回文!"ElseLabel2.Caption = "是回文!"End IfEnd Sub法2Private Sub Command2_Click()Dim s() As StringSt = Text1.Textl = Len(St)ReDim s(1 To l)For i = 1 To ls(i) = Mid(St, i, 1)Next iFor i = 1 To l / 2If s(i) <> s(l - i + 1) ThenExit ForEnd IfNext iIf i <= l / 2 ThenLabel2.Caption = "不是回文!"ElseLabel2.Caption = "是回文!"End IfEnd Sub12.矩阵的转置:Option Base 1Option ExplicitPrivate Sub Command1_Click()Const N = 5Dim a(N, N) As Integer, temp As Integer Dim i As Integer, j As Integer'生成并输出数据Print "转置前"For i = 1 To 5For j = 1 To 5a(i, j) = Int(Rnd * 100)Print a(i, j);Next jPrintNext i'矩阵转置For i = 1 To 5For j = 1 To i - 1temp = a(i, j)a(i, j) = a(j, i)a(j, i) = tempNext jNext i'输出转置后的矩阵Print "转置后"For i = 1 To 5For j = 1 To 5Print a(i, j);Next jPrintNext iend Sub13.矩阵的乘法运算(P72例3-24):Option Base 1Option ExplicitDim a(5, 3) As Integer, b(3, 4) As Integer, c(5, 4) As Integer 1.生成矩阵A:Private Sub Command1_Click()Dim i As Integer, j As Integer'生成并输出矩阵APrint "矩阵A:"For i = 1 To 5For j = 1 To 3a(i, j) = Int(Rnd * 10)Print a(i, j);Next jPrintNext iEnd Sub2.生成矩阵BPrivate Sub Command2_Click()Dim i As Integer, j As Integer'生成并输出矩阵APrint "矩阵B:"For i = 1 To 3For j = 1 To 4b(i, j) = Int(Rnd * 10)Print b(i, j);Next jPrintNext iEnd Sub3.矩阵相乘:Private Sub Command3_Click()Dim i As Integer, j As Integer, k As IntegerPrint "A*B"For i = 1 To 5For j = 1 To 4'计算c(i,j)=a(i,1)*b(1,j)+a(i,2)*b(2,j)+a(i,3)*b(3,j)c(i, j) = 0For k = 1 To 3c(i, j) = c(i, j) + a(i, k) * b(k, j)Next kPrint c(i, j); Spc(7 - Len(Str(c(i, j))));Next jPrintNext iEnd Sub14.矩阵鞍点的查找(所在行最小,同时是所在列最大的元素)附:某些特殊矩阵元素的特征描述(上三角、下三角、对角线元素等)Option Base 1Option ExplicitPrivate Sub Command3_Click()Dim a(4, 5) As IntegerDim i As Integer, j As Integer, k As IntegerForm1.ClsPrint "原始矩阵"For i = 1 To 4For j = 1 To 5a(i, j) = Int(Rnd * 90) + 10Print a(i, j);Next jPrintNext i'开始寻找鞍点,'方法:针对第i行'找出第i行中最小的元素的列号k'查找k列的所有元素,是否存在大于a(i,k)的元素,如果不存在,可以确定为鞍点For i = 1 To 4'找出第i行中最小的元素的列号kk = 1For j = 2 To 5If a(i, j) < a(i, k) Then k = jNext j'遍历第k列元素,确定是否存在大于a(i,k)的元素For j = 1 To 4If a(j, k) > a(i, k) Then Exit ForNext jIf j > 4 Then Print i, k, a(i, k)Next iEnd Sub15.杨辉三角:法1:Private Sub Command1_Click()'利用二维数组,是比较简单直观的做法Dim a(20, 20) As Long '最大不超过20层Dim N As Integer '用户输入的层数N = Val(InputBox("请输入杨辉三角的层数"))For i = 1 To N + 1a(i, 1) = 1a(i, i) = 1Next i'以下利用杨辉三角的特征计算出杨辉三角的数字,结果存放在二维数组中,结果如下'1'1 2 1'1 3 3 1'1 4 6 4 1'......For i = 3 To N + 1For j = 2 To Na(i, j) = a(i - 1, j - 1) + a(i - 1, j)Next jNext i'将二维数组的左下三角元素以杨辉三角的格式输出,每个数据占6位Form1.ClsFor i = 1 To N + 1Print Tab(30 - 3 * i);For j = 1 To ic = Trim(Str(a(i, j)))Print c; Spc(6 - Len(c)); '由于不同的数据位数不同,所以要根据位数在后面补足空格,确保总共占6位Next jPrintNext iEnd Sub法2:Private Sub Command2_Click()'用一位数组事先数据的输出'初始化数组a元素为1,1,1,1,1,1,1,1,1,1,……'第0轮'输出a(1)'第1轮'输出a(1)~a(2)'第2轮:'从a(2)~a(2),令a(i)=a(i)+a(i-1),数组元素变为1,2,1,1,1,1,1,1,1,1,……'输出a(1)~a(3)'第3轮'从a(3)~a(2),令a(i)=a(i)+a(i-1),数组元素变为1,3,3,1,1,1,1,1,1,1,……'输出a(1)~a(4)'第4轮'从a(4)~a(2),令a(i)=a(i)+a(i-1),数组元素变为1,4,6,4,1,1,1,1,1,1,……'输出a(1)~a(5)'......'第i轮'从a(i)~a(2),令a(i)=a(i)+a(i-1)'输出a(1)~a(i+1)'......Dim a(20) As LongFor i = 1 To 20a(i) = 1Next iN = Val(InputBox("请输入杨辉三角的层数"))Form1.ClsFor i = 0 To N'计算a(i)~a(2)For j = i To 2 Step -1a(j) = a(j) + a(j - 1)'由于step=-1 ,所以当i=0,1的时候,循环没有进行,因此第0,1轮没有赋值,只有后面的输出Next j'输出a(1)~a(i+1)Print Tab(30 - 3 * i);For j = 1 To i + 1c = Trim(Str(a(j)))Print c; Spc(6 - Len(c));Next jPrintNext iEnd Sub16.海盗船上的生存问题Private Sub Command1_Click()Dim a() As IntegerDim N As Integer '总人数Dim D As Integer '死亡数字Dim Curp As Integer '当前轮到数数字的人Dim Pnum As Integer '当前船上剩余的人数Dim i As Integer 'Form1.ClsN = Val(Text1.Text)D = Val(Text2.Text)ReDim a(N)For i = 1 To Na(i) = 1Next iPrint "下海顺序:"i = 0Curp = 0Pnum = NDoCurp = Curp + 1 '轮到下一个人数数If (Curp > N) Then Curp = 1 '如果一轮数完,让第一个人数If (a(Curp) = 1) Then i = i + 1 '下标为Curp的人如果还在船上,由他数下一个数If (i = D) Then '如果数到死亡数字a(Curp) = 0 '把当前数数人扔下海Print Curp '输出当前扔下海的人Pnum = Pnum - 1 '剩余人数减1i = 0 '从头重新数End IfLoop While (Pnum > 1)'寻找安全位置For i = 1 To NIf a(i) = 1 ThenPrint "安全位置=" & iExit ForEnd IfNext iEnd Sub。