跳转到内容

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...THEN...ELSE

[编辑 | 编辑源代码]
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

13 ELSEIF

[编辑 | 编辑源代码]

作为启动全新的 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...NEXT

[编辑 | 编辑源代码]
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 循环。

14FOR.BAS

[编辑 | 编辑源代码]
 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...WEND

[编辑 | 编辑源代码]
 WHILE <condition is true>
   [do this]
   ..
   [and this]
 WEND

如果条件为真,则执行 WHILE 之后的代码。当 WEND 命令执行时,它将控制返回到 WHILE 语句(条件在那里再次被测试)。当条件计算为 FALSE 时,控制将传递到 WEND 之后的语句。

15WHILE.BAS

[编辑 | 编辑源代码]
PRINT "Press any key to continue"
WHILE INKEY$=""
WEND

在上面的示例中,你看到一个按任意键提示,它将一直等待用户按下键。(INKEY$ 功能将在 高级输入 中介绍。)


DO...LOOP

[编辑 | 编辑源代码]
 DO
   [this]
   ..
   [and this]
 LOOP WHILE <condition is true> / LOOP UNTIL <condition is true>

DO...LOOP 结构是 WHILE 循环的更高级形式 - 与其他流程控制块一样,它以 DOLOOP 为标记来表示边界。

它依赖于放置在 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

[编辑 | 编辑源代码]
 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 语句覆盖,则第一个选项将优先。

华夏公益教科书