VB程序设计典型算法.docx
VB程序设计典型算法Visual Basic 的基本控制结构 顺序结构 分支结构 循环结构 顺序结构各语句依次顺序执行 此前所学的语句的存在方式都是顺序结构 不要忘记 ² 关于赋值语句: 变量名=表达式 对象名 . 属性名=表达式 先计算右边表达式的值,然后赋值给左边的变量。 如果表达式的精度不同于左边变量的精度,则强制将表达式结果的数据类型更改为变量的精度。 字符型数据赋值给数值型变量时系统先自动将字符串转换为数值,再赋值;但是字符不可以赋值给数值变量。 非字符数据赋值给字符变量时将被转换为字符类型。 a=a+2 实现值的自增。 赋值符号=的左边必须是变量。 整体格式固定不能更改。 例:实现两个变量值的交换 temp=a : a=b : b=temp 分支结构单分支、双分支、多分支 单分支结构 第一种形式 if <条件> then <语句> 第二种形式 if <条件> then 语句 语句 end if a=inputbox( "请问1+3=?","问题1") if a=4 then print "You are smart !" a=inputbox( "请问1+3=?", "问题1") if a=4 then print "Good !" b=msgbox ("还要继续做题吗?",4+32+256) 条件 false Page 59 true 语句组 if b=6 then print "Sorry no more question" end if 练习:让用户输入两个变量,设计程序,计算并输出最大的变量。 双分支结构 语句格式: if <条件> then 语句组1 else 语句组2 end if 练习如上例 多分支结构 ( 四种形式 ) Page 60 Page 59 条件 false 语句组1 true 语句组2 End if 形式一: 见上例 形式二:( if then elseif 语句) 语句格式: if <条件> then 语句组1 elseif <条件2> then 语句组2 Page 6061 else 语句组 end if 形式三: 格式: select case <条件> case <条件的可能结果1> 语句组1 case <条件的可能结果2> 语句组2 case <条件的可能结果n> 语句组n case else 语句组1 end select 其中: ü 条件的可能结果可以是表达式 ü 条件的可能结果可以是to 表达式,如:case 20 to 30 ü 条件的可能结果可以是is 比较式,如:case is >30 形式四:( iff 函数) true 语句格式: 变量 = iif ( 条件,语句1,语句2 ) false max = iif ( 3 > 6 , "不可能" , "yes" ) 练习:如教材page 46下,实现成绩等级评价。 Page 循环结构 Page 63-64 形式一 语法格式: for 循环变量=初始值 to 终止值 step 步长 语句组1 exit for 语句组2 next 循环变量 强制退出循环体 练习及分析: 1求1100之间所有整数的和。 2.求数n的阶乘n! cls n=val(inputbox("请输入一个整数:","求阶乘",3) sum=1 for i=1 to n step 1 sum=sum*i next i msgbox "您输入的是"&n &",它的阶乘为:" &s,0+64+0+4096,n &"的阶乘" 3见教材page64中 例3.6 注意事项: 嵌套时next 循环变量要与最近的for语句循环变量匹配 形式二 Page 65 语法格式: while <条件> 语句组 wend 练习及分析:改造上述例题利用公式求e的值 page 55 cls e=0 fenmu1 n=1 while 1/fenmu>=0.000001 e=e+1/fenmu fenmu=fenmu*n n=n+1 wend print "自然对数底e近似值为:" & e print "累加了" & n & "次" 形式三 语法格式: do while | until <条件> 语句组1 强制退出exit do 循环体 语句组2 loop 练习及分析: 1. 改造上述各例 形式四 语法格式: do 语句组1 强制退出exit do 循环体 语句组2 loop while | until <条件> 练习及分析: 1.计算1200之间所有偶数之和 cls k=2 sum=0 do sum=sum+k k=k+2 loop until k>200 print "结果为:" & sum 2.判断是否素数 page 68 cls m = Val(InputBox("请输入一个整数", "输入整数") n = Sqr(m) k = 2 Do While k < Sqr(m) If m Mod k = 0 Then Exit Do Else k = k + 1 End If Loop If k > Sqr(m) Then Print m & "是素数" Else Print m & "不是素数" End If Page 65 Page 66 形式五 采用各个循环结构互相嵌套的形式,可以完成更复杂的计算。 练习分析: 1.利用*输出平行四边形; cls print for i=5 to 1 step -1 print tab(10); print spc(10-2*i); for j=1 to 2*i-1 print "*"" " next j for k=1 to 11-2*i print "*"" " next k print next i Page 2输出100200之间的素数 cls for n=101 to 200 step 2 m=int (sqr(n) k=2 do while k<=m if n mod k =0 then exit do else k=k+1 end if loop if k>m then print tab(x mod 7)*7 +(7-len(str$(n);n; x=x+1 end if next n 3打印乘法表 cls For i = 1 To 9 For j = 1 To i Print tab(j-1)*8+2) i & "*" & j & "=" &i * j; Next j Print Next i 4打印az字母金字塔(&H61 &H7A) hex(number) 简单测试 Cls k = 1 i = &H61 Do While i < &H7A For j = 1 To k Print Chr(i); i = i + 1 If i > &H7A Then Exit Do Next j Print k = k + 1 Loop 共7行,开始编制 Cls k = 1 i = &H61 For j = 1 To 7 Print Spc(17 - j); For p = 1 To j Print Chr(i) & " " i = i + 1 If i > &H7A Then Exit For Next p Print k = k + 1 Next j 5打印数字金字塔 n=1 for j=1 to 9 print spc(8-2*i); for i= 1 to j print I; next i for i=j to 1 step -1 print I; next I print next j 正确: Cls Print "(15) 数字金字塔" Print Print Print Tab(19); CStr(1) For j = 2 To 9 Print Tab(19 - j + 1); For i = 1 To j Print CStr(i); Next i For i = j - 1 To 1 Step -1 Print CStr(i); Next i Print Next j 6见课本page67 例3.8 "设置标志变量,用于判断相关条件" Page 67 dim check as boolean,counter as integer check=true : counter=0 do do while counter<20 counter=counter+1 if counter=10 then check=false exit do end if loop loop until check=false 7见课本page67 例3.9 搜寻一字符串中目标串出现的次数 dim position as integer,count as integer dim longstring as string,target as string longstring="East and West,Hone is Best !" tatget="st" position=1 do while instr(position,longstring,target) position=instr(position,longstring,target)+1 count=count+1 loop msgbox "目标串st在母串" & longstring & "中出现的次数为:" & count 增强模式:串2在串1中出现的位置和总次数放在文本框中 a = Text1.Text b = Text2 Text3.Text = "" i = 1 c = 0 Do While InStr(i, a, b) Text3 = Text3 & "," & InStr(i, a, b) c = c + 1 i = InStr(i, a, b) + 1 Loop If Text3.Text = "" Then Text3.Text = "查无此串" Else Text3 = Text3 & Chr(13) & Chr(10) & "共" & c & "次" End If 其他辅助控制语句 1Goto语句不鼓励使用 语法格式: goto 行号 | 标号 例题分析: Page 67 标号 行号 dim p as currency,r as single dim t as integer p=1000 r=0.02 t=1 again: if t>10 then goto 100 i=p*r p=p+i t=t+1 goto again 100 print "10后本利合计为:"p;"元" 采用各个循环结构互相嵌套的形式,可以完成更复杂的计算。 2end语句 Page 68 附加: (1) 1100内,能同时被3和5整除的自然数,及其个数" Cls For i = 1 To 100 If (i Mod 3 = 0) And (i Mod 5 = 0) Then Print Tab(n Mod 7) * 7); i; '整齐输出字符 n = n + 1 End If Next i Print Tab(7); "n=" n 输出倒三角形、菱形 '三角形的代码: Cls For i = 1 To 5 Print Spc(8 + i); For j = 1 To 11 - 2 * i Print "*" Next j Print Next i '菱形的代码: '上半部分 For i = 1 To 5 Print Spc(18 - i); For j = 1 To 2 * i - 1 Print "*" Next j Print Next i '下半部分 For i = 4 To 1 Step -1 Print Spc(18 - i); For j = 1 To 2 * i - 1 Print "*" Next j Print Next i 不被3整除的自然数" Cls For i = 100 To 200 If i Mod 3 <> 0 Then n = n + 1 '这是用于统计输出个数,与下面的分支搭配格式化输出数字。 If n Mod 8 = 0 Then Print Chr(13); i; 'chr(13)的结果是"换行"操作的ascii码值,执行到此处,系统换行 Else Print i; End If End If Next i 一元二次方程 Cls Print "求一元二次方程a*x2+b*x+c=0的解,考虑虚根的情况。" a = Val(InputBox("a=?", "输入方程系数", 4) b = Val(InputBox("b=?", "输入方程系数", 6) c = Val(InputBox("c=?", "输入方程系数", 2) If a = 0 Then If b = 0 Then Print "方程不成立" Else X1 = c / (-b) X2 = X1 End If Else d = b 2 - 4 * a * c If d >= 0 Then X1 = (-b + Sqr(d) / 2 / a X2 = (-b - Sqr(d) / 2 / a Else X1 = Format(-b / 2 / a, "0.000") & "+" & Format(Sqr(-d) / 2 / a, "0.000") & " i" X2 = Format(-b / 2 / a, "0.000") & "-" & Format(Sqr(-d) / 2 / a, "0.000") & " i" End If End If If d < 0 Then Print "虚根为:" Print "X1=" X1 '已经是字符串类型 Print "x2=" X2 Else Print "实根为:" Print "X1=" Format(X1, "0.000") '是数值型,所以用format( )函数格式化 Print "x2=" Format(X2, "0.000") '使得可以输出小数点前面的0 End If s=1+3+5+.+(2*n-1)+.+99 Cls For i = 1 To 99 Step 2 s = s + i Next i Print "s=1+3+5+.+(2*n-1)+.+99" Print " =" s s=1-1/2+1/3-1/4+.-1/100 Cls For i = 1 To 100 s = s + (-1) (i - 1) / i Next i Print "s=1-1/2+1/3-1/4+.-1/100" Print " =" Format(s, "0.00000") '格式化,使得输出小数点前面的0 求s=1!+2!+3!+.+n! Cls n = Val(InputBox("n=?", "求s=1!+2!+3!+.+n!", 5) For i = 1 To n t = 1 For j = 1 To i t = t * j Next j s = s + t Next i Print "s=1!+2+3#+.+n!" Print " =" s 计算三角形面积! Cls Print "计算三角形面积!" a = Val(InputBox("第一条边", "输入方程系数", 3) b = Val(InputBox("第二条边", "输入方程系数", 4) c = Val(InputBox("第三条边", "输入方程系数", 5) p = (a + b + c) / 2 s = Sqr(p * (p - a) * (p - b) * (p - c) MsgBox "s=" & s 鸡兔同笼 Cls heads =val(text1.text) '要求用户输入整数 legs = val(text2.text) tu = (legs - 2 * heads) / 2 ji = heads - tu Print tu; "rabbits", ji; "cocks" 自由落体路径问题 Cls Print "(12) 自由落体路径问题" h = 10 s = h '第一次落体是单程,所以单独计算 For i = 1 To 7 '剩余7次都是双程h h = h * (1 - 0.4) s = s + h * 2 Next i Print "第8次落地时,总共路程为" s; "米" 求两个正整数的最大公约数和最小公倍数 求解最大公约数: 1以大数m作为被除数,小点的数n作为除数,相除后取余数r; 2若r不为零,把n的值给m , r给n; m与 n继续相除得到新的r,若r仍不为零,则重复此步骤; 3最后r=0时的n就是最大公约数; 最小公倍数 4最小公倍数=/最大公约数; 代码: Function hef(byval m as long,byval n as long) as long Dim r as long,t as long If m<n then ' 保证m>n T=m : m=n : n=t End if r=m mod n ' 初始r的计算 Do while r<>0 ' 进入循环,注意条件 M=n N=r R=m mod n Loop Hef=n End function Dim a,b,c,d as long A=val(text1.text) B=val(text2.text) C=hef(a,b) ' 得出最大公约数 Text3=str(c) D=a*b/c ' 得出最小公倍数 Text4=str(d) ' 函数str( )功能是将数值转化为字符串类型 最大公约数算法(方法二): Dim m As Integer, n As Integer m = Val(Text1) ' 将文本框的值赋给变量m n = Val(Text2) If m > n Then ' 这个if语句目的是要保证 m<n t = m m = n n = t End If For i = m To 1 Step -1 ' i从较小的数开始循环,逐个比较 If (n Mod i = 0) And (m Mod i = 0) Then ' 逐个比较到底i是不是m和n公有的约数,因为是从大到小比较的,所以这个约数是最大的 Text3 = i ' 将最大公约数输出到文本框3 Exit For ' 最大公约数已经找出,所以退出for循环,停止继续比较 End If Next i 3个数的最大数,此题方法较多,这是其中的一种! Cls a = Val(InputBox("请输入正整数a:", "输入", 450) ' 输入数a b = Val(InputBox("请输入正整数b:", "输入", 23) c = Val(InputBox("请输入正整数c:", "输入", 23) If a > b Then If a > c Then Print a; Else Print a; End If Else If b > c Then Print b; Else Print c End If End If 'IfPrint IIf(a > b, IIf(a > c, a, c), IIf(b > c, b, c) 'iif语句的应用,上面的if语句也可以改成用此语句实现 输出1000之内的所有完数 完数:完数是指一个数的值恰好等于它的因子之和.例如,6的因子为1,2,3,而6=1+2+3,因此6是完数 方法一: Cls Print "(11) 输出1000之内的所有完数" For i = 1 To 1000 s = 0 n = 0 For j = 1 To i-1 ' 逐个比较直到i-1 If i Mod j = 0 Then s = s + j '这里要把整除成立的两个因子都加进来, '但是要注意到,把它自身也加了进来,下面的判断语句要减去自身 End If Next j If s= i Then n = n + 1 Print i; If n Mod 9 = 0 Then Print End If Next i 方法二: Cls Print "(11) 输出1000之内的所有完数" For i = 1 To 1000 s = 0 n = 0 For j = 1 To Sqr(i) ' 比较次数少于上述方法一 If i Mod j = 0 Then s = s + j + (i / j) ' 这里要把整除成立的两个因子都加进来, ' 但是要注意到,把它自身也加了进来,下面的判断语句要减去自身 End If Next j If (s - i = i) and (i<>1) Then ' 从s里面减去自身,并且排除1 n = n + 1 Print i; If n Mod 9 = 0 Then Print End If Next i 求出100内的自然数对 Cls n = 0 For i = 1 To 100 ' 该层循环产生第一个1100之间的整数 For j = 1 To 100 ' 该层循环是要产生第二个1100之间的整数 If Int(Sqr(i + j) = Sqr(i + j) And Int(Sqr(Abs(i - j) = Sqr(Abs(i - j) Then n = n + 1 ' 计数器,计算符合条件的输出项个数 If n Mod 5 <> 0 Then Print " *" & i & "," j; Else Print " *" & i & "," j End If End If Next j Next i 100999 之间的水仙花数 Cls For i = 100 To 999 ' 该层循环逐个产生符合条件的数字 m = i 100 ' 获取百位上的数 n = (i Mod 100) 10 ' 获取十位上的数 k = (i Mod 10) ' 获取个位上的数 If i = m 3 + n 3 + k 3 Then Print i End If Next i 水仙花数,就是指一个三位数,其各个数的立方和等于该数。例如153就是一个水仙花数, 因为153=13+53+33 自然数对是指两个自然数的和与差都是平方数,如8与17的和8+17=25与其差17-8=9都是平方数,则8与17称为自然数对。 数字矩阵 Cls Dim a(1 To 10, 1 To 10) As Integer For i = 1 To 10 For j = 1 To 10 If i = j Then a(i, j) = 0 Else a(i, j) = Rnd( ) * 100 End If Print Tab(j * 5); CStr(a(i, j) & "," ' 输出后不换行 Next j Print Chr(13) ' 输出两个空行 内层循环结束换行 Next i 要求用户输入正整数 Cls a = Text1.Text '不能用val( )函数转换,否则a就一定是数值 For i = 1 To Len(a) b = Mid(a, i, 1) If (Asc(b) < Asc(0) Or (Asc(b) > Asc(9) Then MsgBox "输入不符合要求,请在文本框中输入正整数" Exit For End If Next i (18)打印杨辉三角形 dim a( ) as long dim n as integer do n=inputbox("请输入一个小于10的正整数:") loop while( n>10) redim a(n,n) for i=1 to n a(i,1)=1 a(i,i)=1 next i for i=3 to n for j=2 to i-1 a(i,j)=a(i-1,j-1)+a(i-1,j) next j next i print for i=1 to n print tab(5); for j=1 to i print format (a(i,j),"!"); next j print next i (19) 输出随机产生的10个数中最大、最小数及其平均值 dim a (1 to 10 ) as integer dim max as integer, min as integer dim s as single randomize for i=1 to 10 a(i)=int(rnd*99)+1 print a(i) next i max=0:min=100 for i=1 to 10 if a(i)>max then max=a(i) if a(i)<min then min=a(i) s=s+a(i) next i print "最大数是:"max print "最小数是:"min print "平均值是:"s/10 (20)数组相关 dim a as variant,b as variant a=array(1,3,5,7,9) b=array("monday","Tuesday",Wednesday") for i=Lbound(a) to Ubound(a) print a(i);"" next i print for i=0 to Ubound(b) print b(i);"" next i 模拟计算器 1使用控件数组,09数字按钮使用一个控件数组,+-*/运算使用一个控件数组,=为普通控件 Dim b As Integer, a Private Sub Cmd_Click(Index As Integer) Select Case Index ' 由于本控件数组中的所有控件都执行当前的代码,所以这个select语句的功能可以用label1.caption=label1.caption & cmd(index).caption 代替,其中cmd是本控件数组的名称 Case 0 Label1.Caption = CStr(Label1.Caption & 0) Case 1 Label1.Caption = CStr(Label1.Caption & 1) Case 2 Label1.Caption = CStr(Label1.Caption & 2) Case 3 Label1.Caption = CStr(Label1.Caption & 3) Case 4 Label1.Caption = CStr(Label1.Caption & 4) Case 5 Label1.Caption = CStr(Label1.Caption & 5) Case 6 Label1.Caption = CStr(Label1.Caption & 6) Case 7 Label1.Caption = CStr(Label1.Caption & 7) Case 8 Label1.Caption = CStr(Label1.Caption & 8) Case 9 Label1.Caption = CStr(Label1.Caption & 9) End Select End Sub 2非控件数组实现方法 Dim dot As Boolean, a As Variant, op As String ' 全局变量a为变体数据类型,避免计算过大数据时出错 Private Sub Command1_Click( ) Text1.Text = Text1.Text & 1 End Sub Private Sub Command10_Click( ) Text1.Text = Text1.Text & 0 End Sub Private Sub Command11_Click( ) If dot =False Then ' dot变量用于标识当前输入的数字是否已经使用过小数点 Text1.Text = Text1.Text & "." Dot=true ' 当前数字已经使用过小数点,标识为已经使用过 End If End Sub Private Sub Command12_Click( ) a = Val(Text1.Text) ' 保存运算前输入的数字 Text1.Text = "" ' 清空文本框,为输入下一个数字作准备 dot = False ' 小数点使用标志改成未使用状态,保证下一个数可以使用小数点 op = "+" '也可以把 数字1放入op变量,用来在"="过程区别这里所执行的操作 End Sub Private Sub Command13_Click( ) a = Val(Text1.Text) Text1.Text = "" dot = False op = "-" '也可以把 数字2放入op变量,用来在"="过程区别这里所执行的操作 End Sub Private Sub Command14_Click( ) a = Val(Text1.Text) Text1.Text = "" dot = False op = "*" '也可以把 数字3放入op变量,用来在"="过程区别这里所执行的操