6.9顺序结构程序设计一、顺序结构:根据程序中语句的书写顺序依次逐条执行。流程图如下:语句1语句2例6.1查找某个学生信息(lz1)Opendatabase教学管理Use学生Accept“请输入学生姓名:”tonameLocatefor姓名=nameDisplayUsereturn分类:简单分支语句(IF-ENDIF)选择分支语句(IF-ELSE-ENDIF)结构分支(docase-endcase6.10分支结构yxxxxxxxsincos2310301.简单分支语句(Lz1)格式:IF条件表达式语句块ENDIFIF.T.条件?语句块ENDIF.F.单向IF语句流程图功能:计算条件表达式的值,若为真(.T.),则执行语句块中的语句;若为假(.F.),不执行语句块。无论执行还是不执行,程序都将转向ENDIF下一条语句继续执行。说明:(1)IF和ENDIF必须配对出现,且分两行书写。(2)条件表达式可以是关系表达式或逻辑表达式。例6.2Opendatabase教学管理(lz2)Use学生Accept“请输入学生姓名:”tonameLocatefor姓名=nameIffound()DisplayEndif?“结束”Usereturn例6.3Usezgda(lz3)Locatefor基本工资650.00If.not.Eof()displayEndif2.选择分支语句格式:IF条件表达式语句块AELSE语句块BENDIF条件?语句块1语句块2IF.T..F.ENDIF双向IF语句流程图:功能:条件成立,执行语句块A;条件不成立,执行语句块B。然后程序转向ENDIF下一条语句继续执行。说明:(1)无论条件是否成立,在语句块A和B之间必执行一个,且只能执行一个。(2)该语句可以解决一入口,二分支问题yxxxxxxxsincos231030Input“x=”toxifx0y=sin(x)+sqrt(x*x+1)elsey=cos(x)-x^3+3*xendif?”x=”,x,”y=”,y(LZ4)Inputx=toxifx=0y=cos(x)-x^3+3*xendify=sin(x)+sqrt(x*x+1)Inputx=toxy=cos(x)-x^3+3*xifx0y=sin(x)+sqrt(x*x+1)endif?x,y例6.37铁路托运行李,假设每张车票可按每公斤0.5元托运50公斤以内的行李,如果超过50公斤时,超过的部分每公斤加价0.8元。计算公式和程序如下:p143X=0.5×W当W≤50公斤X=0.5×50+0.8×(w-50)当W50公斤SettalkoffInput“请输入行李的重量为:”towIfw=50x=0.5*wElsex=0.5*50+0.8*(w-50)Endif?”行李的重量为:”+str(w,6,2)+”公斤,其运费为:”+str(x,6,2)+”元”例6.4输入乘出租车的公里数,求乘车费(计费标准:2.5公里以内6元;2.5公里以外,每超过1公里,增加到1.2元,要求四舍五入到元)。(lz5)*PROG6.PRGCLEARINPUT“请输入公里数:”TOXIFX2.5PAY=(X-2.5)*1.2+6ELSEPAY=6ENDIF?应付费,ROUND(PAY,0),元CANCEL例6.5在学生信息.DBF中查找某人,若找到,显示该记录;若找不到,显示“查无此人!”。(lz6)*PROG7.PRGSETTALKOFFUSE学生ACCEPT输入待查找人的姓名:TONAMELOCATEFOR姓名=NAMEIFFOUND()DISPELSE?查无此人!ENDIFUSESETTALKONCANCEL有学生成绩表:现要统计60分以下有多少人,60到69分的有多少人,70-89分的有多少人,90分以上的有多少人。3.IF语句的嵌套IF-ELSE-ENDIF语句中的语句块里可以包含任何合法的语句,也可以包含另一条IF语句,这就构成了IF语句的嵌套。嵌套IF语句可以解决一入口,三分支甚至更多分支的问题。嵌套形式可以是多种多样的,以下是其中的一种:IF条件表达式1语句块1ELSEIF条件表达式2语句块2ELSE语句块3ENDIFENDIF语句块3.F.ELSE条件2语句块2条件1语句块1IF.T..F.ELSEIF.T.ENDIFIf大学英语=90a=a+1ElseIf大学英语=70b=b+1elseIf大学英语=60c=c+1elsed=d+1endifEndifendifIf大学英语60d=d+1ElseIf大学英语70b=b+1elseIf大学英语90c=c+1elsed=d+1endifEndifendifIf大学英语60d=d+1ElseIf大学英语70c=c+1elseIf大学英语90b=b+1elsea=a+1endifEndifendif这样可以不可以?4.结构分支语句格式:DOCASECASE条件表达式1语句块1CASE条件表达式2语句块2……CASE条件表达式n-1语句块n-1[OTHERWISE语句块n]ENDCASE条件1条件2条件n-1语句块n语句块1语句块n-1DOCASEENDCASEOTHERWISE语句块2.T..T..F..F..F..T.功能:依次检测条件表达式的值,一旦某一条件满足,执行相应语句块,然后转到ENDCASE下一条语句。如果所有条件表达式的值都为假,倘若无OTHERWISE子句,则不执行任何语句,直接转到ENDCASE下一条语句;如若有OTHERWISE子句,则无条件执行OTHERWISE与ENDCASE之间的语句块,然后转到ENDCASE下一条语句。说明:(1)如果有两个或两个以上的条件为真,则只执行第一个条件表达式为真的CASE后的语句组,之后即转去执行ENDCASE之后的语句而不会再去判断下一个CASE中的条件。Docasecase大学英语=90a=a+1case大学英语=70.and.大学英语90b=b+1case大学英语=60c=c+1otherwised=d+1endcase也可以这样做Docasecase大学英语60d=d+1case大学英语70c=c+1case大学英语90b=b+1otherwisea=a+1emdcase有学生这样写,大家分析一下?Docasecase大学英语=60a=a+1case大学英语=70b=b+1case大学英语=90c=c+1otherwised=d+1emdcase结果是什么?1.当型循环语句格式:DOWHILE条件表达式循环体ENDDO6.11循环结构初始设置条件满足吗?循环体语句[LOOP][EXIT].F..T.DOWHILEENDDO功能:当条件表达式的值为真(.T.)时,执行循环体中的语句,一旦条件表达式的值为假(.F.),程序跳出循环体,转到ENDDO下一条语句继续执行。说明:(1)如果条件永远成立,形成死循环。为了避免死循环,在循环体中必须要有语句能够改变条件表达式的值。(2)当循环次数事先未知时,使用DOWHILE-ENDDO语句。(3)循环体中,可以出现LOOP语句。遇到LOOP语句时,程序立即转向DOWHILE循环起始语句,而不再执行LOOP下面的循环体语句。(4)循环体中,可以出现EXIT语句。遇到EXIT语句时,程序立即跳出本层循环,转向逻辑上的下一条语句继续执行。设置EXIT语句,也是防止死循环的一种方法。DOWHILE语句的流程图例6.11ClearLZ7use学生成绩store0toa,b,c,ddowhile.not.eof()Docasecase大学英语=90a=a+1case大学英语=70b=b+1case大学英语=60c=c+1otherwised=d+1endcaseskipenddo?a,b,c,dSTORE0TOC,W(LZ8)(用IF语句改写)USEZGDADOWHILE.NOT.EOF()DOCASECASE(年龄45).AND.职称=讲师W=W+1CASE(年龄45).AND.职称=副教授C=C+1ENDCASESKIPENDDO?“45岁以下的讲师人数为:,W?“45岁以下的副教授人数为:,CSETTALKONCANCEL例6.12统计职工表中,职称是”讲师”和副教授,年龄在45岁以下的教师人数.例6.3求N!=1×2×3×……×N(lzn)inputn=tons=1i=1dowhilei=ns=s*ii=i+1enddo?str(N,4)+!=+ltrim(str(s))循环结束i的值是多少?例6.14统计学生.DBF中1979年以后出生的人数,并显示他们的记录。(lz11)SETTALKOFFCLEARUSE学生N=0&&记数器通常初始化为0DOWHILE.NOT.EOF()IF出生日期={^1979-01-01}DISPN=N+1&&记数器ENDIFSKIP&&修改记录指针,漏写该句,程序死循环ENDDO?1979年以后出生的人数为+STR(N,2)+人USESETTALKONCANCEL例6.15完善例6.7,使程序能多次查找学生的记录,一旦输入N,立即结束查找。lz9USE学生x=YDOWHILEUPPER(x)=YACCEPT输入待查找学生的姓名:TONAMELOCATEFOR姓名=NAMEIF.NOT.EOF()DISPELSE?查无此人!ENDIFWAIT是否继续查找(Y/N)?TOxENDDO?结束查找USECANCEL例6.16键盘输入两个整数,求它们的最大公约数和最小公倍数。(lz12)INPUT输入一个整数:TOMINPUT输入另一个整数:TONM1=MN1=NT=MOD(M,N)DOWHILET#0M=NN=TT=MOD(M,N)ENDDO?最大公约数为:,STR(N,4)?最小公倍数为:,STR(M1*N1/N,4)CANCEL辗转相减求两个自然数m,n的最大公约数.lz12am=m-nmnn=n-mnmm,n为公约数m=n1.转跳语句(LOOP)在DOWHILE-ENDDO循环体内提供了一条短路语句,可以起到转跳作用语句格式:Dowhile条件表达式1…if条件表达式2LOOPendif…enddo语句功能:中断本次循环体的执行,跳回到DOWHILE的开始处,重复条件的判断.但要注意具有多重循环的程序中,只返回到与它本身所处的本层循环体相匹配的DOWHILE语句.Dowhile条件表达式1Dowhile条件表达式1…if条件表达式2LOOPendif…enddoloopEnddo【例6.17】工资小于160元的增加10元SETTALKOFFUSEDA2DOWHILE.NOT.EOF()if工资=160SKIPLOOPENDIFREPLACE工资WITH工资+10SKIPENDDO【例6.18】lz10求0~100之间奇数之和SETTALKOFFX=0Y=0DOWHILEX100X=X+1IFINT(X/2)=X/2LOOPELSEY=Y+XENDIFENDDO?0~100之间的奇数之和为:,YSETTALKONCANCEL2.出口语句(EXIT)如果在循环的中途,需要结束循环而转到本层循环的后继命令去执行,可以用出口命令语句格式:EXIT语句功能:终止DOWHILE-ENDDO的正常循环无条件地转到ENDDO的后继命令去执行多重循环,只能跳出一层【例6.19】计算1+2+3+…+100的和SETTALKOFFN=1S=0DOWHILE.T.IFN100EXITENDIFS=S+NN=N+1ENDDO?“S=”,S2.FOR-EndFor循环语句格式:FOR循环变量=初值TO终值[STEP步长]循环体ENDFOR循环变量超过终值?FOR循环变量=初值循环体[LOOP]