分支结构程序设计是根据条件的测试结果执行不同的操作,在Visual FoxPro中有两条命令实现条件分支:IF...ELSE...ENDIF和DOCASE...ENDCASE。
简单分支结构是由以IF语句开头并以ENDIF语句结束的若干条语句组成。
格式:
IF <条件> [THEN]
<命令序列>
ENDIF
功能:如果<条件>成立,其值为真,则执行<命令序列>中的语句,否则执行ENDIF后的语句。
注意:IF语句与ENDIF语句必须成对使用,且各占一行。IF与ENDIF之间的各条语句,在书写或输入时建议向右缩进一些,这样便于程序结构的层次分明,增加程序的可读性。
【例5-7】判断某学生的成绩,如果达到85分以上,则为“优秀”。
CLEAR
INPUT " 请输入学生姓名:" TO XM
INPUT " 请输入该学生的语文成绩:" TO YW
IF YW>=85
? " "+XM+"的语文成绩达到了优秀!!!"
ENDIF
REUTRN
运行结果如下:
【例5-8】编写一个验证密码的程序。
CLEAR
@ 10,5 SAY "请输入密码:"
ACCEPT TO PA
IF !PA="12345"
@ 12,5 SAY "你输入的密码错误!将退出."
CANCEL
ENDIF
@ 12,5 SAY "OK!!"
RETURN
运行结果如下:
或者
选择分支结构同样是由以IF语句开头以ENDIF语句结束的若干条语言组成,其中包含一条ELSE语句。
格式:
IF <条件> [THEN]
<命令序列1>
ELSE
<命令序列2 >
ENDIF
功能:如果<条件>成立,其值为真,则执行<命令序列1>中的语句,否则执行<命令序列2>中的语句。
ELSE语句应单独占一行,IF与ENDIF必须成对使用,且各占一行。
【例5-9】输入任意一个整数,判断是偶数还是奇数。
CLEA
INPUT "请输入任何一个整数:" TO MM
IF INT(MM/2)=MM/2
? MM, "是偶数"
ELSE
? MM,"是奇数"
ENDIF
运行结果如下:
或
【例5-10】根据输入的年龄,判断是否偏大。
CLEAR
XM=SPACE(8)&&姓名
XB=SPACE(2)&&性别
YL=0 &&年龄
@ 10,10 SAY"输入学生姓名:" GET XM PICTURE 'XXXXXX'
@ 12,10 SAY"输入该生性别:" GET XB PICTURE 'XX'
@ 14,10 SAY"输入学生年龄:" GET YL PICTURE '99' RANGE 3,70
READ
IF YL>=25
CT="年龄偏大"
ELSE
IF YL<25 AND YL >=20
CT="年龄适中"
ELSE
CT="年龄偏小"
ENDIF
ENDIF
@ 16,10 say "姓名:"+XM+SPACE(2)+XB+SPACE(2)+;
LTRIM(STR(YL))+"岁"+SPACE(2)+CT
RETURN
运行结果如下:
或者
【例5-11】根据学生档案表(xsda.dbf),按输入的姓名查找其基本情况。
SET TALK OFF
CLEAR
USE XSDA
ACCEPT "请输入姓名:" TO XM
LOCATE FOR 姓名=XM
IF FOUND()
? "姓名:"+姓名
? "性别:",性别
? "年龄:"+STR(年龄,2)
? "出生年月:"+DTOC(出生年月)
ELSE
? "对不起,没有查找到此人!"
ENDIF
CLOSE ALL
RETURN
运行结果如下:
或 或
嵌套式IF条件语句,就是在IF语句中再嵌套一个IF语句,嵌套的IF语句可以在THEN后,也可在ELSE子句后面,还可以在THEN和ELSE后面分别嵌套一个IF语句。
格式:
IF <条件1> [THEN]
IF <条件2> [THEN]
<命令序列1>
ELSE
<命令序列2 >
ENDIF
<命令序列3>
ELSE
<命令序列4 >
ENDIF
注意:对于分支嵌套结构的程序而言,最重要的是要做到内外层分支结构的层次分明。
【例5-12】计算某公司员工的工资。每小时按15元计算,如果本月工作时间超过150小时,则超过部分加发10%,如果本月工作时间达不到120小时,则应从总工资里扣300元。
SET TALK OFF
CLEAR
ACCEPT "工作人员:" TO XM
ACCEPT "工 号:" TO GH
INPUT "请输入工作时间:" TO SJ
IF SJ>150
GZ=SJ*15+(SJ-150)*15*0.1
ELSE
IF SJ<120
GZ=SJ*15-300
ELSE
GZ=SJ*15
ENDIF
ENDIF
?
? "姓名:"+XM+" 工号:"+GH+" 本月应发工资:"+STR(GZ,8,2)
RETURN
运行结果如下:
前面的分支嵌套结构虽然可以解决程序中的多重选择问题,但当嵌套的层数较多时,往往会引起程序结构的混乱与层次不清,并使程序的可读性和可维护性降低。Visual FoxPro提供了多路分支结构来解决多种不同情况下的选择问题。
格式:
DO CASE
CASE<条件1>
<命令序列1>
CASE<条件2>
<命令序列2>
…
CASE<条件N>
<命令序列N>
[OTHERWISE]
[<命令序列N+1>]
ENDCASE
功能:执行多重选择。OTHERWISE表示除去以上多个CASE条件剩下的所有情况,也就是说,当所有<条件>都不成立时,若有[OTHERWISE]项,则执行[<命令序列N+1>],否则执行ENDCASE后的语句。
【例5-13】根据系统日期来判断是星期几。
SET TALK OFF
CLEAR
XQ=CDOW(DATE())
DO CASE
CASE XQ="Monday"
CXQ="今天是:星期一"
CASE XQ="Tuesday"
CXQ="今天是:星期二"
CASE XQ="Wednesday"
CXQ="今天是:星期三"
CASE XQ="Thursday"
CXQ="今天是:星期四"
CASE XQ="Friday"
CXQ="今天是:星期五"
CASE XQ="Saturday"
CXQ="今天是:星期六"
CASE XQ="Sunday"
CXQ="今天是:星期天"
ENDCASE
? "系统日期:",DATE()
?
? CXQ
运行结果如下:
【例5-14】 根据学生成绩表(xscj.dbf)输入学生的姓名,并计算其平均成绩及等级。
SET TALK OFF
CLEAR
USE XSCJ
ACCEPT "请输入姓名:" TO XM
LOCATE FOR 姓名=XM
平均分=INT((语文+数学+外语+政治)/4)
IF FOUND()
DO CASE
CASE 平均分>=90
PD="优秀"
CASE 平均分>=80 AND 平均分<90
PD="良好"
CASE 平均分>=70 AND 平均分<80
PD="中等"
CASE 平均分>=60 AND 平均分<70
PD="及格"
OTHERWISE
PD="不及格"
ENDCASE
? XM+"的平均成绩是:"+STR(平均分,6,2)+" 等级为:"+PD
ELSE
? "对不起,没有找到这个人!!!"
ENDIF
CLOSE ALL
RETURN
运行结果如下:
或
【例5-15】编写一个算银行存款应得利息的程序。
SET TALK OFF
CLEAR
INPUT "请输入存款金额(元):" TO JE
INPUT "请输入存款年限(年):" TO YX
DO CASE
CASE YX>=5
RATE=4.5
CASE YX>=3
RATE=3.6
CASE YX>=2
RATE=3.1
CASE YX>=1
RATE=2.7
CASE YX>=0.5
RATE=2.21
OTHER
RATE=1.23
ENDCASE
LX=JE*YX*RATE/100
? "应取得的利息是:"+STR(LX,8,2)
运行结果如下:
或者