首页 果壳精灵教程 当前文章

【新手入门】第 9 讲:逻辑判断

xLeaves(xxrpa) 发布于 2022年05月27日 21:32:07


在对数据进行处理的时候,我们经常需要根据不同的情况,调用不同的命令,这就是编程中非常重要的一环:逻辑。

在果壳精灵中,实现逻辑处理主要有两种写法:if、select case。

对于编程来说,很多语句的写法格式是固定不变的,这些规则只能依赖死记硬背背下来,然后用熟练,编程要接触的单词可比小学英语简单多了,相信难不倒你。


If 语句:

If语句有以下几种写法:

// 单行逻辑判断并执行
If 逻辑表达式 Then 要执行的语句

// 多行逻辑判断并执行
If 逻辑表达式 Then
	要执行的语句
ElseIf 其他逻辑表达式 Then
	要执行的语句
Else
	所有逻辑都不成立时要执行的语句
End If

第一种写法是只要条件达成,就执行某个指令或计算时使用,例如,当 1 + 1 = 2 的时候,我们就弹出来一个消息对话框:

If 1 + 1 = 2 Then MsgBox("1 + 1 = 2 正确")

我们还可以进一步扩展我们的逻辑,例如在代码不正确的情况下,也有反映:

If 1 + 1 <> 2 Then MsgBox("1 + 1 = 2 不正确")

两个代码合并在一起,我们就能够判断,1 + 1 到底是不是等于 2 了,当然,多数情况下我们的代码不会这么写,因为两个条件分散写死了,不方便修改。

在上一篇教程中我们学会了定义变量,因此我们可以定义一个逻辑类型的变量,来存储 1 + 1 = 2 的结果,形成我们最终版本的代码:

Dim 是否 As Boolean = (1 + 1 = 2)
If 是否 Then MsgBox("1 + 1 = 2 正确")
If 是否 = false Then MsgBox("1 + 1 = 2 不正确")

这种写法对于编程初学者来说很好理解,就好像一整行代码是一个命令调用一样,只不过我们为这个命令调用加上了限定的条件。

代码仍旧是线性运行的,先第一行,然后第二行,然后第三行…… 不会出现执行顺序错乱的问题。

但是如果我们处理的逻辑之后,需要执行一大段代码,问题就比较麻烦了,按照这个方法,我们可能要写类似这样的代码:

Dim 是否 As Boolean = (1 + 1 = 2)
If 是否 Then TracePrint("1")
If 是否 Then TracePrint("+")
If 是否 Then TracePrint("1")
If 是否 Then TracePrint("=")
If 是否 Then TracePrint("2")
If 是否 Then TracePrint("正")
If 是否 Then TracePrint("确")
If 是否 = false Then TracePrint("1")
If 是否 = false Then TracePrint("+")
If 是否 = false Then TracePrint("1")
If 是否 = false Then TracePrint("=")
If 是否 = false Then TracePrint("2")
If 是否 = false Then TracePrint("不")
If 是否 = false Then TracePrint("正")
If 是否 = false Then TracePrint("确")

这会显得代码很拖沓,而且因为重复判断了变量【是否】的值,也会导致脚本性能的降低,为了解决这个问题,我们需要学习第二种 If 语句:

Dim 是否 As Boolean = (1 + 1 = 2)
If 是否 Then
	TracePrint("1")
	TracePrint("+")
	TracePrint("1")
	TracePrint("=")
	TracePrint("2")
	TracePrint("正")
	TracePrint("确")
Else
	TracePrint("1")
	TracePrint("+")
	TracePrint("1")
	TracePrint("=")
	TracePrint("2")
	TracePrint("不")
	TracePrint("正")
	TracePrint("确")
End If

这种写法为代码增加了【结构】,是一种结构化语句,所谓结构,就是将代码分割成明显的区块。

区块内部仍是顺序执行的,但区块本身可能会执行,也可能不执行。

例如这段代码,If 和 Then 两个单词之间的代码就是逻辑判断代码,当这个逻辑判断成立时,它就会执行 Then 到 Else 之间的代码块。

而当 If 到 Then 之间的逻辑判断不成立时,它就会执行 Else 到 End If 之间的代码块。

If 语句写法比较灵活,例如你可以再增加一些条件判断:

If 1 + 1 = 2 Then
	MsgBox("1 + 1 = 2")
ElseIf 1 + 1 = 3 Then
	MsgBox("1 + 1 = 3")
ElseIf 1 + 1 = 4 Then
	MsgBox("1 + 1 = 4")
Else
	MsgBox("我也不知道 1 + 1 等于几")
End If

我们在 If 到 Else 之间,添加了两个 ElseIf,这种语句的写法和【If 判断 Then】类似,只不过 If 变成了 ElseIf,ElseIf 可以添加任意个,也可以不添加。

同样的,我们还可以在任何情况下,省略掉 Else 语句块:

Dim 是否 As Boolean = (1 + 1 = 2)
If 是否 Then
	TracePrint("1")
	TracePrint("+")
	TracePrint("1")
	TracePrint("=")
	TracePrint("2")
	TracePrint("正")
	TracePrint("确")
End If

这样 If 语句就相当于只判断一个条件了,执行一个代码块了。

注意,If 语句只会执行一个代码块,不管执行了哪个代码块,当代码块执行完毕后,都会跳转到 End If 语句的下一行继续执行。

而不是继续执行其他代码块的代码,这很重要,它并没有破坏代码一定是线性执行的基本准则,只是在线性的基础上,增加了跳转执行的能力,如图所示:


我们可以利用已经学习到的命令配合 If 语句,实现一些基本的功能了,例如摇骰子猜数字游戏:

// 生成一个 1 - 6 的随机数
Randomize
Dim 骰子号 As Long = Rnd(1, 6)

// 让用户输入一个数字
Dim 输入数 As String = InputBox("猜猜我摇出来了几?", "1")

// 检查猜测结果是否正确
If CLng(输入数) = 骰子号 Then
	MsgBox("恭喜你猜对了!")
Else
	MsgBox("很抱歉,你猜错了哟~")
End If

这里我们使用了一些新的命令:

Randomize 命令用于初始化随机数生成器,确保不会每次都生成相同的随机数。

Rnd 命令可以生成指定范围的随机数,我们指定的范围是 1 - 6,这个命令还有其他用法,感兴趣的朋友可以看一下命令的集成帮助。

CLng 命令用于将 InputBox 输入的字符串转换为数字,文字和数字是不可以直接进行对比的,因此需要转换数据类型才行。

这一段代码如果你已经能够无障碍的理解了,说明 If 语句你已经初步学会使用啦,接下来,就是不断的实战,提升熟练度吧!


Select 语句:

有 If 语句打底,相信大家理解 Select 语句会容易的多,这里直接上一段代码:

Select Case (1 + 1)
	Case 1
		MsgBox("1 + 1 = 1")
	Case 2
		MsgBox("1 + 1 = 2")
	Case 3
		MsgBox("1 + 1 = 3")
	Case 4
		MsgBox("1 + 1 = 4")
	Case Else
		MsgBox("1 + 1 = 其他值,我也不知道到底是啥")
End Select

对于编程来说,语句的写法往往是固定的,Select 语句总是以 Select Case 开头,然后写上要判断的数据。

之后可以写一个或者若干个 Case 语句,每个 Case 后面都可以跟着数据的猜测结果,或者 Else,但 Else 语句只能有一个,在最后面。

最后,我们在末尾补上一个 End Select 语句,它的执行过程是这样的:



总结:

必须牢记:代码总是线性执行的!

这句话让你在分析问题的时候,能够很好的总结前因后果,之前进行了什么操作,修改了什么数据,导致之后的代码执行的时候出现了什么问题。

这一切都必定会有一条线牵着,这条线就是代码执行的顺序,先执行的哪一行,后执行的哪一行,连起来就是一整个程序。


大多数情况下,我们都可以用 If 语句来代替 Select Case 语句,在刚学习编程的时候,还记不住那么多单词的时候,少记一些语句就少些焦虑。

等 If 语句用熟练了,再回过头来学习 Select Case 语句也是没什么问题的。


既然 If 可以完全替代 Select Case 语句,那么 Select Case 语句存在的意义是什么呢?

因为 Select Case 语句对值的判断方式更丰富,做教学必然是不会藏私的,这里也把 Select Case 语句内的 Case 判断方式补充一下:

// 这是最简单的单个值判断:
Select Case 表达式
	Case 值
End Select

// 这样可以多个值判断,有一个值相同条件就成立:
Select Case 表达式
	Case 值1, 值2 ……
End Select

// 这样可以判断一个数字范围:
Select Case 表达式
	Case 最小值 To 最大值
End Select

// 也可以使用这些运算符参与判断(>、<、>=、<=、=、<>):
Select Case 表达式
	Case > 值
End Select

怎么样?在特定场景下,Select 语句确实是比 If 语句好用一些的吧?


若无特殊声明,上述内容为本站原创,未经授权禁止转载!