<P><A>八、矩阵(二维数组)运算 </A></P>
<P align=left><STRONG>( </STRONG><STRONG>1 </STRONG><STRONG>) </STRONG><STRONG>矩阵的加、减运算 </STRONG><STRONG></STRONG></P>
<P>C(i,j)=a(i,j)+b(i,j) 加法 </P>
<P>C(i,j)=a(i,j)-b(i,j) 减法 </P>
<P><STRONG>( </STRONG><STRONG>2 </STRONG><STRONG>)矩阵相乘 </STRONG></P>
<P>(矩阵 A 有 M*L 个元素,矩阵 B 有 L*N 个元素,则矩阵 C=A*B 有 M*N 个元素)。矩阵 C 中任一元素 (i=1,2,…,m; j=1,2,…,n) </P>
<P align=left>For i = 0 To m </P>
<P align=left>For j = 0 To n </P>
<P align=left>c(i, j) = 0 </P>
<P align=left>For k = 0 To l </P>
<P align=left>c(i, j) = c(i, j) + a(i, k) * b(k, j) </P>
<P align=left>Next k </P>
<P align=left>Next j </P>
<P align=left>Next i </P>
<P align=left><STRONG>( </STRONG><STRONG>3 </STRONG><STRONG>)矩阵传置 </STRONG><STRONG></STRONG></P>
<P align=left>例 : 有二维数组 a(5,5) ,要对它实现转置,可用下面两种方式: </P>
<P align=left>For i=1 to 5 (2) For i=2 to 5 </P>
<P align=left>For j=i+1 to 5 For j=1 to i </P>
<P align=left>t=a(i,j) t=a(i,j) </P>
<P align=left>a(i,j)= a(j,i) a(i,j)= a(j,i) </P>
<P align=left>a(j,i)=t a(j,i)=t </P>
<P align=left>Next j Next j </P>
<P align=left>Next i Next i </P>
<P align=left><STRONG>( </STRONG><STRONG>4 </STRONG><STRONG>)求二维数组中最小元素及其所在的行和列 </STRONG><STRONG></STRONG></P>
<P>基本思路同一维数组,可用下面程序段实现(以二维数组 a(2,3) 为例): </P>
<P>‘变量 max 中存放最大值, row,column 存放最大值所在行列号 </P>
<P>Max = a(1, 1): row = 1: Column = 1 </P>
<P>For i = 1 To 2 </P>
<P>For j = 1 To 3 </P>
<P>If a(i, j) > a(row, Column) Then </P>
<P>Max = a(i, j) </P>
<P>row = i </P>
<P>Column = j </P>
<P>End If </P>
<P>Next j </P>
<P>Next i </P>
<P>Print " 最大元素是 "; Max </P>
<P>Print " 在第 " & row & " 行 ,"; " 第 " & Column & " 列 " </P>
<H3><A>九、迭代法 </A></H3>
<P align=left>算法思想: </P>
<P>对于一个问题的求解 x ,可由给定的一个初值 x0 ,根据某一迭代公式得到一个新的值 x1 ,这个新值 x1 比初值 x0 更接近要求的值 x ;再以新值作为初值,即: x1 → x0, 重新按原来的方法求 x1, 重复这一过和直到 |x1-x0|< ε ( 某一给定的精度 ) 。此时可将 x1 作为问题的解。 </P>
<P align=left>例:用迭代法求某个数的平方根。 已知求平方根的迭代公式为: </P>
<P align=left>Private Function Fsqrt( a As single ) AS single </P>
<P>Dim x0 As Single, x1 As Single </P>
<P>x0 =a/2 ' 迭代初值 </P>
<P>x1 = 0.5*(x0 + a/x0) </P>
<P>Do </P>
<P>x0 = x1 ' 为下一次迭代作准备 </P>
<P>x1 = 0.5*(x0 + a/x0) </P>
<P>Loop While Abs(x1 - x0) > 0.00001 </P>
<P>Fsqrt=x1 </P>
<P>End Function </P>
<H3><A>十、数制转换 </A></H3>
<P>将一个十进制整数 <EM>m </EM>转换成 → r(2 - 16) 进制字符串。 </P>
<P>方法:将 <EM>m </EM>不断除 <EM>r </EM>取余数,直到商为零,以反序得到结果。下面写出一转换函数,参数 idec 为十进制数, ibase 为要转换成数的基(如二进制的基是 2 ,八进制的基是 8 等),函数输出结果是字符串。 </P>
<P align=left>Private Function TrDec(idec As Integer, ibase As Integer) As String </P>
<P>Dim strDecR$, iDecR% </P>
<P>strDecR = "" </P>
<P>Do While idec <> 0 </P>
<P>iDecR = idec Mod ibase </P>
<P>If iDecR >= 10 Then </P>
<P>strDecR = Chr$(65 + iDecR - 10) & strDecR </P>
<P>Else </P>
<P>strDecR = iDecR & strDecR </P>
<P>End If </P>
<P>idec = idec \ ibase </P>
<P>Loop </P>
<P>TrDec = strDecR </P>
<P>End Function </P>
<H3><A>十一、字符串的一般处理 </A></H3>
<P align=left><STRONG>1 </STRONG><STRONG>.简单加密和解密 </STRONG></P>
<P><STRONG>加密的思想是: </STRONG></P>
<P>将每个字母 C 加(或减)一序数 K ,即用它后的第 K 个字母代替,变换式公式: c=chr(Asc(c)+k) </P>
<P>例如序数 k 为 5 ,这时 "A" → "F" , "a" →? "f" , "B" →? "G"… </P>
<P>当加序数后的字母超过 "Z" 或 "z" 则 c=Chr(Asc(c)+k -26) </P>
<P>例如: You are good → Dtz fwj ltti </P>
<P><STRONG>解密为加密的逆过程 </STRONG></P>
<P>将每个字母 C 减(或加)一序数 K ,即 c=chr(Asc(c)-k), </P>
<P>例如序数 k 为 5 ,这时 "Z" → "U" , "z" → "u" , "Y" → "T"… </P>
<P>当加序数后的字母小于 "A" 或 "a" 则 c=Chr(Asc(c)-k +26) </P>
<P>下段程序是加密处理: </P>
<P align=left>i = 1: strp = "" </P>
<P>nL = Len(RTrim(strI)) </P>
<P>Do While (i <= nL) </P>
<P>strT = Mid$(strI, i, 1) ' 取第 i 个字符 </P>
<P>If (strT >= "A" And strT <= "Z") Then </P>
<P>iA = Asc(strT) + 5 </P>
<P>If iA > Asc("Z") Then iA = iA - 26 </P>
<P>strp = strp + Chr$(iA) </P>
<P>ElseIf (strT >= "a" And strT <= "z") Then </P>
<P>iA = Asc(strT) + 5 </P>
<P>If iA > Asc("z") Then iA = iA - 26 </P>
<P>strp = strp + Chr$(iA) </P>
<P>Else </P>
<P>strp = strp + strT </P>
<P>End If </P>
<P>i = i + 1 </P>
<P>Loop </P>
<P>Print strp </P>
<P><STRONG>2 </STRONG><STRONG>. </STRONG><STRONG>统计文本单词的个数 </STRONG><STRONG></STRONG></P>
<P>算法思路: </P>
<P>( 1 )从文本(字符串)的左边开始,取出一个字符;设逻辑量 WT 表示所取字符是否是单词内的字符,初值设为 False </P>
<P>( 2 )若所取字符不是 “ 空格 ” , “ 逗号 ” , “ 分号 ” 或 “ 感叹号 ” 等单词的分隔符,再判断 WT 是否为 True ,若 WT 不为 True 则表是新单词的开始,让单词数 Nw=Nw+1 ,让 WT=True; </P>
<P>( 3 )若所取字符是 “ 空格 ” , “ 逗号 ” , “ 分号 ” 或 “ 感叹号 ” 等单词的分隔符, 则表示字符不是单词内字符,让 WT=False; </P>
<P>• 再依次取下一个字符,重得( 2 ) (3) 直到文本结束 <STRONG>。 </STRONG></P>
<P>下面程序段是字符串 strI 中包含的单词数 </P>
<P align=left>Nw = 0: Wt = False </P>
<P>nL = Len(RTrim(strI)) </P>
<P>For i = 1 To nL </P>
<P>strT = Mid$(strI, i, 1) ' 取第 i 个字符 </P>
<P>Select Case strT </P>
<P>Case " ", ",", ";", "!" </P>
<P>Wt = False </P>
<P>Case Else </P>
<P>If Not Wt Then </P>
<P>Nw = Nw + 1 </P>
<P>Wt = True </P>
<P>End If </P>
<P>End Select </P>
<P>Next i </P>
<P>Print " 单词数为: ", Nw </P>
<P><STRONG> </STRONG><A><STRONG>十二、穷举法 </STRONG></A></P>
<P align=left>穷举法(又称 “ 枚举法 ” )的基本思想是:一一列举各种可能的情况,并判断哪一种可能是符合要求的解,这是一种 “ 在没有其它办法的情况的方法 ” ,是一种最 “ 笨 ” 的方法,然而对一些无法用解析法求解的问题往往能奏效,通常采用循环来处理穷举问题。 </P>
<P align=left><STRONG>例: </STRONG>将一张面值为 100 元的人民币等值换成 100 张 5 元、 1 元和 0.5 元的零钞,要求每种零钞不少于 1 张,问有哪几种组合? </P>
<P align=left>Dim i%, j%, k% </P>
<P>Print "5 元 1 元 0.5 元 " </P>
<P>For i = 1 To 20 </P>
<P>For j = 1 To 100 - i </P>
<P>k = 100 - i - j </P>
<P>If 5.0 * i + 1.0 * j + 0.5 * k = 100 Then </P>
<P>Print i, j, k </P>
<P>End If </P>
<P>Next j </P>
<P>Next i</P>
<H3><A>十三、递归算法 </A></H3>
<P><STRONG>用自身的结构来描述自身,称递归 </STRONG><STRONG></STRONG></P>
<P>VB 允许在一个 Sub 子过程和 Function 过程的定义内部调用自己,即递归 Sub 子过程和递归 Function 函数。递归处理一般用栈来实现,每调用一次自身,把当前参数压栈,直到递归结束条件;然后从栈中弹出当前参数,直到栈空。 </P>
<P align=left><STRONG>递归条件: </STRONG>( 1 )递归结束条件及结束时的值;( 2 )能用递归形式表示,且递归向终止条件发展。 </P>
<P align=left>例:编 fac <EM>(n)=n! </EM>的递归函数 </P>
<P>Function fac(n As Integer) As Integer </P>
<P>If n = 1 Then </P>
<P>fac = 1 </P>
<P>Else </P>
<P>fac = n * fac(n - 1) </P>
<P>End If </P>
<P>End Function</P> |