程序设计基础-Visual Basic(2019秋)

沈阳师范大学 刘立群

目录

  • 认识 Visual Basic
    • ● 认识 Visual Basic
    • ● 对象的属性、事件和方法
    • ● 控件的容器-窗体
    • ● 文本编辑工具-文本框
    • ● 命令按钮和标签
  • 程序设计基础
    • ● 语句和语法规则
    • ● 数据类型和常量变量
    • ● 运算符与表达式
    • ● 常用内部函数
    • ● 输入与输出
  • 基本控制结构和算法
    • ● 程序结构与算法
    • ● 选择结构的语句实现
    • ● 循环结构的语句实现
    • ● 穷举和递推问题求解
    • ● 嵌套循环解百钱百鸡问题
    • ● 星形矩阵的显示问题
  • 常用标准控件
    • ● 选择控件和滚动条--设置文字格式
    • ● 列表框及组合框—购票系统
    • ● 计时器与图片控件—自动变换的交通灯
    • ● 图形操作—小球运动
  • 数组和过程
    • ● 数组的定义与一维数组的应用
    • ● 二维数组
    • ● 控件数组
    • ● 自定义过程
    • ● 参数传递
    • ● 变量的作用域
  • 键盘鼠标事件与菜单设计
    • ● 鼠标键盘事件--小鸡吃虫游戏
    • ● 菜单程序设计--控制移动字幕
  • 通用对话框与文件操作
    • ● 通用对话框与文件操作
    • ● 文件操作--打开保存数据实例
选择结构的语句实现

 3.2 选择结构的语句实现

选择控制结构又称为分支结构,这种结构能够根据条件执行不同的操作。Visual Basic支持的选择控制结构包括If语句和Select Case语句。

1.If…Then 语句

  格式:If<条件>Then   

        <语句块>       

     End If

说 明:                                      ⑴“条件”一般为关系表达式或逻辑表达式,“语句块”可以为一条或多条语句,If语句以EndIf结束。

⑵语句执行过程:首先判断条件表达式的值,若为真,则执行Then后面的语句块,否则直接跳出If语句,执行End If之后的语句。If语句流程图如图1所示。

【例1】输入a、b的值,如果a大于b,则输出“a大于b”。

Private Sub Form_Click()

Dim a! , b!

a = InputBox("please inputa:")

b = InputBox("please inputb:")

If a > b Then

Print "a大于b"

End If

End Sub

⑶条件表达式也可以是算术表达式,按非零为真、零为假来处理。如:

    Dim a%

    a=3

    If a then

      Print a

    End If

由于a被赋值为3, If语句判断条件时,会认为条件为True,所以执行分支内语句,输出a的值3。

⑷If语句可以精简为单行If语句,即

If <条件>Then<语句>

单行If语句必须在一行内完成,Then后面即使是多条语句也要写在一行,用冒号分隔,单行If语句不用End If结束。

【例2】将例1用单行If语句改写。

Private Sub Form_Click()

Dim a!,b!

a = InputBox("please inputa:")

b = InputBox("please inputb:")

If a > b Then  Print "a大于b"

End Sub

一般使用单行If语句做短小简单的判断,但是语句块形式具有更强的结构性与适应性,并且通常也比较容易阅读、维护及调试。

2.If...Then...Else语句

格式:

     If<条件>Then

<语句块1>

Else

<语句块2>

End If

说明:

⑴语句执行过程:首先测试条件表达式的值,如果值为真,执行Then后面的语句块1,执行完毕跳出If语句,继续执行EndIf下面的语句;如果值为假,则执行Else后面的语句块2,执行完毕再执行End If下面的语句。流程图如图2所示。

⑵If...Then...Else语句为双分支选择结构,语句块1和语句块2必定有一个被执行。

【例3】输入一个非零数,判断其是正数还是负数。

PrivateSub Form_Click()

Dimnum!

num= InputBox("please input a number :")

Ifnum > 0 Then

Printnum; "是一个正数"

Else

Printnum; "是一个负数"

EndIf

EndSub

【例4】 判断某年是不是闰年。

闰年的条件:年份能被400整除,或者年份能被4整除但不能被100整除。

算法设计:由条件可知有两种情况是闰年,一种情况是year Mod 400 = 0(被400整除)另一种情况是year Mod 4 = 0 And year Mod 100<> 0(被4整除但不被100整除),只要满足其中一个条件就是闰年,所以这两个表达式之间应该用Or连接。

PrivateSub Form_Click()

Dimyear As Integer

year= InputBox("请输入一个年份:")

If year Mod 400 = 0 Or year Mod 4 = 0 And year Mod 100 <> 0 Then

Printyear; "是闰年"

Else

Printyear; "不是闰年"

EndIf

EndSub

⑶If...Then...Else语句也可以写为单行形式,即

If<条件>Then<语句块1>Else<语句块2>

【例5】将例3用单行语句改写。

PrivateSub Form_Click()

Dimnum!

num= InputBox("please input a number :")

Ifnum > 0 Then  Print num; "是一个正数" Else Print num; "是一个负数"

End Sub

3. IIf函数

格式:IIf(条件,表达式1,表达式2)

说明:

⑴该函数在运算时,首先计算“条件”的值,如果“条件”的值为真,则该函数的返回值就是“表达式1”的值,否则函数的返回值是“表达式2”的值。例如:

PrintIIf(3>5,1,-1)的结果为-1。

⑵函数中的三个参数都不能省略。

⑶可以将IIf函数看作是一种简单的If …Then …Else结构。例如:

MaxValue=IIf(x>y,x,y)

可以改写为单行If语句:

Ifx>y Then MaxValue=x Else MaxValue=y

二者的功能是一致的。

4If...Then...ElseIf语句

格式:

  If<条件1>Then

<语句块1>

ElseIf<条件2>Then

<语句块2>

      [Else

语句块n+1]

   End If

 

说明:

If...Then...ElseIf语句用于实现多分支结构。语句执行过程:依次判断条件1、条件2……,一旦遇到表达式的值为真,则执行该条件下的语句块。如果所有的表达式都不为真,则执行最后的Else下面的语句块n+1,如果没有Else语句,则什么也不执行,跳出If语句,执行End If后面的语句。流程图如图3所示。

If...Then...ElseIf语句可以用于条件比较复杂的多分支情况。


【例6】输入一个分数,判断它应得的学分。90分以上得4学分,80-89分得3学分,70-79分得2学分,60-69分得1学分,60分以下不得学分。

Private Sub Form_Click()

Dim score!,grade!

score = InputBox("请输入分数:")

If score >= 90 Then

          grade = 4

ElseIf score >= 80 Then

          grade = 3

ElseIf score >= 70 Then

          grade = 2

ElseIf score >= 60 Then

          grade = 1

ElseIf score < 60 Then

          grade = 0

End If

Print"应得学分为:";grade

End Sub

当输入一个分数时,程序从第一个条件开始判断,如果条件为真,执行“grade =4”,否则向下继续判断其他条件,总之,只要遇到一个满足条件的分支,便执行该分支下的语句。本题没有Else语句,若所有条件均为假,则一个分支也不执行。

If语句执行过程中,一旦有一个分支被执行,便退出If语句,继续执行End If下面的语句,也就是说如果有多个条件都为真,只能执行第一个条件为真的分支。因此,利用If多分支语句筛选数据时,如果条件设计不当,就不能正确的实现筛选。

【例8】将例7的筛选条件重新设计。

Private Sub Form_Click()

Dim score!,grade!

score = InputBox("请输入分数:")

If score < 60Then

          grade = 0

ElseIf score >= 60 Then

          grade =1

ElseIf score >= 70 Then

          grade =2

ElseIf score >= 80 Then

          grade = 3

ElseIfscore >= 90 Then

          grade = 4

End If

Print"应得学分为:";grade

End Sub

运行程序时输入80,会看到结果为应得学分为:1”。其原因是进入了score >= 60的分支,其它分支不再判断,直接退出If语句。

使用多分支If语句时,一定要注意思路清晰,要养成良好的程序书写风格,层次明确,便于阅读和修改程序。

5. If语句的嵌套

如果一个If语句块中包含另一个If语句,则称为If语句的嵌套。

格式:

If<条件1>Then

<语句块1>

Else

If<条件2> Then

<语句块2>

         Else

             <语句块3>

         End If

   End If

说明:嵌套必须完全包住,不能互相交叉,即把一个If…Then…Else块放在另一个If…Then…Else块中。

例如将例6分段函数用If语句的嵌套改写:

Private Sub Command1_Click()

Dim x As Single, y As Single

x = Val(Text1.Text)

If x >0 Then     

y = x * x + 1

Else

Ifx=0 Then

y = 0

Else

y=2*x-1

End If

   End If

Text2.Text = y   

End Sub

 

6.Select Case语句

实现多分支的筛选,使用If语句嵌套并不是最理想的,Visual Basic提供了Select Case语句可以更方便的完成多分支程序的设计。Select Case语句也称为Case语句或情况语句,其功能是根据测试表达式的值,在几组Case子句中挑选出一组符合条件的语句块执行。

格式:

Select Case <测试表达式>

Case<值1>

<语句块1>

Case<值2>

<语句块2>

[Case Else

<语句块n+1>]

End Select

语句执行过程:先计算测试表达式的值,依次与Case子句中的值相比较,如果遇到相匹配的值,则执行该Case子句中的语句块,然后跳出Select Case语句,继续执行End Select下面的语句。

说明:

1)测试表达式可以是任何数值表达式或字符串表达式,也可以是日期或逻辑表达式;

2)值1、值2是测试表达式可能取的值,与测试表达式的类型必须相同。每个Case分支可以列出多个值,可以是以下形式之一:

Case 1,2,3    多个具体值,用逗号隔开

Case 1 to 10  使用关键字To表示值的范围

3) 使用Is关系表达式,例如:

Case Is>=10                 '表示测试表达式的值大于等于10

Case Is <>""                '表示测试表达式的值不为空字符串

4)也可以使用以上几种形式的组合,例如:

Case 1,3,Is>10             '表示测试表达式的值为13或大于10

【例9】用Case语句编写将输入成绩转换为相应学分。

Private Sub Form_Click()

Dim score!, grade!

score = InputBox("输入成绩")

Select Case score

Case Is >= 90

grade = 4

Case Is >= 80

grade = 3

Case Is >= 70

grade = 2

Case Is >= 60

grade = 1

Case Is < 60

grade = 0

End Select

Print "应得学分为:"; grade

End Sub

注意,使用Select Case语句也要确保值列表顺序的合理性,才能够正确筛选数据,如果将例中的值列表按相反顺序编写,就不能合理地筛选数据了。

Case Else子句是可选的,表示没有匹配的值时则执行该子句中的语句块n+1。通常加上Case Else语句来处理不可预见的测试表达式的值。如果测试表达式没有匹配值,而且也没有Case Else语句,则程序会跳到End Select之后的语句继续执行。

=========================================================================================



========================================================================================