1、第第4章章 程序设计程序设计结构结构 结构化程序设计的基本控制结构有三种,即顺序结结构化程序设计的基本控制结构有三种,即顺序结构、选择结构和循环结构构、选择结构和循环结构。例4.2 根据提示输入直角三角形的两条直角边长,求直角三角形的斜边、周长和面积。Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button1.Click Dim a,b,c,p,area As Double a=TextBox1.Text b=Text
2、Box2.Text c=Math.Sqrt(a 2+b 2)Label3.Text=直角三角形三边分别为:a=&a&,b=&b&,c=&Format(c,0.00)&vbCrLf p=(a+b+c)/2 area=Math.Sqrt(p*(p-a)*(p-b)*(p-c)Label3.Text&=直角三角形的周长=&Format(2*p,0.00)&,面积=&Format(area,0.00)End Sub End Class 4.2 选择结构选择结构 在日常生活和工作中,常常需要对给定的条件进行分析、比较和判断,并根据判断结果采取不同的操作。在Visual Basic中,这样的问题通过选择结
3、构程序来解决,而选择结构可以使用If语句、Select Case语句来实现。4.2.1 If Then Else 语句语句 If Then Else 条件语句包含三种形式:单分支、双分支和多分支。1.单分支结构IfThen语句 格式1:If 条件表达式 Then 语句 格式2:If 条件表达式 Then 语句块End If 例4.3 输入两个数x和y,编程使得x的值始终大于y。运行结果如图4-5所示。Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.Event
4、Args)Handles Button1.Click Dim x As Integer,y As Integer,t As Integer x=Val(TextBox1.Text)y=Val(TextBox2.Text)If x=a And Mid(c,i,1)=z Then cl=cl+1 Else cu=cu+1 End If Next Label1.Text=小写字母个数=&cl Label2.Text=大写字母个数=&cu End Sub End Class 3.多分支结构If Then ElseIf语句 使用IfThenElseIf语句可以定义多个语句块,Visual Basic程序
5、可以根据检测的结果执行其中的一个语句块,其语句格式如下:If 条件1 Then 语句块1 ElseIf Then 语句块2 ElseIf 条件n Then 语句块n Else 语句块n+1 End If例4.7 某购物超市节日期间举办购物打折扣的促销活动,优惠办法是:每位顾客当天一次性购物在100元以上者,按九五折优惠;在200元以上者,按九折优惠;在300元以上者,按八五折优惠;在500元以上者,按八折优惠。则可以根据顾客购物款数计算出优惠价。Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object,
6、ByVal e As System.EventArgs)Handles Button1.Click Dim x As Single,y As Single x=Val(TextBox1.Text)If x 100 Then y=x ElseIf x 200 Then y=0.95*x ElseIf x 300 Then y=0.9*x ElseIf x=90 Thengrade=优 Elself mark=80 Then grade=良 Elself mark=70 Then grade=中 Eiself mark=60 Then grade=及格 Else grade=不及格 End If
7、方法二:If mark=90 Thengrade=优 Eiself mark=80 And mark=70 And mark=60 And mark=60 Thengrade=及格 Elself mark=70 Then grade=中 Eiself mark=80 Then grade=良 Eiself mark=90 Then grade=优 Else grade=不及格 End If 4.If语句的嵌套 If语句的嵌套是指If或Else后面的语句块中又包含If语句。其语句形式如下:If 条件1 Then If 条件2 Then End If End If 例4.9 比较三个数x,y,z的
8、大小并排列,使得xy y Then t=x:x=y:y=t If y z Then t=y:y=z:z=t If x y Then t=x:x=y:y=t End If End If例4.10 输入一串字符,统计英文字母、数字和其它字符的个数。假设字符串通过文本框textbox1输入,并赋值一个字符到变量ch中。For i=1 to len(trim(textbox1.text)Ch=mid(trim(textbox1.text),I,1)(方法一 或 方法二)Next i方法一:If Char.isletter(ch)ThenIf Char.isupper(ch)Then Msgbox(ch
9、+是大写字母)ElseMsgbox(ch+是小写字母)End IfElseif char.lsnumber(ch)ThenMsgbox(ch+是数字字符)ElseMsgbox(ch+是其他字符)End If方法二(利用字符比较):If char.ToUpper(ch)=Ac And Char.ToUpper(ch)=Ac And ch=0c And ch=9c Then MsgBox(ch+是数字字符)ElseMsgBox(ch+是其他字符)End If 例4.11 编程判断某年是否是闰年。判断闰年的条件是:年份能被4整除但不能被100整除,或者能被400整除。程序算法框图如图4-9所示。本例
10、可用四种方法实现。主要源代码如下:方法一(使用日期时间型变量的成员来判断闰年):If DateTime.IsLeapYear(Year)ThenMsgBox(Year&year is a leap year!)Else MsgBox(Year&year is not a leap year!)End If 方法二(使用一个逻辑表达式包含所有的闰年条件):If Year Mod 4=0 And Year Mod 100 0 Or Year Mod 400=0 ThenMsgBox(Year&year is a leap year!)Else MsgBox(Year&year is not a l
11、eap year!)End If 方法三(使用嵌套的If语句):If Year Mod 400=0 Then MsgBox(Year&year is a leap year!)Else If Year Mod 4=0 Then If Year Mod 100=0 Then MsgBox(Year&year is not a leap year!)Else MsgBox(Year&year is a leap year!)End If Else MsgBox(Year&year is not a leap year!)End IfEnd If 方法四(使用IfElself语句):If Year
12、Mod 400=0 Then MsgBox(Year&year is not a leap year!)ElseIf Year Mod 40 ThenMsgBox(Year&year is not a leap year!)ElseIf Year Mod 400=0 ThenMsgBox(Year&year is not a leap year!)ElseMsgBox(Year&year is a leap year!)End If 4.2.2 Select Case语句语句 Select Case语句的功能与IfThenElse语句类似,但对多重选择的情况,Select Case语句使代码更
13、加易读。Select Case语句处理一个测试表达式并只计算一次。然后,将表达式的值与结构中的每个Case的值进行比较。如果相等,就执行与该Case相关联的语句块。如果不止一个Case子句中的值与测试值相匹配,则只对第一个匹配的Case执行与之相关联的语句块。其流程见图4-10所示。Select Case语句的格式为:Select Case 测试表达式或变量 Case 表达式列表1 语句块1 Case 表达式列表2 语句块2 Case Else 语句块n+1 End Select 其中,“测试表达式或变量”为必要参数,可以是任何数值型表达式或字符串表达式。在Case子句中,“表达式列表”为必要
14、参数,必须与“测试表达式或变量”的类型一致,它用来测试其中是否有值与“测试表达式或变量”相匹配,是一个或多个如表4-5所示形式的列表。例4.12 例4.7中计算优惠价格的算法可以改写为如下代码:Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button1.ClickDim x As Single,y As Single x=Val(Text1.Text)Select Case x Case Is 100 y=x Case Is 200 y=0.95*x Ca
15、se Is 300 y=0.9*x Case Is 1)是否是素数,只要依次用2 作除数去除n,若n不能被其中任何一个数整除,则n即为素数;否则,n不是一个素数。程序运行结果如图4-12所示。程序源代码如下:Public Class Form1 Private Sub Form1_Click1(ByVal sender As Object,ByVal e As System.EventArgs)Handles Me.Click Dim n As Long,i As Long,flag As Long n=Val(TextBox1.Text)If n 0 And Int(n)=n Then fl
16、ag=0 For i=2 To Int(Math.Sqrt(n)If n Mod i=0 Then flag=1 Exit For End If Next i If flag=0 Then TextBox2.Text=是素数 Else TextBox2.Text=不是素数 End If Else TextBox2.Text=请输入正整数 End If End SubEnd Class 4.3.2 While循环循环 其格式如下:While条件 语句块 Wend 在上述格式中,“条件”为一布尔表达式。当循环语句的功能是:当给定的“条件”为True时,执行循环中的“语句块”(即循环体)。例4.15
17、 从键盘上输入字符,对输入的字符进行计数,当输入的字符仅为“?”时,停止计数,并输出结果。由于需要输入字符的次数没有指定,不宜用For循环来编写程序。停止计数的条件是输入的字符为“?”,可以用While循环语句来实现。程序如下:Private Sub Form1_Click1(ByVal sender As Object,ByVal e As System.EventArgs)Handles Me.Click Dim ch As String,msg$,Counter%Const ch1$=?counter=0 msg$=Enter a Charavter:ch=InputBox(msg$)W
18、hile ch ch1$Counter=Counter+1 ch=InputBox$(msg$)End While Label1.Text=Number of Characters entered:&CounterEnd Sub例4.16 使用While语句编写程序,判断一个自然数是否是素数。Private Sub Form1_Click1(ByVal sender As Object,ByVal e As System.EventArgs)Handles Me.Click Dim n As Long,i As Long,flag As Long,r As Long n=Val(TextBox
19、1.Text)flag=0 i=2 While(i=Int(Math.Sqrt(n)And(flag=0)r=n Mod i If r=0 Then flag=1 Else i=i+1 End If End While If flag=0 Then TextBox2.Text=是素数 Else TextBox2.Text=不是素数 End IfEnd Sub 4.3.3 Do循环循环 1.先判断型DoLoop循环 Do While|Until 条件 语句块 Exit Do 语句块 Loop 例4.16 用循环语句求1+2+3+100的累加和,代码如下:Private Sub Form1_Cli
20、ck1(ByVal sender As Object,ByVal e As System.EventArgs)Handles Me.Click Dim S As Integer,n As Integer S=0 Do While n n;(2)以大数m作被除数,小数n作除数,m除以n得余数r;(3)若r0,mn,nr,继续执行步骤(2);(4)若r=0,则n即为所求的m与n的最大公约数,算法结束。求最小公倍数的算法思想:将m与n相乘后除以最大公约数即为所求。Private Sub Form1_Click(ByVal sender As Object,ByVal e As System.Even
21、tArgs)Handles Me.Click Dim m%,n%,t%,r%,mn&m=Val(TextBox1.Text)n=Val(TextBox2.Text)If m=0 Or n=0 Then TextBox3.Text=输入错误 End End用于结束程序的运行 End If mn=m*n If m n Then t=m:m=n:n=t End If Do r=m Mod n m=n n=r Loop While r 0 TextBox3.Text=m TextBox4.Text=mn/m End Sub 4.3.4 For Each循环循环 For Each Next语句用于枚举数
22、组或对象集合中的元素,并对该数组或集合中的每个元素执行一次相关的嵌入语句。For Each Next 语句用于循环访问数组或集合以获取所需信息。当为数组或集合中的所有元素完成迭代后,控制传递给For Each Next之后的下一个语句。For Each Next语句的格式为:For Each 变量名 As datatype In数组成集合名称 语句块 Countion For语句块Exit For 语句块 Next 变量名 说明:(1)“变量名”是一个循环变量,在循环中,该变量依次获取数组或集合中各元素的值。如果在使用For Each循环之前尚未声明,则必须使用As datatype声明其数据
23、类型。(2)“变量名”必须与数组或集合的类型一致。(3)在For Each循环体语句块中,数组或集合的元素是只读的。其值不能改变。如果需要迭代数组或集合中的各元素,并改变其值,就应使用For循环。(4)Continue For:将控制转移到For Each循环的开始。(5)Exit For:将控制转移到For Each循环外。例4.18 使用For Each循环显示整数数组的内容。运行结果如图4-16所示。程序代码如下:Private Sub Form1_Click1(ByVal sender As Object,ByVal e As System.EventArgs)Handles Me.C
24、lick Label1.Text=Dim myArray()As Integer=10,20,30,40,50 整数数组 For Each item As Integer In myArray 输出整数数 Label1.Text&=item&Next End Sub 4.3.5 多重循环多重循环 通常把循环体内不含有循环语句的循环叫做单重循环,而把循环体内含有循环语句的循环称为多重循环。多重循环又称多层循环或嵌套循环。例如在循环体内含有一个循环语句的循环称为二重循环。例4.19 打印“九九乘法表”,输出结果如图4-17所示。“九九乘法表”是一个9行9列的二维表,行和列都在变化,而且在变化中互相
25、约束。这个问题可以用下面的二重循环来实现。程序如下:Private Sub Form1_Click(ByVal sender As Object,ByVal e As System.EventArgs)Handles Me.Click Dim i As Integer,j As Integer,s As String Label1.Text=For i=1 To 9 s=For j=1 To i字符串左对齐,在右边以空格填充以达到总长度为8 s&=(i&x&j&=&i*j).PadRight(8)Next j Label1.Text&=s&vbCrLf Next i End Sub 显示图4-
26、18结果的程序代码如下:Private Sub Form1_Click(ByVal sender As Object,ByVal e As System.EventArgs)Handles Me.Click Dim i As Integer,j As Integer,s As String Label1.Text=For i=1 To 9 s=For j=1 To i-1 s&=(String.Format().PadRight(8)Next j For j=i To 9 s&=(String.Format(i&x&j&=&i*j).PadRight(8)Next j Label1.Text&
27、=s&vbCrLf Next i End Sub例4.20 编写程序,输出100以内的素数。代码如下:Private Sub Form1_Click(ByVal sender As Object,ByVal e As System.EventArgs)Handles Me.Click Dim n As Long,i As Long,flag As Long,r As Long Dim count As Integer count=0 Label1.Text=For n=2 To 100 flag=0 i=2 While(i=0.00005 TextBox2.Text=x End Sub End
28、 Class 2.猜数游戏 例4.25 设计一个“猜数游戏”程序,窗体界面如图4-22所示。单击“开始”按钮,计算机随机产生一个1 100以内的随机整数;单击“猜猜看”按钮,用户输入所猜的数后,计算机给出相应的提示:数大了、数小了或猜对了用了几次;单击“不玩了”按钮,结束程序的执行。Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles MyBase.Load Label3.Text=随机产生一个1-100之间的整数,看看你用几次能猜对?Button2.Enabled=Fa
29、lse End Sub Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button1.Click Randomize()js=Int(100*Rnd()+1)n=0 TextBox1.Text=TextBox2.Text=Button1.Enabled=False Button2.Enabled=True End SubPrivate Sub Button2_Click(ByVal sender As System.Object,ByVal e As Sys
30、tem.EventArgs)Handles Button2.Click Dim cs As Short Button1.Enabled=False Button2.Enabled=False Do n=n+1 cs=Val(InputBox(请输入你猜的数,猜数游戏,400,300)If js=cs Then TextBox1.Text=js TextBox2.Text=猜对了!&用了&n&次 Button1.Enabled=True Button2.Enabled=False Exit Do ElseIf cs 5 Then TextBox2.Text=你猜数能力太差,快别猜了Button1
31、.Enabled=True Button2.Enabled=False Exit Do End If Loop End Sub Private Sub Button3_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button3.Click End End Sub 3.水仙花数 例4.26 设计一个程序,求有趣的三位数,这个三位数的各位数字的立方和等于该数字本身,这个数叫水仙花数。例如,153=13+53+33,153是水仙花数。Public Class Form1 Private Sub But
32、ton1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button1.Click Dim i,j,k,m,n As Short TextBox1.Text=水仙花数是 For i=1 To 9 For j=0 To 9 For k=0 To 9 m=i*100+j*10+k n=i 3+j 3+k 3 If m=n Then TextBox1.Text=TextBox1.Text&vbCrLf&m End If Next Next Next End Sub End Class 本例还可以采用另外
33、一种方法,利用单重循环来实现,代码如下:Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles Button1.Click Dim i,j,k,m,n As Short TextBox1.Text=水仙花数 For m=100 To 999 k=Int(m/100)j=Int(m-k*100)/10)i=m-k*100-j*10 If m=i 3+j 3+k 3 Then TextBox1.Text=TextBox1.Text&vbCrLf&m End If Next End Sub