6.9 顺序结构程序设计顺序结构程序设计 一、顺序结构顺序结构:根据程序中语句的书写顺序依根据程序中语句的书写顺序依次逐条执行流程图如下:次逐条执行流程图如下: 语句1 语句2例例6.1查找某个学生信息查找某个学生信息(lz1)Open database 教学管理教学管理Use 学生学生Accept “请输入学生姓名请输入学生姓名:” to nameLocate for 姓名姓名=nameDisplayUsereturn分类:分类:简单分支语句简单分支语句(IF(IF--ENDIF) ENDIF) 选择分支语句选择分支语句(IF(IF--ELSEELSE--ENDIF)ENDIF)结构分支(结构分支(do case-do case-endcaseendcase6.10 6.10 分支结构分支结构 1 1.简单分支语句(.简单分支语句(Lz1Lz1))格式:格式:IF > < <语句块语句块> > ENDIF ENDIF IF .T. 条件条件? 语句块语句块ENDIF.F.单向单向IFIF语句流程图语句流程图功功能能::计计算算条条件件表表达达式式的的值值,,若若为为真真((.T..T.)),,则则执执行行语语句句块块中中的的语语句句;;若若为为假假((.F..F.)),,不不执执行行语语句句块块。
无无论论执执行行还还是是不不执执行行,,程程序序都都将转向将转向ENDIFENDIF下一条语句继续执行下一条语句继续执行说明:说明: ((1 1)) IF IF 和和 ENDIFENDIF必须配对出现,且分两行书必须配对出现,且分两行书写2 2)) 条件表达式可以是关系表达式或逻辑表条件表达式可以是关系表达式或逻辑表达式例例6.2 Open database 教学管理教学管理(lz2)Use 学生学生Accept “请输入学生姓名请输入学生姓名:” to nameLocate for 姓名姓名=nameIf found() DisplayEndif?“结束结束”Usereturn例例6.3Use zgda(lz3)Locate for 基本工资基本工资<650.00If .not. Eof() displayEndif2 2.选择分支语句.选择分支语句格式:格式:IF > < <语句块语句块A>A> ELSE ELSE < <语句块语句块B>B> ENDIF ENDIF条件?条件?语句块语句块1语句块语句块2IF .T. .F.ENDIF双向双向IFIF语句流程图:语句流程图:功能:条件成立,执行功能:条件成立,执行< <语句块语句块A>A>;;条件不成立,条件不成立,执行执行< <语句块语句块B>B>。
然后程序转向然后程序转向ENDIFENDIF下一条下一条语句继续执行语句继续执行说明:说明:((1 1)) 无论条件是否成立,在语句块无论条件是否成立,在语句块A A和和B B之间之间必执行一个,且只能执行一个必执行一个,且只能执行一个2 2)) 该语句可以解决一入口,二分支问题该语句可以解决一入口,二分支问题Input “x=” to xif x<>0 y=sin(x)+sqrt(x*x+1) else y=cos(x) - x^3+3* x endif?”x=”,x,”y=”,y(LZ4)Input "x=" to xif x=0 y=cos(x) - x^3+3* x endify=sin(x)+sqrt(x*x+1 )Input "x=" to xy=cos(x) - x^3+3* xif x<>0 y=sin(x)+sqrt(x*x+1) endif?x,y 例例6.37铁路托运行李,假设每张车票可按每公斤铁路托运行李,假设每张车票可按每公斤0.5元托运元托运50公斤以内的行李,如果超过公斤以内的行李,如果超过50公斤时,公斤时,超过的部分每公斤加价超过的部分每公斤加价0.8元。
计算公式和程序如下:元计算公式和程序如下:p143 X=0.5×W 当当W≤50公斤公斤 X=0.5×50+0.8×(w-50) 当当W>50公斤公斤 Set talk off Input “请输入行李的重量为:请输入行李的重量为:” to w If w<=50 x=0.5*w Else x=0.5*50+0.8*(w-50) Endif ?”行李的重量为:行李的重量为:”+str(w,6,2)+”公斤,其运费公斤,其运费为:为:”+str(x,6,2)+”元元”例例6.4 输入乘出租车的公里数,求乘车费(计费标准:输入乘出租车的公里数,求乘车费(计费标准:2.52.5公里以内公里以内6 6元;元;2.52.5公里以外,每超过公里以外,每超过1 1公里,增加公里,增加到到1.21.2元,要求四舍五入到元)元,要求四舍五入到元)lz5)(lz5)* PROG6.PRG* PROG6.PRGCLEARCLEARINPUT “INPUT “请输入公里数:请输入公里数:” ” TO XTO XIF X>2.5IF X>2.5 PAY=(X-2.5)*1.2+6 PAY=(X-2.5)*1.2+6ELSEELSE PAY=6 PAY=6ENDIFENDIF? "? "应付费应付费",ROUND(PAY,0), "",ROUND(PAY,0), "元元" "CANCELCANCEL例例6.5 6.5 在学生信息在学生信息.DBF.DBF中查找某人,若找到,显示该记录;中查找某人,若找到,显示该记录;若找不到,显示若找不到,显示““查无此人查无此人!”!”。
lz6)lz6)* PROG7.PRG* PROG7.PRGSET TALK OFFSET TALK OFFUSE USE 学生学生ACCEPT "ACCEPT "输入待查找人的姓名输入待查找人的姓名: " TO NAME: " TO NAMELOCATE FOR LOCATE FOR 姓名姓名=NAME=NAMEIF FOUND()IF FOUND() DISP DISP ELSEELSE ? " ? "查无此人查无此人! "! "ENDIFENDIFUSEUSESET TALK ONSET TALK ONCANCELCANCEL有学生成绩表:现要统计有学生成绩表:现要统计60分以下有多少人,分以下有多少人,60到到69分的有多少人,分的有多少人,70-89分的有多少人,分的有多少人,90分以上的有多少人分以上的有多少人3 3.. IFIF语句的嵌套语句的嵌套 IF-ELSE-ENDIFIF-ELSE-ENDIF语句中的句中的语句句块里可以包含任何合法的里可以包含任何合法的语句,句,也可以包含另一条也可以包含另一条IFIF语句,句,这就构成了就构成了IFIF语句的嵌套。
嵌套句的嵌套嵌套IFIF语句可以解决一入口,三句可以解决一入口,三分支分支甚至更多甚至更多分支分支的的问题嵌套形式可以是多种多形式可以是多种多样的,以下是其中的一种的,以下是其中的一种::IF 1> < <语句块语句块1>1>ELSEELSE IF < IF <条件表达式条件表达式2>2> < <语句语句块块2>2> ELSE ELSE < <语句块语句块3>3> ENDIF ENDIFENDIFENDIF语句块3.F.ELSE条件2语句块2条件1语句块1IF.T..F.ELSEIF.T.END IFIf 大学英语大学英语>=90 a=a+1Else If 大学英语大学英语>=70 b=b+1 else If 大学英语大学英语>=60 c=c+1 else d=d+1 endif Endifendif If 大学英语大学英语<60 d=d+1Else If 大学英语大学英语<70 b=b+1 else If 大学英语大学英语<90 c=c+1 else d=d+1 endif Endifendif If 大学英语大学英语>60 d=d+1 Else If 大学英语大学英语>70 c=c+1 else v If 大学英语大学英语>90v b=b+1v elsev a=a+1v endifv Endifvendif 这样可以不可以这样可以不可以?4 4.结构分支语句.结构分支语句格式:格式: DO CASEDO CASE CASE < CASE <条件表达式条件表达式1>1> < <语句块语句块1>1> CASE < CASE <条件表达式条件表达式2>2> < <语句块语句块2>2> …… …… CASE < CASE <条件表达式条件表达式n-1>n-1> < <语句块语句块n-1>n-1> [OTHERWISE [OTHERWISE < <语句块语句块n>]n>] ENDCASE ENDCASE条件1条件2条件n-1语句块n语句块1语句块n-1DO CASEENDCASEOTHERWISE语句块2.T..T..F..F..F..T. 功功能能::依依次次检检测测条条件件表表达达式式的的值值,,一一旦旦某某一一条条件件满满足足,,执执行行相相应应语语句句块块,,然然后后转转到到ENDCASEENDCASE下下一一条条语语句句。
如如果果所所有有条条件件表表达达式式的的值值都都为为假假,,倘倘若若无无OTHERWISEOTHERWISE子子句句,,则则不不执执行行任任何何语语句句,,直直接接转转到到ENDCASEENDCASE下下一一条条语语 句句 ;; 如如 若若 有有 OTHERWISEOTHERWISE子子 句句 ,, 则则 无无 条条 件件 执执 行行OTHERWISEOTHERWISE与与 ENDCASEENDCASE之之 间间 的的 语语 句句 块块 ,, 然然 后后 转转 到到ENDCASEENDCASE下一条语句下一条语句说明:说明:((1 1))如如果果有有两两个个或或两两个个以以上上的的条条件件为为真真,,则则只只执执行行第第一一个个条条件件表表达达式式为为真真的的CASECASE后后的的语语句句组组,,之之后后即即转转去去执执行行ENDCASEENDCASE之之后后的的语语句句而而不不会会再再去去判判断断下下一一个个CASECASE中的条件中的条件Do case case 大学英语大学英语>=90 a=a+1 case 大学英语大学英语>=70.and.大学英语大学英语<90 b=b+1 case 大学英语大学英语>=60 c=c+1 otherwise d=d+1 endcase 也可以这样做也可以这样做Do case case 大学英语大学英语<60 d=d+1 case 大学英语大学英语<70 c=c+1 case 大学英语大学英语<90 b=b+1 otherwise a=a+1 emdcase有学生这样写,大家分析一下?有学生这样写,大家分析一下?Do case case 大学英语大学英语>=60 a=a+1 case 大学英语大学英语>=70 b=b+1 case 大学英语大学英语>=90 c=c+1 otherwise d=d+1 emdcase结果是什么结果是什么??1 1.当型循环语句.当型循环语句格式:格式:DO WHILE > < <循环体循环体> > ENDDO ENDDO6.11 6.11 循环结构循环结构初始设置条件满足吗条件满足吗?循环体语句循环体语句[LOOP][EXIT].F..T.DO WHILEENDDO功功能能::当当< <条条件件表表达达式式> >的的值值为为真真((.T..T.))时时,,执执行行循循环环体体中中的的语语句句,,一一旦旦< <条条件件表表达达式式> >的的值值为为假假((.F..F.)),,程序跳出循环体,转到程序跳出循环体,转到ENDDOENDDO下一条语句继续执行。
下一条语句继续执行 说明:说明:((1 1))如如果果条条件件永永远远成成立立,,形形成成死死循循环环为为了了避避免免死死循循环环,,在在循循环环体体中中必必须须要要有有语语句句能能够够改改变变条条件件表表达达式式的值2 2))当当循循环环次次数数事事先先未未知知时时,,使使用用DO DO WHILE-ENDDOWHILE-ENDDO语语句3 3))循循环环体体中中,,可可以以出出现现LOOPLOOP语语句句遇遇到到LOOPLOOP语语句句时时,,程程序序立立即即转转向向DO DO WHILEWHILE循循环环起起始始语语句句,,而而不不再再执执行行LOOPLOOP下面的循环体语句下面的循环体语句((4 4)) 循循环环体体中中,,可可以以出出现现EXITEXIT语语句句遇遇到到EXITEXIT语语句句时时,,程程序序立立即即跳跳出出本本层层循循环环,,转转向向逻逻辑辑上上的的下下一一条条语语句句继继续续执执行行设置设置EXITEXIT语句,也是防止死循环的一种方法语句,也是防止死循环的一种方法DO WHILE DO WHILE 语句的流程图语句的流程图 例例6.11Clear LZ7use 学生成绩学生成绩store 0 to a,b,c,ddo while .not.eof() Do case case 大学英语大学英语>=90 a=a+1 case 大学英语大学英语>=70 b=b+1 case 大学英语大学英语>=60 c=c+1 otherwise d=d+1 endcase skipenddo?a,b,c,dSTORE 0 TO C, W (LZ8)(STORE 0 TO C, W (LZ8)(用用IFIF语句改写)语句改写)USE ZGDAUSE ZGDADO WHILE .NOT.EOF( )DO WHILE .NOT.EOF( ) DO CASE DO CASE CASE ( CASE (年龄年龄<45).AND.<45).AND.职称职称="="讲师讲师" " W=W+1 W=W+1 CASE ( CASE (年龄年龄<45) .AND.<45) .AND.职称职称="="副教授副教授" " C=C+1 C=C+1 ENDCASE ENDCASE SKIP SKIPENDDOENDDO? “45? “45岁以下的讲师人数为:岁以下的讲师人数为: " ",,W W? “45? “45岁以下的副教授人数为:岁以下的副教授人数为: " ",,C CSET TALK ONSET TALK ONCANCELCANCEL例例6.12统计职工表中统计职工表中,职称是职称是”讲师讲师”和副教授和副教授,年龄在年龄在45岁以下的教师人数岁以下的教师人数.例例6.3 求求N!!=1×2×3×……×N((lzn)input "n=" to ns=1i=1do while i<=n s=s*i i=i+1enddo?str(N,4)+"!="+ltrim(str(s))循环结束循环结束 i的值是多少?的值是多少?例例6.14 6.14 统统计计学学生生.DBF.DBF中中19791979年年以以后后出出生生的的人人数数, ,并并显显示示他他们们的记录。
的记录lz11lz11))SET TALK OFFSET TALK OFFCLEARCLEARUSE USE 学生学生N=0 && N=0 && 记数器通常初始化为记数器通常初始化为0 0DO WHILE .NOT. EOF()DO WHILE .NOT. EOF()IF IF 出生日期出生日期>={^1979-01-01}>={^1979-01-01}DISP DISP N=N+1 && N=N+1 && 记数器记数器ENDIFENDIFSKIP && SKIP && 修改记录指针,漏写该句,程序死循环修改记录指针,漏写该句,程序死循环ENDDOENDDO? "1979? "1979年以后出生的人数为年以后出生的人数为"+STR(N,2)+ ""+STR(N,2)+ "人人" "USEUSESET TALK ONSET TALK ONCANCELCANCEL例例6.15 6.15 完完善善例例6.76.7,,使使程程序序能能多多次次查查找找学学生生的的记记录录,,一一旦旦输输入入N N,,立即结束查找。
立即结束查找lz9lz9USE USE 学生学生x="Y"x="Y"DO WHILE UPPER(x)= "Y"DO WHILE UPPER(x)= "Y"ACCEPT "ACCEPT "输入待查找学生的姓名输入待查找学生的姓名: " TO NAME: " TO NAMELOCATE FOR LOCATE FOR 姓名姓名=NAME=NAMEIF .NOT. EOF()IF .NOT. EOF()DISP DISP ELSEELSE? "? "查无此人查无此人! "! "ENDIFENDIFWAIT "WAIT "是否继续查找是否继续查找(Y/N)? " TO x(Y/N)? " TO xENDDOENDDO? "? "结束查找结束查找" "USEUSE CANCEL CANCEL例例6.16 6.16 键键盘盘输输入入两两个个整整数数, ,求求它它们们的的最最大大公公约约数数和和最最小小公公倍倍数lz12)(lz12)INPUT "INPUT "输入一个整数输入一个整数::" TO M" TO MINPUT "INPUT "输入另一个整数:输入另一个整数:" TO N" TO NM1=MM1=MN1=NN1=NT=MOD(M,N)T=MOD(M,N)DO WHILE T#0DO WHILE T#0M=NM=NN=TN=TT=MOD(M,N)T=MOD(M,N)ENDDOENDDO? "? "最大公约数为最大公约数为: ",STR(N,4): ",STR(N,4)? "? "最小公倍数为最小公倍数为: ", STR(M1*N1/N,4): ", STR(M1*N1/N,4)CANCELCANCEL辗转相减求两个自然数m,n的最大公约数.lz12a m=m-n m>nn=n-m n>m m,n 为公约数为公约数 m=n1.1.转跳语句转跳语句(LOOP)(LOOP)在在DO WHILEDO WHILE--ENDDOENDDO循环体内提供了一条短路语句,可以起到循环体内提供了一条短路语句,可以起到转跳作用转跳作用语句格式:语句格式:Do while 1> … … if < if <条件表达式条件表达式2>2> LOOP LOOP endifendif … …enddoenddo语句功能:语句功能: 中断本次循环体的执行中断本次循环体的执行, ,跳回到跳回到DO WHILEDO WHILE的开始处,重复的开始处,重复条件的判断条件的判断. .但要注意具有多重循环的程序中但要注意具有多重循环的程序中, ,只返回到与它只返回到与它本身所处的本层循环体相匹配的本身所处的本层循环体相匹配的DO WHILEDO WHILE语句语句. .Do while 1> Do while < Do while <条件表达式条件表达式1>1> … … if < if <条件表达式条件表达式2>2> LOOP LOOP endifendif … … enddoenddo loop loopEnddo【【例例6.176.17】】工资小于工资小于160160元的增加元的增加1010元元SET TALK OFFSET TALK OFFUSE DA2USE DA2DO WHILE .NOT.EOF( )DO WHILE .NOT.EOF( ) if if 工资工资>=160 >=160 SKIP SKIP LOOP LOOP ENDIF ENDIFREPLACE REPLACE 工资工资 WITH WITH 工资+工资+1010SKIPSKIPENDDOENDDO【【例例6.186.18】】lz10lz10求求0 0~~100100之间奇数之和之间奇数之和 SET TALK OFFSET TALK OFF X=0 X=0 Y=0 Y=0 DO WHILE X<100 DO WHILE X<100 X=X+1 X=X+1 IF INT(X/2)=X/2 IF INT(X/2)=X/2 LOOP LOOP ELSE ELSE Y=Y+X Y=Y+X ENDIF ENDIF ENDDO ENDDO ? "0 ? "0~~100100之间的奇数之和为:之间的奇数之和为: ", Y", Y SET TALK ON SET TALK ON CANCEL CANCEL2.2.出口语句出口语句(EXIT)(EXIT)如果在循环的中途,需要结束循环而转到本层循如果在循环的中途,需要结束循环而转到本层循环的后继命令去执行,可以用出口命令环的后继命令去执行,可以用出口命令语句格式:语句格式:EXITEXIT语句功能:语句功能:终止终止DO WHILEDO WHILE--ENDDOENDDO的正常循环的正常循环无条件地转到无条件地转到ENDDOENDDO的后继命令去执行的后继命令去执行多重循环,只能跳出一层多重循环,只能跳出一层 【例【例6.196.19】】计算计算1 1++2 2++3 3++……++100100的和的和SET TALK OFFSET TALK OFFN N==1 1S S==0 0DO WHILE .T.DO WHILE .T. IF N>100 IF N>100 EXIT EXIT ENDIF ENDIFS=S+N S=S+N N=N+1N=N+1ENDDOENDDO? “S=”,S? “S=”,S2 2..FOR-FOR-EndForEndFor循环语句循环语句格格式式::FOR FOR < <循循环环变变量量>=<>=<初初值值> > TO TO < <终终值值> > [STEP <[STEP <步长步长>]>] < <循环体循环体> > ENDFOR ENDFOR 循环变量超过终值?FOR循环变量=初值循环体[LOOP][EXIT]循环变量+步长ENDFOR.T..F.记数型记数型循环语循环语句流程句流程图图功功能能::语语句句执执行行时时,,首首先先循循环环变变量量赋赋以以初初值值,,与与终终值值比比较较,,若若超超过过终终值值,,则则循循环环体体一一次次也也不不执执行行,,直直接接跳跳到到循循环环终终止止语语句句ENDFORENDFOR的的下下一一条条语语句句;;若若不不超超过过终终值值,,则则依依次次执执行行循循环环体体语语句句,,遇遇到到ENDFORENDFOR后后,,程程序序转转回回到到FORFOR循循环环初初始始语语句句。
然然后后循循环环变变量量加加上上步步长长,,再再判判断断是是否否超超过过终终值值,,只只要要不不超超过过终终值值就就执执行行循循环环体体一一旦旦超超过过终终值值,,程程序序退退出出循循环环体体,,继继续续执行执行ENDFORENDFOR的下一条语句的下一条语句说明:说明:((1 1))步步长长可可正正可可负负若若步步长长为为1 1,,可可以以省省略略STEPSTEP子句((2 2))计计数数型型循循环环语语句句用用于于循循环环次次数数事事先先已已知知的的场场合合循环次数可按下式来计算:循环次数可按下式来计算:INT(ABS((INT(ABS((终值终值- -初值初值)/)/步长步长))+1))+1((3 3))循循环环体体内内可可以以出出现现 LOOPLOOP和和EXITEXIT语语句句,,其其功功能能如如前所述4 4)循环结束语句一般用)循环结束语句一般用ENDFORENDFOR,,例例6.20 找出表中年龄最大的记录(找出表中年龄最大的记录(lz13lz13))SET TALK OFFSET TALK OFFUSE ZGDAUSE ZGDAMAX=MAX=年龄年龄J=RECCOUNT() J=RECCOUNT() 指表中所含的记录的总数指表中所含的记录的总数FOR I=2 TO JFOR I=2 TO JSKIPSKIPIF MAX] [FOR <>] [FOR <条件条件>]>] < <循环体循环体> > ENDSCAN ENDSCAN功功能能::对对打打开开的的数数据据表表,,在在规规定定的的范范围围内内,,对对符符合合条条件件的的记记录录逐逐条条进进行行循循环环体体语语句句规规定定的的操操作作。
每每执执行行一一次次,,指指针针下下移移,,直到文件尾为止直到文件尾为止说明:说明:((1 1))scanscan循循环环语语句句专专门门用用来来对对数数据据表表操操作作SCAN-ENDSCANSCAN-ENDSCAN语语句句有有自自动动修修改改指指针针和和判判断断是是否否到到达达文文件件尾尾的的功功能能因因此此,,用用SCAN-ENDSCANSCAN-ENDSCAN语语句句比比用用DO DO WHILE-ENDDOWHILE-ENDDO语语句句处处理理数数据据表表速速度度快,而且编程既方便又简洁快,而且编程既方便又简洁2 2))循循环环体体中中可可以以出出现现[LOOP][LOOP]和和[EXIT] [EXIT] 语语句句,,作作用用如如前前所所述 例例6.23 6.23 用用SCAN-ENDSCANSCAN-ENDSCAN语语句句统统计计XSDA.DBFXSDA.DBF中中19791979年年以以后后出出生生的学生人数的学生人数, ,并显示他们的记录并显示他们的记录 (试与例试与例6.146.14进行比较进行比较)lz14)lz14SET TALK OFFSET TALK OFFCLEARCLEARUSE USE 学生学生N=0 N=0 SCAN FOR SCAN FOR 出生日期出生日期>={^1979-01-01}>={^1979-01-01}DISPDISPN=N+1N=N+1ENDSCANENDSCAN? "1979? "1979年以后出生的人数为年以后出生的人数为"+STR(N,2)+ ""+STR(N,2)+ "人人" "USEUSESET TALK ONSET TALK ONCANCEL CANCEL 例例6.246.24在在教教学学管管理理.DBC.DBC中中有有数数据据库库表表学学生生成成绩绩.DBF.DBF,,计计算算学学生的总分,并按如下规定填写等级字段:生的总分,并按如下规定填写等级字段:lz15lz15总分总分>=250 >=250 为为““优秀优秀” ” 210≤210≤总分总分<249<249为为““良好良好””180≤180≤总分总分<209<209为为““一般一般” ” 总分总分<180<180为为““差差””OPEN DATABASE XJGLOPEN DATABASE XJGLUSE USE 学生成绩学生成绩LISTLISTREPL ALL REPL ALL 总分总分 WITH WITH 数学数学+ +大学英语大学英语+ +语文语文 SCAN SCAN DO CASEDO CASE CASE CASE 总分总分>=250>=250 REPL REPL 等级等级 WITH "WITH "优秀优秀" " CASE CASE 总总分分>=210 >=210 && && 不不必必写写成成::总总分分>=210 >=210 AND AND 总分总分<250<250 REPL REPL 等级等级 WITH "WITH "良好良好" " CASE CASE 总分总分>=180>=180 REPL REPL 等级等级 WITH "WITH "一般一般" " OTHERWISE OTHERWISE REPL REPL 等级等级 WITH "WITH "差差" " ENDCASE ENDCASE ENDSCAN ENDSCANLISTLISTCLOSE DATABASECLOSE DATABASECANCEL CANCEL USE 学生成绩学生成绩REPL ALL 总分总分 WITH 数学数学+大学英语大学英语+语文语文 go topdo while .not.eof()DO CASE CASE 总分总分>=250 REPL 等级等级 WITH "优秀优秀" CASE 总分总分>=210 && 不必写成:总分不必写成:总分>=210 AND 总分总分<250 REPL 等级等级 WITH "良好良好" CASE 总分总分>=180 REPL 等级等级 WITH "一般一般" OTHERWISE REPL 等级等级 WITH "差差" ENDCASE skip enddoLISTCANCEL 4 4..循环的嵌套循环的嵌套 如如果果单单层层循循环环里里的的循循环环体体中中又又包包含含另另一一层层循循环环,,即即循循环环内内套套循循环环,,就就构构成成了了二二重重循循环环。
同同理理,,还还有有三三重重循循环环或或更更多多重重循循环环三三种种形形式式的的循循环环可可以以互互相相嵌嵌套套,,但但既既然然嵌嵌套套,,必必须须是是完全嵌套,不能交叉嵌套完全嵌套,不能交叉嵌套Do while 1> 语句语句1…1… do while < do while <条件表达式条件表达式2>2> 语句语句2...2... enddoenddo 语句语句3..3..EnddoEnddo例例6.21 6.21 打印如图所示的图形打印如图所示的图形* * PROG21.PRGPROG21.PRGFOR I=1 TO 4 && FOR I=1 TO 4 && 打印打印4 4行行FOR J=1 TO 5 && FOR J=1 TO 5 && 每行打印每行打印5 5个字符个字符?? "*"?? "*"ENDFORENDFOR? ?ENDFORENDFOR显示结果如下显示结果如下: *****: ***** ***** ***** ***** ***** ***** *****例例6.22 6.22 打印图形打印图形* * PROG22.PRGPROG22.PRGFOR I=1 TO 5 && FOR I=1 TO 5 && 打印打印5 5行行FOR J=1 TO I && FOR J=1 TO I && 每行打印字符数与每行打印字符数与I I有关有关?? "*"?? "*"ENDFORENDFOR? ?ENDFORENDFOR运行结果如下运行结果如下: :* ************************ ***** 例例6.23 6.23 打印图形打印图形lz16lz16* PROG23.PRG* PROG23.PRGFOR I=5 TO 1 STEP –1 && FOR I=5 TO 1 STEP –1 && 打印打印5 5行行,STEP,STEP用负值用负值FOR J=1 TO IFOR J=1 TO I?? "*"?? "*"ENDFORENDFOR? ?ENDFORENDFOR? ?CANCELCANCEL结果如下结果如下: *****: ***** **** **** *** *** ** ** * * 例例6.24 6.24 打印图形打印图形lz17lz17* PROG24.PRG* PROG24.PRGFOR I=1 TO 5 && FOR I=1 TO 5 && 打印打印5 5行行??SPACE(5-I) ??SPACE(5-I) FOR J=1 TO 2*I-1 && FOR J=1 TO 2*I-1 && 随随I I改变改变, ,打印打印1,3,5,7,91,3,5,7,9列列?? "*"?? "*"ENDFORENDFOR? ?ENDFORENDFOR结果如下结果如下: *: * *** *** ***** ***** ******* ******* ********* ********* clearFOR I=1 TO 5? SPACE(20-i) FOR J=1 TO i*2-1?? "*"ENDFORENDFOR例例6.25 6.25 打印图形打印图形* * PROG25.PRGPROG25.PRGFOR I=5 TO 1 STEP –1 && FOR I=5 TO 1 STEP –1 && 打印倒三角打印倒三角,STEP,STEP为负值为负值? SPACE(5-I) && ? SPACE(5-I) && 换行效果与例换行效果与例6.246.24相同相同FOR J=1 TO 2*I-1FOR J=1 TO 2*I-1?? "*"?? "*"ENDFORENDFORENDFORENDFOR结果如下结果如下: *********: ********* ******* ******* ***** ***** *** *** * * clearFOR I=1 TO 5? SPACE(20+i) FOR J=1 TO (5-i)*2+1?? "*"ENDFORENDFORvclearvinput "n=" to nvFOR I=1 TO nv? SPACE(50+I) vFOR J=1 TO 2*n-2*i+1v?? "*"vENDFORvENDFOR例例6.26 6.26 打印图形打印图形* * PROG26.PRGPROG26.PRGFOR I=1 TO 5 && FOR I=1 TO 5 && 打印前打印前5 5行行? SPACE(10-I) && ? SPACE(10-I) && 使图形向右移使图形向右移5 5列列FOR J=1 TO 2*I-1 && FOR J=1 TO 2*I-1 && 打印呈三角形打印呈三角形??CHR(64+I) && ??CHR(64+I) && 打印大写字母打印大写字母ENDFORENDFORENDFORENDFORFOR I=4 TO 1 STEP –1 && FOR I=4 TO 1 STEP –1 && 打印后打印后4 4行行?SPACE(10-I) && ?SPACE(10-I) && 先换行先换行, ,再输出再输出FOR J=1 TO 2*I-1FOR J=1 TO 2*I-1??CHR(64+I)??CHR(64+I)ENDFORENDFORENDFORENDFOR结果如下结果如下: : A A BBB BBB CCCCC CCCCC DDDDDDD DDDDDDD EEEEEEEEE EEEEEEEEE DDDDDDD DDDDDDD CCCCC CCCCC BBB BBB A A例例6.27 6.27 打印九九乘法表打印九九乘法表lz18 lz9lz18 lz9??SPACE(4)+ "*" && ??SPACE(4)+ "*" && 输出第一行输出第一行FOR I=1 TO 9FOR I=1 TO 9??STR(I,5)??STR(I,5)ENDFORENDFOR? ?FOR I=1 TO 50 && FOR I=1 TO 50 && 输出一条由输出一条由5050个个““-”-”组成的直线组成的直线??“-”??“-”ENDFORENDFOR? ?FOR A=1 TO 9FOR A=1 TO 9??STR(A,5) ??STR(A,5) FOR B=1 TO AFOR B=1 TO A??STR(A*B,5)??STR(A*B,5)ENDFORENDFOR? ?ENDFORENDFORCANCEL CANCEL 数组数组一、数组一、数组: :名字相同、用下标区分的内存变量称为数组。
名字相同、用下标区分的内存变量称为数组二、数组的定义二、数组的定义 数组名的取法和一般的变量名取法相同,数组名数组名的取法和一般的变量名取法相同,数组名和简单变量不能同名和简单变量不能同名. .定义数组命令:定义数组命令: DIMENSION 1>[[,<,<数值表达式数值表达式2>2>]]) ) [[,<,<数组名数组名>(<>(<数值表达式数值表达式1>1>…] ]命令功能:定义一个或多个内存变量数组命令功能:定义一个或多个内存变量数组说明:说明:最多可有最多可有36003600个元素,显示内存时只算一个变量个元素,显示内存时只算一个变量数组下标起始值是数组下标起始值是1 1数组元素隐含的逻辑值为数组元素隐含的逻辑值为“假假”****二二维维数数组组,,可可用用一一维维下下标标来来存存取取这这是是由由于于在在内内存存中中,,二二维维数数组组元元素素是是按按行行列列次次序序排列排列它它们们每每个个元元素素都都可可看看作作单单独独一一个个内内存存变变量量使使用,用,主要有以下特点:主要有以下特点:(1)(1)数组元素的类型,由所赋的值来决定数组元素的类型,由所赋的值来决定(2)(2)数组变量可以不带下标使用数组变量可以不带下标使用在赋值语句的右边,表示该数组第一个元素在赋值语句的右边,表示该数组第一个元素在赋值语句的左边,表示该数组所有元素在赋值语句的左边,表示该数组所有元素(3)(3)数组和数据表之间可相互转换数组和数据表之间可相互转换即数据表中数据可以转换为数组数据即数据表中数据可以转换为数组数据数组数据也可以转换为数据表中的数据数组数据也可以转换为数据表中的数据数组实例数组实例§DIMENSION a(2,,3)§? A4§? A(2,1)§? A6§? A(2,3) A(1,1) A(1,2) A(1,3) 1 2 3 A(2,1) A(2,2) A(2,3) 4 5 6数组实例数组实例DIMENSION a(2,3)v二、数组的赋值二、数组的赋值v格式:格式: STORE STORE 〈〈表达式表达式〉〉 TO TO 〈〈数组名数组名〉〉 〈〈数组名数组名〉〉= =〈〈表达式表达式〉〉v命令功能:命令功能:将表达式的值赋给数组变量将表达式的值赋给数组变量上述两个命令是完全等价的上述两个命令是完全等价的v给数组赋值还可用给数组赋值还可用ACCEPTACCEPT、、INPUTINPUT、、WAITWAIT语句语句vDime s(3,5)lz23vFor i= 1 to 3v For j=1 to 5v Input “第”+str(I,1)+”行第”+str(j,1)+”个元素” to s(I,j)vEndforvEndforvFor i= 1 to 3v For j=1 to 5v??s(I,j)vEndforv?vEndforvclearvdime a(10)vfor i= 1 to 10v a(i)=int(rand()*20)+1v ??a(i)v endforvmax=a(1)vimax=1vfor i=2 to 10v if a(i)>maxv max=a(i)v imax=iv endifvendforv?max,imax产生产生10个个1-20之间的随机数之间的随机数,找找出其中最大的数出其中最大的数lz242468101357997531108642交换前交换前交换后交换后For i=1 to int(10/2) T=a(i) A(i)=a(10-i+1) A(10-i+1)=tEndforFor i=1 to 10??a(i)Endforlz25表与数组之间交换数据表与数组之间交换数据1.当前记录复制到数组当前记录复制到数组命令格式命令格式:Scatter to <数组名数组名> [fields<字段名表字段名表>]将表中当前记录复制到指定的数组将表中当前记录复制到指定的数组.在复制时在复制时,第一个字段值传送给第一个数组元素第一个字段值传送给第一个数组元素,第二个字段值第二个字段值传给第二个数组元素传给第二个数组元素,依次类推依次类推.如果没有数组如果没有数组 ,则自动创建则自动创建数组数组,如果已创建的数组元素个数比字段个数多如果已创建的数组元素个数比字段个数多,则多余的数则多余的数组元素保持原值组元素保持原值;如果已创建的数组元素个数比字段个数少如果已创建的数组元素个数比字段个数少,则自动扩展数组则自动扩展数组,使得数组元素个数与字段个数相等使得数组元素个数与字段个数相等.2.数组内容复制到当前记录数组内容复制到当前记录命令格式命令格式:Gather from <数组名数组名> [fields <字段名表字段名表>]将数组中的数据复制到当前记录将数组中的数据复制到当前记录.v第一个数组元素复制到第一个字段第一个数组元素复制到第一个字段,第二个数组元素复制到第二个数组元素复制到第二个字段第二个字段,依次类推依次类推,各个数组元素与对应字段的数据类型各个数组元素与对应字段的数据类型必须一致必须一致.如果数组元素个数比字段个数少如果数组元素个数比字段个数少,多出的字段保持多出的字段保持原值原值,如果数组元素个数比字段个数多如果数组元素个数比字段个数多,多出的数组元素不复多出的数组元素不复制制.v两条记录换位置两条记录换位置vuse 学生学生lz20vlistvdimension a(1),b(1)vx="Y"vdo while upper(x)="Y"v input "第一条记录第一条记录" to mv input "第二条记录第二条记录" to n v go mv v scatter to av go nv scatter to bv gather from av go mv gather from bv wait "继续吗(继续吗(Y/N?)?)" to xv enddov v例:现有数据库例:现有数据库DD.DBF,其结构如下:订单号其结构如下:订单号 N((3,,0),),客户号客户号 C((3),),签单日期签单日期 D,金额金额 N((6,,2)。
数据库数据库TJ2.DBF 结构如下:月份结构如下:月份 N((2,,0),),数量数量 N((2,,0),),总金额总金额 N((8,,2))v 编程序统计出各个月份所签订单的数量及其总金额,并将结编程序统计出各个月份所签订单的数量及其总金额,并将结果按月份的升序放在库文件果按月份的升序放在库文件TJ2.DBFvf5)vset talk offvdime a(12,2) va=0vuse ddvdo while .not. eof()v a(month(签单日期签单日期),1)=a(month(签单日期签单日期),1)+1v a(month(签单日期签单日期),2)=a(month(签单日期签单日期),2)+金额金额v skipvenddovi=1vuse tj1vdo while i<=12v if a(i,1)<>0v appe blankv repl 月份 with i,数量 with a(i,1),金额 with a(i,2)v endifv i=i+1venddovlistvsort on 金额 to tj2vuse tj2vlistv现有数据库现有数据库学生成绩学生成绩.dbf,,有如下结构:有如下结构:lz21学号学号(c,8),,姓名姓名(c,8),,大学英语大学英语(n,4),,语文语文(n,4),,数学数学(n,4)。
编程序统计出每编程序统计出每10分间隔的三门功课的人数,并以分间隔的三门功课的人数,并以下列形式显示:下列形式显示:分数段分数段 大学英语人数大学英语人数 语文人数语文人数 数学人数数学人数 0—9 ** ** **10—19 ** ** **20—29 ** ** ** …..90—100 ** ** **(vf11)vuse 学生成绩学生成绩vdime s(10,3)vs=0vdo while .not.eof()s(int(大学英语大学英语/10)+1,1)= s(int(大学英语大学英语/10)+1,1)+1v s(int(语文语文/10)+1,2)= s(int(语文语文/10)+1,2)+1v s(int(数学数学/10)+1,3)= s(int(数学数学/10)+1,3)+1v skipvenddovclearv?"分数段分数段 英语人数英语人数 语文人数语文人数 数学人数数学人数"vi=1vdo while i<=10v ?str((i-1)*10,2)+"--"+str(i*10-1,3)v j=1v do while j<=3v ??s(i,j)v j=j+1v enddov i=i+1v enddov retu例例6.28 6.28 求求100~200100~200之间的所有素数之和。
之间的所有素数之和SUM=0SUM=0FOR I=101 TO 199 STEP 2 && FOR I=101 TO 199 STEP 2 && 除了除了2 2以外,所有素数都是奇数以外,所有素数都是奇数N=SQRT(I)N=SQRT(I)FOR J=2 TO NFOR J=2 TO N IF MOD(I,J)=0 IF MOD(I,J)=0 EXIT && EXIT && 一俟除尽,退出本层循环一俟除尽,退出本层循环 ENDIFENDIFENDFORENDFORIF J>N && IF J>N && 意味着每个数都除不尽意味着每个数都除不尽 SUM=SUM+ISUM=SUM+IENDIFENDIFENDFORENDFOR? "100~200? "100~200之间的所有素数之和为之间的所有素数之和为: ",SUM: ",SUMCANCEL CANCEL 例例6.29 6.29 求出求出100~999100~999之间的所有水仙花数之间的所有水仙花数 * PROG29.PRGPROG29.PRGFOR I=1 TO 9FOR I=1 TO 9 FOR J=0 TO 9 FOR J=0 TO 9 FOR K=0 TO 9 FOR K=0 TO 9 S=100*I+10*J+K S=100*I+10*J+K IF I^3+J^3+K^3=S IF I^3+J^3+K^3=S ?S ?S ENDIF ENDIF NEXT NEXT NEXT NEXTNEXTNEXTCANCELCANCEL结果有四个数,分别为结果有四个数,分别为153153,,370370,,371371和和407407。
例例6.30 6.30 求求FibonacciFibonacci数数列列((1 1,,1 1,,2 2,,3 3,,5 5,,8 8,,13……13……))的的第第8,15,198,15,19项的值lz22lz22分分析析::FibonacciFibonacci数数列列的的特特点点是是第第一一项项是是1 1,,第第二二项项是是1 1,,从从第第三三项项开开始始,,每每一一项项等等于于前前两两项项之之和和利利用用数数组组是是解解决决这这类类问问题题的的最最佳佳方方法法我我们们将将数数列列中中的的前前若若干干项项依依次次装装入入数数组组元元素素中,需要输出哪一项就输出哪个数组元素中,需要输出哪一项就输出哪个数组元素 * PROG30.PRGPROG30.PRGDIMENSION F(19)DIMENSION F(19)F(1)=1F(1)=1F(2)=1F(2)=1FOR I=3 TO 19FOR I=3 TO 19F(I)=F(I-2)+F(I-1)F(I)=F(I-2)+F(I-1)ENDFORENDFOR?F(8),F(15),F(19)?F(8),F(15),F(19) CANCEL CANCEL 例例6.31 6.31 产生产生1010个个1~201~20之间的随机整数之间的随机整数, ,并将它们按升序排序后输出。
并将它们按升序排序后输出DIMENSION A(10)DIMENSION A(10)RAND(-1) && RAND(-1) && 将系统时间作为首个随机函数的籽值将系统时间作为首个随机函数的籽值FOR I=1 TO 10FOR I=1 TO 10A(I)=INT(RAND()*20)+1 && A(I)=INT(RAND()*20)+1 && 产生产生1~201~20之间的随机数之间的随机数??STR(A(I),5)??STR(A(I),5)ENDFORENDFOR? && ? && 以上语句的功能是建立数组以上语句的功能是建立数组FOR I=1 TO 9 && FOR I=1 TO 9 && 气泡法排序气泡法排序FOR J=I+1 TO 10FOR J=I+1 TO 10IF A(I)>A(J) && IF A(I)>A(J) && 按升序排序按升序排序, ,若改为若改为A(I)
主主程程序序能能调调用用子子程程序序,,但但子子程程序序不不能能调调用用主主程程序序子子程程序序也也可可以以调调用用其其他他子子程程序序,,构构成成子子程程序序的的嵌嵌套套调调用用在在程程序序设设计计中中,,有有些些功功能能或或计计算算需需要要在在不不同同场场合合重重复复进进行行多多次次,,这这时时往往往往将将该该功功能能或或计计算算编编写写成成一一个个独独立立的的子子程程序序,,需需要要时时调调用用它它,,程程序序既既简简洁洁又又节节省省存存储储空空间间事事实实上上,,不不但但重重复复执执行行的的程程序序段段可可以以作作为为子子程程序序独独立立出出去去,,即即使使只只执执行行一一次次的的程程序序段段也也可可以以编编成成子子程程序序每每个个子子程程序序完完成成一一种种功功能能或或计计算算,,主主程程序序的的任务就是输入数据、调用子程序和输出结果这三项任务就是输入数据、调用子程序和输出结果这三项 二、子程序的建立二、子程序的建立 子子程程序序的的建建立立和和主主程程序序一一样样, ,也也是是modify modify command command 扩扩展展名名为为prgprg. .但但在在子子程程序序中中应应有有一一条条返返回回语语句句.Return .Return (to (to master) master) 子子程程序序和和主主程程序序可可以以分分别别放放在在两两个个文文件件内内; ;也也可可以以放放在在一一个文件内个文件内, ,此时此时, ,在子程序的开头要有在子程序的开头要有Procedure Procedure 6.12 6.12 子程序子程序 三、子程序调用语句三、子程序调用语句调用语句格式:调用语句格式:DO [WITH <> [WITH <实际参数表实际参数表>]>]说说明明::WITH WITH < <实实际际参参表表数数> >是是可可选选项项,,用用于于主主程程序序与与子子程程序序之之间间的的参参数数传传递递。
实实参参表表中中的的各各项项可可以以是是常常量量,,变变量量或或一一般般表表达式,互相用逗号分开达式,互相用逗号分开四、子程序返回语句四、子程序返回语句返回语句格式:返回语句格式:RETURN [TO MASTERRETURN [TO MASTER]]说说明明::执执行行子子程程序序时时,,遇遇到到RETURN RETURN 命命令令,,就就返返回回到到上上一一级级子子程程序序或或主主程程序序中中的的子子程程序序调调用用命命令令的的下下一一条条语语句句继继续续执执行行遇遇到到RETURN RETURN MASTERMASTER命命令令,,就就径径直直返返回回主主程程序序通通常常子子程程序序的的最最后后一一条条语语句句是是RETURNRETURN如如果果缺缺省省RETURNRETURN,,程程序序执执行行到到最最后,自动执行后,自动执行RETURNRETURN语句功能,返回主调程序语句功能,返回主调程序 下图下图6-376-37是子程序嵌套调用时的程序执行过程示意图是子程序嵌套调用时的程序执行过程示意图………………DO SUB1………………CANCEL…………DO SUB2…………DO SUB3……RETURN………………RETURN …… …… ……RETURN TO MASTERSub1.prgSub2.prgsub3Main.prg例例6.32 6.32 求求3!+5!+8!3!+5!+8!* lz26.PRG* lz26.PRG((P P、、N N必须在主程序中定义必须在主程序中定义STORE 0 TO SUM,PSTORE 0 TO SUM,PN=3N=3DO JC && DO JC && 调用子程序调用子程序JC.PRGJC.PRGSUM=SUM+P && SumSUM=SUM+P && Sum的值是的值是3!3!N=5N=5DO JC && DO JC && 再次调用子程序再次调用子程序JC.PRGJC.PRGSUM=SUM+PSUM=SUM+PN=8N=8DO JC && DO JC && 第三次调用子程序第三次调用子程序JC.PRGJC.PRGSUM=SUM+PSUM=SUM+P? "3!+5!+8!= ",SUM? "3!+5!+8!= ",SUMCANCELCANCELProcedure jcP=1FOR I=1 TO NP=P*IENDFORRETURNJC.PRG(JC.PRG(子程序子程序) )P=1P=1FOR I=1 TO NFOR I=1 TO NP=P*IP=P*IENDFORENDFORRETURNRETURN注注::主主程程序序负负责责三三次次调调用用子子程程序序以以及及计计算算总总和和,,子子程程序序负负责责计计算算N N!!。
主主程程序序每每次次调调用用子子程程序序时时都都给给定定N N的的值值,,子子程程序序对对给给定定的的N N值值求求N N!!,,结结果果存存入入变变量量S S主主程程序序执执行行时时,,遇遇到到DO DO JCJC语语句句,,程程序序转转入入子子程程序序执执行行子子程程序序语语句句时时,,遇遇到到RETURNRETURN语句,程序又返回到主程序语句,程序又返回到主程序DO JCDO JC的下一条语句继续执行的下一条语句继续执行v例:例:main.prgv wait “下面调用子程序下面调用子程序”v do sub1v“00000”v wait “又返回到主程序又返回到主程序”v retuv sub1.prgv ?’1111111’v do sub2v?’1111111’vRetuvsub2.prgv?’2222222’v retuv注意:注意:sub11 sub2必须是单独的文件必须是单独的文件v例:例:main.prgv wait “下面调用子程序下面调用子程序”v do sub1v wait “又返回到主程序又返回到主程序”v retuv procedure sub1v ?’1111111’v do sub2v?’1111111’vRetuvProcedure sub2v?’2222222’v retuv注意:主程序和子程序可以放在一个文件内。
注意:主程序和子程序可以放在一个文件内v若把sub2.prg中的retu 改成retu to master,结果是什么?v五、子程序的参数传递五、子程序的参数传递格式一:格式一:do <子程序名子程序名> with <实参变量实参变量1>,,<实参实参变量变量2>,…格式二:格式二:<子程序名子程序名> (<实参实参1>,<实参实参2>…)子程序中格式:子程序中格式: parameters <形参变量形参变量1>,<形参变量形参变量2>,… <过程名过程名> (<形参变量形参变量1>,<形参变量形参变量2>,…)v v注意:注意:①①parameters 必须是被调用程序的必须是被调用程序的v第一条语句,而且参数的个数和数据类型必须和被第一条语句,而且参数的个数和数据类型必须和被调用语句的参数相一致调用语句的参数相一致v ②②调用语句中参数可以是常量、已赋值的变量、或调用语句中参数可以是常量、已赋值的变量、或表达式v③③在调用时参数传递关系如下:在调用时参数传递关系如下:(1)按值传递方式:实参的值只能传递给形参变量,而形参变按值传递方式:实参的值只能传递给形参变量,而形参变量的值不会传递给实参变量,当形参变量的值改变时,不会量的值不会传递给实参变量,当形参变量的值改变时,不会影响实参变量的值,实参和形参占用不同的内存空间。
影响实参变量的值,实参和形参占用不同的内存空间 过程名过程名 (<实参实参1>,<实参实参2>,…) 括号不能省括号不能省 过程名过程名 (<形参形参1>,<形参形参2>,…) parameters (<形参形参1>,<形参形参2>,…)(2)引用传递方式:传递实参变量的内存地址,实参变量和形引用传递方式:传递实参变量的内存地址,实参变量和形参变量实际上为同一个内存单元,尽管变量名可以不同,参变量实际上为同一个内存单元,尽管变量名可以不同, 如如果形参变量的值改变,那么实参变量的值也会跟着改变引果形参变量的值改变,那么实参变量的值也会跟着改变引用传递属于双向传递用传递属于双向传递 do 过程名过程名 with <实参实参1>,<实参实参2>,… 过程名过程名 (<形参形参1>,<形参形参2>,…) parameters (<形参形参1>,<形参形参2>,…)v(1)如果某个实参变量用一对圆括号括起来如果某个实参变量用一对圆括号括起来,不管采用哪种调不管采用哪种调用格式用格式,这个实参变量总是按值传递这个实参变量总是按值传递.v(2)实参是表达式或者常量时是按值传递。
实参是表达式或者常量时是按值传递v(3)在两种调用格式在两种调用格式 下下,对应的实参变量和形参变量的名字可对应的实参变量和形参变量的名字可以相同以相同,也可以不相同也可以不相同.v 例:例:set talk off(vf12)v a=10v b=15v do swap with a,bv?”主程序主程序:“,a,b vswap.prgv parameters x,yv?’子程序子程序’ ,x,yv t=xv x=yv y=tv retu vclearv a=10v b=20v Swap1(a,b)v ? "A1=",a,"B1=",bv a=10v b=20v do Swap1 with a,b v ? "A1=",a,"B1=",bv returnv proc Swap1(x,y)v t=xv x=yv y=tv retu例:编程求例:编程求1!!+2!!+…+N!v *jch.prg v para s,tv s=1v i=1v do while i<=tvs=s*Iv i=i+1v enddovreturnv *vf13.prgvset talk offv input “n=“ to n v w=0v p=0v j=1v do while j<=nv do jch with p,jv w=w+pv j=j+1v enddov?”w=” ,wvSTORE 100 TO X,Y lz27vPP(X,Y)v??"按值传递方式:",x,yvdo pp with (x),(y)v??"按值传递方式:",x,yvdo pp with x+5,y+5v??"按值传递方式:",x,yvdo pp with x ,y v??"引用传递方式:",x,yvdo pp with x,(y)v??"两种传递方式:",x,yproc pp(x,y)x=x+100y=y+50?"计算结果:计算结果:",x,yendprocvproc pp(x,y)vx=x+100vy=y+50v?"计算结果:",x,yvendproc内内存存变变量量在在程程序序中中起起作作用用的的范范围围称称为为内内存存变变量量的的作作用用域域。
根根据据作作用用域域的的不不同,内存变量分为三类:局部变量、私有变量和全局变量同,内存变量分为三类:局部变量、私有变量和全局变量1 1)局部变量(本地变量))局部变量(本地变量)格式:格式:LOCAL >功功能能::将将< <内内存存变变量量表表> >中中的的变变量量定定义义为为局局部部变变量量,,其其作作用用域域仅仅在在本本模模块块中中,,不不能能在在上上层层或或下下层层模模块块中中使使用用在在物物理理上上,,本本地地变变量量一一经经定定义义,,就就临临时时分分配配了了存存储储单单元元;;一一旦旦离离开开了了本本模模块块,,局局部部变变量量所所占占的的存存储储单单元元被被释释放放,,局局部变量变成无定义,从而不能再被引用部变量变成无定义,从而不能再被引用说明:说明:① ① LOCALLOCAL命令与命令与LOCATELOCATE命令前四个字符相同,因此不可以缩写为命令前四个字符相同,因此不可以缩写为LOCALOCA② LOCAL② LOCAL命令可以定义局部内存变量和局部数组,且它们的初值皆为命令可以定义局部内存变量和局部数组,且它们的初值皆为.F..F.例如:例如:LOCAL A,B,C(4) && LOCAL A,B,C(4) && 不必再用不必再用DIMENSIONDIMENSION语句定义语句定义C C数组数组?A,B,C(2)?A,B,C(2)结果为结果为 .F. .F. .F..F. .F. .F.3.内存变量的作用域.内存变量的作用域((2 2))私有变量私有变量格式:格式:PRIVATE >功功能能::将将< <内内存存变变量量表表> >中中的的变变量量定定义义为为私私有有变变量量,,其其作作用用域域在本模块及下属模块中。
在本模块及下属模块中说明:说明:① ① PRIVATEPRIVATE命命令令可可以以定定义义私私有有内内存存变变量量和和私私有有数数组组,,且且它它们们的初值皆为的初值皆为.F..F.② ② 系系统统默默认认,,凡凡在在程程序序中中没没作作任任何何说说明明的的变变量量均均为为私私有有变变量量它在本程序及其被调子程序中有效它在本程序及其被调子程序中有效③ ③ 一一般般情情况况下下,,私私有有变变量量不不必必用用PRIVATEPRIVATE命命令令作作显显式式说说明明当当被被调调子子程程序序与与主主调调程程序序中中有有同同名名变变量量时时,,可可在在被被调调子子程程序序中中对对该该变变量量作作显显式式说说明明,,使使主主调调程程序序中中的的同同名名变变量量在在被被调调子子程程序序中中暂暂时时无无效效返返回回主主调调程程序序后后,,主主调调程程序序中中的的同同名名变变量量原原来来的的值值仍仍然然保保留留,,且且变变量量有有效效,,而而被被调调子子程程序序中中的的变变量量变变成成无无效效,,所所占占存存储储单单元元也也被被释释放放另另外外,,在在多多人人开开发发程程序序时时为为防防止止主主程程序序与与各各子子程程序序之之间间因因变变量量同同名名而而互互相相影影响响,,可可在在各各自自开开发发的的子子程程序序中中定定义义私私有有变变量量,,以以屏屏蔽蔽主主调调程程序序中中的的同同名变量。
名变量((3 3)全局变量(公共变量))全局变量(公共变量)格式:格式:PUBLIC >功功能能::将将< <内内存存变变量量表表> >中中的的变变量量定定义义为为全全局局变变量量,,其其作作用用域域涵盖所有程序涵盖所有程序说明:说明:① ① PUBLICPUBLIC命命令令可可以以定定义义全全局局内内存存变变量量和和全全局局数数组组,,且且初初值值皆皆为为.F..F.② ② 在在命命令令窗窗口口中中建建立立的的变变量量和和数数组组均均为为全全局局变变量量和和全全局局数数组组,,但这些全局变量和全局数组不能在程序中引用但这些全局变量和全局数组不能在程序中引用③ ③ 用用PUBLICPUBLIC定定义义的的全全局局变变量量和和数数组组在在整整个个程程序序运运行行过过程程中中始始终终有有效效,,始始终终占占有有存存储储单单元元即即使使程程序序运运行行结结束束,,系系统统也也不不会会自自动动释释放放全全局局变变量量删删除除全全局局变变量量只只能能用用RELEASE RELEASE 或或CLEAR ALLCLEAR ALL等命令④ ④ 若同一模块中有同名的各种变量,则优先次序为:若同一模块中有同名的各种变量,则优先次序为:本地变量本地变量 私有变量私有变量 全局变量全局变量 v求求n到到m的和 的和 vclearlz29vInput “m=” to mvInput “n=“ to nvDo sum1v?”M+N的值为:的值为:”,svProcedure sum1vS=0vFor i=n to mv s=s+IvEndforv?”中间结果:中间结果:”,svReturnS是在子程序中开辟的变量,是在子程序中开辟的变量,有效范围仅在子程序,返回有效范围仅在子程序,返回到主程序时,S已经从内存到主程序时,S已经从内存中消失。
中消失v(4)同名变量被隐藏(4)同名变量被隐藏v某级程序中使用的某级程序中使用的 局部变量,有可能和上级程序中的局部变局部变量,有可能和上级程序中的局部变量同名,为了避免混淆,可在子程序中用量同名,为了避免混淆,可在子程序中用private 命令定义命令定义本级程序专用的局部变量用本级程序专用的局部变量用private命令定义的变量,能把命令定义的变量,能把上级同名的变量暂时隐藏起来,彼此互不影响,子程序运行上级同名的变量暂时隐藏起来,彼此互不影响,子程序运行结束后,在本级程序建立的同名变量即被清除,而被隐藏的结束后,在本级程序建立的同名变量即被清除,而被隐藏的上级程序中的同名变量即被恢复出来,而且保留原值不变上级程序中的同名变量即被恢复出来,而且保留原值不变v命令格式:命令格式:private <内存变量表内存变量表>v例:set talk offv a=1v b=2v do sub v ?”主程序:”,a,bv retuv proc subv private bv a=100v b=200v?”子程序:”,a,bv retuvset talk offv public aav aa=10.2v bb=23v do fx25 with bbv ?aa,bbv retuv fx25.prgv para ccv private aav aa=20.3v cc=aa*2vRetuv set talk offv public a1,b1v store 1 to a1,b1v c1=10v do s1 with a1+b1,c1,a1v ?a1,b1,c1v retuv proc s1v para x1,x2,x3vx2=x1+x3v c1=x2+x3v b1=b1+1v private b1v b1=c1*x2v return1 1.内部过程.内部过程定义格式:定义格式:PROCEDURE >[PARAMETERS |LPARAMETER <[PARAMETERS |LPARAMETER <形式参数表形式参数表>]>]< <语句序列语句序列> >[RETURN [<[RETURN [<表达式表达式>]]>]][ENDPROC][ENDPROC]调用语句格式:调用语句格式:DO [WITH <> [WITH <实际参数表实际参数表>]>]说明:说明:((1 1))内内部部过过程程是是作作为为程程序序中中的的一一个个独独立立单单位位出出现现的的。
它它可可以以完完成成某某种种操操作或某种运算,通常安排在本程序的后面,供本程序调用作或某种运算,通常安排在本程序的后面,供本程序调用2 2))若若定定义义中中有有PARAMETERS PARAMETERS |LPARAMETER |LPARAMETER < <形形式式参参数数表表> >,,称称为为有有参参过过程程,,否否则则称称为为无无参参过过程程有有参参过过程程的的PARAMETERPARAMETER命命令令必必须须是是第第一一条条可可执执行行命命令令,,其其形形参参((也也叫叫虚虚参参))最最多多2727个个为为了了使使过过程程的的功功能能更更强强大大,,适适应应性更广,过程中应多使用形参性更广,过程中应多使用形参6.3.2 6.3.2 过程过程 ((3 3))用用PARAMETERS PARAMETERS < <形形式式参参数数表表> >声声明明的的形形参参变变量量被被视视为为私私有有变变量量;;用用LPARAMETERS LPARAMETERS < <形形式式参参数数表表> >声声明明的的形形参参变变量量被被视为局部变量视为局部变量4 4))实实参参表表中中的的各各项项可可以以是是常常量量,,变变量量或或一一般般表表达达式式,,互互相相用逗号分开。
形参表中只能是内存变量,称为形参变量用逗号分开形参表中只能是内存变量,称为形参变量 ((5 5))RETURNRETURN语语句句表表示示控控制制返返回回到到调调用用语语句句的的下下一一条条继继续续执执行行后后跟跟表表达达式式,,同同时时返返回回表表达达式式的的值值;;不不跟跟表表达达式式,,则则返返回回逻逻辑辑值值.T..T.若若缺缺省省RETURNRETURN,,则则在在过过程程结结束束处处自自动动执执行行一一条条隐含的隐含的RETURNRETURN语句6 6))PROCEDUREPROCEDURE为为过过程程起起始始语语句句,,ENDPROCENDPROC为为过过程程结结束束语语句句若若省省略略ENDPROCENDPROC,,过过程程结结束束于于下下一一条条PROCEDUREPROCEDURE语语句句或或程程序序文件尾 ((7 7)有关参数传递)有关参数传递调调用用过过程程时时,,靠靠虚虚实实结结合合进进行行参参数数传传递递每每个个实实参参的的值值按按次次序序一一一一传传送送给给虚虚参参变变量量虚虚实实结结合合是是按按次次序序而而不不是是按按名名称称逐逐一一结结合合的的通通常常实实参参个个数数与与虚虚参参个个数数相相等等,,形形参参个个数数多多于实参个数,多余的形参取初值于实参个数,多余的形参取初值.F..F.。
虚虚实实结结合合时时,,如如果果实实参参为为常常量量或或表表达达式式,,按按值值单单向向传传送送;;如如果实参为变量,按地址传递果实参为变量,按地址传递若若用用内内存存变变量量作作实实参参但但又又不不要要值值的的回回传传,,则则可可将将实实参参变变量量放放在一对圆括号内,使之成为表达式在一对圆括号内,使之成为表达式例例6.34 6.34 在在程程序序中中多多次次调调用用内内部部过过程程LINE, LINE, 画画一一条条由由3030个个““- -””组成的直线组成的直线USE XSDAUSE XSDADO LINEDO LINEFOR I=1 TO 3FOR I=1 TO 3DISP FIEL DISP FIEL 学号学号, ,姓名姓名, ,性别性别, ,住校否住校否 OFFOFFDO LINEDO LINESKIPSKIPENDFORENDFORUSEUSECANCELCANCELPROCEDURE LINEPROCEDURE LINEFOR J=1 TO 30 && FOR J=1 TO 30 && 不能使用不能使用I I作为循环变量作为循环变量?? "-"?? "-"ENDFORENDFORRETURNRETURNENDPROCENDPROC例例6.35 6.35 为使上述过程为使上述过程LINELINE的功能更强,适应性更广,可以增加两个虚参。
的功能更强,适应性更广,可以增加两个虚参FOR I=1 TO 3FOR I=1 TO 3WAIT "WAIT "输入输入一个字符一个字符: " TO C: " TO CINPUT "INPUT "输入字符的个数输入字符的个数" TO N" TO NDO LINE WITH C,NDO LINE WITH C,NENDFORENDFORCANCELCANCELPROCEDURE LINEPROCEDURE LINEPARAMETERS CH,MPARAMETERS CH,MFOR J=1 TO MFOR J=1 TO M?? CH?? CHENDFORENDFOR? ?RETURNRETURNENDPROCENDPROC例例6.36 6.36 利用内部过程计算多边形的面积利用内部过程计算多边形的面积S=0 && S=0 && 实参实参S S必须有确定的值必须有确定的值AREA=0AREA=0DO TRIANGLE WITH 6.1,6.2,8.6,S DO TRIANGLE WITH 6.1,6.2,8.6,S AREA=AREA+SAREA=AREA+SDO TRIANGLE WITH 8.6,7.8,2.4,SDO TRIANGLE WITH 8.6,7.8,2.4,SAREA=AREA+SAREA=AREA+SDO TRIANGLE WITH 7.8,4,4.5,S DO TRIANGLE WITH 7.8,4,4.5,S AREA=AREA+SAREA=AREA+S?[?[多边形的面积为多边形的面积为],STR(AREA,6,2)],STR(AREA,6,2)CANCELCANCELPROC TRIANGLE && PROC TRIANGLE && 完成已知三边求面积的计算功能完成已知三边求面积的计算功能PARA X,Y,Z,S && PARA X,Y,Z,S && 利用形参变量利用形参变量S S回传三角形面积回传三角形面积L=(X+Y+Z)/2L=(X+Y+Z)/2S=SQRT(L*(L-X)*(L-Y)*(L-Z))S=SQRT(L*(L-X)*(L-Y)*(L-Z))RETURNRETURNENDPROCENDPROC多边形面积多边形面积ABCD6.16.28.62.44.54.0E2 2.外部过程.外部过程 内内部部过过程程只只能能被被本本程程序序中中的的调调用用语语句句调调用用。
外外部部过过程程是是将将一一个个过过程程写写成成一个程序文件,任何程序都可以通过调用语句对它进行调用,通用性强一个程序文件,任何程序都可以通过调用语句对它进行调用,通用性强 外外部部过过程程的的过过程程名名实实际际上上就就是是被被调调用用的的文文件件主主名名程程序序文文件件中中的的第第一一条条语语句句是是PROCEDURE PROCEDURE < <过过程程名名> >,,这这里里的的< <过过程程名名> >必必须须与与文文件件主主名名相相同同,,也也不不能能省省略略,,否否则则出出错错PROCEDURE PROCEDURE < <过过程程名名> >这这条条语语句句可可以以省省略略,,于于是是形形式式上上就与前面说的子程序吻合了就与前面说的子程序吻合了 如如果果内内部部过过程程的的过过程程名名与与外外部部过过程程的的文文件件主主名名相相同同,,调调用用时时系系统统执执行行的的是内部过程是内部过程3 3.过程文件.过程文件 外外部部过过程程的的通通用用性性是是强强了了,,但但当当一一个个大大型型应应用用程程序序要要调调用用多多个个外外部部过过程程时时,,要要进进行行多多次次读读盘盘操操作作,,速速度度受受影影响响,,效效率率降降低低。
另另外外,,系系统统允允许许同同时时打打开开的的文文件件数数是是有有限限制制的的过过程程文件可以很好地解决这个问题文件可以很好地解决这个问题 过过程程文文件件中中包包含含多多个个过过程程,,其其建建立立方方法法与与一一般般程程序序文文件件的的建建立立方方法法相相同同,,扩扩展展名名也也是是.PRG.PRG过过程程文文件件不不能能运运行行,,只只能能打打开开一一旦旦打打开开,,其其中中的的所所有有过过程程均均成成为为内内部部过过程程,,供供程程序序调用命令格式:命令格式:SET SET PROCEDURE PROCEDURE TO TO [<[<过过程程文文件件名名1>[,<1>[,<过过程程文文件件名名2>2>,,……]] [ADDITIVE]……]] [ADDITIVE]功能:打开过程文件,使其中的所有过程可供调用功能:打开过程文件,使其中的所有过程可供调用说明:说明:((1 1))可可以以同同时时打打开开多多个个过过程程文文件件如如果果命命令令中中带带有有ADDITIVEADDITIVE子句,则以前打开的过程文件不关闭子句,则以前打开的过程文件不关闭((2 2))如如果果SET SET PROCEDURE PROCEDURE TO TO 后后面面不不带带过过程程文文件件名名,,则则关关闭闭所有已打开的过程文件。
所有已打开的过程文件3 3)用)用CLOSE PROCEDURECLOSE PROCEDURE命令也可以关闭过程文件命令也可以关闭过程文件4 4)过程文件的书写格式如下:)过程文件的书写格式如下:PROCEDURE 1>[PARAMETERS |LPARAMETER <[PARAMETERS |LPARAMETER <形式参数表形式参数表>]>]< <语句序列语句序列1>1>[RETURN [<[RETURN [<表达式表达式>]]>]]ENDPROCENDPROCPROCEDURE 2>[PARAMETERS |LPARAMETER <[PARAMETERS |LPARAMETER <形式参数表形式参数表>]>]< <语句序列语句序列2>2>[RETURN [<[RETURN [<表达式表达式>]]>]]ENDPROCENDPROC…………例例6.38 6.38 有有8 8个个黑黑子子和和8 8个个白白子子,,从从中中随随机机取取出出8 8个个子子,,问问取取出出5 5黑黑3 3白的概率是多少?白的概率是多少?分分析析::这这是是个个超超几几何何分分布布的的古古典典概概率率问问题题。
概概率率P P和和组组合合的的计计算公式如下:算公式如下: 我我们们编编一一个个过过程程FACFAC求求N N!!,,再再编编一一个个过过程程CMNCMN求求组组合合数数,,须须三三次次调调用用FACFAC;;为为求求概概率率P P,,须须三三次次调调用用CMNCMN,,于于是是构构成成了了嵌嵌套套调调用用编编写写一一个个过过程程文文件件GL.PRGGL.PRG,,其其中中包包含含FACFAC和和CMNCMN两两个个过过程程在在程程序序中中打打开开过过程程文文件件GLGL,,实实现过程嵌套调用,求出概率现过程嵌套调用,求出概率 SET PROCEDURE TO GL && SET PROCEDURE TO GL && 打开过程文件打开过程文件GL.PRGGL.PRGINPUT "INPUT "输入黑子的个数输入黑子的个数" TO H" TO HB=8-HB=8-HR=0R=0DO CMN WITH 8,H,R && DO CMN WITH 8,H,R && 设置实参设置实参R R是为了获得回传的组合数是为了获得回传的组合数Y1=RY1=RDO CMN WITH 8,B,RDO CMN WITH 8,B,RY2=RY2=RDO CMN WITH 16,8,RDO CMN WITH 16,8,RY3=RY3=RP=Y1*Y2/Y3P=Y1*Y2/Y3? "? "取取"+STR(H,1)+ ""+STR(H,1)+ "黑黑"+STR(B,1)+ ""+STR(B,1)+ "白的概率是白的概率是"+STR(P,6,4)"+STR(P,6,4)SET PROCEDURE TO && SET PROCEDURE TO && 关闭过程文件关闭过程文件CANCELCANCEL* * GL.PRGGL.PRGPROCEDURE FAC && PROCEDURE FAC && 过程过程FACFAC的功能是计算阶乘的功能是计算阶乘PARAMETERS T,YPARAMETERS T,YQ=1Q=1FOR I=1 TO TFOR I=1 TO TQ=Q*IQ=Q*IENDFORENDFORY=Q Y=Q && && 阶阶乘乘值值通通过过形形参参Y Y回回传传给给实实参参变变量量X XRETURNRETURNENDPROCENDPROCPROCEDURE CMN && PROCEDURE CMN && 过程过程CMNCMN的功能是计算组合的功能是计算组合PARAMETER PARAMETER M,N,C M,N,C && && 组组合合数数通通过过形形参参C C回回传传给给实实参参变变量量R RX=0X=0DO FAC WITH M,XDO FAC WITH M,XX1=XX1=XDO FAC WITH N,XDO FAC WITH N,XX2=XX2=XDO FAC WITH M-N,XDO FAC WITH M-N,XX3=XX3=XC=X1/(X2*X3)C=X1/(X2*X3)RETURNRETURNENDPROCENDPROC v补充作业补充作业:v1.根据学生成绩表根据学生成绩表,输入课程号输入课程号,重复查询该重复查询该门课程的最高分、最低分和平均分。
门课程的最高分、最低分和平均分v2、根据学生成绩表,输入课程号,统计选修、根据学生成绩表,输入课程号,统计选修该门课程的人数,要求能够重复统计该门课程的人数,要求能够重复统计v3、按照学号的升序逐条显示班级后两位为3、按照学号的升序逐条显示班级后两位为“01”的学生信息,要求分别用的学生信息,要求分别用do while enddo和和scan endscan结构实现结构实现v4、编程实现4、编程实现m+(m+1)+(m+2)+…Nm、、n的的值从键盘输入,值从键盘输入,m<=n。