




已阅读5页,还剩81页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章 Visual FoxPro程序设计,7.1 程序与程序文件,Visual FoxPro支持两种程序设计: 结构化程序设计(面向过程的编程方式) 面向对象的程序设计,7.1.1 程序,1. 程序的概念 程序是命令的有序集合 程序以文本文件的形式存储在磁盘上,称为程序文件 程序文件的扩展名为 .prg,2. 程序方式与交互方式的区别 程序可完成复杂的任务,命令只能完成简单任务 命令不被保存,程序可长期保存并可多次修改和运行 一个程序中可以调用其他程序,命令则不能,7.1.2 程序文件的建立、编辑、保存和运行,1建立和编辑程序文件 (1)命令方式 格式:modify command 说明:扩展名.prg可以省略,由系统自动添加。 (2)菜单或工具栏方式,7.1.2 程序文件的建立、编辑、保存和运行,2保存程序文件 保存:菜单或工具栏按钮、关闭窗口、组合键【Ctrl +W】 【ESC】或【Ctrl +Q】放弃当前修改,7.1.2 程序文件的建立、编辑、保存和运行,3程序文件的运行 (1) 命令方式运行程序 格式:DO With 说明:文件名可以是.prg文件,也可以是其他类型文件 如:.exe、.mpr、.qpr, 所以要加上扩展名。 (2) 菜单或工具栏方式运行程序,7.1.3 程序中常出现的错误,遗漏关键字和变量之间的空格 遗漏定界符,或定界符使用了中文标点符号 关键字、变量名和文件名拼写错误 内存变量没有初始化 表达式和函数中的数据类型不匹配 控制语句缺少结束语句 控制语句嵌套错误,7.2 程序中常用的命令,7.2.1 基本输入命令,1Input命令 格式:INPUT 提示信息 TO 功能:从键盘上接收数据(可为任何类型)赋给内存变量 说明: 提示信息要使用定界符定界,提示信息可以省略 不能不输入任何内容直接按回车键 输入的字符数据需加定界符,输入日期数据时加大括号 ,输入逻辑值时加圆点定界符( )。 举例: input to AA input “请输入学生姓名: “ to name input “请输入该生的出生日期:“ to birth Input “请输入该生的党员值:“ to 党员,2Accept命令 格式:ACCEPT 提示信息 TO 功能 字符串接收命令,仅从键盘上接收字符型数据并赋给内存变量。 输入的字符串不加定界符,否则,系统会认为定界符也是输入字符串本身的一部分。 如果想输入123,此时的123也是字符型数据不能用于计算。 举例: accept “请输入学生证号“ to no accept to ab accept “请输入学生姓名“ to XM,3Wait 命令 格式:WAIT 提示信息 TO Window Timeout 功能:等待用户按键盘上任一个键。 说明 省略提示信息后,系统默认为提示“按任一键继续”。 wait to x 用于保存用户按键的字符,可省略此项。 如指定Window项,主窗口的右上角会出现一个Wait提示窗口,来显示提示信息,否则显示在屏幕工作中。 如指定Timeout 项,用于设定等待时间,Timeout 为间隔秒数,一旦超时,系统自动往下执行。 wait “请输入一个字母“ to m window timeout 3,【例7-1】输入任意一个数据,判断该数的数据类型。 程序如下: CLEAR INPUT “请输入任意类型的一个数据” TO X ? X , “的数据类型为:” , VARTYPE(X) 第一次运行: 请输入任意类型的一个数据:123 第二次运行: 请输入任意类型的一个数据:“123“ 第三次运行: 请输入任意类型的一个数据:.T. 第四次运行: 请输入任意类型的一个数据:1991-05-03,【例7-2】查询学生表中某些学生的信息。 程序如下: USE 学生.DBF ACCEPT “请输入您要查询的学生姓名“ TO NAME LOCATE FOR 姓名=NAME DISP WAIT “您还要查询其他内容?” WINDOW TIMEOUT 5 INPUT “请输入您要查询的学生的身高“ TO HEIGHT LOCATE FOR 身高=HEIGHT DISP USE RETURN,7.2.2 基本输出命令,1表达式输出命令 格式:? | ? , 功能:对一个或多个表达式求值, 并将结果输出到系统主窗口上。 说明:? :表达式的值换行显示; ? :表达式的值不换行显示; ? :单个?表示需要光标换行。 举例: ? 3+4, date() , 67 use 学生表 ? 姓名, 性别, 出生日期 ? ?姓名, 身高, 体重,2文本输出命令 格式:Text EndText 功能:将文本信息输出在屏幕上。 说明:Text 和EndText必须成对出现。 举例: text 系 统 主 菜 单 1. 数据输入 2. 数据查询 3. 数据统计 4. 退出系统 endtext,7.2.3 定位输入输出命令,1定位输出命令 格式: SAY 功能:在屏幕指定位置输出表达式的值。 说明:指定了输出的位置。标准屏幕是25行80列,左上角顶点为(0,0),右下角坐标为(24,79)。行、列都可以为表达式,还可为小数。 举例: 10,10 say “hello!“ 15, 20 say “how are you!“ 20, 35 say “大家好!“,2定位输入命令 格式: SAY (提示信息) GET READ 功能:在屏幕指定位置接收键盘输入的新值 说明 SAY子句:用于显示提示信息,提示信息加定界符 GET子句:用于为显示变量的值,并允许输入新值 GET子句中的变量必须有确定的初值 初值决定了该变量的类型和宽度 READ:使GET后的进入编辑状态; 让光标自动跳到该变量值所在位置上等待编辑修改; 可在多个定位输入命令后面使用一个read语句。,clear name=“张晓磊“ grade=98.6 birth=2002-09-07 团员=.t. 0,10 say “name“ get name read 1,10 say “grade“ get grade read 2,10 say “birth“ get birth read 3,10 say “团员“ get 团员 read ?name, grade, birth, 团员,clear use 学生表 go 2 0,10 say “姓名:“ get 姓名 1,10 say “性别:“ get 性别 2,10 say “出生日期:“ get 出生日期 3,10 say “党员:“ get 团员 3,10 say “身高:“ get 身高 read,7.2.4 清屏命令,格式: CLEAR 功能:清除屏幕或窗口中的显示内容, 光标回到屏幕左上角。,7.2.5 终止程序执行和返回命令,1Cancel 终止程序执行,关闭所有打开的程序,返回命令窗口。 2Return 结束当前程序执行,返回到调用它的上一级主程序,若无上级程序则返回命令窗口。 3Quit 退出Visual Foxpro系统。,7.2.6 MessageBox( )函数,1. 语法格式:MESSAGEBOX (提示信息, 对话框的属性, 对话框窗口标题) 2. 功能:显示一个自定义的对话框。常用作提示之用, 也可作一些简单的选择,比如“确定”、“取消”等 3. 举例:messagebox(“请选择“, 32+3+0 , “测试“) 4. 说明: (1)提示信息:对话框中所用到的提示文字。,(2)对话框的属性: MESSAGEBOX(提示信息 , 对话框的属性 , 对话框窗口标题) 例如:messagebox(“请选择“, 32 + 3 + 0 , “测试“),设置图标,设置按钮属性,设置默认按钮,(3) 对话框窗口标题 MESSAGEBOX(提示信息 , 对话框的属性 , 对话框窗口标题) 例如:messagebox(“请选择“, 32 + 3 + 0 , “测试“) (4) 返回值:该函数执行后有返回值,类型为数值型 n=messagebox(“请选择“, 32 + 3 + 0 , “测试“) ?n,7.3 程序的基本控制结构,程序的概念 命令(或语句)的有序集合,以文件(.prg)形式存储 一个程序一般包括三个部分: 数据定义或输入部分 数据处理部分 数据输出部分 程序的三种基本控制结构: 顺序结构 选择结构 循环结构,7.3.1 顺序结构,顺序结构程序的含义 按语句排列的先后顺序,从上到下依次执行各语句。 每个语句执行一次,且只执行一次。 【例7-3】编程计算圆的周长和面积。 Clear Input “请输入圆的半径“ To R Pi=3.14 L=2*PI*R S=PI*R*R ?“圆的周长为:“ , L ?“圆的面积为:“ , S Return,输入半径R的值,定义圆周率变量pi,计算周长L和面积S,输出L和S的值,清屏幕,【例7-4】查询学生表中所有男同学和女同学的学生证号,姓名,性别和年龄,并分别显示男同学和女同学的信息。 程序分析: clear use 学生表 ?“男同学的信息“ disp 学生证号,姓名,性别,; (year(date()-year(出生日期) ; for 性别=“男“ ?“女同学的信息“ disp 学生证号,姓名,性别,; (year(date()-year(出生日期) ; for 性别=“女“ use,打开学生表,提示先显示男同学信息,逐页显示男同学信息,关闭打开的表,清屏幕,提示先显示女同学信息,逐页显示女同学信息,7.3.2 选择结构,选择结构又称分支结构,它是在程序执行过程中,通过判断某些条件是否成立来控制程序走向的程序结构。 分支程序结构的分类: 单(向)分支 双(向)分支 多(向)分支,1单(向)分支,格式: IF ENDIF 功能:若成立, 则执行; 否则执行ENDIF后面的语句。 说明: IF 和ENDIF必须成对出现。 是一个逻辑值表达式。 可以是多条语句的集合。,clear input “请输入一个正整数“ to x if x0 ?“输入的是正整数“ ?“x=“ , x endif return,【例7-5】判断一个数是正负、负数、还是零。 程序分析: Clear Input “请输入一个数“ to N If N0 ?“是正数。“ Endif If N0 ? “是负数。“ Endif If N=0 ? “是零。“ Endif,【例7-6】在学生表中根据所输入的学生证号查找该学生记录。 程序分析: Clear Use 学生表 Accept “请输入所要查找的学生证号:“ TO XSZH Locate For 学生证号=XSZH If Found() Disp EndIf Use Return,2双(向)分支,格式 IF ELSE ENDIF 功能:若条件成立, 则执行, 否则执行。 说明: IF 和ENDIF必须成对出现; ELSE 本身占一行。,【例7-7】用双分支实现判断一个数的正负。 程序分析: Clear Input “请输入一个数“ to N If N=0 ?“是正数。“ Else ?“是负数。“ Endif ?“程序运行结束“ RETURN,是正数,N=0,否,是,是负数,输入一个数,程序运行结束,分支语句的嵌套 IF IF ELSE ENDIF ELSE IF ENDIF ENDIF,Clear Input “请输入一个数“ to N IF N0 ?“是正数。“ ELSE IF N=0 ?“是零。“ ELSE ?“是负数。“ ENDIF ENDIF ?“程序运行结束“ RETURN,Clear Input “请输入一个数“ to N IF N=0 IF N0 ?“是正数。“ ELSE ?“是零。“ ENDIF ELSE ?“是负数。“ ENDIF ?“程序运行结束“ RETURN,【例7-8】在学生表中根据所输入的姓名查找该学生记录 程序分析: Clear Use 学生表 Accept “请输入所要查找的姓名:“ TO XM Locate For 姓名=XM If Found( ) Disp ELSE ?”查无此人!” EndIf Use Return,显示当前记录,找到?,否,是,显示查无此人,按XM查找记录,关闭表,打开学生表,输入要查找的姓名-XM,3多(向)分支,格式: DO CASE CASE CASE CASE OTHERWISE ENDCASE,【例7-9】根据所输入的日期判定今天是星期几。 程序分析: 输入日期 INPUT 根据日期判断星期几 DOW(日期变量) 程序结构分析: 单分支 双分支 多分去,Input “请输入今天日期:“ To D IF DOW(D)=1 ?“日期日“ ENDIF IF DOW(D)=2 ?“日期一“ ENDIF IF DOW(D)=3 ?“日期二“ ENDIF IF DOW(D)=4 ?“日期三“ ENDIF IF DOW(D)=5 ?“日期四“ ENDIF IF DOW(D)=6 ?“日期五“ ENDIF IF DOW(D)=7 ?“日期六“ ENDIF,【例7-9】根据所输入的日期判定今天是星期几。 程序分析: 输入日期 INPUT 根据日期判断星期几 DOW(日期变量) 程序结构分析: 单分支 双分支(嵌套) 多分去,Input “请输入今天日期:“ To D IF DOW(D)=1 ?“日期日“ ELSE IF DOW(D)=2 ?“日期一“ ELSE IF DOW(D)=3 ?“日期二“ ELSE IF DOW(D)=4 ?“日期三“ ELSE IF DOW(D)=5 ?“日期四“ ELSE IF DOW(D)=6 ?“日期五“ ELSE IF DOW(D)=7 ?“日期六“ ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF,【例7-9】根据所输入的日期判定今天是星期几。 程序分析: 输入日期 INPUT 根据日期判断星期几 DOW(日期变量) 程序结构分析: 单分支 双分支 多分去,Input “请输入今天日期:“ To D Do Case Case Dow(D)=1 ? “星期日” Case Dow(D)=2 ? “星期一” Case Dow(D)=3 ? “星期二” Case Dow(D)=4 ? “星期三” Case Dow(D)=5 ? “星期四” Case Dow(D)=6 ? “星期五” OTHERWISE ? “星期六” EndCase,Accept “请输入学生证号:“ To XSZH Use 成绩表 Locate For 学生证号= XSZH Do Case Case 期末成绩=90 ? “优秀“ Case 期末成绩=80 and 期末成绩=70 and 期末成绩=60 and 期末成绩=69 ? “及格“ Case 期末成绩60 ? “不及格“ EndCase,【例7-10】根据所输入的学生证号,,为成绩表中“期末成绩”字段的值判定等级。期末成绩在: 90分以上的为优秀, 80至89为良好, 70至79为中等, 60至69为及格, 60以下为不及格。 程序分析: 学生证号的输入 成绩的判断 分支结构,7.3.3 循环结构,循环结构(简称循环): 程序中,根据某些条件有规律地重复执行某程序段 被重复执行的程序段,称为循环体 循环体通过循环结构语句来实现循环 循环结构可以减少程序代码重复书写的工作量,使编程效率大大提高, VFP的循环结构语句主要三种 当型循环 步长型循环 表扫描型循环,命令格式1 DO WHILE 循环体语句 ENDDO,1当型循环(DO WHILEENDDO),语句功能: (1)判断是否为真(.T.),是真执行循环体语句,否则执行ENDDO后面语句 (2)执行DO WHILE和ENDDO之间的命令序列(循环体) (3)遇到ENDDO,转(1) (4)结束循环,转到ENDDO后面的语句。,【例7-11】输出至100之间所有能被3整除的数。 Clear Y=1 Do While Y=100 If mod (Y ,3)=0 ? Y EndIf Y=Y+1 EndDo RETURN,显示y值,y=100?,N,ENDDO后面语句,Y,定义变量y=1,y整除3?,Y,N,y值增1,【例7-12】把学生表所有民族为汉族的学生逐条输出。 程序PR7-12.prg如下: Clear Use 学生表.dbf Do While not EOF( ) If 民族=“汉族“ Disp EndIf Skip EndDO USE,命令格式 2 DO WHILE 命令序列1 EXIT 命令序列2 LOOP 命令序列3 ENDDO 语句功能: 在执行循环体语句的过程中遇到exit语句,立即结束循环体的执行,转到ENDDO的后面; 在执行循环体语句的过程中遇到loop语句,立即结束循环体的本次执行,转到DO WHILE处,重新判断循环条件。 EXIT和LOOP命令只能出现在循环体中,并且可以出现在循环体中的任何位置。,【例7-12-1】编写一个能多次计算任意半径的圆的周长和面积的程序,当输入的半径小于或等于 0时,停止运行。 Clear input “请输入圆的半径:“ to r Pi=3.14 L=2*PI*R S=PI*R*R ?“圆的周长为:“ , L ?“圆的面积为:“ , S,Clear R=1 do while R0 Input “请输入圆的半径:“ To R if R=0 loop endif L=2*3.14*R S=3.14*R*R ?“圆的周长为:“ , L ?“圆的面积为:“ , S enddo,Clear do while .T. Input “请输入圆的半径:“ To R if R=0 exit endif L=2*3.14*R S=3.14*R*R ?“圆的周长为:“ , L ?“圆的面积为:“ , S enddo,2步长型循环(FORENDFOR),格式: FOR = TO STEP LOOP EXIT ENDFOR| NEXT 说明: (1)、和是数值表达式 (2)值可以为正,也可以为负。省略时默认值为1。 步长值不能为0,否则造成死循环。 (3)ENDFOR 可以用NEXT代替。 (4)循环次数=INT(终值初值)步长+1,for i=1 to 1+7 sete 2 ?i endfor,2步长型循环(FORENDFOR),格式: FOR = TO STEP LOOP EXIT ENDFOR| NEXT 循环的执行过程: (1)将初值赋给循环变量, (2)循环变量与终值比较,若超过终值转(5),否则转(3) (3)执行循环体(EXIT和LOOP意义同前) (4)遇到ENDFOR子句时,循环变量自动按增值,然后转(2) (5)退出循环,执行ENDFOR后面的语句,for i=1 to 1+7 sete 2 ?i endfor,【例7-13】计算1+2+3+100=? Clear S=0 For i=1 to 100 S=S+i Next i ? “1=2+3+100=”, S RETURN,S=0 i=1 DO WHILE i=100 S=S+i i=i+1 ENDDO,【例7-14】向学生表中一次添加10条新记录。 采用循环结构,每次添加一条记录 先插入一条空记录 利用定位输入输出命令输入记录内容 Clear Use 学生表 For i=1 to 10 APPEND BLANK 2,1 SAY “学生证号:“ GET 学生证号 PICTURE “9999999999“ 4,1 SAY “姓名:“ GET 姓名 6,1 SAY “性别:“ GET 性别 8,1 SAY “出生日期:“ GET 出生日期 10,1 SAY “民族:“ GET 民族 READ ENDFOR USE,格式: SCAN FOR WHILE LOOP EXIT ENDSCAN 功能:在表的指定内扫描,查找满足的 记录并执行循环体中的命令序列。 说明: (1)默认为ALL; (2)每执行一遍循环体,指针自动下移一个记录, 并自动判断是否指向文件尾,是则结束循环, 转到ENDSCAN后面。,3表扫描型循环(SCANENDSCAN),SCAN ENDSCAN,do while not eof( ) skip enddo,【例7-15】查询学生表中所有女党员并输出。 clear use 学生表 scan for 党员 and 性别=“女“ display endscan use return 【例7-15-1】将上述程序,用当型循环改写 【例7-15-2】将上述程序,用步长型循环改写,7.4 子程序、过程与自定义函数,7.4.1 子程序 1子程序的概念 子程序与主程序: 子程序是指可以被多次反复地调用,能完成特定功能的特殊程序段,以独立的程序文件方式存储;相对而言,把调用子程序的程序称为“主程序”。 子程序的优点: 子程序是相对独立的、通用的一段代码。一个程序由若干个子程序组成,子程序独立编码和测试,子程序还可以重复使用,这样可以方便地生成程序,减少代码的编写量,并易于修改和维护程序。,7.4.1 子程序,2子程序的建立:MODIFY COMMAND 子程序文件名 3子程序的调用 调用语句格式:DO With 说明: WITH 用于主程序和子程序间参数的传递 子程序参数定义:PARAMETERS 子程序返回语句的四种格式 RETURN 返回到调用它的上一级主程序或VFP窗口 RETURN 将表达式的值返回给调用程序 RETURN TO 返回指定程序文件 RETURN TO MASTER 直接返回到第一级主程序,7.4.1 子程序,子程序调用语句的执行过程(功能) 执行调用语句时,系统将指定的子程序调入内存并执行该子程序,程序转到子程序中;当执行到子程序中的返回语句时,程序返回主程序,执行该调用语句的下一条可执行语句。,主程序: Clear Do zj1.prg Do zj2.prg Return,zj1.prg: P=1 FOR i=1 TO 100 P=P*i ENDFOR ?“100的阶乘为“ , p RETURN,Zj2.prg: S=0 FOR i=1 TO 100 S=S+i ENDFOR ?“1-100的和为“ , S RETURN,【例7-16】用子程序求任意一个数的阶乘。 Clear Input “请输入要求阶乘的数:“ To M Do JieCheng.prg With M Return *JieCheng.prg子程序* PARAMETERS N P=1 FOR i=1 TO N P=P*i ENDFOR ?N, “的阶乘为“ , p RETURN,主程序PR7-16-1.prg如下(带两个参数): Clear Input “请输入要求阶乘的数:“ To M X=1 Do JieCheng.prg With M,X ?M, “的阶乘为“ , X Return *JieCheng.prg子程序* PARAMETERS N, P FOR i=1 TO N P=P*i ENDFOR RETURN,7.4.2 过程和过程文件,1过程 过程的的概念: 过程是以PROCEDURE开头,以ENDPROC结尾的一段程序。它可以放在调用程序中,也可以独立存储为一个过程文件。 过程定义的语法格式: PROCEDURE PARAMETERS RETURN ENDPROC,【例7-17】把求任意一个数的阶乘的程序用过程来实现。 程序与过程在一个程序文件中(不带参数): Clear Input “请输入要求阶乘的数:“ To N Do JC *过程JC,也在程序PR7-17-1中 Procedure JC P=1 FOR i=1 TO N P=P*i ENDFOR ?N,“的阶乘为“,p ENDPROC RETURN,程序PR7-17-2.prg如下(带一个参数): Clear Input “请输入要求阶乘的数:” To M Do JC With M *过程JC,也在程序PR7-17-2中* Procedure JC PARA N P=1 FOR i=1 TO N P=P*i ENDFOR ?N,”的阶乘为”,p ENDPROC RETURN,2. 过程文件 过程文件:包括一个或多个过程的程序文件(.prg)。 语法格式: PROCEDURE RETURN ENDPROC PROCEDURE RETURN ENDPROC PROCEDURE RETURN ENDPROC,过程文件的建立: 与程序文件的建立方法完全相同 过程文件的打开与过程的调用 要调用过程,必须先打开包含此过程的过程文件。 打开过程文件的格式: SET PROCEDURE TO ,ADDITIVE 说明:可以打开一个或多个过程文件。 过程文件打开后,文件中所有过程都可以被调用 参数ADDITIVE表示不关闭原先已打开过程文件 过程文件的关闭 SET PROCEDURE TO 或 CLOSE PROCEDURE,【例7-18】输入任意半径,计算圆的周长,圆的面积和球的体积用过程文件实现。 程序分析: 主程序 main.prg 过程文件 pp.prg *主程序 main.prg * Clear Input “请输入半径:“ To R Set Procedure to PP.prg Do ZC With R Do MJ With R Do TJ With R Set Procedure To,* 过程文件 PP . prg * Proc ZC PARA X L=2*PI( )*X ?”周长为:”,L ENDPROC PROC MJ PARA X S=PI( )*X*X ?”面积为:”,S ENDPROC PROC TJ PARA X V=4/3*PI()*X*X*X ? “体积为:”,V ENDPROC,内容回顾,程序 例如:求任意一个整数的阶乘和1到该整数的和 子程序 过程 函数,Clear Input “请输入一个整数:“ To N P=1 FOR i=1 TO N P=P*i ENDFOR ?N, “的阶乘为:“ , p S=0 FOR i=1 TO N S=S+i ENDFOR ?“1-“, N, “的和为:“ , S RETURN,Clear Input “请输入一个整数:“ To M Set Procedure to pd.prg do pd1 with M do pd2 with M Set Procedurt to return,*过程文件pd.prg* procedure pd1 Parameters N P=1 FOR i=1 TO N P=P*i ENDFOR ?N, “的阶乘为:“ , p endproc procedure pd2 Parameters N S=0 FOR i=1 TO N S=S+i ENDFOR ?“1-“, N, “的和为:“ , S endproc,*主程序:m1.prg* Clear Input “请输入一个整数:“ To M Do sub1 with M Do sub2 with M Retrun,内容回顾,程序 例如:求任意一个整数的阶乘和1到该整数的和 子程序 过程 函数 系统函数 用户定义函数 date( ) year(date() int( 123.4) mod(23,2) bof( ) eof( ) found( ) recno( ) reccount( ),7.4.3 用户自定义函数,用户自定义的函数和系统内部函数一样,以函数的方式调用,即: 函数名() 用户自定义的函数不能与系统函数同名。 用户自定义函数的语法格式: FUNCTION PARAMETER RETURN ENDFUNC,【例7-19】用函数实现求组合 CLEAR INPUT “第一个数 : “ TO r INPUT “第二个数 : “ TO n C=JC(n) / (JC(r) * JC(n-r) ) ?“从“,n,“里取“,r,“的组合为“ , C RETURN *JC( )函数:求任意一个数x的阶乘* FUNCTION JC PARAMETERS X P=1 FOR i=1 TO X P=P*i ENDFOR RETURN P &返回 P 的值 ENDFUNC,7.4.4 参数传递和变量的作用域,1参数传递 在主程序调用子程序时,有时需要调用程序与被调用程序之间进行参数传递。调用程序用 DO WITH 把实参数据传递给被调用程序中的形参数据,被调用程序中用 PARAMETERS 来接收参数。,*主程序:m1.prg* Clear Input “请输入一个整数:“ To M Do sub1 with M Retrun,*sub1.prg* paramerters N P=1 FOR i=1 TO N P=P*i ENDFOR ?N,“的阶乘为“ , p Return,(1) 参数传递在VFP中分为两种方式,第一种参数传递方式:按值传递 将实参值的副本传递给形参,形参值的改变不影响实参变量的值。 第二种参数传递方式:按地址(引用)传递 将实参的地址传给形参,此时形参变量和实参变量同用一个地址内数据,形参的改变直接影响实参值。 参数传递方式的设置: SET UDFPARMS TO VALUE | REFERENCE 其中:VALUE表示按值传递, REFERENCE表示按地址传递。,(2) 两种格式进行带参调用:,第一种调用方式 格式1:DO WITH 说明:如果实参是非变量的常量或表达式即具体值, 此时的参数传递为按值传递;但如果实参是 变量,这时是按地址传递 第二种调用方式 格式2: () 说明:默认情况下都按值传递,如果想要按地址传递 可用命令SET UDFPARMS重新设定。 SET UDFPARMS TO REFERENCE,Clear ?“采用格式2的参数传递“ Y=1 ?“ 格式2按值传递“ PP(Y) ?“ 外部“,Y ?“-“ Y=1 Set UDFPAR To REFERE ?“ 格式2按地址传递“ PP(Y) ?“ 外部“,Y ?“#“ ?“采用格式1的参数传递“ Y=1 ?“ 格式1按地址传递“,DO PP WITH Y ?“ 外部“,Y ?“-“ Y=1 Set UDFPARMS To Values ?“ 格式1按值传递“ DO PP WITH Y ?“ 外部“,Y ?“-“ Y=1 ?“ 格式1常量按值传递“ DO PP WITH 1 ?“ 外部“,Y ?“-“ RETURN,*过程PP* PROC PP PARA X X=2*X+1 ?“ 内部“,X RETURN ENDPROC,【例7-20】两种格式、两种方式的参数传递应用。,采用格式2的参数传递 格式2按值传递 内部 3 外部 1 格式2按地址传递 内部 3 外部 3 # 采用格式1的参数传递 格式1按地址传递 内部 3 外部 3 格式1按值传递 内部 3 外部 3 格式1按常量按值传递 内部 3 外部 1,7.4.4 参数传递和变量的作用域,2变量作用域 (1) 变量的作用域:是指变量作用的有效范围。 (2) 按变量的作用域来划分, 变量可分为种: 全局变量(public) 私有变量(private) 本地变量(local), 全局变量PUBLIC 在所有程序模块中都有效的内存变量 全局变量在程序或过程结束后不会自动释放,必须使用RELEASE或CLEAR MEMORY命令才能释放。 全局变量的作用域为从定义点开始,到退出FoxPro时所执行的所有的程序或过程。 全局变量须先说明(定义)后使用,通常在主程序中定义,也可在子程序中定义,还可在命令窗口中定义。 格式:PUBLIC 举例:public a, b , c 说明:变量被说明时即被产生,同时赋初值.F., 私有变量PRIVATE 在建立它的程序模块以及该程序嵌套调用的各级子程序中使用的内存变量。 局部变量一旦离开定义它们的程序,就将失去意义。 程序中没有被说明为全局的内存变量,都被看成是局部变量。 局部变量也可以用PRIVATE来说明。 格式1: 格式2:PRIVATE ALL LIKE/EXCEPT 说明:变量被说明的同时并不产生变量,当第一次被赋值时才产生。没被说明,但在程序中被赋初值,系统默认其为单元的局部变量(隐式说明)。在主程序中说明的局部变量其作用域等同于整个程序的全局变量。, 本地变量Local 用Local定义的本地内存变量只能在定义它的程序模块中存在,一旦定义它的程序运行完毕,本地变量就会从内存中释放。其它程序中不能访问本地变量。,【例7-21】全局变量、 局部变量及其作用域示例。 *主程序* CLEAR CLEAR MEMORY Public A1 A1=“1“ DO 子程序1 ?“主程序中内存变量有:“ LIST MEMORY LIKE A* RETURN,PROCEDURE 子程序1 PUBLIC A2 A2=“2“ PRIVATE A3 STORE “3“ TO A1,A2,A3 ?“子程序1中第一次显示内存变量“ LIST MEMORY LIKE A* DO 子程序2 ?“子程序1中第二次显示内存变量“ LIST MEMORY LIKE A* RETURN PROCEDURE 子程序2 PRIVATE A2 LOCAL A4 STORE 4 TO A1,A2,A3,A4 ?“子程序2中第一次显示内存变量“ LIST MEMORY LIKE A* RETURN,子程序1中第一次显示内存变量 A1 Pub C “3“ A2 Pub C “3“ A3 Priv C “3“ 子程序2中第一次显示内存变量 A1 Pub N 4 A2 (hid) C “3“ A3 Priv N 4 A4 本地 N 4 A2 Priv N 4 子程序1中第二次显示内存变量 A1 Pub N 4 A2 Pub C “3“ A3 Priv N 4 主程序中内存变量有: A1 Pub N 4 A2 Pub C “3“,程序填空,*- *【程序填空】 *- *功能: 下面程序是计算1+3+5+99之和的程序。 * 请在【】处添上适当的内容,使程序完整。 *- SET TALK OFF *SPACE* 【?】 *SPACE* FOR I=1 TO 99 【?】 S=S+I ENDFOR *SPACE* ?“结果=“,【?】 SET TALK ON RETURN,答案: =(答案1)= s=0 =(答案2)= step 2 =(答案3)= s =或= str(s) =或= str(s,4),*- *【程序填空】 *- *功能:依次显示XSDB.DBF数据表中的记录内容。请在【】处添上适当 * 的内容,使程序完整。 *- SET TALK OFF *SPACE* 【?】 *SPACE* DO WHILE【?】 DISP *SPACE* 【?】 ENDDO USE SET TALK ON RETURN,答案: =(答案1)= use xsdb =(答案2)= .not. eof() =或= !eof() =或= not eof() =或= Eof() != .T. =(答案3)= SKIP,*- *【程序填空】 *- *功能: 现有职工工资库文件GZ.DBF和职工档案DA.DBF。 * 要求对职工工资库文件中的“基本工资”、“应发工资” * 、“扣款工资”和“实发工资”的字段进行赋值。 * 请在【】处添上适当的内容,使程序完整。 *- SET TALK OFF CLEAR SELE A USE GZ INDEX ON 编号 TO GZBHSY SELE B USE DA *SPACE* INDE ON 【?】 TO DABHSY SELE A *SPACE* UPDA ON 编号 FROM DA REPL 基本工资 WITH 【?】 *SPACE* 【?】 应发工资 WITH 基本工资+奖金,扣款合计 WITH 水费+电费+房租费,实发工资 WITH 实发工资-扣款合计 LIST CLOSE DATABASE SET TALK ON RETURN,答案: =(答案1)= 编号 =(答案2)= B.基本工资 =或= B-基本工资 =(答案3)= REPL ALL,程序改错,*- *【程序改错】 *- *题目:表XSDA.DBF结构为:学号(C,6),姓名(C,6), 性别(C,2),入学成绩(N,6,2)。 本程序实现按学号查找记录,直到输入“#“为止。 *- *注意:不可以增加或删除程序行,也
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 春季养生义诊活动方案策划
- 格瓦斯整合营销方案
- 小型房地产企业管理制度
- 儿童秋衣秋裤活动方案策划
- 十月营销推广方案模板
- 铃木摩托车营销方案模板
- 人造草坪组织施工方案
- 天津趣味跑活动策划方案
- 成华区商业咨询方案公示
- 2025年注册会计师(CPA)考试会计科目真题再现试卷及解析
- 养老机构行政值班查房记录表格
- 中国服用过兴奋剂运动员名单 兴奋剂真的是毒品吗
- 小学英语语法时态讲解与归纳
- 《生存与修炼》熊厚音讲《道德经》教学文案
- 产教融合校企合作[可修改版ppt]课件
- 练习太极拳的三个阶段
- 华为供应商质量管理体系考察报告(全)
- 冶金工业清洁生产的主要途径(共82页).ppt
- 清洁生产实施的主要方法和途径
- 光刻工艺光刻对准
- 热力公司热计量远程抄表系统技术规范(2012.11.21)
评论
0/150
提交评论