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

下载本文档

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

文档简介

1、6.9 顺序结构程序设计,一、顺序结构:根据程序中语句的书写顺序依次逐条执行。流程图如下:,例6.1查找某个学生信息(lz1) Open database 教学管理 Use 学生 Accept “请输入学生姓名:” to name Locate for 姓名=name Display Use return,分类: 简单分支语句(IFENDIF) 选择分支语句(IFELSEENDIF) 结构分支(do case-endcase,6.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 name Locate for 姓名=name If found() Display Endif ?“结束” Use return,例6.3 Use zgda(lz3) Locate for 基本工资650.00 If .not. Eof() displ

3、ay Endif,2选择分支语句 格式:IF ELSE ENDIF,双向IF语句流程图:,功能:条件成立,执行;条件不成立,执行。然后程序转向ENDIF下一条语句继续执行。 说明: (1) 无论条件是否成立,在语句块A和B之间必执行一个,且只能执行一个。 (2) 该语句可以解决一入口,二分支问题,Input “x=” to x if x0 y=sin(x)+sqrt(x*x+1) else y=cos(x) - x3+3* x endif ?”x=”,x,”y=”,y,(LZ4),if x=0 y=cos(x) - x3+3* x endif y=sin(x)+sqrt(x*x+1 ),Inp

4、ut x= to x y=cos(x) - x3+3* x if 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 w=50 x=0.5*w Else x=0.5*50+0.8*(w-50) Endif ?”行李的重量为:”+str(w,6,2)+”公斤,其运费为

5、:”+str(x,6,2)+”元”,例6.4 输入乘出租车的公里数,求乘车费(计费标准:2.5公里以内6元;2.5公里以外,每超过1公里,增加到1.2元,要求四舍五入到元)。(lz5) * PROG6.PRG CLEAR INPUT “请输入公里数:” TO X IF X2.5 PAY=(X-2.5)*1.2+6 ELSE PAY=6 ENDIF ? 应付费,ROUND(PAY,0), 元 CANCEL,例6.5 在学生信息.DBF中查找某人,若找到,显示该记录;若找不到,显示“查无此人!”。(lz6) * PROG7.PRG SET TALK OFF USE 学生 ACCEPT 输入待查找人

6、的姓名: TO NAME LOCATE FOR 姓名=NAME IF FOUND() DISP ELSE ? 查无此人! ENDIF USE SET TALK ON CANCEL,有学生成绩表:现要统计60分以下有多少人,60到69分的有多少人,70-89分的有多少人,90分以上的有多少人。,3 IF语句的嵌套 IF-ELSE-ENDIF语句中的语句块里可以包含任何合法的语句,也可以包含另一条IF语句,这就构成了IF语句的嵌套。嵌套IF语句可以解决一入口,三分支甚至更多分支的问题。嵌套形式可以是多种多样的,以下是其中的一种: IF ELSE IF ELSE ENDIF ENDIF,If 大学英

7、语=90 a=a+1 Else If 大学英语=70 b=b+1 else If 大学英语=60 c=c+1 else d=d+1 endif Endif endif,If 大学英语60 d=d+1 Else If 大学英语70 b=b+1 else If 大学英语90 c=c+1 else d=d+1 endif Endif endif,If 大学英语60 d=d+1 Else If 大学英语70 c=c+1 else If 大学英语90 b=b+1 else a=a+1 endif Endif endif,这样可以不可以?,4结构分支语句 格式: DO CASE CASE CASE CAS

8、E OTHERWISE ENDCASE,功能:依次检测条件表达式的值,一旦某一条件满足,执行相应语句块,然后转到ENDCASE下一条语句。如果所有条件表达式的值都为假,倘若无OTHERWISE子句,则不执行任何语句,直接转到ENDCASE下一条语句;如若有OTHERWISE子句,则无条件执行OTHERWISE与ENDCASE之间的语句块,然后转到ENDCASE下一条语句。 说明: (1)如果有两个或两个以上的条件为真,则只执行第一个条件表达式为真的CASE后的语句组,之后即转去执行ENDCASE之后的语句而不会再去判断下一个CASE中的条件。,Do case case 大学英语=90 a=a+

9、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 大学英语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当型循环语句 格式:DO WHILE ENDDO,6.11 循环结构,功能:

10、当的值为真(.T.)时,执行循环体中的语句,一旦的值为假(.F.),程序跳出循环体,转到ENDDO下一条语句继续执行。 说明: (1)如果条件永远成立,形成死循环。为了避免死循环,在循环体中必须要有语句能够改变条件表达式的值。 (2)当循环次数事先未知时,使用DO WHILE-ENDDO语句。 (3)循环体中,可以出现LOOP语句。遇到LOOP语句时,程序立即转向DO WHILE循环起始语句,而不再执行LOOP下面的循环体语句。,(4) 循环体中,可以出现EXIT语句。遇到EXIT语句时,程序立即跳出本层循环,转向逻辑上的下一条语句继续执行。设置EXIT语句,也是防止死循环的一种方法。 DO

11、WHILE 语句的流程图,例6.11 Clear LZ7 use 学生成绩 store 0 to a,b,c,d do 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 skip enddo ?a,b,c,d,STORE 0 TO C, W (LZ8)(用IF语句改写) USE ZGDA DO WHILE .NOT.EOF( ) DO CASE CASE (年龄45).AND.职称=讲师 W=W+1 CASE (年龄45) .AND.

12、职称=副教授 C=C+1 ENDCASE SKIP ENDDO ? “45岁以下的讲师人数为: ,W ? “45岁以下的副教授人数为: ,C SET TALK ON CANCEL,例6.12统计职工表中,职称是”讲师”和副教授,年龄在45岁以下的教师人数.,例6.3 求N!=123N(lzn) input n= to n s=1 i=1 do while i=n s=s*i i=i+1 enddo ?str(N,4)+!=+ltrim(str(s),循环结束 i的值是多少?,例6.14 统计学生.DBF中1979年以后出生的人数,并显示他们的记录。(lz11) SET TALK OFF CLE

13、AR USE 学生 N=0 如果已创建的数组元素个数比字段个数少,则自动扩展数组,使得数组元素个数与字段个数相等. 2.数组内容复制到当前记录 命令格式: Gather from fields 将数组中的数据复制到当前记录.,第一个数组元素复制到第一个字段,第二个数组元素复制到第二个字段,依次类推,各个数组元素与对应字段的数据类型必须一致.如果数组元素个数比字段个数少,多出的字段保持原值,如果数组元素个数比字段个数多,多出的数组元素不复制.,两条记录换位置 use 学生lz20 list dimension a(1),b(1) x=Y do while upper(x)=Y input 第一条

14、记录 to m input 第二条记录 to n go m,scatter to a go n scatter to b gather from a go m gather from b wait 继续吗(Y/N?) to x enddo,例:现有数据库DD.DBF,其结构如下:订单号 N(3,0),客户号 C(3),签单日期 D,金额 N(6,2)。数据库TJ2.DBF 结构如下:月份 N(2,0),数量 N(2,0),总金额 N(8,2) 编程序统计出各个月份所签订单的数量及其总金额,并将结果按月份的升序放在库文件TJ2.DBF。(vf5),set talk off dime a(12,2

15、) a=0 use dd do while .not. eof() a(month(签单日期),1)=a(month(签单日期),1)+1 a(month(签单日期),2)=a(month(签单日期),2)+金额 skip enddo,i=1 use tj1 do while i0 appe blank repl 月份 with i,数量 with a(i,1),金额 with a(i,2) endif i=i+1 enddo list sort on 金额 to tj2 use tj2 list,现有数据库学生成绩.dbf,有如下结构:lz21 学号(c,8),姓名(c,8),大学英语(n,

16、4),语文(n,4),数学(n,4)。编程序统计出每10分间隔的三门功课的人数,并以下列形式显示: 分数段 大学英语人数 语文人数 数学人数 09 * * * 1019 * * * 2029 * * * . 90100 * * *(vf11),use 学生成绩 dime s(10,3) s=0 do 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 skip enddo

17、clear,?分数段 英语人数 语文人数 数学人数 i=1 do while i=10 ?str(i-1)*10,2)+-+str(i*10-1,3) j=1 do while j=3 ?s(i,j) j=j+1 enddo i=i+1 enddo retu,例6.28 求100200之间的所有素数之和。 SUM=0 FOR I=101 TO 199 STEP 2 也可以放在一个文件内,此时,在子程序的开头要有Procedure,6.12 子程序,三、子程序调用语句 调用语句格式:DO WITH 说明:WITH 是可选项,用于主程序与子程序之间的参数传递。实参表中的各项可以是常量,变量或一般表

18、达式,互相用逗号分开。 四、子程序返回语句 返回语句格式:RETURN TO MASTER 说明:执行子程序时,遇到RETURN 命令,就返回到上一级子程序或主程序中的子程序调用命令的下一条语句继续执行。遇到RETURN MASTER命令,就径直返回主程序。通常子程序的最后一条语句是RETURN。如果缺省RETURN,程序执行到最后,自动执行RETURN语句功能,返回主调程序。,下图6-37是子程序嵌套调用时的程序执行过程示意图。,Sub1.prg,Sub2.prg,sub3,Main.prg,例6.32 求3!+5!+8! * lz26.PRG(P、N必须在主程序中定义 STORE 0 TO

19、 SUM,P N=3 DO JC & 调用子程序JC.PRG SUM=SUM+P & Sum的值是3! N=5 DO JC & 再次调用子程序JC.PRG SUM=SUM+P N=8 DO JC & 第三次调用子程序JC.PRG SUM=SUM+P ? 3!+5!+8!= ,SUM CANCEL,Procedure jc P=1 FOR I=1 TO N P=P*I ENDFOR RETURN,JC.PRG(子程序) P=1 FOR I=1 TO N P=P*I ENDFOR RETURN 注:主程序负责三次调用子程序以及计算总和,子程序负责计算N!。主程序每次调用子程序时都给定N的值,子程序

20、对给定的N值求N!,结果存入变量S。主程序执行时,遇到DO JC语句,程序转入子程序。执行子程序语句时,遇到RETURN语句,程序又返回到主程序DO JC的下一条语句继续执行。,例:main.prg wait “下面调用子程序” do sub1 “00000” wait “又返回到主程序” retu sub1.prg ?1111111 do sub2 ?1111111 Retu sub2.prg ?2222222 retu 注意:sub11 sub2必须是单独的文件。,例:main.prg wait “下面调用子程序” do sub1 wait “又返回到主程序” retu procedure

21、 sub1 ?1111111 do sub2 ?1111111 Retu Procedure sub2 ?2222222 retu 注意:主程序和子程序可以放在一个文件内。 若把sub2.prg中的retu 改成retu to master,结果是什么?,五、子程序的参数传递 格式一:do with ,, 格式二: (,) 子程序中格式: parameters , (,) 注意:parameters 必须是被调用程序的 第一条语句,而且参数的个数和数据类型必须和被调用语句的参数相一致。 调用语句中参数可以是常量、已赋值的变量、或表达式。 在调用时参数传递关系如下:,(1)按值传递方式:实参的值

22、只能传递给形参变量,而形参变量的值不会传递给实参变量,当形参变量的值改变时,不会影响实参变量的值,实参和形参占用不同的内存空间。 过程名 (,) 括号不能省 过程名 (,) parameters (,) (2)引用传递方式:传递实参变量的内存地址,实参变量和形参变量实际上为同一个内存单元,尽管变量名可以不同, 如果形参变量的值改变,那么实参变量的值也会跟着改变。引用传递属于双向传递。,do 过程名 with , 过程名 (,) parameters (,) (1)如果某个实参变量用一对圆括号括起来,不管采用哪种调用格式,这个实参变量总是按值传递. (2)实参是表达式或者常量时是按值传递。 (3

23、)在两种调用格式 下,对应的实参变量和形参变量的名字可以相同,也可以不相同.,例: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 y=t retu,例:编程求1!+2!+N! *jch.prg para

24、 s,t s=1 i=1 do while i=t s=s*I i=i+1 enddo return *vf13.prg,set 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=” ,w,STORE 100 TO X,Y lz27 PP(X,Y) ?按值传递方式:,x,y do pp with (x),(y) ?按值传递方式:,x,y do pp with x+5,y+5 ?按值传递方式:,x,y do pp with x ,y ?引用传递方式:,x,y do pp

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

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

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

28、 在命令窗口中建立的变量和数组均为全局变量和全局数组,但这些全局变量和全局数组不能在程序中引用。 用PUBLIC定义的全局变量和数组在整个程序运行过程中始终有效,始终占有存储单元。即使程序运行结束,系统也不会自动释放全局变量。删除全局变量只能用RELEASE 或CLEAR ALL等命令。 若同一模块中有同名的各种变量,则优先次序为: 本地变量 私有变量 全局变量,求n到m的和 clearlz29 Input “m=” to m Input “n=“ to n Do sum1 ?”M+N的值为:”,s Procedure sum1 S=0 For i=n to m s=s+I Endfor ?”

29、中间结果:”,s Return,S是在子程序中开辟的变量,有效范围仅在子程序,返回到主程序时,已经从内存中消失。,()同名变量被隐藏 某级程序中使用的 局部变量,有可能和上级程序中的局部变量同名,为了避免混淆,可在子程序中用private 命令定义本级程序专用的局部变量。用private命令定义的变量,能把上级同名的变量暂时隐藏起来,彼此互不影响,子程序运行结束后,在本级程序建立的同名变量即被清除,而被隐藏的上级程序中的同名变量即被恢复出来,而且保留原值不变。 命令格式:private ,例:set talk off a=1 b=2 do sub ?”主程序:”,a,b retu proc s

30、ub private b a=100 b=200 ?”子程序:”,a,b retu,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*2 Retu,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,x3 x2=x1+x3 c1=x2+x3 b1=b1+1 private b

31、1 b1=c1*x2 return,1内部过程 定义格式: PROCEDURE PARAMETERS |LPARAMETER RETURN ENDPROC 调用语句格式: DO WITH 说明: (1)内部过程是作为程序中的一个独立单位出现的。它可以完成某种操作或某种运算,通常安排在本程序的后面,供本程序调用。 (2)若定义中有PARAMETERS |LPARAMETER ,称为有参过程,否则称为无参过程。有参过程的PARAMETER命令必须是第一条可执行命令,其形参(也叫虚参)最多27个。为了使过程的功能更强大,适应性更广,过程中应多使用形参。,6.3.2 过程,(3)用PARAMETERS

32、 声明的形参变量被视为私有变量;用LPARAMETERS 声明的形参变量被视为局部变量。 (4)实参表中的各项可以是常量,变量或一般表达式,互相用逗号分开。形参表中只能是内存变量,称为形参变量。 (5)RETURN语句表示控制返回到调用语句的下一条继续执行。后跟表达式,同时返回表达式的值;不跟表达式,则返回逻辑值.T.。若缺省RETURN,则在过程结束处自动执行一条隐含的RETURN语句。 (6)PROCEDURE为过程起始语句,ENDPROC为过程结束语句。若省略ENDPROC,过程结束于下一条PROCEDURE语句或程序文件尾。 (7)有关参数传递 调用过程时,靠虚实结合进行参数传递。每个

33、实参的值按次序一一传送给虚参变量。虚实结合是按次序而不是按名称逐一结合的。通常实参个数与虚参个数相等,形参个数多于实参个数,多余的形参取初值.F.。 虚实结合时,如果实参为常量或表达式,按值单向传送;如果实参为变量,按地址传递。 若用内存变量作实参但又不要值的回传,则可将实参变量放在一对圆括号内,使之成为表达式。,例6.34 在程序中多次调用内部过程LINE, 画一条由30个“-”组成的直线。 USE XSDA DO LINE FOR I=1 TO 3 DISP FIEL 学号,姓名,性别,住校否 OFF DO LINE SKIP ENDFOR USE CANCEL PROCEDURE LIN

34、E FOR J=1 TO 30 & 不能使用I作为循环变量 ? - ENDFOR RETURN ENDPROC,例6.35 为使上述过程LINE的功能更强,适应性更广,可以增加两个虚参。 FOR I=1 TO 3 WAIT 输入一个字符: TO C INPUT 输入字符的个数 TO N DO LINE WITH C,N ENDFOR CANCEL PROCEDURE LINE PARAMETERS CH,M FOR J=1 TO M ? CH ENDFOR ? RETURN ENDPROC,例6.36 利用内部过程计算多边形的面积。 S=0 & 实参S必须有确定的值 AREA=0 DO TRI

35、ANGLE WITH 6.1,6.2,8.6,S AREA=AREA+S DO TRIANGLE WITH 8.6,7.8,2.4,S AREA=AREA+S DO TRIANGLE WITH 7.8,4,4.5,S AREA=AREA+S ?多边形的面积为,STR(AREA,6,2) CANCEL PROC TRIANGLE & 完成已知三边求面积的计算功能 PARA X,Y,Z,S & 利用形参变量S回传三角形面积 L=(X+Y+Z)/2 S=SQRT(L*(L-X)*(L-Y)*(L-Z) RETURN ENDPROC,多边形面积,A,B,C,D,6.1,6.2,8.6,2.4,4.5,

36、4.0,E,2外部过程 内部过程只能被本程序中的调用语句调用。外部过程是将一个过程写成一个程序文件,任何程序都可以通过调用语句对它进行调用,通用性强。 外部过程的过程名实际上就是被调用的文件主名。程序文件中的第一条语句是PROCEDURE ,这里的必须与文件主名相同,也不能省略,否则出错。PROCEDURE 这条语句可以省略,于是形式上就与前面说的子程序吻合了。 如果内部过程的过程名与外部过程的文件主名相同,调用时系统执行的是内部过程。,3过程文件 外部过程的通用性是强了,但当一个大型应用程序要调用多个外部过程时,要进行多次读盘操作,速度受影响,效率降低。另外,系统允许同时打开的文件数是有限制的。过程文件可以很好地解决这个问题。 过程文件中包含多个过程,其建立方法与一般程序文件的建立方法相同,扩展名也是.PRG。过程文件不能运行,只能打开。一旦打开,其中的所有过程均成为内部过程,供程序调

温馨提示

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

评论

0/150

提交评论