第四章 选择结构程序设计关系表达式和逻辑表达式用行 IF语句实现选择结构用块 IF实现选择多分支选择结构多分支转移语句选择结构程序设计问题的提出在实际问题中,要求计算机进行逻辑判断,即给出一个条件,让计算机判断是否满足条件,并按照判断的结果来做不同的处理。
1,从键盘输入一个数,如果是正数则打印出来,否则不做任何处理;
2,将学生中成绩不合格者打印出来;
3,将职工工资低于 300元者打印出来;
4,根判别式 b2-4ac<0,则终止程序执行,否则求解。
关系运算符关系运算符 含义 相当于数学符号 举例
> 大于 > a>b
< 小于 < x<y
= 等于 = c=d
>= 大于等于 ≥ e>=-1
<= 小于等于 ≤ h<=I
<> 不等于 ≠ u<>v
关系表达式
用一个关系运算符把两个运算量(数值量或字符串)联结起来称关系表达式;
每个关系表达式都有一个值,这个值称作逻辑值(即
,真,或,假,);
在 QBASIC中,如果表达式不成立,即,假,,则此表达式的值为,0”,否则为,-1” ;
举例,PRINT 15>13,13>15
运行结果,-1 0
逻辑运算符问题的提出:如果需要判断一个数是否满足 0≤x≤10,语句
IF 0=<x<=10 THEN 语句 1 ELSE 语句 2 是错误的,因为在 QB中只能使用简单的关系表达式。
IF x>=0 AND x<=10 THEN 语句 1 ELSE 语句 2( 正确 )
QB的逻辑运算符:
AND( 与):所联结的关系表达式必须同时成立才为真;
OR( 或),所联结的关系表达式只要有一个为真,即为真;
NOT( 非):将原来的逻辑值取反。
逻辑运算符的运算规则
A B A AND B A OR B NOT A NOT B
真 真 真 真 假 假真 假 假 真 假 真假 真 假 真 真 假假 假 假 假 真 真逻辑表达式的预算次序一个逻辑表达式一般包括逻辑运算符、关系表达式或其他运算量;
算术运算 → 关系运算 → 逻辑运算( NOT→AND→OR )
如以下表达式,其中 a=5,b=3,c=-2,d=8
a-c > b+d OR c>d AND ABS(c) =a OR NOT c> d+5
7 > 11 OR c>d AND 2 =a OR NOT c>13
假 OR 假 AND 假 OR NOT 假假 OR 假 OR 真 真
IF语句语法,IF 关系表达式 THEN 语句 1 [ELSE 语句 2]
在 IF语句中,实际是判别关系表达式的逻辑值是零还是非零。如果是非零(即条件成立),则执行 THEN后的语句,否则执行 ELSE后的语句( 有 ELSE语句! )。
IF 5>3 THEN PRINT,This is true.” ELSE PRINT,This is false”
IF 3>5 THEN PRINT,This is true.” ELSE PRINT,This is false”
IF 2 THEN PRINT,This is true.” ELSE PRINT,This is false”
IF 0 THEN PRINT,This is true.” ELSE PRINT,This is false”
表达式的逻辑值可以赋值给变量:
x=5>3
x=5=3
甲、乙、丙、丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷。已知四人中有一个人说假话。
甲:我不是小偷。
乙:丙是小偷。
丙:丁是小偷。
丁:丙说谎。
分析:可以采用枚举法,依次假设甲、乙、丙、丁是小偷,
再根据他们的谈话找到关系式。由于有一个人说谎,所以四个关系式相加值为 -3时即可找到小偷。
(X<>1)+(X=3)+(X=4)+(X<>4)=-3
四大湖问题 (湖南省 1986年青少年程序设计竞赛试题 )。
上地理课时,四个学生回答我国四大淡水湖的大小时说:
甲:洞庭湖最大,洪泽湖最小,鄱阳湖第三。
乙:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三。
丙:洪泽湖最小,洞庭湖第三。
丁:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三。
对于每个湖的大小,每人仅答对了一个。
请判断四个湖的大小。
问题分析:
可以设洞庭湖、洪泽湖、鄱阳湖、太湖分别用变量 A,B、
C,D表示。每个变量的取值是 1~ 4。
因为每个只答对了一个,所以,他们的叙述可以表示为:
甲,(A=1)+(B=4)+(C=3)=-1
乙,(B=1)+(A=4)+(C=2)+(D=3)=-1
丙,(B=4)+(A=3)=-1
丁,(C=1)+(D=4)+(B=2)+(A=3)=-1
只有以上条件都满足时,才能找到正确答案。
用行 IF语句实现选择结构行 IF语句有二种形式:
(1)IF 条件 THEN 语句例如,IF x>0 THEN PRINT x
(2) IF 条件 THEN 语句 1 ELSE 语句 2
例如,IF x>0 THEN PRINT x ELSE PRINT –x
一般形式,IF 条件 THEN 语句 1 [ELSE 语句 2]
求解一元二次方程 ax2+bx+c=0(参见 SAMP4-2.BAS)
qipxacbD
qpxacbD
a
D
q
a
b
p
a
Db
a
acbb
x




2,1
2
2,1
2
2
2,1
,04
,04
2
,
2
22
4
则若则若令输入 a,b,c
d=b2-4ac
p=-b/2a
a
Dq
2?
d≥0
是 否
x1=p+q
x2=p-q
x1=p+q”i”
x2=p-q”i”
INPUT "Please enter the value of a,b,c:",a,b,c
d = b * b - 4 * a * c
p = -b / (2 * a)
q = SQR(ABS(d)) / (2 * a)
IF d >= 0 THEN x1 = p + q,x2 = p - q,PRINT "x1="; x1,"x2="; x2 ELSE
PRINT "x1="; p; "+"; q; "i","x2="; p; "-"; q; "i"
END
选择结构的嵌套在一个选择结构中包含另外一个选择结构,就称为选择结构的嵌套
y= 0 (x=0)
1 (x>0)
-1 (x<0)
举例:
输入 x
x>0
是 否
y=1
x=0是 否
y=0 y=-1
INPUT,Please input x”
IF x>0 THEN y=1 ELSE IF x=0 THEN y=0 ELSE y=-1
PRINT,y=“;y,END
对选择结构的嵌套的理解选择结构的嵌套实际上是把一个 IF结构的语句作为它外层 IF结构的 THEN 或 ELSE 子句中应该执行的语句。
对比:
IF 逻辑表达式 THEN 语句 1 ELSE 语句 2
IF x>0 THEN y=1 ELSE IF x=0 THEN y=0 ELSE y=-1
IF x>=0 THEN IF x>0 THEN y=1 ELSE y=0 ELSE y=-1
内层 IF-ELSE
外层 IF-ELSE
IF x>=0 THEN IF x>0 THEN y=1 ELSE y=-1
IF x>=0 THEN IF x>0 THEN y=1 ELSE y=-1
内层 IF-ELSE
IF x>=0 THEN IF x>0 THEN y=1 ELSE y=-1
内层 IF-ELSE

规定,ELSE 与离它最近的 IF 配对关于选择结构嵌套的两点说明
1,将内层的 THEN子句和 ELSE子句写全,即使不需要 ELSE子句,也应写上
ELSE子句,后面不跟任何语句。
内层 IF-ELSE
外层 IF-ELSE
IF x>=0 THEN IF x>0 THEN y=1 ELSE ELSE y=-1
2,尽量将内嵌的 IF 结构放在外层 IF 的 ELSE子句中,而不放在 THEN子句中,
由于内层 IF出现在外层 IF 的 ELSE子句中,内层的 ELSE只能与其前面的 IF
配对,而 IF是在外层的 ELSE 右边,由于有外层 IF的 ELSE隔开,所以内层的 ELSE绝不会越过外层的 ELSE与外层的 IF 配对。
IF x>0 THEN y=1 ELSE IF x=0 THEN y=0 ELSE y=-1
内层 IF-ELSE
外层 IF-ELSE
利用块 IF实现选择结构语法:
IF 条件 THEN
语句组 1
ELSE
语句组 2
END IF
y= 0 (x=0)
1 (x>0)
-1 (x<0)
举例:
INPUT,Please input x:”;x
IF x>0 THEN
y=1
ELSE
IF x=0 THEN
y=0
ELSE
y=-1
END IF
END IF
PRINT,x=”;x,”y=”;y
END
块 IF实现选择结构举例举例( P108,sam4-6.bas):
d=
0.05 (250≤m<500)
0 (m<250)
0.075 (500≤m<1000)
0.1 (1000≤m<2000)
0.15 (2000≤m)
INPUT "Please input your money for buying:",m
IF m < 250 THEN
d = 0
ELSE
IF m < 500 THEN
d =,05
ELSE
IF m < 1000 THEN
d =,075
ELSE
IF m < 2000 THEN
d =,1
ELSE
d =,15
END IF
END IF
END IF
END IF
amount = m * (1 - d)
PRINT "amount="; amount
END
amount = m * (1 - d)
PRINT "amount="; amount
END
INPUT "Please input your money for buying:",m
IF m < 2000 THEN
ELSE
d=.15
END IF
IF m <1000 THEN
ELSE
d=0.1
END IF
IF m < 500 THEN
ELSE
d=0.75
END IF
IF m < 250 THEN
d=0
ELSE
d=.05
END IF
ELSEIF语句实现选择结构语法:
IF 条件 1 THEN
语句组 1
ELSEIF 条件 2 THEN
语句组 2
ELSEIF 条件 3 THEN
语句组 3
……..
ELSEIF 条件 4 THEN
语句组 n
ELSE
语句组 n+1
END IF
INPUT,Please input your money for buying:”,m
IF m<250 THEN
d=0
ELSEIF m<500 THEN
d=0.05
ELSEIF m<1000 THEN
d=0.075
ELSEIF m<2000 THEN
d=0.1
ELSE
d=0.15
ENDI
amout=m*(1-d)
PRINT,amount=”;amount
END
基本要求
掌握逻辑运算的基本概念
掌握行 IF语句和块 IF结构的使用
IF 条件 THEN 语句 1 ELSE 语句 2
IF 条件 THEN
语句组 1
ELSE
语句组 2
END IF
IF 条件 THEN
语句组 1
ELSEIF 条件 1 THEN
语句组 2
ELSEIF 条件 2 THEN
语句组 3
……..
ELSEIF 条件 3 THEN
语句组 n
ELSE
语句组 n+1
END IF
多分支选择结构 (SELECT CASE结构 )
语法,
SELECT CASE 表达式
CASE 条件 1
语句组 1
CASE 条件 2
语句组 2
……
CASE ELSE
语句组 n
END SELECT
y= 0 (x=0)
1 (x>0)
-1 (x<0)
举例:
INPUT,Please enter x:”,x
SELE CASE x
CASE IS >0
y=1
CASE IS =0
y=0
CASE IS <0
y=-1
END SELECT
PRINT,x=”;x,”y=”;y
END
SELECT CASE结构举例有一笔款欲存银行,三年后取出,可以采取几种方案之一:
1,活期 3年;
2,3次一年定期(每年到期后取出,在重新存入);
3,先存一次 2年定期,再存一次 1年定期;
4,先存一次 1年定期,再存一次 2年定期;
5,3年定期。
假设存款年利率为:
活期,1.5%
1年期,4%
2年期,4.5%
3年期,5.1%
求本、利和的公式,p=p0*(1+r)n (其中,r为年利率,n为存款年数 )
(参见 samp4-9.bas)
REM program for bank savings
r0 =,01,r1 =,04,r2 =,045,r3 =,051
INPUT "Please input your deposit:",p0
INPUT "Please input scheme:",c
SELECT CASE c
CASE 1
p = p0 * (1 + r0) ^ 3
CASE 2
p = p0 * (1 + r1) ^ 3
CASE 3
p = p0 * (1 + r2) ^ 2
p = p * (1 + r1)
CASE 4
p = p0 * (1 + r1)
p = p * (1 + r2) ^ 2
CASE 5
p = p0 * (1 + r3) ^ 3
END SELECT
PRINT "p="; p
END
关于 SELECT CASE结构的几点说明 (I)
1,SELECT CASE行后的表达式称,CASE表达式,,又可称,测试表达式,,它可以是一个变量或表达式,如 a+b,sin(x)
2,CASE后的条件有如下三种形式:
常量;
用,TO”指定一个范围,如 3 TO 4,8 TO 23( 闭区间 );
用,IS”指定一个条件,其一般形式为,IS <关系运算符 > <表达式 >,
当“条件”为一个关系条件时,不能包含逻辑运算符,如 IS <6( 正确 ),IS NOT <6( 错误,不能包含逻辑运算符 )。
表示 0=<x<=10不能写成 IS >=0 AND IS <=0,应该为,0 TO 10
3,可以在一个 CASE中使用多个条件,多个条件时,各个条件之间的关系是
“逻辑或”的关系,如
CASE 1,3,5,7
CASE 1 TO 5,8 TO 10,IS >100
CASE IS>=0,IS<=100 (各个条件之间的关系是“逻辑或”的关系,
所以 -∞<x< ∞)
关于 SELECT CASE结构的几点说明 (II)
4,不同 CASE子句中的“条件”不应当重复,重复虽然不会报告错误,只是出现操作上的矛盾,例如:
SELECT CASE a
CASE 1,2,3
PRINT,1-3”
CASE IS >0
PRINT,>0”
CASE 2 TO 10
PRINT,2 -10”
END SELECT
5.除了 CASE ELSE 子句外,其他 CASE
子句的顺序对执行结果没有影响,如果把 CASE ELSE子句放在最前,则首先执行的是 CASE ELSE子句,而认为前面的 CASE子句均不符合条件,例如:
SELECT CASE INT(m)
CASE ELSE
d=0.15
CASE IS <250
d=0
CASE 250 TO 499
d=0.05
END SELECT
多分支转移语句 (ON GOTO 语句 )
语法,ON 算术表达式 GOTO 行号或行标号 1,行号或行标号 2,行号或行标号 3……
例如,ON x GOTO a,b,c,d
当 x=1时,执行行标号为 a的语句行;
当 x=2时,执行行标号为 b的语句行;
当 x=3时,执行行标号为 c的语句行;
当 x=4时,执行行标号为 d的语句行。
y= 0 (x=0)
1 (x>0)
-1 (x<0)
举例:
INPUT,Enter x:”,x
s=SGN(x)
ON s+2 GOTO a,b,c
a,y=-1,GOTO d
b,y=0,GOTO d
c,y=1,GOTO d
d,PRINT,x=”;x,”y=”;y
END
选择结构程序设计举例例 1:输入一个年份(例如 1999),要求判断它是否是闰年。
分析:判断闰年的条件是:能被 4整除但不能被 100整除的是闰年,如 1992年;能被 4整除又能被 400整除的是闰年,如 2000年;其他为非闰年。
(参见,s4-11-1.bas,s4-11-2.bas,s4-11-3.bas,s4-11-4.bas)
INPUT "Please input year:"; year
PRINT year; " is ";
IF (year MOD 4 = 0 AND year MOD 100 <> 0) OR year MOD 400 = 0 THEN
PRINT "a leap year!" ELSE PRINT "NOT a leap year!"
END
s4-11-1.bas用行 IF语句实现选择
s4-11-2.bas用块 IF结构实现选择
INPUT "Please input year:"; year
PRINT year; " is ";
IF (year MOD 4 = 0 AND year MOD 100 <> 0) OR year MOD 400 = 0 THEN
PRINT "a leap year!"
ELSE
PRINT "NOT a leap year!"
END IF
END
s4-11-3.bas逐个条件判断
INPUT "Please input year:"; year
IF year MOD 4 = 0 THEN
IF year MOD 100 = 0 THEN
IF year MOD 400 = 0 THEN
leap = 1
ELSE
leap = 0
END IF
ELSE
leap = 1
END IF
ELSE
leap = 0
END IF
IF leap = 1 THEN
PRINT year; " is a leap year!"
ELSE
PRINT year; " is NOT a leap year!"
END IF
END
s4-11-4.bas在块 IF结构使用 ELSEIF语句实现选择
INPUT "Please input year:"; year
IF year MOD 4 <> 0 THEN
leap = 0
ELSEIF year MOD 100 <> 0 THEN
leap = 1
ELSEIF year MOD 400 = 0 THEN
leap = 1
ELSE
leap = 0
END IF
IF leap = 1 THEN
PRINT year; " is a leap year!"
ELSE
PRINT year; " is NOT a leap year!"
END IF
END
选择结构程序设计举例例 2 有一城市,规划建设
1个中心城和 4个卫星城。中心城的边长 20
公里,卫星城边长为 5
公里,均为正方形,
中心城的地价为每公顷 10万,卫星城为 5万,
其他地区 1万。编程序,
输入任意一点的位置,
确定该点的地价。
-10-20
Ⅱ Ⅰ
ⅣⅢ -20
20
20
-10
10
10
中心城的范围:
|x|≤10 AND |y|≤10
卫星城的范围:
20≤ |x|≤25 AND 20≤ |y|≤25
s4-12-1.bas在块 IF结构使用 ELSEIF语句实现选择
INPUT "Please input your coordinate:"; x,y
IF ABS(x) <= 10 AND ABS(y) <= 10 THEN
price = 10
ELSEIF (ABS(x) >= 20 AND ABS(x) <= 25) AND (ABS(y) >= 20 AND
ABS(y) <= 25) THEN
price = 5
ELSE
price = 1
END IF
PRINT "Price="; price
END
s4-12-2.bas用 3个行 IF语句实现选择
INPUT "Please input your coordinate:"; x,y
IF ABS(x) <= 10 AND ABS(y) <= 10 THEN price = 10
IF (ABS(x) >= 20 AND ABS(x) <= 25) AND (ABS(y) >= 20 AND ABS(y) <= 25)
THEN price = 5
IF NOT (ABS(x) <= 10 AND ABS(y) <= 10) AND NOT (ABS(x) >= 20 AND
ABS(x) <= 25 AND ABS(y) >= 20 AND ABS(y) <= 25) THEN price = 1
PRINT "Price="; price
END
s4-12-3.bas用 2个行 IF语句实现选择
INPUT "Please input your coordinate:"; x,y
price = 1
IF ABS(x) <= 10 AND ABS(y) <= 10 THEN price = 10
IF ABS(x) >= 20 AND ABS(x) <= 25 AND ABS(y) >= 20 AND ABS(y) <=
25 THEN price = 5
PRINT "Price="; price
END
s4-12-4.bas通过标志变量实现选择
INPUT "Please input your coordinate:"; x,y
price = 1
IF ABS(x) <= 10 AND ABS(y) <= 10 THEN price = 10
flag = 1
IF ABS(x) >= 20 AND ABS(x) <= 25 AND ABS(y) >= 20 AND ABS(y) <=
25 THEN price = 5
flag = 2
IF flag <> 1 AND flag <> 2 THEN price = 1
PRINT "Price="; price
END
找出剩余 2个数中的最大者,放在 c中找出 4个数中的最大者,放在 a中找出剩余 3个数中的最大者,放在 b中
a<b
真 假
a与 b互换
a<c
真 假
a与 c互换
a<d
真 假
a与 d互换
b<c
真 假
b与 c互换
b<d
真 假
b与 d互换
c<d
真 假
c与 d互换
INPUT "Please input a,b,c,d:"; a,b,c,d
IF a < b THEN SWAP a,b
IF a < c THEN SWAP a,c
IF a < d THEN SWAP a,d
IF b < c THEN SWAP b,c
IF b < d THEN SWAP b,d
IF c < d THEN SWAP c,d
PRINT a,b,c,d
END
程序设计 参见,Samp4-14.bas
基本要求
掌握多分支选择结构和多分支转移语句的使用。