第5章 Visual Basic控制结构 之 常用算法举例 郭清溥
5.4 程序举例 还记得吗? 2.5.1 用Visual Basic开发应用程序的一般步骤 (1)分析问题得出算法 (2)创建应用程序的界面 (3)设置属性 (4)编写代码 (5)调试运行、生成工程或可执行文件 还记得吗?
5.4 程序举例 5.4.1 累加、累乘 例 8
5.4 程序举例 5.4.1 累加、累乘 例16 任意输入一个字符串,编写程序,将其反向输出 。
5.4 程序举例 ? 5.4.1 累加、累乘 例16 任意输入一个字符串,编写程序,将其反向输出 。 Dim N$, M$, I%, T$ 5.4.1 累加、累乘 例16 任意输入一个字符串,编写程序,将其反向输出 。 Private Sub cmdStart_Click() Dim N$, M$, I%, T$ N = txtN.Text M = "" For I = Len(N) To 1 Step -1 T = Mid(N, I, 1) M = M & T Next I txtM.Text = M End Sub For I = 1 To Len(N) M = T & M ?
5.4 程序举例 5.4.1 累加、累乘 例16 任意输入一个字符串,编写程序,将其反向输出 。 Dim N$, M$, I%, T$ 5.4.1 累加、累乘 例16 任意输入一个字符串,编写程序,将其反向输出 。 Private Sub cmdStart_Click() Dim N$, M$, I%, T$ N = txtN.Text M = "" For I = Len(N) To 1 Step -1 T = Mid(N, I, 1) M = M & T Next I txtM.Text = M End Sub Private Sub cmdStart_Click() Dim N$, M$ N = txtN.Text M = StrReverse(N) txtM.Text = M End Sub 有更简单的方法吗?
5.4 程序举例 5.4.2 输出定位 * ** *** **** ***** A ABC ABCDE ABCDEFG ABCDEFGHI
5.4 程序举例 5.4.2 输出定位 P112 例5-17 输出数字金字塔 。 For I = 0 To 8 5.4.2 输出定位 P112 例5-17 输出数字金字塔 。 For I = 0 To 8 Print Tab(27 - 3 * I); For J = 1 To I Print J; Next J …… Next I
5.4 程序举例 5.4.2 输出定位 P112 例5-17 输出数字金字塔 。 For I = 0 To 8 …… 5.4.2 输出定位 P112 例5-17 输出数字金字塔 。 For I = 0 To 8 …… For J = I + 1 To 1 Step -1 Print J; Next J Print Next I
5.4 程序举例 5.4.2 输出定位 P112 例5-17 输出数字金字塔 。 Private Sub Form_Click() 5.4.2 输出定位 P112 例5-17 输出数字金字塔 。 Private Sub Form_Click() Dim I%, J% For I = 0 To 8 Print Tab(27 - 3 * I); For J = 1 To I Print J; Next J For J = I + 1 To 1 Step -1 Print Next I End Sub
5.4 程序举例 例17 ?
5.4 程序举例 5.4.3 穷举法 例18 编写程序,计算我国古代数学家提出的“百钱百鸡问题”:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏几何?” 分析: 我们分别用 X,Y,Z 表示公鸡、母鸡、小鸡的个数 则有: X + Y + Z =100 ① 5X+3Y+Z/3=100 ② 由方程②可知:X的取值范围为[0,20]中的整数。 Y的取值范围为[0,33]中的整数。 因此我们可以用二重循环来解决这个问题
5.4 程序举例 5.4.3 穷举法 例18
5.4 程序举例 5.4.3 穷举法 例18 Dim X%, Y%, Z% For X = 0 To 20 For Y = 0 To 33 5.4.3 穷举法 例18 Dim X%, Y%, Z% For X = 0 To 20 For Y = 0 To 33 Z = 100 - X - Y If 5 * X + 3 * Y + Z / 3 = 100 Then lblX.Caption = lblX.Caption & " " & X lblY.Caption = lblY.Caption & " " & Y lblZ.Caption = lblZ.Caption & " " & Z End If Next Y Next X
5.4 程序举例 5.4.3 穷举法 例19 一个长长的阶梯,如果一次上两阶,最后剩一阶;如果一次上三阶,最后剩两阶;如果一次上五阶,最后剩四阶;如果一次上六阶,最后剩五阶;如果一次上七阶,刚好上完。编写程序,计算这个阶梯至少有多少阶?
5.4 程序举例 5.4.3 穷举法 例19 解法1 设阶梯长 X 阶,则: X Mod 2 = 1 ① 分析: X Mod 3 = 2 ② 5.4.3 穷举法 例19 解法1 设阶梯长 X 阶,则: X Mod 2 = 1 ① X Mod 3 = 2 ② X Mod 5 = 4 ③ X Mod 6 = 5 ④ X Mod 7 = 0 ⑤ 分析: 由 ① 知 X 为奇数; 由 ⑤ 知 X 为 7 的倍数; 则我们可以控制循环由 7 开始,每次增加 14,在循环体中比较 X 是否满足条件②、③、④。
5.4 程序举例 5.4.3 穷举法 例19 解法1
5.4 程序举例 5.4.3 穷举法 例19 解法1 Dim X% X = 7 Do If X Mod 3 = 2 And X Mod 5 = 4 And X Mod 6 = 5 Then lblResult.Caption = lblResult.Caption & X Exit Do Else X = X + 14 End If Loop
5.4 程序举例 5.4.3 穷举法 例19 解法2 假设阶梯有 X 阶,则: X Mod 2 = 1 ① 分析: 5.4.3 穷举法 例19 解法2 假设阶梯有 X 阶,则: X Mod 2 = 1 ① X Mod 3 = 2 ② X Mod 5 = 4 ③ X Mod 6 = 5 ④ X Mod 7 = 0 ⑤ 由 ①、②、③、④ 知 X+1 是2、3、5、6 的倍数, 也就是 X+1 能同时整除2、3、5、6,换句话说就是(X+1)可整除2,3,5,6的最小公倍数30,可用表达式表示为: (X+1) Mod 30 = 0 ⑥ 分析:
5.4 程序举例 5.4.3 穷举法 例19 解法2 分析: 现在条件变为: X Mod 7 = 0 ⑤ 5.4.3 穷举法 例19 解法2 分析: 现在条件变为: X Mod 7 = 0 ⑤ (X+1) Mod 30 = 0 ⑥ 则我们可以控制循环由 29 开始,每次增加 30,在循环体中比较 X 是否满足条件⑤。
5.4 程序举例 5.4.3 穷举法 例19 解法2 Dim X% X = 29 Do If X Mod 7 = 0 Then 5.4.3 穷举法 例19 解法2 Dim X% X = 29 Do If X Mod 7 = 0 Then Label1.Caption = Label1.Caption & X Exit Do Else X = X + 30 End If Loop
5.4 程序举例 5.4.4 递推法 “递推法”又称“迭代法”,就是在知道某些结果的前提下,根据已经给出的(或者是分析总结出的)递推公式,推出所要的结果。
5.4 程序举例 5.4.4 递推法 例20 已知前两个数分别是1,1,从第三个数据开始每个数据都是其前两个数据的和,编写程序,输出该数列的前12个数 。 -- Fabonacci序列
5.4 程序举例 5.4.4 递推法 例20 我们用A、B分别表示前两个数。由于从第三个数开始每个数都是前两个数的和,所以如果仍然用A、B表示第三、四个数,则有: 分析: A B A =A+B B =B+A 第1个数 第2个数 第3个数 第4个数 A = A + B B = B + A
5.4 程序举例 5.4.4 递推法 例20 Dim A%, B%, I% Show A = 1: B = 1 Print A, B 5.4.4 递推法 例20 Dim A%, B%, I% Show A = 1: B = 1 Print A, B For I = 2 To 6 A = A + B B = B + A Next I
5.4 程序举例 5.4.4 递推法 例21 一个猴子摘了一堆桃子。第一天吃了一半,又多吃一个。第二天还是吃了一半,又多吃一个。它每天如此,到第5 天时只剩一个桃子了。编写程序,计算猴子第一天共摘了多少个桃子?
5.4 程序举例 5.4.4 递推法 根据题目描述, 例21 第5天剩1个桃子, T5=1 第4天剩下的桃子数,T4=2×(T5+1) 5.4.4 递推法 例21 根据题目描述, 第5天剩1个桃子, T5=1 第4天剩下的桃子数,T4=2×(T5+1) 第3天剩下的桃子数,T3=2×(T4+1) 第2天剩下的桃子数,T2=2×(T3+1) 第1天剩下的桃子数,T1=2×(T2+1) 因此我们得到:Tn=2×(Tn+1+1) (n=4,3,2,1) 假设程序中我们用T表示每天的桃子数。 用循环控制执行四次:T=2*(T+1) 即可得到要求的结果。 分析:
5.4 程序举例 5.4.4 递推法 例21 Dim T%, I% T = 1 For I = 1 To 4 T = 2 * (T + 1) 5.4.4 递推法 例21 Dim T%, I% T = 1 For I = 1 To 4 T = 2 * (T + 1) Next I lblResult.Caption = "猴子第一天共摘了 " & _ T & " 个桃子"
5.4 程序举例 1 n! 例22 我们利用公式计算工程常量。 ≤Accuracy 分析: 我们 用 E 表示待求的工程常量 用 M 表示第 N+1个数据项的分母(M = N! ) 当 1 / M > Accuracy 为真时重复执行: E = E + 1 /M N = N + 1 M = M * N
5.4 程序举例 我们利用公式计算工程常量。 <Temp 1 n! 例22
5.4 程序举例 例22 Private Sub cmdStart_Click() Dim E#, N%, M&, Accuracy! Accuracy = Val(InputBox("", "输入精确度")) lblPrecision.Caption = "输入的精确度为:" & Accuracy While 1 / M > Accuracy E = E + 1 / M N = N + 1 M = M * N Wend txtE.Text = E End Sub
5.4 程序举例 T (N≥2) 利用部分级数和近似计算Sinx 分析 假定我们用 S 表示待求的SinX;用 N表示求和序列的数据项数;用 T 表示第N项的值: T (N≥2)
5.4 程序举例 利用部分级数和近似计算Sinx Dim n%, s#, t!, term!, x! Term = 0.0000001 x = Val(InputBox("输入X的值")) t = x: n = 1: s = t Do Until Abs(t) < Term n = n + 1 t = -t * x * x / ((2 * n - 2) * (2 * n - 1)) s = s + t Loop Label1.Caption = " SinX =" & s Label2.Caption = "Sin(X)=" & Sin(x)
第5章作业3 P116 习题:一、二
第5章作业3 1. 编写程序,使用循环结构计算2n的值(n由键盘输入)。 2. 编写程序,显示所有的“水仙花数”(所谓水仙花数 是指三位数其各个位上数字的立方和等于该数字本身。 例如,153=13+53+33。因此153是水仙花数)。 3. 编写程序,计算a+aa+aaa+…+aa…aa(n个a)的值 (a和n均由键盘输入)。 例如,当a=3,n=5时,需要计算的式子为: 3+33+333+3333+33333