1、第 十 章 结构化程序设计,本章主要内容: 程序设计基础知识 程序文件的建立、编辑和运行 程序中的常用命令(重点、难点) 结构化程序设计(重点、难点)顺序结构、分支语句和循环语句数组的使用过程与自定义函数程序调试方法(了解),编写程序test7,显示入学成绩分别前三名和后三名的同学的学号、系名称、姓名、入学成绩和计算机成绩。,sele a use department inde on 系别号 tag ixbh sele b use score inde on 学号 tag ixh sele c use student inde on 入学成绩 tag icj desc set rela to
2、系别号 into a set rela to 学号 into b addi list next 3 fiel 学号,a.系名称,姓名,入学成绩,计算机 go bott skip -2 list next 3 fiel 学号,a.系名称,姓名,入学成绩,计算机,思考:如何计算圆面积。,1、算法 1)算法的概念算法:解决问题的具体方法及步骤。程序:按特定顺序组织在一起的若干指令的集合。(计算机能够执行的算法)程序 = 算法 + 数据结构数据结构:包括数据间的逻辑结构和数据存储的物理结构。,2)算法的特点,有限性:步骤有限,每一步的执行时间有限。 可行性:算法的每一步都是可行的。 确定性:算法的每一
3、步均是明确的。 输入:算法执行所需的外界数据,一般需要。 输出:算法的执行结果,必须要。,3)算法的表示,自然语言:日常生活中使用的语言 伪代码:介于自然语言与高级语言之间的文字 流程图:采用带箭头的线段表示算法的执行过程,例:计算 S=8!自然语言:求S=1234. 8,流程图:,伪代码:初始化S=1,i=1循环:当 i8 时退出,否则执行 S=Si,i=i+1输出S的值,结束。,开始,S=1,i=1,判断i=8,输出S,S=Si i=i+1,Y,N,结束,例:将十进制正整数 m转换为二进制数 伪代码: 读入十进制数m,初始化i=0 循环:当m0i=mod(m/2) m=int(m/2)输出
4、i 结束循环 结束,开始,输入m,i=0,判断m0,输出i,i=mod(m/2) m=int(m/2),Y,N,结束,2、结构化算法 1)三种基本结构:,顺序结构,A,B,分支结构,P,A,B,Yes,No,循环结构(当型),P1,A,No,Yes,循环结构(直到型),P2,A,No,Yes,P1是进入循环的条件,P2是退出循环的条件,2)NS图:,顺序结构,A B,分支结构,P Yes NoA B,当 P1A,A直到 P2,当型循环,直到型循环,例如:求S=8!,S=1 i=1 当 i=8S=Si i=i+1 输出S,3、怎样设计结构化算法 1)模块化:将一个大的任务分解成若干个小的部分,每
5、个小部分承担一定的功能,即功能模块。 2)自顶向下:就是从整体出发,将问题自上而下逐层分解。 3)逐步求精:从大致考虑到细化。,应用程序:为完成某项任务所需执行的命令序列, 这些命令按照一定的结构有机地组合在一 起,并以文件的形式存储在磁盘上,又称为 命令文件 (.PRG),应用程序的组成: 前言:注释语句 * 或 & 设置区:设置程序的运行环境,多由SET命令实现。 程序体:所有命令序列,一般包括数据的输入输出、数据的处理以及结果输出等命令。 整理部分:如关闭各种文件。 程序的退出:设置有关命令关闭文件返回到命令窗口状态或操作系统状态。,10.2 建立和运行程序文件的方式 10.2.1 使用
6、菜单方式 10.2.2 使用项目管理器 10.2.3 命令方式 1.建立或编辑程序 格式:MODIFY COMMAND 盘符:路径 程序文件名 功能:在指定盘符指定路径下建立程序文件。 说明:程序文件扩展名为.PRG,在建立与编辑时可省略 例 在D盘学生管理文件夹中建立名为abc的程序文件modify command d:学生管理abc,2.运行程序 格式:DO 盘符:路径 例 执行D盘学生管理中的ABC.PRG文件。DO d:学生管理ABC 3.程序结束命令 Return :控制返回到调用程序 Cancel :控制返回到命令窗口 Quit :退出vfp程序,10.3 程序中常用命令 10.3
7、.1 系统状态设置命令 (1) SET TALK ON / OFF 功能:在屏幕上显示或关闭命令执行的响应信息。 (2) SET SAFETY ON / OFF 功能:设置在文件将要被修改或覆盖时显示或不显示提示。 (3) SET DELETED ON / OFF 功能:是否显示带有逻辑删除标记(*)的记录。on:不显示 off:显示(默认),(4) SET DEFAULT TO 功能:设置输入输出操作的缺省驱动器 例 SET DEFAULT TO d:学生管理 (5) SET FILTER TO 功能:只筛选出满足条件表达式中的记录,方便以后操作;其它记录被隐藏。 例 set filter
8、to 性别=“女” 以后对表记录的所有操作都将只针对女生进行 (6) SET EXACT ON / OFF 功能:设置在进行字符串比较时需不需要准确的匹配,(7) SET HEADING ON / OFF 功能: 设置用LIST,DISPLAY时,在字段上方是否显示字段名。 (8) SET ESCAPE ON/OFF (9) SET PATH TO Path 功能: 设置搜索路径 (10) SET CONSOLE ON /OFF 功能: 设置打开或关闭屏幕显示,10.3.2 交互式数据输入命令 1)字符串接收命令 格式:ACCEPT 提示信息 TO 功能:接收键盘数据给内存变量。提示信息必须是
9、字符串,注意加定界符 注意:只能接收字符型。 2)数据输入命令 格式:INPUT 提示信息 TO 功能:接收键盘数据给内存变量。 注意:1)接收数值型、字符型、日期型、逻辑型。 2)接收数值型以外的数据时需用定界符。,*ex.prg 根据学号显示学生信息 SET TALK OFF CLEA USE D:学生管理student ACCEPT “请输入待查学号” TO No LOCA FOR 姓名=No ?“学号:”+学号 ?“入学成绩:”+STR(入学成绩,5,1) USE,*ex.prg 求圆的面积SET TALK OFFCLEAINPUT “请输入半径R=” TO RS=3.14*R2?“所
10、求面积S=”, S RETURN,3)单字符接收和等待命令 WAIT 格式:WAIT 提示信息 TO WINDOW AT 行数,列数 TIMEOUT 秒数 功能:接收单个字符给内存变量。 说明:1)只接收单个字符。2)用户输入后不需按回车,系统自动接收并执行后续语句。,提示信息以窗口方式显示,设置等待时间,4)三者区别,10.3.3 非格式输出命令 格式:?|? Expression1,Expression2,. 说明:?在新的一行输出表达式的值(换行输出)? 在当前行输出表达式的值(同行输出) 注意:1)可输出多个表达式,之间逗号间隔2)省略表达式,表示输出空行,即直接换行,10.3.4 基
11、本屏幕输入输出命令 1. 格式输出命令: SAY PICTURE FUNCTION 功能:在指定位置输出的值。 说明: picture和function指定数据的显示形式 2. 选择格式输出设备 SET DEVICE TO SCREEN | PRINT SET PRINT ON/OFF,3.格式输入命令 SAY GET PICTURE FUNCTION RANGE , VALID功能:在指定位置按约定格式输入变量或表达式的值,指定输入数 据的范围,指定输入数 据必须满足的条件,READ,激活GET子句,格式化输入输出命令的说明: 1) 变量若是内存变量必须先赋值。 2) RANGE用于指定接收
12、数据的下限和上限。(N型或D型) 3) VALID用于指定数据编辑和显示的条件。 4) READ放在GET接收变量之后,用于激活变量,且必不可少。 5) 格式化输出只能显示字符型的数据,且数据之间只能以+号连接。,10.3.5 文本输出命令TEXT.ENDTEXT格式: TEXTENDTEXT 文本信息:包括文本、内存变量、数组元素、表达式、函数,以及它们的组合 注意:不是书名号 SET TEXTMERGE ON :将文本信息计算后再输出 SET TEXTMERGE OFF :不计算, 按文本方式原样输出,10.3.6 其他命令 1.NOTE|*|&:添加注释 2.CLEA:清屏 3.RETR
13、Y:返回调用程序,并重新执行调用命令 4.RETURN:返回调用程序或命令窗口 5.函数:ROW( ),COL( ),MODIFY COMMAND 盘符:路径 程序文件名 DO 盘符:路径 程序文件名 ACCEPT 提示信息 TO INPUT 提示信息 TO WAIT 提示信息 TO WINDOW ?| ? SAY PICTURE FUNCTION ROW( ),COL( ),变量赋初值 SAY GET PICTURE FUNCTION RANGE , VALID READ SET TEXTMERGE ON/OFF TEXT ENDTEXT,本节主要内容:1、理解顺序结构和选择结构。2、理解并
14、掌握选择结构的命令及适用范围。(记忆)3、熟练掌握顺序结构和选择结构的程序设计方法。(重点),10.4 顺序结构与分支结构程序设计,10.4.1 顺序结构,例1、根据输入的半径值计算圆面积。 程序流程图:,顺序结构:是程序设计中最简单、最常用、最基本的 结构。以顺序结构编写的程序是按照语句的先后顺序 从上往下、逐条执行。,10.4.2 选择结构,选择结构:是结构化程序设计中的基本结构之一, 它通过判断给出的条件表达式是否成立,以此决定 程序的执行路径。,选择结构,简单选择,双重选择,单条件选择if语句,多条件选择do case语句,选择语句的嵌套使用,2.1 单条件选择ifelseendif语
15、句,命令格式: if 语句序列a endif,else语句序列b endif,例2 根据输入的半径值计算圆面积,若输入的半径值 小于0,则显示提示信息“输入的半径值无效!”。 双重选择结构流程图:,语句序列1,语句序列2,if与endif 必须配对使用。,2.2 IIF()函数 命令格式: IIF(,) 功能:测试条件表达式的值,若为真,则返回的值;若为假,则返回的值。,说明:IIF()函数可以用IF语句实现。IF 条件表达式?ELSE?ENDIF,注意: IIF()函数只能显示,不能赋值;各分支中不能包含多个语句。,团员否= .t. ?IIF(团员否, “团员”,“非团员”)思考: 利用II
16、F()函数编写程序,判断输入的正整数是奇数还是偶数。,input “请输入要判断的正整数:” to s ?”这个数是”+iif(mod(s,2)=0,”偶数”,”奇数”),2.2 多条件选择do caseendcase语句,do case语句的命令格式: do casecase 语句序列1case 语句序列2case 语句序列n-1otherwise语句序列n endcase,otherwise,例3、通过键盘输入百分制考试成绩,将百分制成绩用五级积分制来表示。“优秀”(=90)、“良好”(=80)、“中等”(=70)、及格”(=60)、“不及格”(60)。分别用变量s100和s5来存放百分制
17、和五级制成绩。 多条件选择结构流程图:,otherwise,语句序列1,语句序列3,语句序列4,语句序列5,语句序列2,例3、通过键盘输入百分制考试成绩,将百分制成绩用五级积分制来表示。“优秀”(=90)、“良好”(=80)、“中等”(=70)、“及格”(=60)、“不及格”(60)。分别用变量s100和s5来存放百分制和五级制成绩。,语句序列1,语句序列2,语句序列3,语句序列4,语句序列5,Do case语句和嵌套结构的应用范围,说明: 1、do case 和 endcase必须配对使用。 2、和If 语句一样,Do case语句也可以使用嵌套结构,即在各case 子句中包含新的do ca
18、se语句。,编写一程序,根据输入的学生学号在 student.dbf 和 score.dbf中查找该学生的信息。若找到则显示该生的学号,姓名,平均分和等级。若平均分=90分,则显示等级为“优秀”;若平均分=80分,则显示等级为“良好”;若平均分=60分,则等级为“合格”;若平均分60分,则等级为“不合格”;若没有找到该生,则显示“查无此人!”,练习,*练习程序代码: set talk off set safe off clea sele a use score inde on 学号 tag ixh2 sele b use student set rela to 学号 into a acce “
19、请输入待查学号:“ to xh loca for 学号=allt(xh),?“学号 姓名 性别 平均分 等级“ ?学号,姓名,性别,a.平均分 do casecase a.平均分=85?“ 优秀“case a.平均分=70?“ 良好“case a.平均分=60?“ 合格“other?“ 不合格“ endcase clos all,10.5 循环结构程序设计,本节重难点:1、理解循环结构。 2、掌握三种循环结构的命令。(记忆) 3、理解并掌握三种循环结构的区别及适用范围。(重点) 4、熟练掌握循环结构的程序设计方法。(重点、难点),循环结构:让某一段程序在特定条件下反复执行。 循环的三要素:循环
20、开始语句(循环条件)循环体(程序段)循环结束语句 VFP中的三种循环语句:do while . enddoscan for . endscanfor . to . endfor,10.5.1 do while .enddo循环 命令格式: do while 循环体LOOPEXIT enddo,条件表达式,循环体的语句序列,T,F,do while循环流程图,关于LOOP和EXIT的说明:1) LOOP和EXIT语句只能用于循环体内部,用于控制循环的流程。2) 当程序执行到LOOP语句时,将直接返回到循环的开始位置,重新判断循环条件,满足则开始新一轮循环;否则执行后面的语句。3) 当程序执行到E
21、XIT语句时,将直接退出当前循环,执行后面的语句。,返回,例 按输入的姓名查询学生基本信息,初始值:i=1 i=1 1 i=2 2 i=3 i=4 4 i=5 5,set talk off clea i=1 do while i=5if i=3i=i+1loopendif?ii=i+1 enddo,思考:当循环结束后,i= ?,set talk off pass=“computer” do while .t.acce”请输入密码:”to passwordif lower(password) pass?”密码输入错误,请重新输入!”loopendif enddo ?”密码输入正确,进入系统!”
22、retu,例10-26 输入密码,若密 码错误则要求反 复输入,直到密 码输入正确,则 退出循环。,exit enddo ?”密码输入正确,进入系统!” retu,初始值: i=1, s=1 设 n=5 i=1 s=1*1 i=2 s=1*2 i=3 s=1*2*3 i=4 s=1*2*3*4 i=5 s=1*2*3*4*5,例 计算N的阶乘,set talk off clea i=1 s=1 inpu “请输入N=“ to n do while i=ns=s*ii=i+1 enddo ?“N的阶乘为:“,s,例 按学号查询学生基本信息,要求程序能反复执行。,set talk off clea
23、 use student do while .t.acce “请输入待查学号:“ to xhloca for 学号=xhif found()?“ 学号 姓名 性别 入学成绩“?“-“?学号,姓名,性别,入学成绩else?“查无此人!“endifwait “是否继续查询?“ to ynif upper(yn)“Y“exitendif enddo use,(1),(2),程序能反复执行的固定结构,do while循环小结: 1)DO WHILE 与 ENDDO 必须配对使用 2)通常使用的条件表达式: .T. .NOT. EOF( ) 、 .NOT. BOF( ) i10 . 3)循环体中可以包含
24、一个或多个循环。(循环的嵌套) 4)循环体中要针对循环开始的条件进行修改,或使用退出循环的语句,否则会出现死循环。 如:EXIT、LOOP、SKIP、SKIP -1、i=i+1、n=n-1 等,要求程序能反复执行,对表记录进行操作时,随堂练习: 1、在score表中根据平均分给出所有学生评价 其中:平均分=85为“优秀”,85平均分=70为“良好”,70平均分=60为“及格”,平均分60为“不及格” 显示格式如下:学号 平均分 评价20020101 69.4 及格20020301 87 优秀 2、求20以内所有奇数的和,10.5.2 SCANENDSCAN 语句 命令格式: SCAN 范围 F
25、OR WHILE 循环体 LOOP EXIT ENDSCAN,功能:找出符合条件的所有记录,并定位到符合条件的首条记录,然后判断eof()函数的返回值。为假则反复执行循环体的语句;为真则退出循环。,说明:1)适用范围:对表和记录进行处理。2)SCAN 和 ENDSCAN必须配对使用。3)循环中隐含了判断eof()的条件和skip命令。4)SCANENDSACN 语句可以嵌套使用其他的循环语句。,do while not eof()if 团员否n=n+1endifskip enddo,例:利用SCAN循环编写一程序,统计student表中的团员人数。,10.5.3 FOR ENDFOR 语句 命
26、令格式:FOR 循环控制变量=初值 TO 终值 STEP 步长循环体LOOPEXITENDFOR | NEXT功能: 先给循环控制变量赋初值, 然后判断循环变量的值 是否超过终值。未超过则执行循环, 循环变量按步长值 自动增加,继续和终值进行比较,超过则退出循环。默认步长为1。,例 利用for 循环计算N的阶乘。,set talk off clea s=1 inpu “请输入N=“ to n for i=1 to ns=s*i enddo ?“N的阶乘为:“,s,set talk off clea inpu “请输入N=“ to n s=1 i=1 do while i=ns=s*ii=i+1
27、 enddo ?“N的阶乘为:“,s,显示入学成绩前三名同学的名次,姓名,入学成绩 set talk off clea use student inde on 入学成绩 tag icj desc ?”名次 姓名 入学成绩” for i=1 to 3?i,姓名,入学成绩skip endfor use,利用循环控制变量 i 作为学生的名次 显示出来,说明:1) FOR循环隐含了控制变量自动增加的语句。2) FOR 和 ENDFOR | NEXT必须配对使用。3) FORENDFOR | NEXT语句可以嵌套使用其他的循环语句。4)适用范围:可以确定循环次数时。,练习 1、求1+1/2+1/3+1/
28、4+.+1/n的和。 2、已知有工资表 ZGGZ,其记录如下: (设表中共有30条记录) 姓名 职称 基本工资 奖金 实发工资 张三 教授 890.00 120 李四 讲师 560.00 70 王五 助教 480.00 40 程七 副教授 789.00 100 赵八 实验员 670.00 65 调整个人的奖金为:教授:220,副教授:170,讲师:130,其他:80 计算每个人的实发工资,按从高到低的顺序显示,10.5.4 多重循环(循环的嵌套) 命令格式:DO WHILE DO WHILE ENDDOENDDO,do while 条件1程序段1do while 条件2程序段2enddo程序段
29、3 enddo,内循环,外循环,执行情况:如果外循环条件1为真,则执行语句组1,然后进入内循环,判断内循环条件2,若为真则反复执行语句组2,直到条件2为假,退出内循环,执行语句组3;继续判断条件1,若为真,重复以上执行,为假则退出.,例 编制“九九”乘法表,格式如下: 1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 ,流程: 外循环:i=1, 换行内循环: j=1, 显示j=j+1i=i+1 外循环:i=2, 换行内循环: j=1, 显示j=j+1 j=2, 显示j=j+1i=i+1,*显示99乘法表 set talk off clea i=1 do while i=9
30、?j=1do while j=i? spac(2)+str(i*j,2)j=j+1enddoi=i+1 enddo,显示结果: 1 1 2,思考:若将此处 的 i 改为9,结果会有什么变化,set talk off clea k=15 for i=1 to 4for j=1 to 2*i-1i,k+j say“*”endfork=k-1 endfor,显示结果:*,1) i=1 j=1 to 1 k=15 2) i=2 j=1 to 3 k=14 3) i=3 j=1 to 5 k=13 4) i=4 j=1 to 7 k=12,1、计算1!+2!+3!+.+9!2、实训教程P84,思考与练习
31、第3题,基础练习,在student和department表中统计人数最 多的系,并显示该系的系名称和人数。提示:可以分别用2种方法实现。select语句循环语句,提高练习,10.6 数组的使用 10.6.1 数组的插入、删除、复制、和排序函数 1. 数组的插入函数 格式:AINS(,2) 功能:在指定数组的行/列插入一个新元素,初始值为.F.,插入以后将原有元素覆盖。返回值为1 例: dime a(4)a(1)=1a(2)=“a“a(3)=2002-12-10a(4)=.t.?ains(a,3),2. 数组的删除函数 格式:ADEL(,2) 功能:将数组的指定行/列上的元素删除,删除后,后面的
32、元素的脚标依次向前移动一位,数组元素个数不变,最后一个元素默认为.F.。返回值为1。例: dime a(4)a(1)=1a(2)=“a“a(3)=2002-12-10a(4)=.t.?ADEL( a,3),3. 数组的复制函数 格式:ACOPY( , ,目标数组起始元素) 例:acopy(a,b,2,3)在数组a中,从第二个数组元素开始,一共复制 3个元素到数组b中,返回值为复制元素的个数。,4. 数组排序函数 格式:ASORT( ,) 功能:对指定数组指定元素进行排序,若无起始元素,默认为所有元素,0:升序,1:降序,默认为升序,返回值1或-1 例: a(1)=1a(2)=-3a(3)=0a
33、(4)=4asort(a)disp memo,10.8.2 数组与数据表之间的数据传递 1.将数据表中的数据传递给数组的命令 格式: SCATTER FIELDS TO MEMO 功能:将已打开的数据表文件的当前记录的指定字段的值,依次赋值给指定数组中各相应元素。 说明:a:FIELDS确定传送的顺序,若缺省,将依次传送所有。b:数组元素类型由相应字段类型决定。c:若数组不存在或其大小不够,系统自动定义新数组。,例如:将表STUDENT中的5号记录的学号、姓名、性别、出生日期、入学成绩字段的值传送 给数组B。 USE D:ZENGSTUDENT GO 5 DIME Y(5) SCATTER F
34、IELDS 学号,姓名,性别,出生日期, ;入学成绩 TO Y,2. 将数组中的数据传递给数据表的命令 GATHER FROM FIELDS MEMO 功能:将数组中各元素的值依次传送给已打开的表文件当前记录的相应字段。 说明: a:若数组元素少于字段个数,则多余的字段值不变。 b:若数组元素多于字段个数,多余的数组元素不传送 c:数组元素与字段类型必须匹配。 例: USE STUDENT GO 5 INSERT BLANK GATHER FROM Y FIELDS 学号,姓名,性别,出生日期,;入学成绩,本节主要内容: 1、理解主程序、子程序、参数、变量的作用域等相关概念。(记忆) 2、掌握
35、子程序和过程的建立和调用方法。(重点) 3、理解并熟练掌握参数的两种传递方法。(重点&难点) 4、熟练掌握变量的不同作用域之间的区别和表示方法,并能结合子程序和过程调用、参数传递等完成综合性习题。(重点&难点) 5、掌握自定义函数的建立和调用方法。,10.7 过程与自定义函数 10.7.1 子程序 主程序和子程序是相对的。 1)主程序和子程序的建立(与建立程序方法相同) 2)调用子程序DO 盘符路径 WITH 参数:调用时可以没有参数;若有参数,可以是表达式、内存变量、常量,若参数是内存变量需要先赋初值。 3)子程序中参数接收命令PARAMETERS 功能:接收主程序传递过来的参数。,无参调用
36、举例,实际参数与形式参数:主程序中传递的参数称为实际参数(实参);子程序中接收的参数称为形式参数(形参)。,说明: 1)若子程序要接收参数,则PARAMETERS必须是子程序中第一个语句。 2)形参必须是合法的变量名,形参与实参必须在个数、顺序上一致,形参不得少于实参。 3)只有当主程序调用子程序时,使用实际参数代替子程序中的形式参数,程序才得以执行。 4)形参是私有变量PRIVATE,在返回主程序后被清除。,带参调用举例,例1 不带参数的子程序调用。,*main clea ?”准备调用子程序” do sub1 retu,*sub1 ?”=“ ?”现在被调用的是子程序sub1” ?”=” wa
37、it retu,调用子程序时,必须调用子程序的文件名!,返回,例2 利用子程序调用编写程序计算圆面积。,*main 计算圆面积 set talk off clea inpu “请输入半径值:“ to r s=0 do ex2_sub2 with s, r ?“圆面积S=“,s,*sub para s, r s=pi()*r2 retu,思考:如果将子程序中形参 s 和 r 的顺序互换,最后显示的结果是多少?为什么?,s=0, r=1,s=0, r=1,s=3.1416,s=3.1416,思考与练习:利用子程序调用编写程序, 计算1!+2!+3!+.+9!,4)子程序返回语句格式一:RETURN
38、 TO MASTER功能:返回到上级程序或主控程序。格式二:RETURN 功能:返回的值,用于自定义函数中。5)子程序调用的嵌套,. . DO S1 . .,. . DO S2 . . RETU,. . DO S3 . . RETU,. . . . . RETU TO MASTER,MAIN,S1,S2,S3,RETU,10.9.2 过程及过程文件 1)过程及过程文件 (在一个程序文件中包含多个功能模块) 2)过程文件的建立及结构 建立方法:与程序文件建立方法相同 过程的结构:PROCEDURE ENDPROC | RETUPROCEDURE ENDPROC | RETU,3)过程文件的调用
39、SET PROCEDURE TO 盘符路径 DO WITH IN 4)关闭打开的过程文件 SET PROCEDURE TO,过程文件和子程序文件的区别: 1、一个子程序作为一个程序文件存储,可看作只能完成某一种功能的模块。调用时直接通过程序文件名调用。 2、一个过程文件作为一个程序文件存储,但可看作多个不同功能子程序的集合。每个子程序就是其中的一个过程。调用时,需要首先在主程序中打开过程文件,再按各子模块的过程名调用。,4.过程调用时的参数传递1、 包含PARAMETERS命令的过程称为有参过程。作用:接收并传递参数和从子程序或过程中回送参数。命令中的参数被VFP默认为私有变量PRIVATE,
40、返回主程序时回送参数值后即被清除。 2、在使用过程调用时,参数传递的规则如下:1)按地址传递:形参值改变将引起实参值改变,该方式是默认的参数传递方式。按值传递:形参值改变不会引起实参值改变,在参数传递时,将实参用( )括起,则按值传递。表达式和常量按值传递。2)实参数目必须小于或等于形参数目(多余的形参值为逻辑假值.F.)。,参数传递很简单 实参依次传形参 上级调用传实参 下级接收用形参,不加括号按址传 形参返回改实参 加上括号按值传 形参不会改实参 实参若是表达式(常量) 传递只能按值传,参数传递小结,例3 利用子程序调用计算组合数,=,m=5,a=5,p=120,a=120,例4 参数传递
41、示例,set talk off set proc to ex4_proc4 clea x1=100 x2=200 do proc_1 with (x1), x2, x1+x2 ?“调用过程proc_1:“ ?“x1=“,x1 ?“x2=“,x2 ?“x1+x2=“,x1+x2 set proc to,procedure proc_1 para a1, a2, a3 a1=a1/10 a2=a1+a3 a3=0 retu,思考:运行程序后,显示的结果是什么?,10.9.3 变量的作用域 1.公共变量的声明及作用域 格式:PUBLIC 功能:将指定变量定义为公共变量, 初值为.F. 公共变量的作用
42、域:任何模块都有效 2. 局部变量的声明及 格式:PRIVATE ALL LIKE/EXCEPT 功能:将指定变量定义为局部变量 说明:1) 局部变量会随程序关闭而释放。2) 程序中定义的变量默认是局部变量。 3.本地变量的声明及作用域 格式:LOCAL 说明:只能在声明它的模块中使用,对上下级模块均无效,该模块运行结束时,本地变量自动释放。初值为.F.,作用域,公共变量的说明:公共变量不会随着程序的关闭而释放,要清除必须使用释放内存变量的命令。,局部变量的作用域: 默认对当前模块及其下级模块有效 注意: (若在下级模块中出现与当前模块同名的变量) 1) 若下级模块没有将同名变量单独定义为局部
43、变量,则上下级模块中的同名变量是同一个变量。(即下级模块中变量的改变会引起上级模块中变量的改变)2) 若下级模块中已将同名变量单独定义为局部变量,则认为上下级模块中的同名变量是两个不同的变量。(即上下级模块中的同名变量各不相同,互不影响),返回,变量的作用域小结Public大家用 Local变量自己用 Private上禁用 若是上下有同名 (变量) 下未声明两者同 下若声明各不同,例5 编写程序,说明全局变量和局部变量的作用域。,10+2+20=32,10+20+32=62,x1=10,10+2+32=44,x1=10,显示结果: ys=62 过程中的x1=10 xs=44 程序中的x1=10
44、,priv x1,*MAIN5.PRG set talk off local a,b,c a=100 b=200 c=300 ? a,b,c do sub5 ? x,y,z retu,*SUB5.PRG public x,y,z x=10 y=20 z=30 retu,*运行结果200 30020 30,本地变量、公共变量,* MAIN1.PRG set talk off a=100 b=200 c=300 ?a,b,c do sub1 ? a,b,c return,*SUB1.PRG a=10 b=20 c=30 ?a,b,c retu,*运行结果 100 200 300 10 20 30
45、10 20 30,* MAIN2.PRG set talk off set proc to sub2 a=100 b=200 c=300 ?a,b,c do aaa with a,b,c ? a,b,c set proc to,*SUB2.PRG proc aaa para a,b,c a=10 b=20 c=30 ? a,b,c RETU,*运行结果 100 200 300 10 20 30 10 20 30,* MAIN3.PRG set talk off a=100 b=200 c=300 ?a,b,c do sub3 ? a,b,c return,*SUB3.PRG priv a,b,
46、c a=10 b=20 c=30 ? a,b,c retu,*运行结果 100 200 300 10 20 30 100 200 300,局部变量(有声明),有如下主、子程序 *MAIN.PRG SET TALK OFF STOR 4 TO X,A,B ?X,A,B DO SUB WITH A,B ?X,A,B SET TALK OFF RETU,*SUB.PRGPARA A,BX=X+AA=A+B?X,A,BRETU,*修改MAIN.PRG SET TALK OFF STOR 4 TO X,A,B ?X,A,B DO SUB WITH (A),B ?X,A,B SET TALK OFF RE
47、TU,结果1: 4 4 8 4 8 8 4,结果2: 4 4 8 4 8 4 4,最后显示的结果是什么?,* MAIN4.PRG set talk off a=100 b=200 c=300 ?a,b,c do sub4 with a,b,c ? a,b,c return,*SUB4.PRG para a,b,c priv a,b,c a=10 b=20 c=30 ? a,b,c retu,*运行结果 100 200 300 10 20 30 10 20 30,局部变量(有声明,有参数传递),* MAIN4.PRG set talk off a=100 b=200 c=300 ?a,b,c d
48、o sub4 with a,b,(c) ? a,b,c return,*SUB4.PRG para a,b,c priv a,b,c a=10 b=20 c=30 ? a,b,c retu,*运行结果 100 200 300 10 20 30 10 20 300,局部变量(参数传递),10.9.4 自定义函数(2种方式) 自定义一个函数实现中英文日期的转换 *RQ.PRGPARA DN=str(YEAR(D),4)Y=str(MONTH(D),2)R=str(DAY(D),2)X=DOW(D)D=N+”年”+Y+”月”+R+”日星期”;+subs(“日一二三四五六”,2*x-1,2)RETU D,