1、第三章 分支程序设计,一、定义:所谓分支是在程序的执行中有两个以上的支路,它通过对语句中给定条件的判断来决定程序的走向。 二、VFP分支结构的类型:IF语句 简单分支判断 (IF-ENDIF)选择分支判断 (IF-ELSE-ENDIF)结构分支判断,第一节 简单分支判断,格式: IF ENDIF功能:,条件?,语句系列,ENDIF后语句,NO,YES,例1:在人事表中间检查某人的职称,如是“助教”,将其职称为讲师,并将工资增加50元。,MODI COMM EX3-1.PRG SET TALK OFF USE RSACCEPT “请输入姓名“ TO XMLOCATE FOR 姓名=XMIF 职称
2、= “助教“ REPL 职称 WITH “讲师“,工资 WITH 工资+50 ENDIFDISP RETURN(如RS表中没有工资字段,可修改表结构、增加工资字段并补充记录的工资内容。),例2:请输入一个逻辑真值,若输入一个逻辑假值,屏幕显示你输入错误,再显示再见。若输入正确,只显示再见。,MODI COMM EX3-2.PRG SET TALK OFFINPUT “请输入一个逻辑真值“ TO LIF .NOT. L ?“你输入错误“ ENDIF?“再见“ RETU,例3:请输入一个正整数,若是偶数,屏幕显示你输入的偶数,再显示再见。若是奇数,只显示再见。,MODI COMM EX3-3.PR
3、G SET TALK OFF INPUT “请输入一个正整数“ TO YIF INT(Y/2)=Y/2 ? “你输入的数是偶数“ ENDIF? “再见“ RETU,强调:1.判断偶数的条件 INT(X/2)=X/2 或 MOD(X,2)=02.判断奇数的条件 INT(X/2)X/2 或 MOD(X,2)03.判断X被Y整除的条件 INT(X/Y)=X/Y 或 MOD(X,Y)=0总结:IF-ENDIF用法见教材P129/模式B(P126例16),作业1:给出一个整数,判断它能否被3,5,7整除,并根据判断结果打印出以下信息之一:能同时被3,5,7整除能同时被其中两数整除能被其中一个数整除。,提
4、示:判断是否能除尽105。判断是否能除尽15或21或35判断是否能除尽3或5或7,例4:在凭证表中,根据凭证编号查找凭证, 如找到凭证则显示该凭证。,(演示:凭证表) *MODI COMM EX3-4.PRGSET TALK OFF USE PZK CLEAR ACCEPT “请输入凭证编号“ TO CZ LOCA FOR 凭证编号=CZ IF FOUND() DISP ENDIF,第二节 选择分支语句,格式: IF ELSEENDIF,功能:,条件?,语句序列 1,ENDIF后语句序列,NO,YES,语句序列 2,例5:输入一个正整数,若是偶数显示你输入的数是偶数;若是奇数,则显示你的数是奇
5、数。,*MODI COMM EX3-5.PRG SET TALK OFF INPUT “请输入正整数“ TO NIF INT(N/2)=N/2 ? “你输入的数是偶数“ ELSE ? “你输入的数是奇数“ ENDIFRETU,例6:托运行李,不超过20KG,行李费是0.13/kg;超过20 kg,超过部分按0.2元收费。,*MODI COMM EX5-6.PRG SET TALK OFF INPUT “请输入行李的重量“ TO XIF X=20 Y=X*0.13 ?“你的行李费是“,YELSE Y=(X-20)*0.20+20*0.13 ?“你的行李超过20公斤,行李费是“,Y ENDIFRE
6、TU,例7:判断闰年,任给一年,试判断它是闰年。,闰年的计算方法:年数可以被4整除,但不能被100整除;或者可被400整除的为闰年。如2000年是闰年,而1900年不是。重要语句IF(Y/4=INT(Y/4).AND.Y/100INT(Y/100).OR.(Y/400=INT(Y/400) ?Y,“是闰年“ ELSE ?Y,“不是闰年“ ENDIF,关于闰年(请参阅),现在世界各国通用的公历,也叫阳历,是以地球绕太阳运行一周所用的时间来定的。地球绕太阳一周的实际时间是365天5小时48分46秒,为了计算方便,就把365天定为一年,叫做平年。这样,每过四年就要多出23小时15分4秒(5小时48分
7、46秒4),这个时间接近一天,因此,又规定每四年就要在二月份增加一天,补上前面少算的时间,即这一年二月有29天。这一年就叫作闰年,闰年有366天。可是,按上面的算法,每隔四年加一天,又多算了44分56秒(24小时-23小时15分4秒) ,照这样推算,100年要多算18小时43分20秒,将近一天。所以,又规定公历整百年,这一年不算闰年,也就是“百年不闰”。按 “百年不闰”计算,每100年又多出5小时16分40秒,推到400年,共多出了21小时6分40秒,又将近一天了,所以公历年份是400的倍数时,这一年又是闰年了。即公历年份是整百数的,必须是400的倍数,这一年才是闰年。所以,闰年的算法是:四年
8、一闰,百年不闰,四百又闰。,作业:请写出求闰年的完整程序。,SET TALK OFF INPUT “请输入年份“ TO Y IF(Y/4=INT(Y/4).AND.Y/100INT(Y/100).OR.(Y/400=; INT(Y/400) ?Y,“是闰年“ ELSE ?Y,“不是闰年“ ENDIF RETU,例8:完善人事表的查找程序。,MODI COMM EX3-8.PRG SET TALK OFF USE RS CLEAR ACCEPT “请输入姓名“ TO XM LOCA FOR 姓名=XM IF .NOT.EOF() DISP ELSE ?“查无此人“ ENDIF RETURN,例9
9、:完善凭证表的查找程序。,*MODI COMM EX3-9.PRGSET TALK OFF USE PZK CLEAR ACCEPT “请输入凭证编号“ TO CZ LOCA FOR 凭证编号=CZ IF FOUND() DISP ELSE CLEAR ? “无此凭证“ ENDIF,强调: 另外VFP还提供了逻辑判断函数。命令格式:IIF(条件表达式,表达式, 表达式)当条件表达式成立,取第一个表达式的值,否则取第二个表 达式的值。 例如:?IIF(year(date()=2003,.t.,.f.)P124/例9,例10:给出三个数A,B,C,要求按大小顺序将它们打印出来。,分析:1、将A和B
10、比较,若BA则将A、B互换,即将大者放在A中。2、将A和C比较,若CA则将A、C互换,即始终将大者放在A中。3、将B和C比较,若BC则将B、C互换,即将中者放在B中,小者放在C中。4、依次打印A、B、C。,例10:给出三个数A,B,C,要求按大小顺序将它们打印出来。,SET TALK OFF INPUT “ A=“ TO A INPUT “ B=“ TO B INPUT “ C=“ TO C IF BAT=AA=BB=T ENDIF IF CAT=AA=CC=T ENDIF,IF CBT=CC=BB=T ENDIF ?A,B,C,第三节 IF嵌套结构,格式1:IF IF ENDIFELSEEN
11、DIF,格式2:IF ELSEIF ENDIFENDIF,IF嵌套(续),格式3: IF IF ENDIFELSEIF ENDIFENDIF,见教材125页例题10、11、12强调:1、“最近搭配原则”。 2、三种选择取一个利用二条IF语句嵌套,四种选择取一个使用三条IF语句嵌套,N种选择取一个应用N-1条IF语句嵌套。,编程序求方程:AX2+BX+C=0,SET TALK OFF INPUT “ A=“ TO AINPUT “ B=“ TO B INPUT “ C=“ TO CZ=B*B-4*A*C,IF A=0 IF B=0 ?“无意义“ ELSE X=-C/B ?“有一个根,X=“,X
12、ENDIF,ELSEIF Z=0 X1=(-B+SQRT(Z)/(2*A) X2=(-B-SQRT(Z)/(2*A) ? “方程有两个实根,X1=“+STR(X1,7,2) ? “方程有两个实根,X2=“+STR(X2,7,2)ELSE R1=SQRT(-Z)/(2*A) R2=-B/(2*A) ?“方程有两个虚根,X1=“+LTRIM(STR(R2,7,2)+ ; “+I*“+LTRIM(STR(R1,7,2) ?“方程有两个虚根,X2=“+LTRIM(STR(R2,7,2)+ ; “-I*“+LTRIM(STR(R1,7,2) ENDIF ENDIF,第四节 结构分支语句 (情况语句),格
13、式: DO CASECASE (条件1)(语句行序列1)CASE (条件2)(语句行序列2)CASE (条件n)(语句行序列n)OTHERWISE(语句行序列)ENDCASE,条件1,条件2,条件n,语句序列1,语句序列2,语句序列n,语句序列n+1,ENDCASE语句,.T.,.T.,.T.,.F.,.F.,.F.,例10、某大型商场为了促进销售,采用了购货打折扣的优惠方法,即每位顾客一次购货:在800元以上者,给予95%优惠;在2000元以上者,给予90%优惠;在3000元以上者,给予85%优惠。在5000元以上者,给予80%优惠。请编程来计算顾客应付货款。,*MODI COMM EX3-
14、10.PRGSET TALK OFFINPUT “请输入购物总金额“ TO XDO CASECASE X=800Y= XCASE x=2000Y=x*0.95CASE x=3000Y=X*0.90CASE x=5000Y=X*0.85OTHERWISEY=X*0.80ENDCASE? “本次购物总金额: “,X? “本次购物实际支付金额:“ ,YRETU,例11、用结构语句编程求个人所得税。 已知:1、个人月收入在800元以内的免交税;2、月收入在800-2000以内,收税5%;3、月收入在2000-3000以内,收税8%; 4、月收入在3000-5000以内,收税10%;5、月收入在5000
15、元以上者,收税15%.,MODI COMM EX3-11.PRG SET TALK OFF INPUT “请输入个人月收入“ TO X DO CASECASE X800Y=0CASE X2000Y=(X-800)*0.05CASE X3000Y=(X-2000)*0.08+(2000-800)*0.05CASE X5000Y=(X-3000)*0.10+(3000-2000)*0.08+(2000-800)*0.05OTHERWISEY=(X-5000)*0.15+(5000-3000)*0.10+(3000- 2000)*0.08+(2000-800)*0.05 ENDCASE ? “ 个人
16、所得税税额为: “ ,Y RETU,例12、编写计算电费的程序,计算方法为:100度电以内每度电0.55,100-200之间收费0.80元,200-300度之间收费1元,超过300度的部分每度收费1.5元。 MODI COMM EX3-12.PRG SET TALK OFF INPUT “请输入用电度数“ TO X DO CASECASE X100Y=0.55*xCASE X200Y=(X-100)*0.80+100*0.55CASE X300Y=(X-200)*1+(200-100)*0.80+100*0.55OTHERWISEY=(X-300)*1.5+(300-200)*1+(200-1
17、00)*0.80+55 ENDCASE ?“所需要交的电费为: “,Y RETU,例13、根据人事表来判断职工的职称是高级职称、中级职称、初级职称,并根据不同的职称做不同的修改,如修改基本工资。,MODI COMM EX3-13.PRG USE RS ACCE “请输入要查的姓名:“ TO xm1 LOCA FOR 姓名=xm1 DO CASECASE 职称=“教授“ .OR.职称=“副教授“?姓名+“为高级职称“Repl 基本工资 with 基本工资+300 CASE 职称=“讲师“ ?姓名+“为中级职称“ Repl 基本工资 with 基本工资+200CASE 职称=“助教“ ?姓名+“为
18、初级职称“Repl 基本工资 with 基本工资+100 ENDCASE,例14:当用户在键盘上按下任意键,提示按键是数字、字母或其他键。,MODI COMM EX3-12.PRG CLEARWAIT WINDOW “请你按任一键!“ TO ANYKEYDO CASECASE ISDIGIT(ANYKEY)?“你好,你按的键为数字键!“CASE ISALPHA(ANYKEY)?“你好,你按的键为字母键!“ OTHERWISE?“对不起,你按的既不是数字键,也不是字母“ENDCASERETU,强调:用do case编程应注意几点:1.是操作表还是解决数理问题?2.在数理问题中,条件如何正确的描述
19、?3.表达式是否描述准确?(例如:分段计算与简单表达 式的区别)4.如何进行显示?(是总体显示还是分段显示)5.有些细节是否考虑周到?,作业:用do case语句来完成ax2+bx+c=0,作业:用结构语句编程求个人所得税。 已知级数 全月应纳税所得额级距 税率 速算 (%) 扣除数 1 不超过500元的 5 0 2 超过500元至2000元的 10 25 3 超过2000元至5000元的 15 125 4 超过5000元至20000元的 20 375 5 超过20000元至40000元的 25 1375 6 超过40000元至60000元的 30 3375 7 超过60000元至80000元的 35 6375 8 超过80000元至100000元的 40 10375 9 超过100000元的 45 15375 计算公式=X(工资总额)-4000(免税部分)*税率(相应税率)-速算扣除数,