本语句用于执行从属于一个表达式的多个分支语句块中的一个。
SELECT CASE〈测试表达式〉
CASE〈情况1〉
S1(语句块1)
CASE〈情况2〉 可以有多个CASE〈情况〉
S2(语句块2) 及相应的语句块
…
CASE ELSE
Sn(语句块n)
END SELECT
说明:
(1)〈测试表达式〉:可以是数值表达式或字符串表达式;
(2)〈情况1〉、〈情况2〉…,可以是以下格式中的任意一种:
①〈表达式〉[,〈表达式〉]…
②〈表达式〉TO〈表达式〉
③ IS〈关系运算符〉〈表达式〉
以上的〈表达式〉可以是数值类型的或字符串类型的,但它们要与〈测试表达式〉的类型一致。
(1)SELECT CASE〈测试表达式〉是该选择结构的第一个语句,它要说明被测试的对象,用表达式表示,比如例5.9中,纳税人的收入多少是被测试的对象,收入多少不同,纳税就有六个等级,因此,就构成六个〈情况〉。
(2)CASE〈情况1〉语句,就是反映测试对象的各种可能情况,当测试表达式的值,满足CASE〈情况1〉的条件时,就执行相应的语句块S1,执行完后,跳到END SELECT的下一语句继续执行。不满足时,依次判断下一个。
在所有CASE〈情况〉语句,如有两个及两个以上的〈情况〉条件都满足,则只执行最先满足〈情况〉条件的分支。
(1)CASE ELSE当所有CASE〈情况〉的条件都不满足时,执行后面的语句块,执行完后退出END SELECT结构,往下继续执行。
(2)END SELECT语句,是多路选择结构的结束标帜,不产生任何操作,但它提供一个出口以便继续执行行其后的语句,每个多路选择结构有一个SELECT CASE语句,必须有一个END SELECT语句与之配对。
[例6-10] 某幼儿园儿童按年龄编班,2~3岁的为小班,4岁的为中班,5~6岁的为大班,输入某儿童的年龄,计算机给出应编进哪个班级。
算法:
把入园儿童的年龄设为OLD,以该变量为测试表达式,按2~3,5~6三种情况来应用SELECT CASE语句写程序。
源程序:
’EXAMPLE 10
INPUT How old are yor?”;OLD
SELECT CASE OLD
CASE 2,3
PTINT "Enter lower class"
CASE 4
PRINT "Enter Middle class"
CASE 5 TO 6
PRINT "Enter higher class"
CASE ELSE
PRINT "Can not enter!"
END SELECT
END
[例6-11] 求函数Y的值:

源程序:
'EXAMPLE 11
INPUT "X=";X
SELECT CASE X
CASE IS<0
Y=EXP(X)+EXP(-X)
CASE 0
Y=1.25
CASE IS>0
Y=LOG(X)/LOG(10)
CASE ELSE
PRINT "It is wrong!"
END SELECT
PRINT "Y=";Y
END
GOTO〈行号丨标号〉
在BASIC中,只能指定一个有效的〈行号〉
在Quick BASIC中,还可以指定一个有效的〈标号〉
例:
GOTO 50(该行号应是本程序单元内存在的)
GOTO start(start是一个标号,它应是本程序单元内存在的)
用无条件转移语句GOTO,可由编程人员强行指定程序的执行转移到程序中的相应位置去,这个用起来简单方便,但用得不好,容易破坏程序结构,引起混乱,不便阅读,因此,建议尽量少用,能用其他方法代替的,就不用GOTO语句,但是它和条件语句配合使用,构成一个循环结构,还是可以的。
[例6-12] 计算某班科考试成绩的平均分
算法:
(1)用READ语句读入学生的考试成绩,将考试分数放在DATA语句中。
(2)建立一个终止标志,方法是在Data语句中,写完所有的分数之后,加一个“-1”,它和分数有根本区别,因为分数不可能为负数。设立终止标志的作用是控制读数操作的结束,以改变程序的流程。
(3)当读入一个数据之后,都要检查是不是-1,如果是-1,就表示已没有数据可读了,因此程序不再进行累加;如果不是-1,就表示读入的是分数,应该进行累加处理。
(4)用GOTO和条件语句构成循环,进行累加。
(5)全部累加完后,再求平均,打印结果。
源程序:
REM EXAMPLE 12
SUM=0:N=0
start; READ SCORE
IF SCORE=-1 THEN 80
SUM=SUM+SCORE
N=N+1
GOTO start
MEAN=INT(SUM/NJ+0.5)
PRINT "MEAN=";MEAN
DATA 89,76,94,51,65,86,-1
END
这种反复执行一段程序的过程就称为循环,下一章,将进一步讨论循环结构。
ON〈算术表达式〉GOTO〈行号1〉,〈行号2〉,…
说明
〈算术表达式〉:其值必须在1~255之间,若值为小数则按四舍五入取为整数;如果其值为负或大于255,将出现错误信息。
〈行号1〉,〈行号2〉,…分别代表每一分支的入口行号。
首先计算算术表达式的值,得到一个在1~255的整数。这个整数就是要转移到某分支行号的位置。
例:

当X=4时,由于位置上没有行号,程序将转移到下一个BASIC语句去。
ON GOTO就象一个多路开关,按顺序选通某一通路。如图6-11所示。

图6-11 多分支语句
4.举例
[例13] 在(0,60)区间有一连续函数,当给出任一个X值时求Y值,函数为:
Y=30 0≤X<10
40-X 10≤X<20
20 20≤X<30
50-X 30≤X<40
10 40≤X<50
60-X 50≤X<60
算法:
用多分支的ON GOTO语句处理;
源程序:
REM EXAMPLE 13
INPUT X
ON X/10+1 GOTO 60,70,80,90,100,110
PRINT "X<0 OR X>60"
GOTO 130
Y=30:GOTO 120
Y=40-X:GOTO 120
Y=20:GOTO 120
Y=50-X:GOTO 120
Y=10:GOTO 120
Y=60-X
PRINT "X=";X,"Y=";Y
END
1.选择结构的功能是控制程序执行的流程。当流程发生分支时,根据一定的逻辑条件选择其中之一作为执行流程。基本的流程分支可分为两分支和多分支两类。
2.为了实现基本的两分支流程,BASIC提供了行IF语句,Quick BASIC扩展成为块IF。
(1)行IF语句的格式是:
IF〈条件〉HTEN〈语句丨行号〉[ELSE〈语句丨行号〉]
它包括3个部分:(1)条件部分;
(2)THEN语句部分;
(3)ELSE语句部分。
当条件为“真”,执行THEN语句部分
当条件为“假”,执行ELSE语句部分
(2)块IF由3个语句两个组成,其格式是:
IF〈条件〉HTEN
S1
ELSE
S2
END IF
3.使用行IF语句时的注意事项
(1)在〈语句丨行号〉参数中,尽量不要使用〈行号〉这样可以避免发生结构上的混乱。
(2)行IF语句的ELSE部分是可选的,可以省去这一部分,这是,只对条件为真时进行处理,条件为假时,不执行该语句,程序执行转到它的下一个语句。
(3)行IF语句的长度不要超过255字符,最好写得简短些,不宜写得太长。
(4)允许行IF内嵌套,但不宜太深。
4.块IF是功能最强、结构最清楚的选择结构,因而也是一个最基本的重要结构。使用时应注意以下几点。
(1)IF条件语句和END IF语句必须配对;
(2)ELSE语句是可选的,当语句块S2省略时,可以省略该语句;
(3)它的两个语句块S1、S2可以同时出现,也可以省略其中任意一个;
(4)不允许用GOTO语句从块外转到IF块内来;
(5)允许块IF内再嵌套IF语句。
5.在条件语句中,条件是用关系表达式或逻辑表达式来表示的。条件较简单的可以只用关系表达式,条件较复杂的(如复合条件)可以用逻辑表达式,最常用的逻辑运算有NOT、AND、OR。
6.为了实现多分支的流程,Quick BASIC提供了一个专门处理多种情况的SELECT CASE语句和扩充的块IF,在BASIC中则有ON GOTO语句。
实际上利用行IF语句和块IF的嵌套也能实现多分支的流程。
7.无条件转向语句GOTO,在不破坏程序的结构化原则下可以使用,如它和行IF语句配合构成循环结构。但不提倡到处都用GOTO转移语句。
1.如果X=1,Y=2,Z=3计算下列表达式的逻辑值。
(1)X<0·1 (2)X>0 AND Y>Z
(3)Z=X+Z (4)SIN(X)=COS(X)*Y
(5)4*Y/Z<>X (6)X*Y*Z>Y∧3
(7)X+Y+Z>0 OR 1-COS(Z)>0
(8)Z*2>X AND Z+2<Y OR Z/2>X AND Z-2<Y
2.把下列每个条件写成BASIC的逻辑表达式(或关系表达式)
(1)0<X<10 (2)X小于等于Y
(3)X和Y都不大于100 (4)X不在a和b之间
(5)X不等于Y (6)X不大于Z或不小于Y
(7)N大于100或N<0 (8)X=Y=Z
3.输入x,编制程序计算y的值。

4.输入a、b、c三个数,要求将绝对值最大者打印出来。
5.输入x,计算y的值。

6.假设邮局规定为
(1)凡不超过
(2)每个邮包收手续费0.50元;
(3)需作快件投递者,增收平常邮费的20%。
7.编写程序,从键盘输入3个不同的数,按从大到小的顺序输出。
8.编一程序,从键盘上输入两个操作数和一个运算符,,由计算机输出运算结果(运算符为:+、-、*、/)。
9.某学校评选一等奖学金的条件有以下两种:
(1)每门课程成绩在85分以上。
(2)所考6门课程成绩总分在520分以上。
请输入某学生6门课程的成绩cj1、cj2、cj3、cj4、cj5、cj6,问他能否获得一等奖学金。