QBasic/流程控制
为了在程序的两个或多个部分之间选择执行,可以使用 IF 语句。也可以使用 WHILE、DO UNTIL 和 CASE 语句。所有这些都通过使用布尔逻辑“测试”来控制条件执行,其结果要么是 TRUE 要么是 FALSE。要将一段代码重复执行一定次数,可以使用 FOR 语句。
IF 测试可以在单行中执行,但也可以像其他语句一样用于控制代码块。
布尔逻辑是一种测试,它产生两种可能的结果之一:真或假。测试本质上总是数学的……当两个字符(或字符串)被“比较”时,使用的是它们的 ASCII 码(因此 a < b 和 b < A)。
qbasic 中使用的比较运算符是:= 如果两个变量相等则为真 < 如果第一个小于第二个则为真 =< 如果第一个小于或等于第二个则为真 > 如果第一个大于第二个则为真 >= 如果第一个大于或等于第二个则为真 <> 如果两个不相等则为真
可以使用“AND”、“OR”和“NOT”运算符将多个测试链接在一起。我们稍后将详细介绍这些运算符的含义,但你可能已经理解了前两个运算符。
QBasic 中最实用的语句之一是 IF 语句。它允许你根据给定的条件选择程序将执行的操作。接下来的几个程序将介绍使用 IF 语句的方法。
IF [conditional] THEN [do this]
单行 IF 是最简单的示例。要执行代码块,使用 END IF
IF [conditional] THEN [do this] [and do this] ... [and also do this] END IF
IF [conditional] THEN [do this] ELSE [do that]
要从两个不同的代码块中选择,使用 ELSE 语句。
IF [conditional] THEN [do this] .. [and do this] ELSE [do that] .. [and also that] END IF
作为启动全新的 IF THEN ELSE 语句序列的替代方案。你可以在 THEN 语句(s)之后使用 ELSEIF [conditional] THEN。这不会创建新的嵌套级别。
IF [条件] THEN
[do this] .. [and do this]
ELSEIF [条件] THEN
[do that] .. [and also that]
ELSEIF [条件] THEN
[do the other] .. [and also ...]
ELSE
[do this final thing]
END IF
FOR <variable name> = <start value> TO <end value> [STEP <increment>] [do this] ... [and do this] NEXT
<增量> 可以是 + 或 - 并且是可选的。如果省略,则默认值为 +1。FOR 循环中包含的代码将始终至少执行一次,因为只有在“NEXT”语句处才会检查变量的值是否超过结束值。
当 NEXT 语句执行时,变量将根据 STEP 值修改并与结束值进行比较。如果变量尚未超过结束值,则控制将返回到 FOR 之后的行。
可以使用 EXIT FOR 命令提前退出 FOR 循环。
CLS
RANDOMIZE TIMER
num = INT(RND * 20) + 1
FOR count = 1 TO 5
INPUT "Pick a number between 1 and 20: ", answer
IF answer = num THEN PRINT "You win after";count;"guesses!": END
NEXT
PRINT "You lose"
WHILE <condition is true> [do this] .. [and this] WEND
如果条件为真,则执行 WHILE 之后的代码。当 WEND 命令执行时,它将控制返回到 WHILE 语句(条件在那里再次被测试)。当条件计算为 FALSE 时,控制将传递到 WEND 之后的语句。
PRINT "Press any key to continue"
WHILE INKEY$=""
WEND
在上面的示例中,你看到一个按任意键提示,它将一直等待用户按下键。(INKEY$ 功能将在 高级输入 中介绍。)
DO [this] .. [and this] LOOP WHILE <condition is true> / LOOP UNTIL <condition is true>
DO...LOOP 结构是 WHILE 循环的更高级形式 - 与其他流程控制块一样,它以 DO 和 LOOP 为标记来表示边界。
它依赖于放置在 DO 或 LOOP 之后的条件语句。
DO
a$ = inkey$
LOOP WHILE a$=""
作为替代方案,你可以用 UNTIL 替换 WHILE,使循环持续到满足特定条件为止。
DO
x=x+1
LOOP UNTIL x >= 10
在某些版本的 BASIC 中,UNTIL 或 WHILE 条件可以放在 DO 语句之后,而不是 LOOP 语句之后(前测试),与上面显示的(后测试)相反。
CLS
RANDOMIZE TIMER
num = INT(RND * 100) + 1
DO
INPUT "Pick a number between 1 and 100: ", answer
IF num = answer THEN PRINT "You Got It!"
IF num > answer THEN PRINT "Too Small"
IF num < answer THEN PRINT "Too big"
LOOP UNTIL num = answer
PRINT "Game Over."
SELECT CASE <variable expression> CASE <value> [do this] CASE <value 2> [do instead] ... CASE ELSE ... END SELECT
select 语句是重复使用 IF 语句的替代方案。<变量表达式> 被计算并依次与每个 CASE <值> 进行比较。当找到匹配的 CASE <值> 时,将执行其后的 [执行此操作] 代码。如果执行了 EXIT CASE,则控制将传递到 END SELECT 之后的行,否则将检查下一个 CASE <值>。如果没有找到匹配项,则执行 CASE ELSE。请注意,<值> 可以是数字、字符或字符串,或者逻辑表达式(例如 '>0'、'<>1')。还要注意,可能会找到并执行多个 CASE 匹配(因此,例如,如果两个 CASE <值> 是 'CASE >1' 和 'CASE >10',则计算为 11(或更多)的 <变量表达式> 将导致 CASE >1 和 CASE >10 都被执行)
CLS
PRINT "WELCOME"
PRINT "I HAVE AN ANSWER FOR ANY OF YOUR QUESTIONS"
10 INPUT "WRITE YOUR QUESTION AND I'LL GIVE YOU AN ANSWER ", question$
RANDOMIZE TIMER
PRINT
answer = INT(RND * 4 + 1)
SELECT CASE answer
CASE 1
PRINT "PLEASE REPHRASE YOUR QUESTION."
CASE 2
PRINT "YOUR QUESTION IS MEANINGLESS."
CASE 3
PRINT "DO YOU THINK I CAN ANSWER THIS?"
CASE 4
PRINT "THIS QUESTION LOOKS FUNNY."
END SELECT
PRINT
PRINT "ENTER ANOTHER QUESTION", K$
GOTO 10
如果一个参数会被多个 case 语句覆盖,则第一个选项将优先。