本课学习目标
- 理解条件判断如何改变程序执行流程。
- 掌握 If...Then 单一条件判断。
- 掌握 If...Then...Else 双分支判断。
- 使用 ElseIf 处理多个条件。
- 理解判断顺序为什么非常重要。
- 使用 AndAlso、OrElse 与 Not 组合条件。
- 认识嵌套 If,并知道何时应该避免过度嵌套。
- 完成一个可判断成绩等级与及格状态的 Windows Forms 应用。
7.1 程序为什么需要条件判断?
真实程序不会每次都执行完全相同的代码。它必须根据用户输入、系统状态或计算结果决定接下来做什么。
例如学生成绩为 76 分。
True → 显示“及格”;False → 显示“不及格”。
条件表达式的结果必须能够解释为 Boolean:也就是 True 或 False。
Dim score As Integer = 76
Dim passed As Boolean = score >= 50
这里 score >= 50 的结果是 True。接下来就可以用 If 根据这个结果决定是否执行某段代码。
7.2 If...Then:单一条件判断
最简单的 If 结构是:
If 条件 Then
条件成立时执行的代码
End If
例如:
Dim score As Integer = 76
If score >= 50 Then
lblResult.Text = "及格"
End If
程序会先检查 score >= 50:
条件成立
执行 If 与 End If 之间的代码。
条件不成立
跳过这段代码,继续执行 End If 后面的语句。
7.3 If...Then...Else:两种结果
如果条件不成立时也要执行另一段代码,就加入 Else:
If score >= 50 Then
lblResult.Text = "及格"
Else
lblResult.Text = "不及格"
End If
这个结构保证两条分支中只会执行一条:
score >= 50→ True:及格|False:不及格
另一个例子:检查年龄
Dim age As Integer = 20
If age >= 18 Then
lblStatus.Text = "成年人"
Else
lblStatus.Text = "未成年人"
End If
7.4 ElseIf:处理多个条件
如果可能有超过两种结果,可以使用一个或多个 ElseIf。
If score >= 80 Then
grade = "A"
ElseIf score >= 70 Then
grade = "B"
ElseIf score >= 60 Then
grade = "C"
ElseIf score >= 50 Then
grade = "D"
Else
grade = "F"
End If
VB.NET 会从上往下检查条件,一旦找到第一个 True,就执行对应代码,然后跳到 End If 后面。
7.5 为什么条件顺序非常重要?
考虑下面这个错误写法:
If score >= 50 Then
grade = "D"
ElseIf score >= 60 Then
grade = "C"
ElseIf score >= 70 Then
grade = "B"
ElseIf score >= 80 Then
grade = "A"
Else
grade = "F"
End If
如果成绩是 92,第一项 score >= 50 已经是 True,因此程序立即把等级设成 D,后面的 A、B、C 永远不会被检查。
7.6 使用 AndAlso 组合条件
有时一个决定需要同时满足多个条件:
Dim age As Integer = 25
Dim hasTicket As Boolean = True
If age >= 18 AndAlso hasTicket Then
lblStatus.Text = "可以入场"
Else
lblStatus.Text = "不符合入场条件"
End If
这里必须同时满足:
- age >= 18
- hasTicket = True
两个条件都为 True,整个 AndAlso 表达式才为 True。
检查数值是否在范围内
If score >= 0 AndAlso score <= 100 Then
lblStatus.Text = "成绩范围有效"
Else
lblStatus.Text = "成绩必须介于 0 与 100"
End If
这是非常常见的写法,因为一个有效成绩必须同时满足“不小于 0”以及“不大于 100”。
7.7 使用 OrElse 与 Not
OrElse:满足其中一个条件即可
Dim isMember As Boolean = False
Dim hasCoupon As Boolean = True
If isMember OrElse hasCoupon Then
lblStatus.Text = "可享优惠"
Else
lblStatus.Text = "没有优惠资格"
End If
Not:反转 Boolean
Dim isClosed As Boolean = False
If Not isClosed Then
lblStatus.Text = "商店目前营业中"
End If
7.8 嵌套 If
If 里面还可以再放另一个 If,这称为嵌套 If(Nested If)。
If score >= 50 Then
If score >= 80 Then
lblResult.Text = "及格,而且成绩优秀"
Else
lblResult.Text = "及格"
End If
Else
lblResult.Text = "不及格"
End If
嵌套 If 在某些逻辑中很自然,但层数太多会让代码难读。很多情况可以用 ElseIf 或组合条件表达得更清楚。
7.9 单行 If:什么时候使用?
Visual Basic 也允许非常短的单行 If:
If score >= 50 Then lblResult.Text = "及格"
也可以写成:
If score >= 50 Then lblResult.Text = "及格" Else lblResult.Text = "不及格"
虽然语法有效,但本教程在初学阶段仍推荐多行结构,因为更容易阅读、修改和调试:
If score >= 50 Then
lblResult.Text = "及格"
Else
lblResult.Text = "不及格"
End If
7.10 实作:学生成绩等级判定器
建立新的 Windows Forms 项目:
GradeEvaluator2026
程序会让用户输入学生姓名和成绩,并显示等级、及格状态与简单评语。
成绩:86
等级:A
状态:及格
评语:表现优秀
在 Form1 加入以下控件:
| 控件 | Name | Text / 用途 |
|---|---|---|
| Form | Form1 | Text = 学生成绩等级判定器 |
| TextBox | txtStudentName | 输入学生姓名 |
| TextBox | txtScore | 输入 0–100 的成绩 |
| Button | btnEvaluate | Text = 评定成绩 |
| Button | btnClear | Text = 清除 |
| Label | lblResult | 显示等级和评语;建议 AutoSize = True |
完整的评定按钮代码
Private Sub btnEvaluate_Click(sender As Object, e As EventArgs) _
Handles btnEvaluate.Click
Dim studentName As String = txtStudentName.Text.Trim()
Dim score As Integer = CInt(txtScore.Text)
Dim grade As String
Dim status As String
Dim comment As String
If score >= 80 Then
grade = "A"
comment = "表现优秀"
ElseIf score >= 70 Then
grade = "B"
comment = "表现良好"
ElseIf score >= 60 Then
grade = "C"
comment = "表现尚可"
ElseIf score >= 50 Then
grade = "D"
comment = "已经及格,但仍可加强"
Else
grade = "F"
comment = "需要继续努力"
End If
If score >= 50 Then
status = "及格"
Else
status = "不及格"
End If
lblResult.Text =
"学生:" & studentName & Environment.NewLine &
"成绩:" & CStr(score) & Environment.NewLine &
"等级:" & grade & Environment.NewLine &
"状态:" & status & Environment.NewLine &
"评语:" & comment
End Sub
清除按钮
Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
txtStudentName.Clear()
txtScore.Clear()
lblResult.Text = ""
txtStudentName.Focus()
End Sub
7.11 先加入基本范围判断
目前如果输入 -5 或 150,等级逻辑仍会产生结果。我们可以先用本课学到的条件判断阻止超出范围的成绩:
Dim score As Integer = CInt(txtScore.Text)
If score < 0 OrElse score > 100 Then
lblResult.Text = "成绩必须介于 0 与 100。"
Exit Sub
End If
把这段代码放在等级判断之前。Exit Sub 表示立即结束当前事件处理程序,不继续执行后面的代码。
7.12 逐步理解程序逻辑
从 TextBox 取得姓名和成绩,并把成绩转换成 Integer。
成绩若小于 0 或大于 100,就显示错误信息并 Exit Sub。
先判断 80,再判断 70、60、50,确保较高成绩不会提前落入较低等级。
成绩达到 50 显示“及格”,否则显示“不及格”。
把姓名、成绩、等级、状态和评语显示在 lblResult。
7.13 测试边界值
条件程序特别需要测试“边界值”,因为错误经常发生在刚好跨越门槛的位置。
| 输入成绩 | 预期等级 | 状态 | 为什么值得测试 |
|---|---|---|---|
| 80 | A | 及格 | A 的最低边界 |
| 79 | B | 及格 | A 边界下方 1 分 |
| 70 | B | 及格 | B 的最低边界 |
| 60 | C | 及格 | C 的最低边界 |
| 50 | D | 及格 | 及格最低边界 |
| 49 | F | 不及格 | 及格边界下方 1 分 |
| 100 | A | 及格 | 最高有效成绩 |
| 101 | — | 错误 | 超出有效范围 |
7.14 初学者常见错误
条件顺序写反
多重等级判断从低分开始,会让高分提前匹配低等级。通常应从最高门槛往下判断。
把 = 与 >= 混淆
score = 50 只检查刚好 50;score >= 50 才表示 50 或以上。
漏写 End If
多行 If 必须用 End If 结束,否则后面的代码结构会被破坏。
复杂条件没有括号
虽然 VB 有运算优先级,但复杂逻辑适当加括号能让条件更清楚,也减少误读。
7.15 小练习
- 新增“优秀奖”判断:如果成绩 ≥ 90,在结果最后再显示“获得优秀奖”。
- 加入 CheckBox:chkAttendanceOK。只有成绩 ≥ 50 而且出席条件合格时,才显示“最终及格”。
- 如果学生姓名为空白,先显示“请输入学生姓名。”并使用 Exit Sub 停止处理。
- 加入“是否需要补考”的 Boolean 结果:成绩低于 50 时为 True。
- 测试 49、50、59、60、69、70、79、80、100,确认每个等级边界都正确。
本课复习
- If...Then 在条件为 False 时会怎样?
- Else 的作用是什么?
- 什么时候应该使用 ElseIf?
- 为什么成绩等级判断通常要从最高门槛开始?
- AndAlso 和 OrElse 有什么区别?
- Not 的作用是什么?
- 什么是嵌套 If?为什么不应该过度嵌套?
- Exit Sub 在本课示例中的作用是什么?