《2022年常用算法与编程技巧 .pdf》由会员分享,可在线阅读,更多相关《2022年常用算法与编程技巧 .pdf(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Visual Basic 程序设计实验指导81 21 计数、累加与累乘计数、累加与累乘在程序设计中是最基本的语句,其使用频率非常高,许多问题的编程中都要使用到。但往往初学Visual Basic 时,是不容易搞清的,本节通过几个例题对他们做进一步的解释。计数语句的格式为:n = n +1 其含义是“变量n 的当前值加上1 后再送给变量n” ,即变量 n 的值增加了1。将计数语句放到循环中时,即可实现计数。通常计数变量n 的初值为 0。累加语句的格式为:s = s + x 其含义是“变量s 的当前值加上变量x 的值后再送给变量s” ,即变量s 的值为 s 与 x值之和。 将累加语句放到循环中时,
2、即可实现累加的作用。通常累加变量s 的初值为 0。特别的当变量x 的值为 1 时,累加语句即为计数语句。累乘语句的格式为:t = t * x 其含义是 “变量 t 的当前值乘以变量x 的值后再送给变量t” ,即变量 t 的值为 t 与 x 值之积。将累乘语句放到循环中时,即可实现累乘的作用。通常累乘变量t 的初值为 1。以上三条语句的共同特点是赋值号的两侧出现相同的变量,可以做出相同的解释:即先计算赋值号右侧的表达式的值,然后将结果送给左侧的变量。【例 2.1】编写一个程序, 生成 20 个随机整数,输出其中能被3 整除的数的个数与他们的和。程序如下:Private Sub Command1_
3、Click() Dim i As Integer, n As Integer, s As Single, x As Integer Randomize n = 0: s = 0 计数变量、累加变量赋初值For i = 1 To 20 x = Int(Rnd * 90 + 10) 产生一个随机数If x Mod 3 = 0 Then 判断是否能被3 整除Print x n = n + 1 计数s = s + i 累加End If Next i Print n=; n, s=; s 输出End Sub 【例 2.2】编写一个程序,求下面阶乘的和。S = 1! + 2! +3! + ,+ 7!名师资
4、料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 48 页 - - - - - - - - - 第 2 部分常用算法与编程技巧82 程序如下:程序 1:Private Sub Command1_Click() Dim i As Integer, s As Single, t As Integer t = 1 累乘变量赋初值For i = 1 To 7 t = t * i 累乘s = s + t 累加Next i Print s=; s End Sub 程序 2:Private S
5、ub Command1_Click() Dim i As Integer, j As Integer, s As Single, t As Integer For i = 1 To 7 t = 1 累乘变量赋初值For j = 1 To i t = t * j 累乘Next j s = s + t 累加Next i Print s=; s End Sub 比较程序 1 与程序 2 的实现方法有什么不同?注意程序2 中给累乘变量赋初值语句的位置。【例 2.3】目前世界人口为60 亿,如果以每年1.4%的速度增长,多少年后世界人口达到或超过70 亿?分析:使用公式 p = p0 * (1 + r)
6、 ,p0 为当前人口, r 为增长率程序如下:Private Sub Command1_Click() Dim p As Single, r As Single, n As Integer p = 60 累乘变量赋初值r = 0.014 增长率Do p = p * (1 + r) 累乘n = n + 1 计数Loop Until p = 70 Print n; 年后世界人口达到; p; 亿 End Sub 程序中累乘变量p 每乘一个( 1+r) ,年份增加1 年,直到变量p=70 满足时, n 即为所求的年数。这种用法,体现出了累乘的特点。若采用下面的做法,则是不可取的,请分析原因?Priva
7、te Sub Command2_Click() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 48 页 - - - - - - - - - Visual Basic 程序设计实验指导83 Dim p As Single, p0 As Single, r As Single, n As Integer p0 = 60 r = 0.014 Do n = n + 1 p = p0 * (1 + r) n Loop Until p = 70 Print n; 年后世界人口达到;
8、 p; 亿 End Sub22 输出格式控制在 Visual Basic 中,输出程序运行的结果,通常使用的是Print 方法。 使用 Print 方法可以将文本输出到窗体、图片框、立即窗口或打印机上。使用格式如下: 对象 .Print 输出列表 说明:(1) 对象可以是窗体 (Form) 、 图片框(PictureBox ) 、 立即窗口( Debug) 或打印机(Printer) 。省略对象名时,将输出内容输出到当前窗体上。(2)如果省略输出列表,则输出一个空行。(3)输出列表的各项之间可以用逗号“,”或分号“;”分隔。当采用逗号作分隔符时,称为标准输出格式,每个输出项宽度为14 个字符;
9、 当采用分号作分隔符时,称为紧凑输出格式,输出数值数据时,数值的前面有一个符号位(正数为空格),后面有一个空格,输出字符串数据时前后都没有空格。(4)若语句行末尾没有分隔符,则输出当前输出项后自动换行。若以分号或逗号结束,则输出当前输出项后不换行,下一个Print 语句输出的内容将输出在同一行上。Print 语句的输出格式只有两种,一种是标准输出格式,另一种是紧凑格式。在实际使用时,经常要与Tab 函数配合使用。【例 2.4】设计一个程序。单击窗体则在窗体上输出一个由“*”号组成的平行四边形图案,程序参考界面如图2.1 所示。【分析】 在窗体或图形框中输出一个由字符组成的图形,通常采用的方法是
10、,使用多重For 循环语句控制输出多行,每一行输出多个字符。外循环控制需要输出几行,内循环控制在一行上输出几个字符。输出语句采用Print 语句并与 Tab 函数配合控制输出的位置。程序如下:Private Sub Form_Click() Dim i As Integer, j As Integer Cls 清除窗体Print For i = 1 To 6 Print Tab(25 - i); 定位每行输出开始的位置For j = 1 To 8 每行由 8 个“ *”号组成名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精
11、心整理 - - - - - - - 第 3 页,共 48 页 - - - - - - - - - 第 2 部分常用算法与编程技巧84 Print *; Next j Print 输出一行后换行Next i End Sub 程序运行结果如图2.1 所示。思考:如果将显示的平行四边形图案改成如图2.2 所示,该如何修改程序?【例 2.5】输出图 2.3 所示的三角图案。程序如下:Private Sub Form_Click() Dim i As Integer, j As Integer For i = 1 To 8 输出 8 行Print Tab(20 - i); 给出输出的位置For j =
12、1 To 2 * i - 1 每行输出 2i-1 个Print *; Next j 图 2.1 输出由星号组成的图案图 2.2 输出由数字组成的图案图 2.3 输出三角图案名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 48 页 - - - - - - - - - Visual Basic 程序设计实验指导85 Print 换行Next i End Sub 【例 2.6】输出下列形式的杨辉三角形。1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 ,【分析】杨辉三
13、角形有各种不同的形式,这里只是其中的一种。其特点是第i 行有 i 个数字,且第1 及第 i 个数字为 1,第 j 个数字( 2ji 1)是前一行的第j 1 及第 j 个数字之和。程序如下:Private Sub Form_Click() Dim i As Integer, j As Integer, c As Integer For i = 0 To 10 控制输出多少行c = 1 For j = 1 To 30 - 3 * i 每一行输出30-3i 个空格Print ; Next j Print c; 输出每一行的第一个1 For j = 1 To i 控制一行输出多少个数值c = c *
14、(i - j + 1) / j 计算要输出的数值Print Tab(32 - 3 * i + 6 * j); CStr(c); 用 Tab 函数控制输出的位置Next j Print 换行Next i End Sub 程序运行结果如图2.4 所示。由上述几个例题可以总结出:在窗体上输出由不同行与不同列组成的二维图形时,采用两重循环,外循环控制输出多少行,内循环控制输出多少列,Tab 函数用于控制输出的位置,在两个Next 语句之间是用于换行的Print 语句。还有一种情况是输出数据时,要求在一行上输出几个数据并分几行输出,请看例2.7。图 2.4 输出杨辉三角形名师资料总结 - - -精品资料
15、欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 48 页 - - - - - - - - - 第 2 部分常用算法与编程技巧86 【例 2.7】随机产生20 个不超过两位的整数,要求按每行5 个的格式输出。程序代码:Private Sub Form_Click() Dim i As Integer, k As Integer, n As Integer Randomize For i = 1 To 30 k = Int(Rnd * 99 + 1) 产生一个随机数Print Format(k, ); 输出
16、 k 时占 5 个位置,右对齐n = n + 1 计数If n Mod 5 = 0 Then Print 输出 5 个后换行Next i End Sub 程序运行结果如图2.5 所示。23 数字问题数字问题在实际编程的过程中经常会遇到,例如需要将一个整数的各位数字分离出来,然后让分离出来的数进行其他的运算,或者需要求余数、判断是否整除等等。可以采用下面的方法进行:(1)分离整数x 各位的数字方法 1:求余运算。 x mod 10 的值是 x 的个位数, (x10) mod 10 的值是 x 的十位数,x100 的值是 x 的百位数等等。方法 2:转换成字符型。将整型变量x 转换成字符型变量s,
17、即 s = CStr(x),然后使用字符函数取得每位数字。a = Val(Mid(s,1,1) 即为个位数, b = Val(Mid(s,2,1) 为十位数, c = Val(Mid(s,3,1) 为百位数等等。(2)判断一个整数x 能否被另一个整数y 整除方法 1:求余运算。若x mod y = 0 ,则 x 能被 y 整除,否则不能。方法 2:整除运算。若x y = x / y 或者 Int(x / y) = x / y ,则 x 能被 y 整除,否则不能。【例 2.8】编程求出所有的“水仙花数”。【分析】所谓“水仙花数”是指一个三位正整数,其各位数字的立方和等于该数本身,例如: 153
18、= 13 + 53 + 33。程序如下:图 2.5 每行 5个的形式输出名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 48 页 - - - - - - - - - Visual Basic 程序设计实验指导87 Private Sub Form_Click() Dim i As Integer, a As Integer, b As Integer, c As Integer For i = 100 To 999 a = i Mod 10 得到个位数b = i 10 M
19、od 10 得到十位数c = i 100 得到百位数If a 3 + b 3 + c 3 = i Then 条件成立即是水仙花数Print i; End If Next i End Sub 程序运行的结果为:153370 371 407 【例 2.9】求一个整数的逆序数。【分析】所谓逆序数是将一个数的高位数与对应的低位数进行调换,如3268 的逆序数为 8623。方法 1:采用的方法是:依次从低位取得每一位数,将其拼装成新的数,如3268: 取得个位数8; 取得十位数6,拼装成 86,即 86 = 8 * 10 + 6 ; 取得百位数2,拼装成 862,即 862 = 86 * 10 + 2
20、; 取得千位数3,拼装成 8623,即 8623 = 862 * 10 + 3 。用 y 表示拼装的数,t 表示取得的数,根据上面分析就有y = y * 10 + t ,y 的初值为 0。程序如下:Private Sub Form_Click() Dim x As Integer, y As Integer, t As Integer, m As Integer x = InputBox( 请输入一个整数:, 输入 ) m = x 将 x 送给 m 保存Do While x 0 t = x Mod 10 从低位取得一位数y = y * 10 + t 进行组合x = x 10 舍去最低位Loop
21、 Print m; 的逆序数为: ; y End Sub 方法 2:采用转换成字符型的方法。 按序取得字符:mid(x, i, 1) ; 拼装成新的字符串,若从左往右取字符则先取出的字符在后,若从右往左取字符则先取出的字符在前。程序如下:Private Sub Form_Click() Dim x As String, y As String, i As Integer x = InputBox( 请输入一个数字 , 输入 ) For i = 1 To Len(x) y = Mid(x, i, 1) & y 从左往右取,先取出的字符在后名师资料总结 - - -精品资料欢迎下载 - - - -
22、- - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 48 页 - - - - - - - - - 第 2 部分常用算法与编程技巧88 Next i Print 逆序数为: ;y End Sub 【例 2.10】编程序输出三位的回文数。【分析】 所谓回文数是指顺读与倒读的数字相同,即最高位与最低位相同,次高位与次低位相同,依次类推。判断的方法: 只要对输入的数 (按字符串类型处理) ,利用 mid 函数从两边往中间逐位进行比较,只要出现不相同的数对,就不是回文数。程序如下:Private Sub Form_Click() Dim x
23、As String, k As Integer, i As Integer, j As Integer For i = 100 To 999 x = CStr(i) k = Len(x) For j = 1 To k 2 If Mid(x, j, 1) Mid(x, k - j + 1, 1) Then Exit For Next j If j k 2 Then Print i; n = n + 1 If n Mod 10 = 0 Then Print 每行输出 10 个End If Next i End Sub 【例 2.11】编程序输出一个整数的所有因子。【分析】一个整数的因子包括1,但不
24、包括本身。对于整数x,求出其所有因子的一般方法是穷举法,即用1 到 x /2 去试除 x,能够整除的为x 的因子。程序如下:Private Sub Form_Click() Dim x As Integer, i As Integer x = InputBox( 请输入一个整数:, 输入一个数 ) Print x; 的因子为: ; For i = 1 To x /2 If x Mod i = 0 Then 若能整除则是因子Print i; End If Next i End Sub 【例 2.12】求 1,500之间的红玫瑰数。【分析】 所谓红玫瑰数是指,一个正整数n 的所有因子之和等于n 的
25、倍数, 则称 n为红玫瑰数。如28 的因子之和为1+2+4+7+14=28 ,所以 28 是红玫瑰数。程序如下:Private Sub Form_Click() Dim x As Integer, i As Integer 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 48 页 - - - - - - - - - Visual Basic 程序设计实验指导89 For n = 1 To 500 Sum = 0 For i = 1 To n / 2 If n Mod i
26、= 0 Then 若能整除则是因子Sum = Sum + i 求因子和End If Next i If Sum Mod n = 0 Then 判断是否是倍数Print n; End If Next n End Sub输出结果是:1 6 28 120 496 上述程序中若将If Sum Mod n = 0 Then语句改为If Sum = n Then ,则输出的结果称为完数。所谓完数是指,一个整数的所有因子之和与该数相等,则称这个数为完数。例如6=1+2+3 ,所以 6 是一个完数。【例 2.13】编写一个程序。找出2000 以内的亲密数对。【分析】所谓“亲密数对”是指甲数所有的因子和等于乙数
27、,乙数所有因子的和等于甲数,则甲、乙两数为亲密数对。如:220 的因子和: 1+2+4+5+10+11+12+20+22+44+55+110=284 284 的因子和: 1+2+4+71+142=220 则 220 和 284 为亲密数对。程序如下:Private Sub Form_Click() Dim i As Integer, j As Integer Dim sum1 As Integer, sum2 As Integer For i = 1 To 2000 sum1 = 0: sum2 = 0 For j = 1 To i / 2 找 i 的因子If i Mod j = 0 Then
28、 若能整除则是因子sum1 = sum1 + j 求因子和End If Next j For j = 1 To sum1 / 2 找 i 的因子和 sum1 的因子If sum1 Mod j = 0 Then sum2 = sum2 + j 求因子和End If Next j If i = sum2 And i n) ,用 n 到 1 之间的每一个整数去检验是图 2.6 百元购百鸡方案名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 48 页 - - - - - - -
29、- - 第 2 部分常用算法与编程技巧92 否能同时除尽m 和 n,满足条件的第一个整数即为最大公约数。程序如下:Private Sub Form_Click() Dim m As Integer, n As Integer, i As Integer m = InputBox( 请输入第一个整数) n = InputBox( 请输入第二个整数) i = IIf(m n, n, m) i 为 m 与 n 中的小者Do While m Mod i 0 Or n Mod i 0 只要有一个满足,循环继续i = i - 1 Loop MsgBox m & 与 & n & 的最大公约数为: & i i
30、 为 m 与 n 的最大公约数End Sub 【例 2.18】编程序找出30 以内的所有能构成直角三角形的整数的组合。【分析】设直角三角形的三边分别为a、b 和 c,则要构成直角三角形,需要满足:c2 = a2 + b2,并且 c 应为小于等于30 的整数。程序代码:Private Sub Form_Click() Dim a As Integer, b As Integer, c As Single For a = 1 To 30 For b = 1 To 30 c = Sqr(a 2 + b 2) 计算出 c If c = 30 And c = Int(c) Then 若条件满足则构成直角
31、三角形Print a, b, c End If Next b Next a End Sub 【例 2.19】编程序找出100 以内的所有“自然数对”。【分析】所谓“自然数对”即两个自然数的和与差都是平方数,如26 和 10,其和为 36与差为 16 均为平方数,则26 和 10 被称为自然数对。程序代码:Private Sub Form_Click() Dim i As Integer, j As Integer, sum As Single, k As Integer For i = 1 To 100 For j = 1 To i sum = i + j 两个数的和k = i - j 两个数
32、的差If Sqr(sum) = Int(Sqr(sum) And Sqr(k) = Int(Sqr(k) Then 是否平方数Print i, j End If Next j Next i End Sub 采用穷举法进行编程,由于要遍历每一种情况,运行效率不高,但在解决不定方程及名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 48 页 - - - - - - - - - Visual Basic 程序设计实验指导93 上面几个例题的问题上还值得一试。【例 2.20】求)
33、!1(2) 1(! 4! 21)cos()1(2142nxxxxnnn=1,2,直到级数的第n 项的绝对值小于等于10-6为止。【分析】 本题目可以采用两种方法,第一种方法是总结出级数的通项公式,然后采用累加的方法进行累加求和;第二种方法是总结通项之间的公比采用迭代法,然后采用累加的方法进行累加求和。这里采用迭代法。设,321ttt为级数的第1,2, 3, ,则有如下关系:ninnxttixttixttitnn)22)(32() 1(343)1(221) 1(11212232121若用变量 m 表示级数的通项,则有如下的迭代公式:)22)(32()1(2nnxmmn=2,3,4,1mn=1 根
34、据题意迭代结束的条件为000001. 0m程序如下:Private Sub Form_Click() Dim x As Single, s As Single, m As Single, n As Integer s = 1: n = 2: m = 1 变量赋初值x = InputBox( 请输入 x 的值: , 输入 ) Do m = m * (-1) * x 2 / (2 * n - 3) * (2 * n - 2) 计算出一项If Abs(m) = 0.000001 Then 条件成立则结束累加Exit Do End If s = s + m 累加n = n + 1 Loop Print
35、 Cos( & x & )= & s End Sub【例 2.21】 利用下列公式计算圆周率, 计算精确到第n 项减 1 的绝对值小于10-6为止。2222222222名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 48 页 - - - - - - - - - 第 2 部分常用算法与编程技巧94 【分析】例2.20 是使用累加的方法实现,本例则是使用累乘的方法实现。设通项的分母为t,则有:2ti = 2 22t,将2t代入,则有:tt2i =3 ,4,若用变量 m 表示
36、级数的通项,则有如下的迭代公式:m = 2 / t 根据题意迭代结束的条件为000001. 01m程序如下:Private Sub Form_Click() Dim t As Single, s As Single, m As Single s = 2 赋初值t = Sqr(2) Do m = 2 / t 计算一项s = s * m 将其累乘If Abs(m - 1) 0.000001 Then 是否满足条件Exit Do End If t = Sqr(2 + t) 为下一项做准备Loop Print s End Sub【例 2.22】用牛顿迭代法求方程0634223xxx在 1.5 附近的根
37、。【分析】牛顿迭代公式为:)()(1nnnnxfxfxx迭代变量为x0,迭代结束条件为:|xn+1-xn| 0.00001 是否满足迭代条件Print x0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 48 页 - - - - - - - - - Visual Basic 程序设计实验指导95 End Sub 【例 2.23】用二分法求方程0142243xxx在区间 0,1上的一个实根。【分析】二分法求根的思路是: 若方程0)(xf在区间 a, b上有一个实根, 则
38、)(af与)(bf必然异号,即)(af*)(bf0。设 c = (a + b)/2 ,若)(cf0,则令 a=c,否则令 b = c 。当 a-b的绝对值小于或等于给定误差要求时,则c 就是要求的根。程序代码:Private Sub Form_Click() Dim a As Single, b As Single, c As Single, f As Single a = 0: b = 1 Do c = (a + b) / 2 区间的中点f = c 3 - c 4 + 4 * c 2 1 中点的函数值If f = 0.00001 Print 方程的根是: ; (a + b) / 2 End
39、Sub 25 一维数组的应用数组在程序设计中的作用非常重要,使用数组可以存放相同类型的一批数据,并且便于利用循环对批量数据进行各种处理,包括数据的分类、排序、检索等。本节通过若干例题介绍一维数组的使用方法与技巧。在数组的使用中,下面两个函数非常重要:UBound(数组名, n) LBound( 数组名, n) 其中,参数 n 为数组维的序号,省略时,默认求第一维的维界。函数UBound( 数组名,n)求某一维的上界,LBound( 数组名, n)求数组某一维的下界。其次,动态数组在使用时,下面的固定形式会经常用到:k = k + 1 ReDim Preserve a(k) A(k) = x 这
40、三条语句使用时,会出现在循环中,其含义是:每循环一次,数组增加一个元素,并保留数组中原有元素的值,将变量x 的值存到新的元素中。【例 2.24】编写一个程序,生成20 个互不相同的两位的随机整数,将其以每行5 个的形式输出。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 48 页 - - - - - - - - - 第 2 部分常用算法与编程技巧96 【分析】基本思想是:每产生一个随机数,就与已有数组的元素进行比较,若与其中一个已有元素的值相同,则放弃并重新产生;若与已
41、有全部元素都不同,则将其加入数组中,作为一个新的元素。程序代码:Option Base 1 Private Sub Command1_Click() Dim a() As Integer, i As Integer, k As Integer Dim m As Integer, flag As Boolean Randomize ReDim a(1) 声明一个元素a(1) = Int(90 * Rnd() + 10 产生第一个元素k = 1 赋初值i = 19 Do While i 0 m = Int(90 * Rnd() + 10 产生一个数n = UBound(a) n 为数组元素的个数F
42、or j = 1 To n If m = a(j) Then 若相等则放弃Exit For End If Next j If j n Then k = k + 1 ReDim Preserve a(k) 数组增加一个元素a(k) = m 给增加的元素赋值i = i - 1 End If Loop Print k; 个互不相同的整数为: For i = 1 To k Print Format(a(i), ); If i Mod 5 = 0 Then Print 每行输出 5 个Next i End Sub程序运行结果如图2.7 所示。图 2.7 产生不同的随机数名师资料总结 - - -精品资料欢
43、迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 48 页 - - - - - - - - - Visual Basic 程序设计实验指导97 【例 2.25】编写一个程序,随机产生20 个两位数, 输出其中最大的元素和最小的元素。【分析】基本思想是:产生一个随机数,将其作为最大数及最小数。循环中将其余元素依次与最大值与最小值比较,若比最大值大,则将其作为最大值,若比最大值小,则将其与最小值进行比较;若小于最小值,则将其作为最小值,若比最小值大,则进入下一轮比较。程序代码:Option Base 1 Pr
44、ivate Sub Command1_Click() Dim D(10) As Integer, i As Integer Dim Max As Integer, Min As Integer Randomize For i = 1 To 10 D(i) = Int(90 * Rnd() + 10 Print D(i); Next i Print Max = D(1): Min = D(1) For i = 2 To 10 If D(i) Max Then Max = D(i) ElseIf D(i) a(i) Then t = a(i - 1): a(i - 1) = a(i): a(i)
45、= t End If Next i c = c + 1 处理左边下一元素For i = c + 1 To d 小数往左送If a(i - 1) a(i) Then t = a(i - 1): a(i - 1) = a(i): a(i) = t End If Next i d = d - 1 处理右边下一元素Loop While c a(k) And k i 查找插入位置k = k + 1 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 48 页 - - - - - -
46、- - - 第 2 部分常用算法与编程技巧100 Loop For j = i - 1 To k Step -1 移位a(j + 1) = a(j) Next j a(k) = x 插入 x Next i For i = 1 To 10 Print a(i); Next i End Sub【例 2.29】采用希尔排序法对数组元素按降序进行排序。【分析】 希尔排序法是一种高效率的排序方法,其基本思想是: 每次排序都是将左边的元素与右边间隔一定位置的元素进行比较,且间隔的位置总是上一次间隔位置的一半,若间隔位置为0 时,则将其置为1。设置一个标志变量,只要比较时发生了数据元素的交换,则改变标志变量
47、的状态,依据标志变量的状态判断是否已经排好序。希尔排序法的图示如下:38 42 13 27 29 16 8 40 17 21 38 42 40 27 29 16 8 13 17 21 40 42 38 27 29 16 17 21 8 13 42 40 38 29 27 17 21 16 13 8 42 40 38 29 27 21 17 16 13 8 42 40 38 29 27 21 17 16 13 8 程序代码:Option Base 1 Private Sub Form_Click() Dim a(10) As Integer, i As Integer, t As Integer
48、, k As Integer Dim flg As Boolean, m As Integer Randomize m = UBound(a) For i = 1 To m a(i) = Int(Rnd * 90 + 10) Print a(i); Next i Print k = m K = 5 flg=true 重复 K = 1 flg=true K = 2 flg=true K = 1 flg=true 重复 K = 1 flg=true 图 2.10 希尔排序法的图示重复 K = 1 flg=false 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - -
49、- - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 48 页 - - - - - - - - - Visual Basic 程序设计实验指导101 flg = True 循环开始前将标志变量置为True Do While flg flg = False 每次循环开始,将标志变量置为False k = Int(k / 2) 计算间隔的位置If k = 0 Then k = 1 若间隔为 0,强制间隔为1 i = 1 Do While i = m - k 将左边元素与间隔位置为k 的元素进行比较If a(i) a(i + k) Then t = a(i):
50、a(i) = a(i + 1): a(i + 1) = t flg = True 只要发生交换就将标志变量置为True End If i = i + 1 Loop Loop For i = 1 To m Print a(i); Next i End Sub【例 2.30】合并排序。合并排序是指将有序数组a、b 合并成另一个有序的数组c。【分析】合并排序的实现步骤如下: 设 m、n 与 k 分别指向数组a、b、c 中的元素位置,初始值分别为1、1、1; 将 a(m)与 b(n)比较,若:a(m)b(n) ,则 c(k) = b(n) ,k=k+1 ,n=n+1 重复,直到数组a、b 中有一个数组