第6章程序设计内容ppt课件_第1页
第6章程序设计内容ppt课件_第2页
第6章程序设计内容ppt课件_第3页
第6章程序设计内容ppt课件_第4页
第6章程序设计内容ppt课件_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、6.9 顺序构造程序设计 一、顺序构造:根据程序中语句的书写顺序依次逐条执行。流程图如下: 语句1 语句2例6.1查找某个学生信息(lz1)Open database 教学管理Use 学生Accept “请输入学生姓名: to nameLocate for 姓名=nameDisplayUsereturn分类:简单分支语句(IFENDIF) 选择分支语句(IFELSEENDIF)构造分支do case-endcase6.10 分支构造 1简单分支语句Lz1格式:IF ENDIF IF .T. 条件? 语句块ENDIF.F.单向IF语句流程图功能:计算条件表达式的值,假设为真.T.,那么执行语句块

2、中的语句;假设为假.F.,不执行语句块。无论执行还是不执行,程序都将转向ENDIF下一条语句继续执行。阐明: 1 IF 和 ENDIF必需配对出现,且分两行书写。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选择分支语句格式:IF ELSE EN

3、DIF条件?语句块1语句块2IF .T. .F.ENDIF双向IF语句流程图:功能:条件成立,执行;条件不成立,执行。然后程序转向ENDIF下一条语句继续执行。阐明:1 无论条件能否成立,在语句块A和B之间必执行一个,且只能执行一个。2 该语句可以处理一入口,二分支问题Input “x= to xif x0 y=sin(x)+sqrt(x*x+1) else y=cos(x) - x3+3* x endif?x=,x,y=,y(LZ4)Input x= to xif x=0 y=cos(x) - x3+3* x endify=sin(x)+sqrt(x*x+1 )Input x= to xy=

4、cos(x) - x3+3* xif x0 y=sin(x)+sqrt(x*x+1) endif?x,y 例6.37铁路托运转李,假设每张车票可按每公斤0.5元托运50公斤以内的行李,假设超越50公斤时,超越的部分每公斤加价0.8元。计算公式和程序如下:p143 X=0.5W 当W50公斤 X=0.550+0.8(w-50) 当W50公斤 Set talk off Input “请输入行李的分量为: to w If w2.5 PAY=(X-2.5)*1.2+6ELSE PAY=6ENDIF? 应付费,ROUND(PAY,0), 元CANCEL例6.5 在学生信息.DBF中查找某人,假设找到,显

5、示该记录;假设找不到,显示“查无此人!。lz6)* PROG7.PRGSET TALK OFFUSE 学生ACCEPT 输入待查找人的姓名: TO NAMELOCATE FOR 姓名=NAMEIF FOUND() DISP ELSE ? 查无此人! ENDIFUSESET TALK ONCANCEL有学生成果表:现要统计60分以下有多少人,60到69分的有多少人,70-89分的有多少人,90分以上的有多少人。3 IF语句的嵌套 IF-ELSE-ENDIF语句中的语句块里可以包含任何合法的语句,也可以包含另一条IF语句,这就构成了IF语句的嵌套。嵌套IF语句可以处理一入口,三分支甚至更多分支的问

6、题。嵌套方式可以是多种多样的,以下是其中的一种:IF ELSE IF ELSE ENDIFENDIF语句块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 大学英语60 d=d+1 Else If 大学英语70 c=c+1 else If 大学英语90 b=b+1 else a=a+1 endif

7、 Endifendif 这样可以不可以?4构造分支语句格式: DO CASE CASE CASE CASE OTHERWISE ENDCASE条件1条件2条件n-1语句块n语句块1语句块n-1DO CASEENDCASEOTHERWISE语句块2.T.T.F.F.F.T. 功能:依次检测条件表达式的值,一旦某一条件满足,执行相应语句块,然后转到ENDCASE下一条语句。假设一切条件表达式的值都为假,倘假设无OTHERWISE子句,那么不执行任何语句,直接转到ENDCASE下一条语句;如假设有OTHERWISE子句,那么无条件执行OTHERWISE与ENDCASE之间的语句块,然后转到ENDCA

8、SE下一条语句。阐明:1假设有两个或两个以上的条件为真,那么只执行第一个条件表达式为真的CASE后的语句组,之后即转去执行ENDCASE之后的语句而不会再去判别下一个CASE中的条件。Do case case 大学英语=90 a=a+1 case 大学英语=70.and.大学英语=60 c=c+1 otherwise d=d+1 endcase 也可以这样做Do case case 大学英语60 d=d+1 case 大学英语70 c=c+1 case 大学英语=60 a=a+1 case 大学英语=70 b=b+1 case 大学英语=90 c=c+1 otherwise d=d+1 emd

9、case结果是什么?1当型循环语句格式:DO WHILE ENDDO6.11 循环构造初始设置条件满足吗?循环体语句LOOPEXIT.F.T.DO WHILEENDDO功能:当的值为真.T.时,执行循环体中的语句,一旦的值为假.F.,程序跳出循环体,转到ENDDO下一条语句继续执行。 阐明:1假设条件永远成立,构成死循环。为了防止死循环,在循环体中必需求有语句可以改动条件表达式的值。2当循环次数事先未知时,运用DO WHILE-ENDDO语句。3循环体中,可以出现LOOP语句。遇到LOOP语句时,程序立刻转向DO WHILE循环起始语句,而不再执行LOOP下面的循环体语句。4 循环体中,可以出

10、现EXIT语句。遇到EXIT语句时,程序立刻跳出本层循环,转向逻辑上的下一条语句继续执行。设置EXIT语句,也是防止死循环的一种方法。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)(用IF语句改写USE ZGDADO WHILE .NOT.

11、EOF( ) DO CASE CASE (年龄45).AND.职称=讲师 W=W+1 CASE (年龄45) .AND.职称=副教授 C=C+1 ENDCASE SKIPENDDO? “45岁以下的讲师人数为: ,W? “45岁以下的副教授人数为: ,CSET TALK ONCANCEL例6.12统计职工表中,职称是讲师和副教授,年龄在45岁以下的教师人数.例6.3 求N!=123Nlzn)input n= to ns=1i=1do while i=1979-01-01DISP N=N+1 & 记数器ENDIFSKIP & 修正记录指针,漏写该句,程序死循环ENDDO? 1979年以后出生的人

12、数为+STR(N,2)+ 人USESET TALK ONCANCEL例6.15 完善例6.7,使程序能多次查找学生的记录,一旦输入N,立刻终了查找。lz9USE 学生x=YDO WHILE UPPER(x)= YACCEPT 输入待查找学生的姓名: TO NAMELOCATE FOR 姓名=NAMEIF .NOT. EOF()DISP ELSE? 查无此人! ENDIFWAIT 能否继续查找(Y/N)? TO xENDDO? 终了查找USE CANCEL例6.16 键盘输入两个整数,求它们的最大公约数和最小公倍数。(lz12)INPUT 输入一个整数: TO MINPUT 输入另一个整数: T

13、O NM1=MN1=NT=MOD(M,N)DO WHILE T#0M=NN=TT=MOD(M,N)ENDDO? 最大公约数为: ,STR(N,4)? 最小公倍数为: , STR(M1*N1/N,4)CANCEL辗转相减求两个自然数m,n的最大公约数.lz12a m=m-n mnn=n-m nm m,n 为公约数 m=n1.转跳语句(LOOP)在DO WHILEENDDO循环体内提供了一条短路语句,可以起到转跳作用语句格式:Do while if LOOP endif enddo语句功能: 中断本次循环体的执行,跳回到DO WHILE的开场处,反复条件的判别.但要留意具有多重循环的程序中,只前往

14、到与它本身所处的本层循环体相匹配的DO WHILE语句.Do while Do while if LOOP endif enddo loopEnddo【例6.17】工资小于160元的添加10元SET TALK OFFUSE DA2DO WHILE .NOT.EOF( ) if 工资=160 SKIP LOOP ENDIFREPLACE 工资 WITH 工资10SKIPENDDO【例6.18】lz10求0100之间奇数之和 SET TALK OFF X=0 Y=0 DO WHILE X100 EXIT ENDIFS=S+N N=N+1ENDDO? “S=,S2FOR-EndFor循环语句格式:F

15、OR = TO STEP ENDFOR 循环变量超越终值?FOR循环变量=初值循环体LOOPEXIT循环变量+步长ENDFOR.T.F.记数型循环语句流程图功能:语句执行时,首先循环变量赋以初值,与终值比较,假设超越终值,那么循环体一次也不执行,直接跳到循环终止语句ENDFOR的下一条语句;假设不超越终值,那么依次执行循环体语句,遇到ENDFOR后,程序转回到FOR循环初始语句。然后循环变量加上步长,再判别能否超越终值,只需不超越终值就执行循环体。一旦超越终值,程序退出循环体,继续执行ENDFOR的下一条语句。阐明:1步长可正可负。假设步长为1,可以省略STEP子句。2计数型循环语句用于循环次

16、数事先知的场所。循环次数可按下式来计算:INT(ABS(终值-初值)/步长)+13循环体内可以出现 LOOP和EXIT语句,其功能如前所述。4循环终了语句普通用ENDFOR,例6.20 找出表中年龄最大的记录lz13SET TALK OFFUSE ZGDAMAX=年龄J=RECCOUNT() 指表中所含的记录的总数FOR I=2 TO JSKIPIF MAX年龄MAX=年龄RSC=RECNO()ENDIFENDFORUSE? RSC,MAX3SCAN ENDSCAN循环语句格式: SCAN FOR ENDSCAN功能:对翻开的数据表,在规定的范围内,对符合条件的记录逐条进展循环体语句规定的操作

17、。每执行一次,指针下移,直到文件尾为止。阐明:1scan循环语句专门用来对数据表操作。SCAN-ENDSCAN语句有自动修正指针和判别能否到达文件尾的功能。因此,用SCAN-ENDSCAN语句比用DO WHILE-ENDDO语句处置数据表速度快,而且编程既方便又简约。2循环体中可以出现LOOP和EXIT 语句,作用如前所述。 例6.23 用SCAN-ENDSCAN语句统计XSDA.DBF中1979年以后出生的学生人数,并显示他们的记录。(试与例6.14进展比较)lz14SET TALK OFFCLEARUSE 学生N=0 SCAN FOR 出生日期=1979-01-01DISPN=N+1END

18、SCAN? 1979年以后出生的人数为+STR(N,2)+ 人USESET TALK ONCANCEL 例6.24在教学管理.DBC中有数据库表学生成果.DBF,计算学生的总分,并按如下规定填写等级字段:lz15总分=250 为“优秀 210总分249为“良好180总分209为“普通 总分=250 REPL 等级 WITH 优秀 CASE 总分=210 & 不用写成:总分=210 AND 总分=180 REPL 等级 WITH 普通 OTHERWISE REPL 等级 WITH 差 ENDCASE ENDSCANLISTCLOSE DATABASECANCEL USE 学生成果REPL ALL

19、 总分 WITH 数学+大学英语+语文 go topdo while .not.eof()DO CASE CASE 总分=250 REPL 等级 WITH 优秀 CASE 总分=210 & 不用写成:总分=210 AND 总分=180 REPL 等级 WITH 普通 OTHERWISE REPL 等级 WITH 差 ENDCASE skip enddoLISTCANCEL 4循环的嵌套 假设单层循环里的循环体中又包含另一层循环,即循环内套循环,就构成了二重循环。同理,还有三重循环或更多重循环。三种方式的循环可以相互嵌套,但既然嵌套,必需是完全嵌套,不能交叉嵌套。Do while 语句1 do

20、while 语句2. enddo 语句3.Enddo例6.21 打印如下图的图形* PROG21.PRGFOR I=1 TO 4 & 打印4行FOR J=1 TO 5 & 每行打印5个字符? *ENDFOR?ENDFOR显示结果如下: * * * *例6.22 打印图形* PROG22.PRGFOR I=1 TO 5 & 打印5行FOR J=1 TO I & 每行打印字符数与I有关? *ENDFOR?ENDFOR运转结果如下:* 例6.23 打印图形lz16* PROG23.PRGFOR I=5 TO 1 STEP 1 & 打印5行,STEP用负值FOR J=1 TO I? *ENDFOR?E

21、NDFOR?CANCEL结果如下: * * * * * 例6.24 打印图形lz17* PROG24.PRGFOR I=1 TO 5 & 打印5行?SPACE(5-I) FOR J=1 TO 2*I-1 & 随I改动,打印1,3,5,7,9列? *ENDFOR?ENDFOR结果如下: * * * * * clearFOR I=1 TO 5? SPACE(20-i) FOR J=1 TO i*2-1? *ENDFORENDFOR例6.25 打印图形* PROG25.PRGFOR I=5 TO 1 STEP 1 & 打印倒三角,STEP为负值? SPACE(5-I) & 换行效果与例6.24一样F

22、OR J=1 TO 2*I-1? *ENDFORENDFOR结果如下: * * * * * clearFOR I=1 TO 5? SPACE(20+i) FOR J=1 TO (5-i)*2+1? *ENDFORENDFORclearinput n= to nFOR I=1 TO n? SPACE(50+I) FOR J=1 TO 2*n-2*i+1? *ENDFORENDFOR例6.26 打印图形* PROG26.PRGFOR I=1 TO 5 & 打印前5行? SPACE(10-I) & 使图形向右移5列FOR J=1 TO 2*I-1 & 打印呈三角形?CHR(64+I) & 打印大写字

23、母ENDFORENDFORFOR I=4 TO 1 STEP 1 & 打印后4行?SPACE(10-I) & 先换行,再输出FOR J=1 TO 2*I-1?CHR(64+I)ENDFORENDFOR结果如下: A BBB CCCCC DDDDDDD EEEEEEEEE DDDDDDD CCCCC BBB A例6.27 打印九九乘法表lz18 lz9?SPACE(4)+ * & 输出第一行FOR I=1 TO 9?STR(I,5)ENDFOR?FOR I=1 TO 50 & 输出一条由50个“-组成的直线?“-ENDFOR?FOR A=1 TO 9?STR(A,5) FOR B=1 TO A?

24、STR(A*B,5)ENDFOR?ENDFORCANCEL 数组一、数组:名字一样、用下标区分的内存变量称为数组。二、数组的定义 数组名的取法和普通的变量名取法一样,数组名和简单变量不能同名.定义数组命令: DIMENSION 数组名(,) ,(命令功能:定义一个或多个内存变量数组。阐明:最多可有3600个元素,显示内存时只算一个变量数组下标起始值是1数组元素隐含的逻辑值为“假*二维数组,可用一维下标来存取。这是由于在内存中,二维数组元素是按行列次序陈列它们每个元素都可看作单独一个内存变量运用,主要有以下特点:(1)数组元素的类型,由所赋的值来决议(2)数组变量可以不带下标运用在赋值语句的右边

25、,表示该数组第一个元素在赋值语句的左边,表示该数组一切元素(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)二、数组的赋值格式: STORE 表达式 TO 数组名 数组名=表达式命令功能:将表达式的值赋给数组变量上述两个命令是完全等价的给数组赋值还可用ACCEPT、INPUT、WAIT语句Dime s(3,5)lz

26、23For i= 1 to 3 For j=1 to 5 Input “第+str(I,1)+行第+str(j,1)+个元素 to s(I,j)EndforEndforFor i= 1 to 3 For j=1 to 5?s(I,j)Endfor?Endforcleardime a(10)for i= 1 to 10 a(i)=int(rand()*20)+1 ?a(i) endformax=a(1)imax=1for i=2 to 10 if a(i)max max=a(i) imax=i endifendfor?max,imax产生10个1-20之间的随机数,找出其中最大的数lz24246

27、8101357997531108642交换前交换后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将表中当前记录复制到指定的数组.在复制时,第一个字段值传送给第一个数组元素,第二个字段值传给第二个数组元素,依次类推.假设没有数组 ,那么自动创建数组,假设已创建的数组元素个数比字段个数多,那么多余的数组元素坚持原值;假设已创建的数组元素个数比字段个数少,那么自动扩展数组,使得数组元素个

28、数与字段个数相等.2.数组内容复制到当前记录命令格式:Gather from fields 将数组中的数据复制到当前记录.第一个数组元素复制到第一个字段,第二个数组元素复制到第二个字段,依次类推,各个数组元素与对应字段的数据类型必需一致.假设数组元素个数比字段个数少,多出的字段坚持原值,假设数组元素个数比字段个数多,多出的数组元素不复制.两条记录换位置use 学生lz20listdimension a(1),b(1)x=Ydo while upper(x)=Y input 第一条记录 to m input 第二条记录 to n go m scatter to a go n scatter to

29、 b gather from a go m gather from b wait 继续吗Y/N? to x enddo 例:现有数据库DD.DBF,其构造如下:订单号 N3,0,客户号 C3,签单日期 D,金额 N6,2。数据库TJ2.DBF 构造如下:月份 N2,0,数量 N2,0,总金额 N8,2 编程序统计出各个月份所签署单的数量及其总金额,并将结果按月份的升序放在库文件TJ2.DBF。(vf5)set talk offdime a(12,2) a=0use dddo while .not. eof() a(month(签单日期),1)=a(month(签单日期),1)+1 a(mont

30、h(签单日期),2)=a(month(签单日期),2)+金额 skipenddoi=1use tj1do while i=12 if a(i,1)0 appe blank repl 月份 with i,数量 with a(i,1),金额 with a(i,2) endif i=i+1enddolistsort on 金额 to tj2use tj2list现有数据库学生成果.dbf,有如下构造:lz21学号(c,8),姓名(c,8),大学英语(n,4),语文(n,4),数学(n,4)。编程序统计出每10分间隔的三门功课的人数,并以以下方式显示:分数段 大学英语人数 语文人数 数学人数 09 *

31、 * *1019 * * *2029 * * * .90100 * * *(vf11)use 学生成果dime s(10,3)s=0do while .not.eof()s(int(大学英语/10)+1,1)= s(int(大学英语/10)+1,1)+1 s(int(语文/10)+1,2)= s(int(语文/10)+1,2)+1 s(int(数学/10)+1,3)= s(int(数学/10)+1,3)+1 skipenddoclear?分数段 英语人数 语文人数 数学人数i=1do while i=10 ?str(i-1)*10,2)+-+str(i*10-1,3) j=1 do while

32、 jN & 意味着每个数都除不尽 SUM=SUM+IENDIFENDFOR? 100200之间的一切素数之和为: ,SUMCANCEL 例6.29 求出100999之间的一切水仙花数。* PROG29.PRGFOR I=1 TO 9 FOR J=0 TO 9 FOR K=0 TO 9 S=100*I+10*J+K IF I3+J3+K3=S ?S ENDIF NEXT NEXTNEXTCANCEL结果有四个数,分别为153,370,371和407。例6.30 求Fibonacci数列1,1,2,3,5,8,13的第8,15,19项的值。lz22分析:Fibonacci数列的特点是第一项为哪一项

33、1,第二项是1,从第三项开场,每一项等于前两项之和。利用数组是处理这类问题的最正确方法。我们将数列中的前假设干项依次装入数组元素中,需求输出哪一项就输出哪个数组元素。* PROG30.PRGDIMENSION F(19)F(1)=1F(2)=1FOR I=3 TO 19F(I)=F(I-2)+F(I-1)ENDFOR?F(8),F(15),F(19) CANCEL 例6.31 产生10个120之间的随机整数,并将它们按升序排序后输出。DIMENSION A(10)RAND(-1) & 将系统时间作为首个随机函数的籽值FOR I=1 TO 10A(I)=INT(RAND()*20)+1 & 产生

34、120之间的随机数?STR(A(I),5)ENDFOR? & 以上语句的功能是建立数组FOR I=1 TO 9 & 气泡法排序FOR J=I+1 TO 10IF A(I)A(J) & 按升序排序,假设改为A(I)A(J),按降序陈列T=A(I) & 交换数组元素的值A(I)=A(J)A(J)=TENDIFENDFORENDFOR & 以上语句的功能是处置数组元素 一、子程序的概念 在Visual FoxPro 中,子程序是被其他程序调用的程序文件。主程序能调用子程序,但子程序不能调用主程序。子程序也可以调用其他子程序,构成子程序的嵌套调用。在程序设计中,有些功能或计算需求在不同场所反复进展多次

35、,这时往往将该功能或计算编写成一个独立的子程序,需求时调用它,程序既简约又节省存储空间。现实上,不但反复执行的程序段可以作为子程序独立出去,即使只执行一次的程序段也可以编成子程序。每个子程序完成一种功能或计算,主程序的义务就是输入数据、调用子程序和输出结果这三项。 二、子程序的建立子程序的建立和主程序一样,也是modify command 扩展名为prg.但在子程序中应有一条前往语句.Return (to master) 子程序和主程序可以分别放在两个文件内;也可以放在一个文件内,此时,在子程序的开头要有Procedure 6.12 子程序 三、子程序调用语句调用语句格式:DO WITH 阐明

36、:WITH 是可选项,用于主程序与子程序之间的参数传送。实参表中的各项可以是常量,变量或普通表达式,相互用逗号分开。四、子程序前往语句前往语句格式:RETURN TO MASTER阐明:执行子程序时,遇到RETURN 命令,就前往到上一级子程序或主程序中的子程序调用命令的下一条语句继续执行。遇到RETURN MASTER命令,就径直前往主程序。通常子程序的最后一条语句是RETURN。假设缺省RETURN,程序执行到最后,自动执行RETURN语句功能,前往主调程序。 以下图6-37是子程序嵌套调用时的程序执行过程表示图。DO SUB1CANCELDO SUB2DO SUB3RETURNRETUR

37、N RETURN TO MASTERSub1.prgSub2.prgsub3Main.prg例6.32 求3!+5!+8!* lz26.PRGP、N必需在主程序中定义STORE 0 TO SUM,PN=3DO JC & 调用子程序JC.PRGSUM=SUM+P & Sum的值是3!N=5DO JC & 再次调用子程序JC.PRGSUM=SUM+PN=8DO JC & 第三次调用子程序JC.PRGSUM=SUM+P? 3!+5!+8!= ,SUMCANCELProcedure jcP=1FOR I=1 TO NP=P*IENDFORRETURNJC.PRG(子程序)P=1FOR I=1 TO N

38、P=P*IENDFORRETURN注:主程序担任三次调用子程序以及计算总和,子程序担任计算N!。主程序每次调用子程序时都给定N的值,子程序对给定的N值求N!,结果存入变量S。主程序执行时,遇到DO JC语句,程序转入子程序。执行子程序语句时,遇到RETURN语句,程序又前往到主程序DO JC的下一条语句继续执行。例:main.prg wait “下面调用子程序 do sub1“00000 wait “又前往到主程序 retu sub1.prg ?1111111 do sub2?1111111Retusub2.prg?2222222 retu留意:sub11 sub2必需是单独的文件。例:mai

39、n.prg wait “下面调用子程序 do sub1 wait “又前往到主程序 retu procedure sub1 ?1111111 do sub2?1111111RetuProcedure sub2?2222222 retu留意:主程序和子程序可以放在一个文件内。假设把sub2.prg中的retu 改成retu to master,结果是什么?五、子程序的参数传送格式一:do with ,,格式二: (,)子程序中格式: parameters , (,) 留意:parameters 必需是被调用程序的第一条语句,而且参数的个数和数据类型必需和被调用语句的参数相一致。 调用语句中参数可

40、以是常量、已赋值的变量、或表达式。在调用时参数传送关系如下:(1)按值传送方式:实参的值只能传送给形参变量,而形参变量的值不会传送给实参变量,当形参变量的值改动时,不会影响实参变量的值,实参和形参占用不同的内存空间。 过程名 (,) 括号不能省 过程名 (,) parameters (,)(2)援用传送方式:传送实参变量的内存地址,实参变量和形参变量实践上为同一个内存单元,虽然变量名可以不同, 假设形参变量的值改动,那么实参变量的值也会跟着改动。援用传送属于双向传送。 do 过程名 with , 过程名 (,) parameters (,)(1)假设某个实参变量用一对圆括号括起来,不论采用哪种

41、调用格式,这个实参变量总是按值传送.(2)实参是表达式或者常量时是按值传送。(3)在两种调用格式 下,对应的实参变量和形参变量的名字可以一样,也可以不一样. 例:set talk off(vf12) a=10 b=15 do swap with a,b?主程序:“,a,b swap.prg parameters x,y?子程序 ,x,y t=x x=y y=t retu clear a=10 b=20 Swap1(a,b) ? A1=,a,B1=,b a=10 b=20 do Swap1 with a,b ? A1=,a,B1=,b return proc Swap1(x,y) t=x x=y

42、 y=t retu例:编程求1!+2!+N! *jch.prg para s,t s=1 i=1 do while i=ts=s*I i=i+1 enddoreturn *vf13.prgset talk off input “n=“ to n w=0 p=0 j=1 do while j=n do jch with p,j w=w+p j=j+1 enddo?w= ,wSTORE 100 TO X,Y lz27PP(X,Y)?按值传送方式:,x,ydo pp with (x),(y)?按值传送方式:,x,ydo pp with x+5,y+5?按值传送方式:,x,ydo pp with x

43、,y ?援用传送方式:,x,ydo pp with x,(y)?两种传送方式:,x,yproc pp(x,y)x=x+100y=y+50?计算结果:,x,yendprocproc pp(x,y)x=x+100y=y+50?计算结果:,x,yendproc内存变量在程序中起作用的范围称为内存变量的作用域。根据作用域的不同,内存变量分为三类:部分变量、私有变量和全局变量。1部分变量本地变量格式:LOCAL 功能:将中的变量定义为部分变量,其作用域仅在本模块中,不能在上层或下层模块中运用。在物理上,本地变量一经定义,就暂时分配了存储单元;一旦分开了本模块,部分变量所占的存储单元被释放,部分变量变成无

44、定义,从而不能再被援用。阐明: LOCAL命令与LOCATE命令前四个字符一样,因此不可以缩写为LOCA LOCAL命令可以定义部分内存变量和部分数组,且它们的初值皆为.F.例如:LOCAL A,B,C(4) & 不用再用DIMENSION语句定义C数组?A,B,C(2)结果为 .F. .F. .F.3内存变量的作用域2私有变量格式:PRIVATE 功能:将中的变量定义为私有变量,其作用域在本模块及下属模块中。阐明: PRIVATE命令可以定义私有内存变量和私有数组,且它们的初值皆为.F. 系统默许,凡在程序中没作任何阐明的变量均为私有变量。它在本程序及其被调子程序中有效。 普通情况下,私有变

45、量不用用PRIVATE命令作显式阐明。当被调子程序与主调程序中有同名变量时,可在被调子程序中对该变量作显式阐明,使主调程序中的同名变量在被调子程序中暂时无效。前往主调程序后,主调程序中的同名变量原来的值依然保管,且变量有效,而被调子程序中的变量变成无效,所占存储单元也被释放。另外,在多人开发程序时为防止主程序与各子程序之间因变量同名而相互影响,可在各自开发的子程序中定义私有变量,以屏蔽主调程序中的同名变量。3全局变量公共变量格式:PUBLIC 功能:将中的变量定义为全局变量,其作用域涵盖一切程序阐明: PUBLIC命令可以定义全局内存变量和全局数组,且初值皆为.F. 在命令窗口中建立的变量和数

46、组均为全局变量和全局数组,但这些全局变量和全局数组不能在程序中援用。 用PUBLIC定义的全局变量和数组在整个程序运转过程中一直有效,一直占有存储单元。即使程序运转终了,系统也不会自动释放全局变量。删除全局变量只能用RELEASE 或CLEAR ALL等命令。 假设同一模块中有同名的各种变量,那么优先次序为:本地变量 私有变量 全局变量 求n到m的和clearlz29Input “m= to mInput “n=“ to nDo sum1?M+N的值为:,sProcedure sum1S=0For i=n to m s=s+IEndfor?中间结果:,sReturnS是在子程序中开辟的变量,有

47、效范围仅在子程序,前往到主程序时,曾经从内存中消逝。同名变量被隐藏某级程序中运用的 部分变量,有能够和上级程序中的部分变量同名,为了防止混淆,可在子程序中用private 命令定义本级程序公用的部分变量。用private命令定义的变量,能把上级同名的变量暂时隐藏起来,彼此互不影响,子程序运转终了后,在本级程序建立的同名变量即被去除,而被隐藏的上级程序中的同名变量即被恢复出来,而且保管原值不变。命令格式:private 例:set talk off a=1 b=2 do sub ?主程序:,a,b retu proc sub private b a=100 b=200?子程序:,a,b retu

48、set talk off public aa aa=10.2 bb=23 do fx25 with bb ?aa,bb retu fx25.prg para cc private aa aa=20.3 cc=aa*2Retu set talk off public a1,b1 store 1 to a1,b1 c1=10 do s1 with a1+b1,c1,a1 ?a1,b1,c1 retu proc s1 para x1,x2,x3x2=x1+x3 c1=x2+x3 b1=b1+1 private b1 b1=c1*x2 return1内部过程定义格式:PROCEDURE PARAMET

49、ERS |LPARAMETER RETURN ENDPROC调用语句格式:DO WITH 阐明:1内部过程是作为程序中的一个独立单位出现的。它可以完成某种操作或某种运算,通常安排在本程序的后面,供本程序调用。2假设定义中有PARAMETERS |LPARAMETER ,称为有参过程,否那么称为无参过程。有参过程的PARAMETER命令必需是第一条可执行命令,其形参也叫虚参最多27个。为了使过程的功能更强大,顺应性更广,过程中应多运用形参。6.3.2 过程 3用PARAMETERS 声明的形参变量被视为私有变量;用LPARAMETERS 声明的形参变量被视为部分变量。4实参表中的各项可以是常量,

50、变量或普通表达式,相互用逗号分开。形参表中只能是内存变量,称为形参变量。 5RETURN语句表示控制前往到调用语句的下一条继续执行。后跟表达式,同时前往表达式的值;不跟表达式,那么前往逻辑值.T.。假设缺省RETURN,那么在过程终了处自动执行一条隐含的RETURN语句。6PROCEDURE为过程起始语句,ENDPROC为过程终了语句。假设省略ENDPROC,过程终了于下一条PROCEDURE语句或程序文件尾。 7有关参数传送调用过程时,靠真假结合进展参数传送。每个实参的值按次序一一传送给虚参变量。真假结合是按次序而不是按称号逐一结合的。通常实参个数与虚参个数相等,形参个数多于实参个数,多余的

51、形参取初值.F.。真假结合时,假照实参为常量或表达式,按值单向传送;假照实参为变量,按地址传送。假设用内存变量作实参但又不要值的回传,那么可将实参变量放在一对圆括号内,使之成为表达式。例6.34 在程序中多次调用内部过程LINE, 画一条由30个“-组成的直线。USE XSDADO LINEFOR I=1 TO 3DISP FIEL 学号,姓名,性别,住校否 OFFDO LINESKIPENDFORUSECANCELPROCEDURE LINEFOR J=1 TO 30 & 不能运用I作为循环变量? -ENDFORRETURNENDPROC例6.35 为使上述过程LINE的功能更强,顺应性更广,可以添加两个虚参。FOR I=1 TO 3WAIT 输入一个字符: TO CINPUT 输入字符的个数 TO NDO LINE WITH C,NENDFORCANCELPROCEDURE LINEPARAMETERS CH,MFOR J=1 TO M? CHENDFOR?RETURNENDPROC例6.36 利用内部过程计算多边形的面积。S=0 & 实参S必需有确定的值AREA=0DO TRIANGLE WITH 6.1,6.2,8.6,S AREA=AREA+SDO TRIANGLE WITH 8.6,7.8,2.4,SAREA=AREA+SDO TRIANGLE WITH

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论