结构化程序设计基础教学课件VF.ppt
第第6 6章章 结构化程序设计基础结构化程序设计基础吉林大学计算机教学与研究中心6.1 样本程序分析样本程序分析 MODIFY COMMANDMODIFY COMMAND Example_1 Example_1 INPUTINPUT “请输入数请输入数N:”N:”TO NTO N IFIF N 1 N 1?“输入的数输入的数:”,N N,太小!太小!CANCELCANCEL ENDIFENDIF STORE 1 TO I,S STORE 1 TO I,S DO WHILEDO WHILE I=N I=N S=S*I S=S*I I=I+1I=I+1 ENDDOENDDO?N N,“的阶乘是的阶乘是:”,S S CANCEL CANCEL【例【例1 1】求数】求数N N的阶乘的阶乘26.2 程序的建立与执行程序的建立与执行 VFPVFP源源程程序序是是用用VFPVFP命命令令或或程程序序中中专专用用语语句编写的文本文件,其扩展名是句编写的文本文件,其扩展名是PRGPRG。6.2.1 VFP6.2.1 VFP专用程序编辑器专用程序编辑器建立源程序文件建立源程序文件方方法法一一:“文文件件”菜菜单单项项“新新建建”选选择择“程序程序”“”“新建文件新建文件”。方法二:方法二:使用常用工具栏的使用常用工具栏的“新建新建”按钮。按钮。36.2.1 VFP专用程序编辑器专用程序编辑器说明说明1 1:此方法可以此方法可以建立建立新程序文件,又新程序文件,又可可修改修改已有的程序文件。已有的程序文件。方法三方法三:在命令窗口中执行命令:在命令窗口中执行命令:Modify Command 说明说明2 2:文件的扩展名可缺省,系统默认文件的扩展名可缺省,系统默认扩展名为扩展名为.PRGPRG。46.2.1 VFP专用程序编辑器专用程序编辑器方方法法四四:在在项项目目管管理理器器中中,进进入入“代代码码”选选项卡,选择项卡,选择“程序程序”,单击,单击“新建新建”。说明说明3 3:一个命令行中只能写一条命令,若一个命令行中只能写一条命令,若一行写不下,需使用分行符一行写不下,需使用分行符“;”。56.2.1 VFP专用程序编辑器专用程序编辑器 保存程序文件保存程序文件方法一:方法一:单击单击“文件文件”菜单项菜单项“保存保存”。方方法法二二:单单击击“常常用用”工工具具栏栏里里的的“保保存存”按钮。按钮。方法三:方法三:按按 Ctrl+W Ctrl+W。方方法法四四:关关闭闭程程序序编编辑辑器器,系系统统提提示示是是否否保保存文件。存文件。66.2.2 打开源程序文件打开源程序文件方方法法一一:“文文件件”菜菜单单项项“打打开开”“”“文文件类型件类型”为为“程序程序”选择文件选择文件“确定确定”方方法法二二:单单击击“常常用用”工工具具栏栏里里的的“打打开开”按钮。按钮。方法三:方法三:在命令窗口中执行命令:在命令窗口中执行命令:Modify Command|?打开程序文件打开程序文件76.2.3 程序的编译与执行程序的编译与执行 在在VFPVFP中中,可可以以执执行行源源程程序序、编编译译程程序序、应用程序和可执行程序种程序文件。应用程序和可执行程序种程序文件。(1 1)源源程程序序(PRG)(PRG):源源程程序序是是文文本本文文件件,可可以以对对其其内内容容进进行行修修改改。只只要要有有源源程程序序文文件件,就可以生成其他就可以生成其他3 3种程序文件。种程序文件。执执行行程程序序就就是是按按照照程程序序的的内内部部控控制制结结构构执行文件中的相关语句序列。执行文件中的相关语句序列。程序文件的类型程序文件的类型 86.2.3 程序的编译与执行程序的编译与执行(2 2)编编译译程程序序(FXP)(FXP):每每个个源源程程序序文文件件都都有有对对应应的的编编译译程程序序文文件件,执执行行编编译译程程序序比比执执行行源程序的速度快。源程序的速度快。(3 3)应应用用程程序序(APP)(APP):由由多多个个文文件件(包包括括程程序序、表表单单和和菜菜单单等等)连连接接成成一一个个应应用用程程序序文文件。件。注意:注意:以上三以上三种文件都是在种文件都是在VFPVFP环境下运行。环境下运行。96.2.3 程序的编译与执行程序的编译与执行(4 4)可可执执行行程程序序(EXE)(EXE):将将多多个个文文件件(包包括括程程序序、表表单单和和菜菜单单等等)连连接接成成一一个个可可执执行行程程序文件序文件,此种文件可以此种文件可以脱离脱离VFPVFP环境运行。环境运行。编译程序编译程序 当当执执行行一一个个源源程程序序时时,系系统统自自动动将将其其编编译译为为编编译译程程序序(FXP)(FXP)。在在VFPVFP中中允允许许只只编编译译而而不执行程序。不执行程序。106.2.3 程序的编译与执行程序的编译与执行方法一:方法一:在程序编辑器中,单击在程序编辑器中,单击“程序程序”菜单项菜单项“编译编译”。方方法法二二:单单击击“程程序序”菜菜单单项项“编编译译”选选择择“文文件件类类型型”为为“程程序序”选选择择程序文件程序文件“编译编译”编译方法为:编译方法为:116.2.3 程序的编译与执行程序的编译与执行执行程序执行程序 方方法法一一:在在程程序序编编辑辑器器中中,“程程序序”菜菜单单“执行执行”或或“运行运行”常用工具常用工具“!”!”。方方法法二二:“程程序序”菜菜单单“运运行行”选选择择“文文件件类类型型”为为“程程序序”选选择择或或输输入入程程序文件名序文件名“运行运行”。方法三方法三:在程序或命令窗口中执行:在程序或命令窗口中执行:Do 126.2.3 程序的编译与执行程序的编译与执行说明:说明:当源程序当源程序(PRG)(PRG)和编译程序和编译程序(FXP)(FXP)文件文件同时存在时,系统将执行距当前时间最近的同时存在时,系统将执行距当前时间最近的程序文件。程序文件。136.3.1 输入字符串语句输入字符串语句语句格式:语句格式:Accept To “字字符符表表达达式式”:作作为为执执行行到到此此语语句句时时的的提提示信息。若无此项,则不输出任何信息。示信息。若无此项,则不输出任何信息。内内存存变变量量:用用来来接接收收输输入入的的字字符符串串。若若不不输输入任何字符,则将入任何字符,则将空字符空字符赋值给内存变量。赋值给内存变量。例:例:Accept“Accept“请输入学号请输入学号:”To XH:”To XH?”?”输入的学号是:输入的学号是:”+XH+XH 146.3.2 等待语句等待语句语句格式:语句格式:Wait To To Window At Window At,NowaitNowait Clear|NoclearTimeout Clear|NoclearTimeout “字字符符表表达达式式”:提提示示信信息息。若若无无此此项项,则则输出任何信息。输出任何信息。To To 内内存存变变量量:用用来来接接收收输输入入的的字字符符。若若不不输输入任何字符,则将入任何字符,则将空字符空字符赋值给内存变量。赋值给内存变量。156.3.2 等待语句等待语句Window Window AtAt,:使使用用WindowWindow项项表表示示在在VFPVFP主主窗窗口口的的右右上上角角弹弹出出提提示示信信息息窗窗口口。也也可可以以使使用用AtAt,指指定定提提示示信信息息窗窗口口的的开开始位置。始位置。WindowWindow和和NowaitNowait:弹弹出出提提示示窗窗口口后后,程程序序不不暂暂停停,即即不不等等用用户户按按键键,就就继继续续执执行行后后面面的的语句。语句。WindowWindow和和 NoclearNoclear:在在 执执 行行 下下 一一 条条 Wait Wait WindowWindow或或Wait Wait ClearClear语语句句之之前前,系系统统不不关关闭闭提提示信息窗口。示信息窗口。166.3.2 等待语句等待语句Timeout Timeout:用用于于设设定定等等待待的的秒秒数数。在在等等待待时时间间内内按按任任意意键键或或等等待待超超时时,程程序序将继续向下执行。将继续向下执行。例:例:Wait Wait 显示时间:显示时间:Timeout 3 Timeout 3?Time()?Time()176.3.3 输入表达式语句输入表达式语句 语句格式:语句格式:Input To 说说明明:允允许许输输入入任任何何类类型型的的表表达达式式。InputInput输输入字符串时必须加上定界符。入字符串时必须加上定界符。例:例:N=2N=2Input Input 请输入数据:请输入数据:To M To M?M?M186.4.1 If 分支语句分支语句 语句格式:语句格式:If Then Then 1 Endif开始开始语句语句序列序列结束结束条件条件?YN分支结构分支结构后面语句后面语句单分支单分支IfIf语句语句Y其其中中IF-ENDIFIF-ENDIF必必须须配对出现。配对出现。196.4.1 If 分支语句分支语句例:例:Input Input 请输入一个请输入一个N N:To N To NIf N0 If N0 N=-N N=-N EndifEndif?N?N的绝对值是:的绝对值是:,N,N206.4.1 If 分支语句分支语句双分支双分支IfIf语句语句 语句格式:语句格式:If ThenThen 1 ELSE Endif开始开始语句序列语句序列1结束结束条件条件?YN语句序列语句序列2分支结构分支结构后面语句后面语句216.4.1 If 分支语句分支语句例,求两个数中较小值:例,求两个数中较小值:Input X=To XInput X=To XInput Y=To YInput Y=To YIf XYIf X0)0 (X=0)1(X0If X0Y=1Y=1ElseElseIf X=0If X=0Y=0Y=0ElseElseY=-1Y=-1EndifEndifEndifEndif?Y?Y246.4.2 If语句的嵌套语句的嵌套控制程序是否继续执行控制程序是否继续执行 例例 :?DATE()&?DATE()&输出系统日期输出系统日期CANCEL&CANCEL&结束本程序的执行结束本程序的执行?TIME()&?TIME()&此语句得不到执行此语句得不到执行(1 1)CancelCancel:结束当前程序的运行。结束当前程序的运行。256.4.2 If语句的嵌套语句的嵌套控制程序是否继续执行控制程序是否继续执行 (2 2)SuspendSuspend:暂暂停停程程序序的的执执行行。暂暂停停期期间间可以在命令窗口中执行交互命令。可以在命令窗口中执行交互命令。(3 3)ResumeResume:继继续续执执行行SuspendSuspend暂暂停停的的程程序,从序,从SuspendSuspend语句的下一条继续。语句的下一条继续。例例6.9:6.9:X=1X=1SuspendSuspendY=2Y=2?X+Y?X+Y266.4.3 条件函数条件函数 函数格式:函数格式:Iif(,)2)说说明明:若若条条件件成成立立,则则表表达达式式1 1的的值值作作为为函函数值;否则,表达式数值;否则,表达式2 2的值作为函数值。的值作为函数值。例如:例如:Input Input 输入一个数输入一个数N N:To N To N M M=Iif(N0,-N,N)Iif(N0,-N,N)?”N?”N的绝对值是:的绝对值是:”,M,M276.4.4 多分支语句多分支语句 开始开始语句语句序列序列 1结束结束条件条件1?YN语句序列语句序列 2条件条件2?YN语句序列语句序列 n条件条件n?YNOTHERWISE语句序列语句序列 n+1.多分支结构多分支结构286.4.4 多分支语句多分支语句语句格式:语句格式:Do CaseCase 1 1Case 2 2Case n n Otherwise n+1 Endcase296.4.4 多分支语句多分支语句说说明明1 1:执执行行时时,系系统统从从上上向向下下依依次次对对CaseCase后后面面的的条条件件进进行行判判断断,当当条条件件不不成成立立时时,就就判判断断下下一一个个CaseCase条条件件是是否否成成立立。一一旦旦某某个个CaseCase条条件件成成 立立,就就 执执 行行 该该 CaseCase与与 下下 一一 个个CaseCase(OtherwiseOtherwise或或EndcaseEndcase)之之间间的的语语句句序序列列,然后执行然后执行EndcaseEndcase后面的语句。后面的语句。说说明明2 2:若若所所有有条条件件都都不不成成立立,而而有有OtherwiseOtherwise项项,则则执执行行语语句句序序列列n+1n+1,然然后后执执行行EndcaseEndcase后后面面的的语语句句;若若所所有有条条件件都都不不成成立立,且且无无OtherwiseOtherwise项,则直接执行项,则直接执行EndcaseEndcase后面的语句。后面的语句。306.4.4 多分支语句多分支语句例:例:Input Input 请输入一个数:请输入一个数:To X To XDo CaseDo CaseCase X0Case X0Y=1Y=1Case X=0Case X=0Y=0Y=0Otherwise Otherwise Y=-1Y=-1EndcaseEndcase?Y?Y1 (X0)0 (X=0)1(X0)Y=316.5 循环结构程序设计循环结构程序设计 循循环环结结构构指指在在执执行行程程序序过过程程中中,重重复复执执行行某某程序段。程序段。在在循循环环体体中中,可可以以利利用用Exit语语句句提提前前结结束束循循环,也可利用环,也可利用Loop语句提前结束本次循环。语句提前结束本次循环。重重复复执执行行的的程程序序段段称称为为循循环环体体,重重复复执执行行的的次数称为次数称为循环次数循环次数。326.5.1 Do While(当型当型)循环语句循环语句 语句格式:语句格式:Do While Enddo 开始开始语句序列语句序列 结束结束条件条件?YN循环前的语句循环前的语句循环体后的语句循环体后的语句语句序列语句序列 Y说说明明:Do Do WhileWhile与与EnddoEnddo必须必须成对成对使用。使用。336.5.1 Do While(当型当型)循环语句循环语句例,求前例,求前100100个自然数的和:个自然数的和:S=0 S=0 N=1 N=1 Do While N=100 Do While N=100 S=S+NS=S+NN=N+1N=N+1EnddoEnddo循环条件循环体S=1+2+3+4+10034v例例 N=2 S=1 Do While N=5 S=S*N N=N+1 Enddo?”5!等于等于:”,S 思考思考:如何求任意如何求任意数的阶乘数的阶乘?35v例例:P174-例例 Use CJB N=0 Do while!Eof()If 重修重修?”重修学号重修学号:”,学号学号,Space(4),”重修课程码重修课程码:”,课课程码程码 N=N+1 Endif Skip Enddo?”共有共有:”+Str(N,4)+”人次重修人次重修”Use366.5.1 Do While(当型当型)循环语句循环语句死循环死循环如如果果循循环环体体中中没没有有能能执执行行到到的的、使使条条件件趋趋于于不不成成立立的的语语句句、结结束束循循环环或或结结束束程程序序的的语语句句,将将永永远远执执行行不不完完循循环环体体,即即出出现现死死循循环环。语语句修改为:句修改为:Do WhileDo While LoopLoop 2 ExitExit 3 EnddoEnddo376.5.1 Do While(当型当型)循环语句循环语句(2 2)ExitExit:一一旦旦执执行行到到ExitExit语语句句,就就结结束束整整个循环个循环。(1 1)LoopLoop:一一旦旦执执行行到到LoopLoop语语句句,就就提提前前结结束本次循环。束本次循环。例例,对对键键盘盘输输入入的的每每一一个个正正数数,输输出出其其算算术术平平方根;当输入的数小于或等于方根;当输入的数小于或等于0 0时,结束程序。时,结束程序。38开始开始循环体前语句循环体前语句循环体条件循环体条件Y分支条件分支条件YLOOPN分支结构下面的语句分支结构下面的语句N循环体下面的语句循环体下面的语句结束结束 无条件转向循环无条件转向循环 语句格式语句格式(以当型循环为例以当型循环为例)DO WHILE IF LOOP ENDIF ENDDO39 例例:计算计算1100的奇数和。的奇数和。*store 0 to i,tdo while i100 i=i+1 if int(i/2)=i/2 loop endif t=t+ienddo?1100奇数和为:,t说明:说明:int(N):取整函数取整函数 此处用于判断此处用于判断i的奇偶性的奇偶性思考:利用思考:利用mod(N1,N2)如何如何 判断奇偶性?判断奇偶性?40开始开始循环体前语句循环体前语句循环体条件循环体条件Y分支条件分支条件NEXITY分支结构下面的语句分支结构下面的语句N循环体下面的语句循环体下面的语句结束结束 无条件跳出循环无条件跳出循环 语句格式语句格式(以当型循环为例以当型循环为例)DO WHILE IF EXIT ENDIF ENDDO41例:例:P174_P174_【例例】DO WHILE .T.CLEAR INPUT “请输入一个数:请输入一个数:”TO X IF Vartype(X)!=N WAIT 不是数值型数据不是数值型数据 LOOP ENDIF IF X 0 EXIT ENDIF?X,的算术平方根为:的算术平方根为:,SQRT(X)WAIT ENDDO?输入的数不大于输入的数不大于0,结束程序结束程序!426.5.2 For(步长型步长型)循环语句循环语句语句格式:语句格式:ForFor =ToTo StepStep EndforEndfor|NextNext 说明说明2 2:若步长缺省,默认值为若步长缺省,默认值为1 1。说明说明1 1:初初值、终值和步长应为数值型表达式值、终值和步长应为数值型表达式436.5.2 For(步长型步长型)循环语句循环语句例,求前例,求前100100个自然数的和:个自然数的和:S=0S=0For N=1 To 100For N=1 To 100 S=S+NS=S+NEndfor Endfor?1+2+3+98+99+100=,S?1+2+3+98+99+100=,S446.5.3 Scan(扫描扫描)循环语句循环语句语句格式:语句格式:ScanScan ForFor 1WhileWhile 2 EndscanEndscan说明说明1 1:ScanScan和和EndscanEndscan必须成对使用。此循环必须成对使用。此循环语句用于处理与数据表有关的循环问题,功能语句用于处理与数据表有关的循环问题,功能等效于:等效于:LocateLocate ForForForForWhileWhileWhileWhile222Do WhileDo While Found()Found()ContinueContinueEnddoEnddo456.5.3 Scan(扫描扫描)循环语句循环语句例,使用例,使用 ScanScan循环结构编程:循环结构编程:Use CJBUse CJBN=0N=0Scan For Scan For 重修重修?重修学号重修学号:,:,学号学号,Space(4),Space(4),?重修课程码重修课程码:,:,课程码课程码N=N+1N=N+1EndscanEndscan?共有共有:+Str(N,4)+:+Str(N,4)+人次重修人次重修 UseUse466.5.4 结构嵌套结构嵌套为实现复杂的功能,为实现复杂的功能,VFPVFP允许相互嵌套。但不允许相互嵌套。但不允许交叉嵌套,即一个结构必须完整地包含允许交叉嵌套,即一个结构必须完整地包含在另一个结构中。在另一个结构中。例如:例如:For M=1 To 9For M=1 To 9For N=M To 9For N=M To 9?Space(2),Str(M,1),*,?Space(2),Str(M,1),*,?Str(N,1),=,Str(M*N,2)?Str(N,1),=,Str(M*N,2)Endfor Endfor?EndforEndfor 外层循环外层循环内层循环内层循环47*clearinput 请输入数据个数:请输入数据个数:to ndimension X(n)store 1 to kdo while kX(j)W=X(i)X(i)=X(j)X(j)=W endif endfor?X(i)endfor?X(n)return例:数组例子例:数组例子假设输入数据为:假设输入数据为:n=4X(1)X(2)X(3)X(4)12 23 5 21为为X数组的每数组的每个元素赋值个元素赋值i=1j=212 23 5 21j=3 5 23 12 21j=4 5 23 12 21i=2j=3j=4 5 12 23 21 5 12 23 21i=3 j=4 5 12 21 23512212348练习题:试编写练习题:试编写“从前有座山从前有座山”的故事,使其分的故事,使其分 别完成下列要求:别完成下列要求:1、将故事重复显示将故事重复显示5次次。2、故事每重复显示故事每重复显示5 5次后暂停,并询问是否继续,次后暂停,并询问是否继续,输入输入“Y”,继续重复显示,否则中止程序执行。继续重复显示,否则中止程序执行。3、令故事无限重复显示,当按任意键时暂停显示,令故事无限重复显示,当按任意键时暂停显示,并询问是否继续。并询问是否继续。(提示:提示:INKEY()函数函数)INKEY(nSECONDS):返回所按键的返回所按键的ASCIIASCII码。码。49v练习练习:请设计简单的数据表维护系统请设计简单的数据表维护系统,界面界面及功能要求如下及功能要求如下:欢迎使用本系统欢迎使用本系统!请输入数据表名请输入数据表名:维护菜单维护菜单:1 1 修改记录修改记录 2 2 追加记录追加记录3 3 删除记录删除记录 4 4 退出退出请输入操作代码请输入操作代码(1(14):4):506.6 子程序及其调用子程序及其调用 在在实实际际应应用用中中,经经常常将将一一个个比比较较复复杂杂的的程程序序分分解解成成多多个个功功能能相相对对独独立立的的子子程程序序模模块块。因因此此,一一个个应应用用程程序序可可能能包包含含多多个个程程序序模模块块,通通常常将将调调用用其其它它模模块块的的模模块块称称为为主主程程序序,被被其其它它模模块块调调用用的的模模块块称称为为子子程程序序。主主程程序序与与子子程程序序的的概概念念是是相相对对的的,一一个个程程序序可可能能是是某某个个程程序的主程序,同时是另一个程序的子程序。序的主程序,同时是另一个程序的子程序。子程序调用实例子程序调用实例:编程编程实现该公式的功能。516.6 子程序及其调用子程序及其调用*主程序主程序.prgprg.DO DO 1DO DO 2*子程序子程序1 1.prgprgRETURNRETURN*子程序子程序2 2.prgprgRETURNRETURN526.6.2 过程子程序及其调用过程子程序及其调用过程子程序内部结构过程子程序内部结构(1 1)Parameters|LparametersParameters|Lparameters:用用于于指指定定形形式式参参数数,接接收收主主程程序序传传来来的的数数据据,可可以以是是简简单单内内存存变变量量或或数数组组说说明明。若若使使用用此此语语句句,必须在子程序中的第必须在子程序中的第1 1行。行。ParametersParameters|LparametersLparameters 子子 程程 序序 体体 RetryRetry|Return Return To MasterTo Master 536.6.2 过程子程序及其调用过程子程序及其调用(3 3)ReturnReturn:返返回回到到主主程程序序中中调调用用语语句句的的下下一一条条语语句句继继续续执执行行。子子程程序序中中的的最最后后一一条条ReturnReturn语句可以省略。语句可以省略。(2 2)RetryRetry:返返回回到到调调用用程程序序中中重重新新执执行行调调用语句。用语句。(4 4)Return Return To To MasterMaster:返返回回到到主主控控程程序序(最最顶顶层层的的程程序序,在在命命令令窗窗口口中中用用DoDo调调用用的的程程序序)中中调调用用语语句句的的下下一一条条语语句句继继续续执执行行,它它可可能能直接或间接调用本子程序。直接或间接调用本子程序。546.6.2 过程子程序及其调用过程子程序及其调用过程子程序调用过程子程序调用 调调用用过过程程子子程程序序就就是是转转去去执执行行过过程程子子程程序序中中的的语语句句,当当执执行行到到返返回回语语句句时时,再再回回到到主程序的对应位置继续执行。主程序的对应位置继续执行。调用语句:调用语句:Do Do WithWith 说明:说明:若子程序中有若子程序中有ParametersParameters或或LparametersLparameters语句,则调用语句应该带有实际参数语句,则调用语句应该带有实际参数(简称实参简称实参)表。表。556.6.2 过程子程序及其调用过程子程序及其调用参数传递方式参数传递方式 所所谓谓参参数数传传递递,就就是是利利用用参参数数在在主主程程序序与与子子程程序序之之间间进进行行传传递递数数据据。主主程程序序通通过过实实参参与与形形参参的的位位置置对对应应关关系系向向子子程程序序传传递递数数据据,有时也通过参数由子程序向主程序传递数据。有时也通过参数由子程序向主程序传递数据。注注意意:在在调调用用子子程程序序时时,实实参参个个数数不不得得超超出出形形参参个个数数;当当实实参参个个数数少少于于形形参参个个数数时时,多多余的形参初值为逻辑假余的形参初值为逻辑假(.F.)(.F.)。56*主程序主程序.prgprgDO DO 1 WITH WITH X X,Y Y,Z Z*子程序子程序1 1.prgprgRETURNPARAMETERS|LPARAMETERS M,N,P实际参数实际参数形式参数形式参数6.6.2 过程子程序及其调用过程子程序及其调用576.6.2 过程子程序及其调用过程子程序及其调用(1 1)值值方方式式传传递递:调调用用子子程程序序时时,将将实实参参值值传传递递给给对对应应的的形形参参;当当执执行行子子程程序序结结束束时时,形形参参变变化化后后的的值值不不能能回回送送给给实实参参。这这种种只只能能由由实实参参传传递递给给形形参参值值的的单单向向传传递递方方式式称称为为值值传递。传递。参数传递的两种方式参数传递的两种方式(2 2)引引用用方方式式传传递递:调调用用子子程程序序时时,将将实实参参值值传传递递给给对对应应的的形形参参;当当执执行行子子程程序序结结束束时时,形形参参变变化化后后的的值值能能回回送送给给实实参参。这这种种双双向向传传递值的方式称为引用传递。递值的方式称为引用传递。586.6.2 过程子程序及其调用过程子程序及其调用(1 1)当当形形参参是是数数组组说说明明时时:对对应应实实参参必必须须是是数数组组名名,与与形形参参数数组组说说明明的的维维数数和和元元素素个个数数无无关关,实实参参与与形形参参之之间间按按引引用用方方式式传传递递数数据据。例如例如E6_25E6_25。参数传递规则式参数传递规则式(2 2)当当实实参参是是数数组组名名时时:系系统统自自动动将将形形参参转转换换成成与与实实参参等等价价的的数数组组,并并且且实实参参与与形形参参之之间按间按引用方式引用方式传递数据。传递数据。596.6.2 过程子程序及其调用过程子程序及其调用(3 3)当当实实参参是是简简单单内内存存变变量量(不不含含数数组组元元素素)时:时:实参与形参之间按实参与形参之间按引用方式引用方式传递数据。传递数据。参数传递规则式参数传递规则式(4 4)当当实实参参是是表表达达式式(包包括括常常数数、数数组组元元素素和和函函数数)时时:实实参参与与形形参参之之间间按按值值方方式式传传递递数数据。据。例如例如E6_27E6_27。606.6.3 函数子程序及其调用函数子程序及其调用 函函数数子子程程序序也也称称用用户户自自定定义义函函数数。函函数数子子程程序序的的编编写写方方法法与与过过程程子子程程序序没没有有太太大大的的区区别别,只只是是为为了了使使函函数数子子程程序序具具有有返返回回值值的的能能力力,在在返回语句中需要带值返回语句中需要带值(如如Return SReturn S)。函数子程序内部结构函数子程序内部结构 ParametersParameters|LparametersLparameters 子子 程程 序序 体体Return Return 表达式表达式 若省略表达式,则函数返回值为逻辑真若省略表达式,则函数返回值为逻辑真616.6.3 函数子程序及其调用函数子程序及其调用 函函数数子子程程序序与与系系统统函函数数的的调调用用方方法法一一样样,都都作作为为表表达达式式的的一一部部分分。所所谓谓调调用用函函数数子子程程序序就就是是转转去去执执行行函函数数子子程程序序中中的的语语句句,执执行行到到返返回回语语句句时时,转转回回到到主主程程序序中中的的调调用用语语句句并带回一个值。并带回一个值。函数子程序调用函数子程序调用 调用格式:调用格式:()62*主程序主程序.prg S=WJM(X,Y,Z )*WJM.prg PARAMETERS M,N,P RETURN 6.6.3 函数子程序及其调用函数子程序及其调用参数传递参数传递返回表达式的值返回表达式的值63*CLEAR S=0 FOR i=1 TO 10 S=S+F(i)ENDFOR?S=,S*PARAMETERS N M=1 FOR j=1 TO N M=M*j ENDFOR RETURN M例例:计算阶乘的自定义函数计算阶乘的自定义函数646.6.3 函数子程序及其调用函数子程序及其调用 系系统统默默认认函函数数子子程程序序调调用用一一律律按按值值方方式式传传递递值值。可可以以通通过过VFPVFP命命令令重重新新设设置置参参数数的的传传递递方式。方式。参数传递规则式参数传递规则式命令格式:命令格式:Set Udfparms To Set Udfparms To ValueValue|ReferenceReference 值值 引用引用例如例如E6_28E6_28656.6.4 过程子程序与函数子程序区别过程子程序与函数子程序区别(1 1)在在编编写写程程序序方方面面,函函数数子子程程序序通通常常用用Return Return 语语句句返返回回到到主主程程序序;而而过过程程子子程程序序通通常常用用Return Return To To MasterMaster或或RetryRetry语句返回到主程序或主控程序。语句返回到主程序或主控程序。(2 2)在在调调用用子子程程序序方方面面,用用函函数数形形式式调调用用函函数数子子程程序序,使使之之成成为为表表达达式式的的一一部部分分;用用DoDo语语句句调调用用过过程程子子程程序序,使使之之成成为为程程序序中中的的一条语句。一条语句。666.6.4 过程子程序与函数子程序区别过程子程序与函数子程序区别 在在实实际际应应用用时时,函函数数子子程程序序和和过过程程子子程程序序可可以以互互换换调调用用方方式式。通通过过过过程程方方式式调调用用(Do(Do语语句句)函函数数子子程程序序时时,系系统统将将忽忽略略函函数数的的返返回回值值,且且返返回回到到主主程程序序中中调调用用语语句句(Do)(Do)的的下下一一条条语语句句继继续续执执行行;通通过过函函数数方方式式调调用用过过程程子子程程序序时时,函函数数返返回回值值为为逻逻辑辑真真(.T.)(.T.),而而返返回回到主程序中的调用语句。到主程序中的调用语句。676.7 子程序存放形式子程序存放形式 从从存存放放形形式式上上看看,VFPVFP子子程程序序分分为为独独立立文文件件子子程程序序、过过程程文文件件子子程程序序和和程程序序文文件件中中子子程程序序3 3种组织形式。种组织形式。6.7.1 6.7.1 独立文件子程序独立文件子程序 所所谓谓独独立立文文件件子子程程序序就就是是一一个个PRGPRG文文件件对对应一个子程序,文件主名也是子程序名。应一个子程序,文件主名也是子程序名。686.7.2 过程文件子程序过程文件子程序 过程的格式:过程的格式:ProcedureProcedure|FunctionFunction Parameters|Lparameters Parameters|Lparameters 子程序体子程序体 Retry|ReturnRetry|Return|To Master|To Master Endproc Endproc|EndfuncEndfunc 在在一一个个应应用用程程序序中中,可可将将一一些些子子程程序序存存放放到到一一个个程程序序文文件件中中,通通常常将将这这种种文文件件称称为为过过程程文文件件,而而将将其其中中的的子子程程序序称称为为过过程程文文件件的子程序,简称的子程序,简称过程过程。开始语句开始语句结束语句结束语句过过程程文文件件(扩扩展展名名为为.PRG).PRG)本本质质上上也也是是程程序序文文件件,因因此此建建立立程程序序文文件件的的方方法法都都适适用于过程文件。用于过程文件。696.7.2 过程文件子程序过程文件子程序 在在调调用用子子程程序序之之前前,应应该该先先打打开开其其所所在在的的过过程程文文件件,随随后后的的调调用用方方法法与与独独立立文文件件子子程程序序的调用方法完全相同。的调用方法完全相同。打开过程文件打开过程文件 打开命令:打开命令:Set Procedure ToSet Procedure To AdditiveAdditive706.7.2 过程文件子程序过程文件子程序语句格式语句格式1 1:Set Procedure ToSet Procedure To关闭过程文件关闭过程文件 语句格式语句格式2 2:Release Procedure Release Procedure 注注意意:如如果果独独立立文文件件子子程程序序与与过过程程文文件件中中的的子子程程序序重重名名,调调用用子子程程序序时时,若若事事先先打打开开了了过过程程文文件件,则则系系统统调调用用过过程程文文件件中中的的子子程程序序;否否则则系统调用独立文件子程序。系统调用独立文件子程序。716.7.3 程序文件中的子程序程序文件中的子程序 在在一一个个程程序序文文件件中中也也可可以以包包含含本本程程序序的的一一些子程序,其结构为:些子程序,其结构为:程程 序序 段段 Procedure Procedure|FunctionFunction ParametersParameters|LparametersLparameters 子子 程程 序序 体体 RetryRetry|ReturnReturn|To MasterTo Master Endproc Endproc|EndfuncEndfunc 在在本本程程序序文文件件中中可可以以直直接接调调用用这这种种子子程程序序,如如果果将将这这种种程程序序文文件件作作为为过过程程文文件件打打开开,也也可可以以在其他程序文件中调用这种子程序。在其他程序文件中调用这种子程序。72*过程文件过程文件1.prgRETURNEndProcPROCEDURE 过