1、第3章 基本程序设计,程序的基本结构 顺序结构 选择结构 循环结构 其他辅助控制语句 应用举例,程序的基本结构,顺序结构,【例3.1】 将变量A、B中的数据交换。 有三种方法可以实现。 【方法一】 使用中间变量(中转站)语句如下: c=a:a=b:b=c 【方法二】 不使用中间变量(先求和),语句如下: a=a+b:b=a-b:a=a-b 【方法三】 不使用中间变量(先作差),语句如下: a=a-b:b=a+b:a=b-a,【例3.2】 输入某同学三门课程的成绩,求它们的平均分。,Private Sub Form_Click()Dim s1!,s2!,s3!,aver!s1=InputBox(
2、“输入第一门课程的成绩“)s2=InputBox(“输入第二门课程的成绩“)s3=InputBox(“输入第三门课程的成绩“)aver=(s1+s2+s3)/3print “aver=“;aver End Sub,选择结构又称条件结构: 根据某个具体的条件的分析、比较和判断,决定完成相应的操作; 使用If语句来实现; 包括单行结构条件语句和块结构条件语句,If条件语句,单分支条件结构(If.Then语句) 双分支结构(If.Then.Else语句) 多分支结构(IfThenElseIf语句) If语句的嵌套,1单分支条件结构(If.Then语句),用 If.Then 结构有条件地执行一个或多个
3、语句。单行语法和多行块语法都可以使用: (1)If Then (2)If ThenEnd If 下面两个例子等价: (1)If todayDate 为 True 时要执行多行代码,则必须使用多行块 If.Then.End If 语法。,【例3.3】 已知两个数x和y,比较它们的大小,使得 x大于y:,【方法一】 If xy Then t=xx=yy=t End If 【方法二】 If xy Then t=x : x=y : y=t,【例3.4】 输入x的值,并输出其绝对值。,Private Sub Command1_Click() Dim x! x = InputBox(“请输入一个数“) I
4、f x0 Then x = -xPrint “绝对值是:“;x End Sub,2. 双分支结构(If.Then.Else语句) 可以用 If.Then.Else 块定义几个语句块,执行其中一个语句。其语法格式也有两种形式: (1)If ThenElseEnd If (2)If ThenElse,当的值为真时,执行Then后面的语句块1(或语句1),否则执行Else后面的语句块2(或语句2)。,y=,执行过程:首先计算的值,如果结果为True,则执行,否则,执行。,选择结构流程图,双分支结构例,计算分段函数,单分支 y=cos(x)x3+3*x 结构实现 If x0 Then y=sin(x)
5、+sqr (x*x+1),If x0 Then双分支 y=sin(x)+sqr (x*x+1)Else 结构实现 y=cos(x)x3+3*xEnd If,【例3.5】 输入一个整数,判断其奇偶性。,Private Sub Form_Click()Dim x as integerx=InputBox(“输入一个整数“)If x mod 2=0 Then Print x; “是偶数“ Else Print x; “是奇数“ End Sub,例如:计算分段函数,y =,本题在选择条件时,可以选择x0作为条件,也可以选择x0作为条件。这里选择x0作为条件。画出如图所示流程图。,双分支结构流程实例,y
6、=3*x*x+4*x-5,True,False,X=0,(1)用单分支结构实现 y=3*x*x+4*x-5 If x=0 Then y=,或 If x0 Then y=3*x*x+4*x-5 If x=0 Then y=,但是,不能这样表示: If x=0 Then y=,(2)用双分支结构实现 If x=0 Then y=,Elsey=3*x*x+4*x-5 End If,y=3*x*x+4*x-5,多分支结构可以处理两个或两个以上分支。其语句形式为: If ThenElseIf Then Else End If 首先测试。如果它为 False,就测试,依次类推,直到找到一个为 True 的
7、条件。当它找到一个为 True 的条件时,就会执行相应的语句块,然后执行 End If 后面的代码。作为一个选择,可以包含 Else 语句块,如果条件都不是 True,则 执行 Else 语句块。,3. 多分支结构(IfThenElseIf语句),例:利用If.Then.Else 语句编写求函数,y =,的值的程序,要求只要在文本框Text1中输入自变量x的值,就在标签栏label1上显示函数值。 根据题意,在窗体上添加一个文本控件Text1和标签控件label1,代码应包含在Text1_change事件中。代码为: Private Sub Text1_Change()Dim x As Dou
8、ble, y As DoubleLabel1.Caption = “ 清空Label1的内容x = CDbl(Text1.Text) 将字符串类型转化为双精度类型 If (x = 1# And x = 2#) Theny = (1# - x) * (2# - x)Elsey = -(2# - x) End If Label1.Caption = y 在Label1上显示结果 End Sub,【例3.6】 在文本框中输入若干字符,统计其中字母字符、数字字符及其他字符的个数,并显示结果。,Dim countX%,countY%,countZ% Private Sub Text1_KeyPress(
9、KeyAscii As Integer)Dim c$c=chr(KeyAscii) 将文本框中输入的字符赋给变量c If Ucase(c)= “A“ And Ucase(c)=“0“ And c=“9“ ThencountY=county+1ElsecountZ=countZ+1End IfIf KeyAscii=13 Then 当按回车键字符输入完毕,显示结果Print “字母字符有“;countX; “个“Print “数字字符有“;countY; “个“Print “其他字符有“;countZ; “个“End IfEnd Sub,有了If语句的基本形式,可以通过这些基本形式加以复合,获得
10、更为复杂的If结构,称为If语句的嵌套。一般形式如左图所示。右图为在Else块中嵌套If结构的形式。可根据实际情况选择采用何种结构。,If语句复合结构的一般形式,在Else块中嵌套If结构的形式,If语句的嵌套,使用嵌套语句时应注意以下问题: (1)如果存在嵌套时,语句中的每一个Else必须和一个If相对应,应避免产生混乱。在书写时,可以将同一层的If子句和Else子句左对齐,内层的各语句块相对于外层向右缩进若干空格,以使程序结构更加清楚,便于阅读和查错。 (2)每一个块结构都必须以If开始,以End If结束。 (3)内层嵌套的块结构中除了满足该层规定的条件外,还必须首先满足外层结构中相应位
11、置的条件。 (4)VB中对块嵌套的层数没有限制,在嵌套的块结构中仍然可以继续嵌套其他的块结构,但嵌套时外层的块结构必须完全“包住”内层的块结构,不能相互“交叉”。 (5)利用块If语句的嵌套可以解决“多分支”选择的问题。,正确与错误的转向,练习,输入任一点的坐标(X,Y),判断该点位于哪个象限。 在平面直角坐标系中,点所在的象限有以下4种情况:X0 ,Y0 点位于第一象限内X0, Y0 点位于第二象限内X0, Y0 点位于第三象限内X=0或Y=0 位于原点,给出提示“该点不在任何象限内”。,练习,键盘输入三个整数到变量A、B、C,将三个整数从小到大给予输出。,【例3.8】 编程求一元二次方程a
12、x2+bx+c=0的根,其中a不等于0。,Private Sub Form_Click() Dim a As Integer, b As Integer, c As Integer a = InputBox(“请输入a的值:“) b = InputBox(“请输入b的值:“) c = InputBox(“请输入c的值:“) d = b * b - 4 * a * c p = - b / (2 * a) If d = 0 Then If d 0 Then r = Sqr(d) / (2 * a) X1 = p + r:X2 = p - r Else X1 = p:X2 = p End If Pr
13、int “X1=“; X1, “X2=“; X2 Else q = Sqr(-d) / (2 * a) Print “X1=“; p; “+“; q; “i“, “X2=“; p; “-“; q; “i“ End If End Sub,Select Case的结构形式为: Select Case Case Case Case Case Else End Select,2.Select Case, 表达式或由逗号分隔的多个表达式例如: Case “A“, “B“ , “C“ , “D“ , “E“ Case 1,3,5 Case a,b To 例如: Case 1 to 10 Case “A“
14、to “Z“ Case a to b Is 例如: Is a+b,【例3.9】 从键盘输入一个百分制成绩,将其转换为对应的等级显示,转换规则为:90100对应A,8089对应B,7079对应C,6069对应D,059对应E。,Private Sub Command1_Click() Dim x As Single, y As Single x = InputBox(“请输入分数:“) if x100 Thenprint “分数越界“Elsex=x+0.5 x=int(x)x=x10 Select Case x Case 10,9 Print “A“ Case 8 Print “B“ Case
15、7Print “C“ Case 6Print “D“ Case ElsePrint “E“ End Select End IfEnd Sub,课堂练习题 下表为某航空公司机票打折表。试根据此表编写程序。日期、机票数从文本框中输入,打折情况在窗体上输出。,条件函数,IIf 函数,IIf 函数的功能是根据表达式的值,来返回两部分中的其中一个。其语法格式为: IIf(, , ),例如,求分段函数:,Y=,函数值的语句可以简单地表示为: y=Iif(x0,3*x+2,5-2*x),下面的示例使用 Choose 函数来显示某天的执勤人员情况, strDay 参数传递到过程之中的索引。 Function
16、GetChoice(strDay As string)strName= Choose(strDay, “李小龙”, “刘德华”, “成 龙”, “何小娟”, “吴博雄“,) End Function 当strDay的值为1时,返回字符串“李小龙”,当strDay的值为2时,返回字符串“刘德华”,以此类推。当strDay的值不在15之间时,返回NULL。,Choose函数,Choose函数的功能是:从参数列表中选择并返回一个值。其语法格式为: Choose(, , , . ,),循环结构,FOR循环结构; WHILE-WEND; DO循环; 多重循环 Goto语句 On-Goto语句,循环概述,
17、在程序中,凡是需要重复相同或相似的操作步骤,都可以使用循环结构来实现。循环结构由两部分组成:循环体,即要重复执行的语句序列;循环控制部分,即用于规定循环的重复条件或重复次数,同时确定循环范围的语句。 要使计算机能够正常执行某循环,由循环控制部分所规定的循环次数必须是有限的。 VB提供了三种不同风格的循环结构,分别是: 计数循环(ForNext循环) 当循环(WhileWend循环) Do循环(DoLoop循环) 其中计数循环常用于已知循环次数的循环,而当循环和Do循环适合于循环次数未知,只知道循环结束条件的循环。,FOR循环,格式: For 循环变量=初值 To 终值 Step 步长循环体Ne
18、xt 循环变量 格式说明: “循环变量”:被用作循环计数器的数值变量。 “初值”、“终值”:都是数值型,可以是数值表达式。 “步长”:是数值型,可以是数值表达式。步长不能为0。如果步长是1,则Step 1可以省略。 “循环体”:在For和Next之间一条或多条语句。 Next后面的循环变量与For语句中的循环变量必须相同。,For循环的执行过程如下为: 系统将初值赋给循环变量,并自动记下终值和步长。 判断循环变量是否超过终值:未超过终值,执行一次循环体;否则,结束循环。 执行Next语句,将循环变量加上一个步长。 转到(2),继续执行。 结束循环,执行Next后面的语句。 功能说明: 在执行过
19、程第二步中,所说的“超过”包含两种情况: 步长为正数时,循环变量大于终值为“超过”。 步长为负数时,循环变量小于终值为“超过”。 终值和初值的取值有以下情况:步长为正数时,终值应该大于初值,否则循环体不会被执行。 步长为负数时,终值应该大于初值,否则循环体不会被执行。 当终值等于初值时,不管步长是正数是负数,均执行一次循环体。 循环次数由初值、终值和步长确定,计算公式为: 循环次数 = Int(终值-初值)/ 步长)+ 1 循环变量用来控制循环过程,在循环体内可以被引用,但不应被重新赋值,否则将无法确定循环次数。,【例3.10】 计算123200的值。,Private Sub Command1
20、_Click() Dim i As Integer, Sum As Integer Sum = 0 For i=1 to 200 Sum = Sum +iNext iText1.Text = Sum End Sub,课堂练习题,求1100所有奇数的平方和。 求表达式x/2!+x2/3!+xn/(n+1)!的值。其中x、n由键盘输入。 求100999所有的X,满足X = X个位、十位、百位的立方和。 求11000之间所有能够被13整除的数。按每行各行10个数排满足条件的数。,FOR循环逻辑结构流程图,步长为正数(0),步长为负数(0),while循环,While循环的格式如下: While 循环
21、体Wend 该循环格式中的一般为布尔表达式,也可以是数值和字符表达式,结果为True或False,用来表示一个判断条件。,该语句的执行过程是: 首先计算给定的的值,如果结果为 True(非0值),则执行循环体,当遇到Wend语句时,控制返回并继续对进行测试,如果仍然为True,重复上述过程;如果的结果为False,则不执行循环体,直接执行Wend后面的语句。,While循环流程图,这种循环结构的循环体内一般应该包括对“条件”进行改变的语句,使的结果发生变化。否则,若初始条件成立,则每次执行完循环体后再检验条件,条件仍然成立,再执行循环体,这样无限执行下去,不能结束,就形成了所谓的“死循环”。若
22、初始条件不成立,则循环体一次也不执行,循环就毫无意义。 While循环与For 循环的区别在于:For循环对循环体执行指定的次数;而While循环则是在给定的条件为真时重复一组语句的执行。这就是说,通过While循环可以指定一个循环终止的条件,而使用For循环只能进行指定次数的重复。因此,当需要由数据的某个条件是否满足来控制循环时,使用While循环比较灵活。,【例3.11】 计算11/21/31/200的值。,Private Sub Command1_Click() Dim i As IntegerDim sum As Singlesum = 0: i = 1While i = 200sum
23、 = sum + 1 / ii = i + 1WendText1.Text = sum End Sub,课堂练习题,键盘输入一个数,判断其为素数 求的近似值可以用公式: /6=1/(11)+1/(22)+1/(33)+ +1/(nn)要求逐项累加,直到1/(nn)0.0000001时,求的近似值 找出1000以下的能够被13和7整除的最大的10个数并将其输出。 编写程序,找到一个正整数N,要求N的阶乘最接近1000但又不大于1000。,DO循环控制,用于循环次数不固定的情况; 有两种样式:,样式二: Do While | Until 循环条件语句块EXIT DO LOOP,样式一: Do语句块
24、EXIT DO LOOP While | Until 循环条件,最简单情况:Do 语句块Loop,逻辑结构流程图,DoLoop While循环,DoLoop Until循环,逻辑结构流程图,Do WhileLoop循环,Do UntilLoop循环,【例3.12】 求最小公倍数、最大公约数。,Private Sub Form_Click()n = Val(Text1.txt)m = Val(Text2.txt)If n 0) r = m Mod nm = nn = rLoopPrint “最大公约数=“, m, Chr(13) + Chr(10)Print “最小公倍数=“, mn / m E
25、nd Sub,【例3.13】 输入一个整数,将各位数字反转后输出。,Private Sub Form_Load() Text1.Text = “ Text2.Text = “ End Sub Private Sub Command1_click() Dim int1 As IntegerDim Num As Integerint1 = CInt(Text1.Text) 将文本框输入的数据转化为数值型DoNum = int1 Mod 10Text2.Text = Text2.Text + “ “ + Chr(Asc(Num) int1 = int1 10 Loop While int1 0End
26、 Sub,格式一:Do WhileLoopDim i As IntegerDim F As LongF = 1 阶乘赋初值i = 1Do While i = 10F= F * ii = i + 1LoopPrint “10!=“; F,例:用不同的循环语句,求阶乘10!(10!=12910) 说明:阶乘值用变量F存放,循环变量为i。,格式二:Do UntilLoop Dim i As Integer Dim F As Long F = 1 i = 1 Do Until i 10F = F* ii = i + 1 Loop Print “10!=“; F,格式三:DoLoop WhileDim
27、i As Integer Dim F As Long F = 1 i = 1 DoF = F* ii = i + 1 Loop While i = 10 Print “10!=“; F,格式四:DoLoop Until Dim i As Integer Dim F As Long F = 1 i = 1 DoF = F * ii = i + 1 Loop Until i 10 Print “10!=“; F,格式五:DoLoopDim i As IntegerDim F As LongF = 1i = 1DoF = F * ii = i + 1If i 10 Then Exit DoLoopP
28、rint “10!=“; F,例题,键盘输入一个整数,判断它是否为素数(质数)。 Private Sub Command_click() n = val(text1.text) k=sqr(n) 求算术平方根For j = 2 To k If n mod j = 0 then exit for next j If j k then print n;“是一个素数“Elseprint n;“不是一个素数“End if End Sub,多重循环,在一个循环体内又出现另外的循环语句称为循环嵌套,也称为多重循环。在嵌套结构中,对嵌套的层数没有限制,有几层嵌套,就说是几重循环。 多重循环的执行过程是,外循
29、环每执行一次,内循环都要从头到尾执行一遍。 例如:For i = 1 To 5For j = 1 To 3Print i, j, i + jNext jNext I在以上的双重循环中,外循环变量I取1时,内循环就要执行3次(内循环变量J依次取1、2、3),接着,外循环变量取值2,内层循环同样要重新执行3次(J再一次取1、2、3)这样下去,循环体一共执行了5*3次,即15次。,内层循环必须完全包含在外层循环之内,不能相互“交叉”。,正确的嵌套,错误的嵌套,说明: (1)For循环的嵌套是经常使用的循环嵌套语句,其形式通常有以下两种:,1)一般形式 For I1=For I2=For I3Next
30、 I3Next I2 Next I1,2)省略Next后面的循环变量 For I1=For I2=For I3=NextNext Next,其中,每层For循环的Next语句都不可省略。但当多重循环的Next语句连续出现时,Next语句可以合并成一条,在其后跟着各循环控制变量,循环变量名不能省略。内层循环变量写在前面,外层循环变量写在后面。例如: For I1=For I2=For I3= Next I3, I2, I1 (2)在循环的嵌套中,内层循环和外层循环应该使用不同的循环控制变量。 (3)在多重循环的任何一层循环中都可以使用Exit Do或Exit For退出循环,但要注意只能退出Ex
31、it Do或Exit For 语句所对应的最内层循环,而不是一次退出多层循环。,例如,下面的循环退出位置如箭头所示: f = 1 For i = 1 To 10For j = 1 To 10f = f * i * jIf f 1000 Then Exit ForNext jPrint i; j; f Next I,课堂练习,九九乘法表问题 求100300之间的所有素数 打印如右图所示图形编程求Sum=1+(1+2)+(1+2+3)+(1+2+3+n),其中n由用户输入。,AB BC C CD D D DE E E E EF F F F F FG G G G G G GF F F F F F E
32、 E E E ED D D DC C CB BA,其他控制语句,Exit语句:Exit For、Exit Do、Exit Sub、Exit Function End语句:End If,End With,End Type,End Select,End Sub,End Function With语句: With 对象名 语句块End With,例如:,With form1 .Height=3000 .Width=4000 .BackColor=RGB(255,0,0) End With,6.7 GOTO型控制,功能:跳转到指定的行号或标号 格式:GoTo 行号|标号,课堂练习题,1.在窗体上作出正弦函数y=sin(x)的草图。例6.18 分析:程序中是采用连续的星号来组成函数曲线的。因为输出时只能从上到下逐行输出,所以,为了实现的方便,在这个题目中是将屏幕的垂直方向作为X轴,水平方向作为Y轴。 2.输入任意一个整数,将其各位反向形成一个整数。如:输入6231,则输出1326。 3.输入任意一个整数,求所有位上(偶数位上、奇数位上)数字(为偶数、为奇数)之和。,