声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5656|回复: 13

[VB] [推荐]VB 程序设计的常用算法

[复制链接]
发表于 2005-8-14 10:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
<P align=left>算法( Algorithm ):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。 </P>
<H3><A>一、计数、求和、求阶乘等简单算法 </A></H3>
<P>此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。 例:用随机函数产生 100 个 [0 , 99] 范围内的随机整数,统计个位上的数字分别为 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 的数的个数并打印出来。 </P>
<P>本题使用数组来处理,用数组 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) 。 </P>
<P>将程序编写在一个 GetTJput 过程中,代码如下: </P>
<P>Public Sub GetTJput() </P>
<P>Dim a(1 To 100) As Integer </P>
<P>Dim x(1 To 10) As Integer </P>
<P>Dim i As Integer, p As Integer </P>
<P>' 产生 100 个 [0 , 99] 范围内的随机整数,每行 10 个打印出来 <BR>For i = 1 To 100 </P>
<P>a(i) = Int(Rnd * 100) </P>
<P>If a(i) &lt; 10 Then </P>
<P>Form1.Print Space(2); a(i); </P>
<P>Else </P>
<P>Form1.Print Space(1); a(i); </P>
<P>End If </P>
<P>If i Mod 10 = 0 Then Form1.Print </P>
<P>Next i </P>
<P>' 统计个位上的数字分别为 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 的数的个数,并将统计结果保存在数组 x(1),x(2),...,x(10) 中,将统计结果打印出来 </P>
<P>For i = 1 To 100 </P>
<P>p = a(i) Mod 10 ' 求个位上的数字 </P>
<P>If p = 0 Then p = 10 </P>
<P>x(p) = x(p) + 1 </P>
<P>Next i </P>
<P>Form1.Print " 统计结果 " </P>
<P>For i = 1 To 10 </P>
<P>p = i </P>
<P>If i = 10 Then p = 0 </P>
<P>Form1.Print " 个位数为 " + Str(p) + " 共 " + Str(x(i)) + " 个 " </P>
<P>Next i </P>
<P>End Sub <BR></P>
<H3><A>二、求两个整数的最大公约数、最小公倍数 </A></H3>
<P align=left>分析:求最大公约数的算法思想: ( 最小公倍数 = 两个整数之积 / 最大公约数 ) </P>
<P>(1) 对于已知两数 <EM>m , n , </EM>使得 <EM>m&gt;n </EM>; </P>
<P>(2) <EM>m </EM>除以 <EM>n </EM>得余数 <EM>r </EM>; </P>
<P>(3) 若 <EM>r= </EM>0 ,则 <EM>n </EM>为求得的最大公约数,算法结束;否则执行 (4) ; </P>
<P>(4) <EM>m ← n </EM>, <EM>n ← r </EM>,再重复执行 (2) 。 </P>
<P>例如 : 求 <EM>m=14 ,n=6 </EM>的最大公约数 . m n r </P>
<P>14 6 2 </P>
<P>6 2 0 </P>
<P>m=inputBox("m=") </P>
<P>n=inputBox("n=") </P>
<P>nm=n*m </P>
<P>If m &lt; n Then t = m: m = n: n = t </P>
<P>r=m mod n </P>
<P>Do While (r &lt;&gt; 0) </P>
<P>m=n </P>
<P>n=r </P>
<P>r= m mod n </P>
<P>Loop <BR>Print " 最大公约数 =", n </P>
<P>Print " 最小公倍数 =", nm/n </P>
<P><A><STRONG><FONT size=3>三、判断素数 </FONT></STRONG></A></P>
<P>只能被 1 或本身整除的数称为素数 基本思想:把 m 作为被除数,将 2—INT ( <IMG src="http://www.ahbvc.cn/jpkc/vbjpck/cysf_clip_image002.gif">)作为除数,如果都除不尽, m 就是素数,否则就不是。(可用以下程序段实现) </P>
<P align=left>m =val( InputBox(" 请输入一个数 ")) </P>
<P>For i=2 To int(sqr(m)) </P>
<P>If m Mod i = 0 Then Exit For </P>
<P>Next i </P>
<P>If i &gt; int(sqr(m)) Then </P>
<P>Print " 该数是素数 " </P>
<P>Else </P>
<P>Print " 该数不是素数 " </P>
<P>End If </P>
<P align=left>将其写成一函数 , 若为素数返回 True ,不是则返回 False </P>
<P align=left>Private Function Prime( m as Integer) As Boolean </P>
<P>Dim i% </P>
<P>Prime=True </P>
<P>For i=2 To int(sqr(m)) </P>
<P>If m Mod i = 0 Then Prime=False: Exit For </P>
<P>Next i </P>
<P>End Function </P>

评分

1

查看全部评分

回复
分享到:

使用道具 举报

 楼主| 发表于 2005-8-14 10:49 | 显示全部楼层

回复:(风花雪月)[推荐]VB 程序设计的常用算法

<P><A><STRONG>四、验证哥德巴赫猜想 </STRONG></A></P>
<P><STRONG>(任意一个大于等于 6 的偶数都可以分解为两个素数之和) </STRONG></P>
<P>基本思想: n 为大于等于 6 的任一偶数,可分解为 n1 和 n2 两个数,分别检查 n1 和 n2 是否为素数,如都是,则为一组解。如 n1 不是素数,就不必再检查 n2 是否素数。先从 n1=3 开始,检验 n1 和 n2 ( n2=N-n1 )是否素数。然后使 n1+2 再检验 n1 、 n2 是否素数, … 直到 n1=n/2 为止。 </P>
<P>利用上面的 prime 函数,验证哥德巴赫猜想的程序代码如下: </P>
<P>Dim n%,n1%,n2% </P>
<P>n=Val(InputBox(" 输入大于 6 的正整数 ")) </P>
<P>For n1=3 to n\2 step 2 </P>
<P>n2=n-n1 </P>
<P>If prime(n1) Then </P>
<P>If prime(n2) then </P>
<P>Print n &amp; "=" &amp; n1 &amp; "+" &amp; n2 </P>
<P>Exit For ' 结束循环 </P>
<P>End if </P>
<P>End if </P>
<P>Next n1 </P>
<P><A><STRONG><FONT size=3>五、排序问题 </FONT></STRONG></A></P>
<P><STRONG>1 .选择法排序(升序) </STRONG></P>
<P>基本思想: </P>
<P>1 )对有 n 个数的序列(存放在数组 a(n) 中),从中选出最小的数,与第 1 个数交换位置; </P>
<P>2 )除第 1 个数外,其余 n-1 个数中选最小的数,与第 2 个数交换位置; </P>
<P>3 )依次类推,选择了 n-1 次后,这个数列已按升序排列。 </P>
<P>程序代码如下: </P>
<P align=left>For i = 1 To n - 1 </P>
<P align=left>imin = i </P>
<P align=left>For j = i + 1 To n </P>
<P align=left>If a(imin) &gt; a(j) Then imin = j </P>
<P align=left>Next j </P>
<P align=left>temp = a(i) </P>
<P align=left>a(i) = a(imin) </P>
<P align=left>a(imin) = temp </P>
<P align=left>Next I </P>
<P align=left><STRONG>2 </STRONG><STRONG>.冒泡法排序(升序) </STRONG><STRONG></STRONG></P>
<P>基本思想: ( 将相邻两个数比较,小的调到前头 ) </P>
<P>1 )有 n 个数(存放在数组 a(n) 中),第一趟将每相邻两个数比较,小的调到前头,经 n-1 次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”; </P>
<P>2 )第二趟对余下的 n-1 个数(最大的数已“沉底”)按上法比较,经 n-2 次两两相邻比较后得次大的数; </P>
<P>3 )依次类推, n 个数共进行 n-1 趟比较,在第 j 趟中要进行 n-j 次两两比较。 </P>
<P>程序段如下 </P>
<P align=left>For i = 1 To n - 1 </P>
<P>For j = 1 To n-i </P>
<P>If a(j) &gt; a(j+1) Then </P>
<P>temp=a(j) : a(j)=a(j+1) : a(j+1)=temp </P>
<P>End if </P>
<P>Next j </P>
<P>Next i </P>
<P>  </P>
<P><STRONG>3 .合并法排序(将两个有序数组 A 、 B 合并成另一个有序的数组 C ,升序) </STRONG></P>
<P>基本思想: </P>
<P>1 )先在 A 、 B 数组中各取第一个元素进行比较,将小的元素放入 C 数组; </P>
<P>2 )取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完; </P>
<P>3 )将另一个数组剩余元素抄入 C 数组,合并排序完成。 </P>
<P align=left>程序段如下: </P>
<P>Do While ia &lt;= UBound(A) And ib &lt;= UBound(B) ' 当 A 和 B 数组均未比较完 </P>
<P>If A(ia) &lt; B(ib) Then </P>
<P>C(ic) = A(ia) : ia = ia + 1 </P>
<P>Else </P>
<P>C(ic) = B(ib) : ib = ib + 1 </P>
<P>End If </P>
<P>ic = ic + 1 </P>
<P>Loop </P>
<P>Do While ia &lt;= UBound(A) 'A 数组中的剩余元素抄入 C 数组 </P>
<P>C(ic) = A(ia) </P>
<P>ia = ia + 1 : ic = ic + 1 </P>
<P>Loop </P>
<P>Do While ib &lt;= UBound(B) 'B 数组中的剩余元素抄入 C 数组 </P>
<P>C(ic) = B(ib) </P>
<P>ib = ib + 1 : ic = ic + 1 </P>
<P>Loop </P>
 楼主| 发表于 2005-8-14 10:50 | 显示全部楼层

回复:(风花雪月)[推荐]VB 程序设计的常用算法

<P><A><STRONG>六、查找问题 </STRONG></A></P>
<P><STRONG>1 . ① 顺序查找法(在一列数中查找某数 x ) </STRONG></P>
<P>基本思想:一列数放在数组 a(1)---a(n) 中,待查找的数放在 x 中,把 x 与 a 数组中的元素从头到尾一一进行比较查找。用变量 p 表示 a 数组元素下标, p 初值为 1 ,使 x 与 a(p) 比较,如果 x 不等于 a(p) ,则使 p=p+1 ,不断重复这个过程;一旦 x 等于 a(p) 则退出循环;另外,如果 p 大于数组长度,循环也应该停止。(这个过程可由下语句实现) </P>
<P>p = 1 </P>
<P>Do While x &lt;&gt; a(p) And p &lt; =n </P>
<P>p = p + 1 </P>
<P>Loop </P>
<P align=left>下面写一查找函数 Find ,若找到则返回下标值,找不到返回 0 </P>
<P align=left>Option Base 1 </P>
<P>Private Function Find( a( ) As Single,x As Single) As Integer </P>
<P>Dim n%,p% </P>
<P>n=Ubound( a ) </P>
<P>p = 1 </P>
<P>Do While x &lt;&gt; a(p) And p &lt; =n </P>
<P>p = p + 1 </P>
<P>Loop </P>
<P>If p&gt;n then p=0 </P>
<P>Find=p </P>
<P>End Function </P>
<P>  </P>
<P>②基本思想:一列数放在数组 a(1)---a(n) 中,待查找的关键值为 key ,把 key 与 a 数组中的元素从头到尾一一进行比较查找,若相同,查找成功,若找不到,则查找失败。 ( 查找子过程如下。 index :存放找到元素的下标。 ) </P>
<P>Public Sub Search(a() As Variant, key As Variant, index%) </P>
<P>Dim i% </P>
<P>For i = LBound(a) To UBound(a) </P>
<P>If key = a(i) Then </P>
<P>index = i </P>
<P>Exit Sub </P>
<P>End If </P>
<P>Next i </P>
<P>index = -1 </P>
<P>End Sub </P>
<P>  </P>
<P>2 .折半查找法(只能对有序数列进行查找) </P>
<P>基本思想: 设 n 个有序数(从小到大)存放在数组 a(1)----a(n) 中,要查找的数为 x 。用变量 bot 、 top 、 mid 分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间, mid=(top+bot)/2 ,折半查找的算法如下: </P>
<P>( 1 ) x=a(mid) ,则已找到退出循环,否则进行下面的判断; </P>
<P>( 2 ) x&lt;a(mid) , x 必定落在 bot 和 mid-1 的范围之内,即 top=mid-1 ; </P>
<P>( 3 ) x&gt;a(mid) , x 必定落在 mid+1 和 top 的范围之内,即 bot=mid+1 ; </P>
<P>( 4 )在确定了新的查找范围后,重复进行以上比较,直到找到或者 bot&lt;=top 。 </P>
<P>将上面的算法写成如下函数,若找到则返回该数所在的下标值,没找到则返回 -1 。 </P>
<P>Function search(a() As Integer, x As Integer) As Integer </P>
<P>Dim bot%, top%, mid% </P>
<P>Dim find As Boolean ' 代表是否找到 </P>
<P>bot = LBound(a) </P>
<P>top = UBound(a) </P>
<P>find = False ' 判断是否找到的逻辑变量,初值为 False </P>
<P>Do While bot &lt;= top And Not find </P>
<P>mid = (top + bot) \ 2 </P>
<P>If x = a(mid) Then </P>
<P>find = True </P>
<P>Exit Do </P>
<P>ElseIf x &lt; a(mid) Then </P>
<P>top = mid - 1 </P>
<P>Else </P>
<P>bot = mid + 1 </P>
<P>End If </P>
<P>Loop </P>
<P>If find Then </P>
<P>search = mid </P>
<P>Else </P>
<P>search = -1 </P>
<P>End If </P>
<P align=left><FONT size=2>End Function <STRONG></STRONG></FONT></P>
<P><A><STRONG>七、插入法 </STRONG></A></P>
<P><STRONG>把一个数插到有序数列中,插入后数列仍然有序 </STRONG></P>
<P>基本思想: n 个有序数(从小到大)存放在数组 a(1)—a(n) 中,要插入的数 x 。首先确定 x 插在数组中的位置 P ;(可由以下语句实现) </P>
<P>p=1 </P>
<P>do while x&gt;a(p) and p&lt;=n </P>
<P>p=p+1 </P>
<P>loop </P>
<P>a(p)—a(n) 元素向后顺移一个位置以空出 a(p) 元素放入 x ,可由以下语句实现: </P>
<P>for i=n to p step-1 </P>
<P>a(i+1)=a(i) </P>
<P>next i </P>
<P>a(p)=x </P>
<P>将其写成一插入函数 </P>
<P align=left>Private Sub Instert(a() As Single, x As Single) </P>
<P>Dim p%, n%, i% </P>
<P>n = UBound(a) </P>
<P>ReDim Preserve a(n + 1) </P>
<P>p = 0 </P>
<P>Do While x &gt; a(p) And p &lt; =n ' 确定 x 应插入的位置 </P>
<P>p = p + 1 </P>
<P>Loop </P>
<P>For i = n To p Step -1 </P>
<P>a(i + 1) = a(i) </P>
<P>Next i </P>
<P>a(p) = x </P>
<P>End Sub </P>
 楼主| 发表于 2005-8-14 10:50 | 显示全部楼层

回复:(风花雪月)[推荐]VB 程序设计的常用算法

<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) &gt; 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 " 在第 " &amp; row &amp; " 行 ,"; " 第 " &amp; Column &amp; " 列 " </P>
<H3><A>九、迭代法 </A></H3>
<P align=left>算法思想: </P>
<P>对于一个问题的求解 x ,可由给定的一个初值 x0 ,根据某一迭代公式得到一个新的值 x1 ,这个新值 x1 比初值 x0 更接近要求的值 x ;再以新值作为初值,即: x1 → x0, 重新按原来的方法求 x1, 重复这一过和直到 |x1-x0|&lt; ε ( 某一给定的精度 ) 。此时可将 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) &gt; 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 &lt;&gt; 0 </P>
<P>iDecR = idec Mod ibase </P>
<P>If iDecR &gt;= 10 Then </P>
<P>strDecR = Chr$(65 + iDecR - 10) &amp; strDecR </P>
<P>Else </P>
<P>strDecR = iDecR &amp; 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 &lt;= nL) </P>
<P>strT = Mid$(strI, i, 1) ' 取第 i 个字符 </P>
<P>If (strT &gt;= "A" And strT &lt;= "Z") Then </P>
<P>iA = Asc(strT) + 5 </P>
<P>If iA &gt; Asc("Z") Then iA = iA - 26 </P>
<P>strp = strp + Chr$(iA) </P>
<P>ElseIf (strT &gt;= "a" And strT &lt;= "z") Then </P>
<P>iA = Asc(strT) + 5 </P>
<P>If iA &gt; 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>&#8226;  再依次取下一个字符,重得( 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>
发表于 2007-9-20 01:32 | 显示全部楼层
收藏中......
十分感谢楼主的资料
发表于 2007-10-12 11:13 | 显示全部楼层

回复 #4 风花雪月 的帖子

楼主真实个高人,以后又这方面的问题要多向你请教
发表于 2007-11-26 19:56 | 显示全部楼层
好东西。收藏。
发表于 2008-1-24 10:33 | 显示全部楼层
好东西。收藏。
发表于 2008-3-27 21:33 | 显示全部楼层

龙格库塔变步长法

请教楼主龙格库塔变步长法的编写程序,急用,谢谢!~
发表于 2008-4-3 18:52 | 显示全部楼层
楼上的朋友如果还没找到,请留下信箱
发表于 2008-12-5 19:57 | 显示全部楼层
请教楼主如何编一个平面钢架矩阵有限元程序vb编的,谢谢!
发表于 2009-1-12 22:13 | 显示全部楼层
有点遗憾,缺少使用VB编程那些优化算法,好像比你原来用的程序简单:@(
发表于 2009-1-15 21:21 | 显示全部楼层

ok

谢谢!!很好!!!
发表于 2009-1-24 23:27 | 显示全部楼层
不错,不过我现在都使用vb2005了。
有没有比较高级的算法啊,比如多元函数极值,非线性最小二乘法等优化算法,还有矩阵求逆,稀疏矩阵的算法等等。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-23 19:54 , Processed in 0.065261 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表