MAX=C
END IF
IF C>MIN THEN
ELSE
MIN=C
END IF
PRINT "MAX=";MAX;"MIN=";MIN
END
程序说明:
块IF中的S1和S2可以同时存在,这是它的基本形式,但它可以缺省S1,或缺省S2,这就是它的特殊形式,如图6-6所示。该程序中包含了3个IF块:第1个是完整的IF块;第2个缺省S2,ELSE可省去不写;第3个缺省S1,ELSE语句不能省。
注意:每个块IF必须以END IF结束,它不能省,而且END IF必须与IF THEN配对。
在行IF语句“THEN”后面的语句中或“ELSE”后面的语句中允许再包含行IF语句,这就叫嵌套,例如:
IF〈条件〉THEN IF〈条件〉THEN〈语句〉ELSE〈语句〉ELSE〈语句〉
在THEN后嵌套了一个行IF语句,称它为内层。
[例6-5] 平面直角坐标系中,不同的象限内点的坐标的符号有以下4种情况:
在A象限 X>0,Y>0
在B象限 X<0,Y>0
在C象限 X<0,Y<0
在D象限 X>0,Y<0
任意输入一对坐标值,找出它所在的象限。
算法:
1.输入一对坐标值X,Y;
2.将4种可能的情况组成为嵌套的行IF语句。
N-S图如图6-7。
源程序:
REM EXAMPLE 5
INPUT X,Y
IF X>0 THEN IF Y>0 THEN PRINT "in A"
ELSE PRINT "in D"ELSE IF Y>0 THEN PRINT "in B"
ELSE PRINT "in C"
END

图6-7 IF嵌套
说明:
行IF的嵌套关系不容易看清楚,因此建议读者;
(1)嵌套不宜太深,尽可能不使用这种嵌套方法;
(2)嵌套的行IF语句不能省略ELSE部分。
(3)识别行IF语句嵌套的层次的方法是:首先扫描关键字ELSE,从左至右将第一个ELSE与它左面的最邻近的THEN和IF配对,再依次往右找第二个ELSE,与它后面最邻近的THEN和IF配对(已配过的THEN和IF除外)。
在块IF结构中的两个块S1、S2,每块中均可再包括块IF结构。
[例6-6] 将例5改用块IF的嵌套
'EXAMPLE 6
INPUT X,Y
IF X>0 THEN
IF Y>0 THEN
PRINT "in A"
ELSE
PRINT "in D"
END IF
ELSE
IF Y>0 THEN
PRINT "in B"
ELSE
PRINT "in C"
END IF
END IF
END
[例6-7] 把任意3个数按由大到小排列打印,用嵌套的块IF写程序。
N-S图如图6-8所示。

图6-8 N-S图
源程序:
’EXAMPLE 7
INPUT A,B,C
IF A>B THEN
ELSE
SWAP A,B
END IF
IF B>C THEN
ELSE
SWAP B,C
IF A>B THEN
ELSE
SWAP A,B
END IF
END IF
PRINT A,B,C
END
[例6-8] 编写求一元二次方程式Ax2+Bx+C=0的通解的程序。
算法:
本题要求通解就要对3个系数的任意取值进行判断,在各种情况下都能给出正确的结果。
顶层设计:判断A是否为零,如图6-9(a)。
(1)如果A=0,则方程变为解一元一次方程Bx+C=0。
(2)如果A≠0,根据判别式disc=b2

图6-9 顶层设计
第二层设计:
(1)A=0解一元一次方程,如图6-9(b)所示。

图6-10 第二层设计
① 判断b是否为零,如果b不为零则x=-c/b.
② 如果b为零,进一步判断c是否为零。
③ 如果c=0,则变得没有用处,显然,任何x值都是该方程的解;
④ 如果c≠0,则不可能求解。
(2)A≠0,如图6-9(c)所示。

图6
① disc>0 有两相异实根
② disc=0 有一个实根
③ disc<0 有两相异虚根
N-S图如图6-9(d)

图6-12
源程序:
'EXAMPLE 8
’Solve the Quadratic Equation
INPUT "A,B,C:";A,B,C
IF A=0 THEN
IF B=0 THEN
IF C=0 THEN
PRINT "It is trivial"
ELSE
PRINT "It is impossible"
END IF
ELSE
PRINT "Has one solution:"
PRINT "X=";-C/B
END IF
ELSE
DISC=B*B-4*A*C
R=-B/(2*A)
P=SQR(ABS(DISC))/(2*A)
IF DISC>=0 THEN
IF DISC>0 THEN
PRINT "Has two real roots;"
PRINT X1=";R+P
PRINT X2=";R-P
ELSE
PRINT "Has one real roots:"
PRINT "X=";R
END IF
ELSE
PRINT "Has two complex roots:"
PRINT "X1=";R;"+";P;"i"
PRINT "X2";R;"-";P;"i"
END IF
END IF
END
在块IF的结构中,增加一个ELSE IF语句,就扩充成多分分支的块IF结构。
IF〈条件1〉THEN
ELSE IF〈条件2〉 THEN
…}S2(块2)
ELSE IF〈条件3〉 THEN 可以包括多个ELSEIF语句
…}S3(块3) 和相应的语句块
…
ELSE IF〈条件n〉THEN
…}Sn(块n)
ELSE
…}Sn+1(ELSE块)
END IF
当条件1的逻辑值为真时,就执行语句块1(即S1),执行完后就退出S1,转到END IF语句的下一个语句继续执行;
如果条件1的逻辑值为假时,就跳过S1,执行ELSE IF〈条件2〉THEN语句,当条件2的逻辑值为真时,就执行S2,执行完后,退出S2,转到END IF语句的下一个语句:
如果条件2的逻辑值为假时,就又跳过S2,执行下一个ELSE IF语句。依此类推,有多少个ELSE IF语句,就有多少个分支,选择其一执行相应的语句块,然后退出该语句块。
如果所有条件都不满足,则程序执行就跳到ELSE,执行ELSE后的语句,然后退出该语句块。
[例6-9] 计算个人所得税,假设按以下规定征收:以月收入计征。
表6-1 个人征税率
|
收 入 金 额 (元) |
征 税 率 |
|
500以下 |
免征 |
|
500~1000以下 |
5%(扣除免征部分) |
|
1000~5000以下 |
10%(扣除免征部分) |
|
5000~10000以下 |
20%(扣除免征部分) |
|
10000~20000以下 |
30%(扣除免征部分) |
|
20000以下 |
45%(扣除免征部分) |
算法:
6种不同的收税标准构成6个条件的多路选择,用多分支的块IF就可写出程序。
N-S图,如图6-10。

图6-13 N-S图
源程序:
'EXAMPLE 9
'INCOME TAX COMPUTATION
INPUT "Get the income:";INCOME
IF INCOME<500 THEN
PRINT "Tax Free"
ELSE IF INCOME<1000 THEN
Tax=(INCOME-500) * 0.05
ELSE IF INCOME<5000 THME
Tax=(INCOME-500) * 0.10
ELSE IF INCOME<1000 THEN
Tax=(INCOME-500) * 0.20
ELSE IF INCOME<20000THEN
Tax=(INCOME-500) * 0.30
ELSE
Tax=(INCOME-500) * 0.45
END IF
PRINT "TAX=";TAX
END