《VisualFoxPro程序设计结构化程序设计课件.pptx》由会员分享,可在线阅读,更多相关《VisualFoxPro程序设计结构化程序设计课件.pptx(80页珍藏版)》请在三一办公上搜索。
1、Visual FoxPro 6.0 程序设计.课件,-1-,在程序设计的方法中,结构化程序设计是程序设计的基本方法。结构化程序设计的基本思想是逐步求精、模块化和自顶向下,将一个复杂的程序系统的设计任务分成多个易于控制和处理的子任务,每个子任务都是可独立编程的子程序、过程或函数模块。其程序控制结构有顺序结构、分支结构和循环结构三种。,Visual FoxPro 6.0 程序设计.课件,-2-,6.1 程序文件,6.1.1 程序文件建立 6.1.2 简单的交互方式输入输出命令 6.1.3 应用程序的调试与执行,Visual FoxPro 6.0 程序设计.课件,-3-,6.1 程序文件,前面已经介
2、绍了Visual FoxPro的交互式操作方式:菜单操作方式和命令操作方式。这两种方式对于需要大量重复操作的数据库管理工作来说,效率低下;而且这两种方式都要求用户熟练掌握Visual FoxPro中的各种数据操作,这在实际应用环境中并不现实。因此,Visual FoxPro提供了程序文件方式来管理数据库,即通过程序文件编辑工具,将数据库操作的命令、函数等编制成一个有序序列存放在程序文件中,然后通过菜单操作方式或命令操作方式运行该程序文件,即可完成相应的一系列操作,程序文件的扩展名为.PRG。,Visual FoxPro 6.0 程序设计.课件,-4-,6.1.1 程序文件的建立,Visual
3、FoxPro中编写的代码都存放在纯文本格式的文件中,因此任何可以建立、编辑文本文件的工具都可以创建和编辑Visual FoxPro程序文件,通常使用的是Visual FoxPro提供的内部编辑器。程序文件建立的方法有多种,常用的有下列3种方法。1.菜单方式单击“文件”|“新建”命令,在弹出的“新建”对话框中,选择文件类型为“程序”,然后单击“新建文件”按钮,即可打开如图所示的程序编辑窗口。,在编辑窗口中可以逐条输入命令,程序文件建立好后,可以单击“文件”“保存”命令来保存该程序文件。,Visual FoxPro 6.0 程序设计.课件,-5-,2.项目管理器方式,(1)单击“文件”|“新建”命
4、令,在弹出的“新建”对话框中,选择文件类型为“项目”,然后单击“新建文件”按钮,在打开的“创建”对话框中输入项目文件名后,单击“保存”按钮,即可打开“项目管理器”对话框。(2)在“项目管理器”对话框的“全部”选项卡中,单击“代码”前的“+”号展开“代码”文件夹,选择“程序”选项,然后单击“新建”按钮,如图所示,也可打开程序编辑窗口。,Visual FoxPro 6.0 程序设计.课件,-6-,3.命令方式,命令格式如下: MODIFY COMMAND 在命令窗口中输入该命令后,也会打开程序编辑窗口。其中各参数的说明如下:如果命令中给出,若该文件不存在,则打开以该文件名为标题的程序编辑窗口;若该
5、文件已存在,则在程序编辑窗口中打开该文件,可以重新进行编辑修改。如果命令中缺省,则会打开默认以“程序1”、“程序2”为标题的程序编辑窗口,在保存时,用户应重新为程序文件命名。若中未给出包含盘符和路径的绝对路径,默认保存在当前文件中;中可以缺省程序文件的扩展名,系统会自动加上扩展名.PRG。,Visual FoxPro 6.0 程序设计.课件,-7-,6.1.2 简单的交互方式输入输出命令,在程序的执行过程中,经常需要从键盘输入数据,或将运行结果在屏幕上显示出来,这就需要在程序设计中使用到交互式的输入输出命令。1.输入单字符命令输入单字符命令的格式如下: WAIT TO 其中各参数的说明如下:表
6、示在等待用户输入时,在屏幕上显示的提示内容,通常是一个字符串,需用单引号、双引号或方括号作为定界符括起来,也可以是字符串变量。若省略该项,屏幕上显示的是系统默认的提示信息“按任意键继续”。TO 表示将输入的单个字符赋给内存变量。输入字符时,不需输入字符的定界符,否则内存变量得到的是第一个定界符;若未输入字符就按回车键或单击鼠标,则内存变量得到空值。若省略该项,则输入的字符不能保留。注意:该命令一般只是为了显示提示信息,等待用户按任意键后继续执行。,Visual FoxPro 6.0 程序设计.课件,-8-,2.输入字符串命令,输入字符串命令的格式如下:ACCEPT TO 其中各参数的说明如下:
7、表示在等待用户输入时,在屏幕上显示的提示内容,通常是一个字符串,需用单引号、双引号或方括号作为定界符括起来,也可以是字符串变量。TO 表示将输入的字符串赋给内存变量。输入字符串时,不需输入字符串的定界符,否则定界符也会作为字符串的一部分被赋给内存变量;若未输入字符就按回车键或单击鼠标,则内存变量得到空值。若省略该项,则输入的字符不能保留。 【例6-1】编写程序文件prog.prg,要求根据键盘输入的学生姓名,显示该学生的学生信息。分析:要在表中查询满足条件的记录,首先应打开该表,根据题目要求,本题应先打开的是学生信息表student,再用ACCEPT命令将所输入的学生姓名存放到内存变量中,再根
8、据该值在表中进行查询并显示,所有操作结束后应关闭该表。,Visual FoxPro 6.0 程序设计.课件,-9-,程序编辑窗口的输入如图6-3所示,运行时在屏幕中输入“王燕燕”,结果如图6-4所示。,图6-3 程序编辑窗口的输入,图6-4 结果显示,Visual FoxPro 6.0 程序设计.课件,-10-,3.输入任意数据命令,输入任意数据命令的格式如下:INPUT TO 其中各参数的说明如下:表示在等待用户输入时,在屏幕上显示的提示内容,通常是一个字符串,需用单引号、双引号或方括号作为定界符括起来,也可以是字符串变量。TO 表示将输入的数据赋给内存变量。INPUT命令可以接受字符型、数
9、值型、逻辑型、日期型和日期时间型数据,可以接受常量、变量或一般表达式。数值型常量可直接输入,字符型常量必须加定界符,逻辑型常量必须加圆点定界符(如.T.或.F.),日期型和日期时间型常量既可按严格格式输入,也可利用相应的转换函数输入(如2008/5/27、2008-5-27 11:14:20a、CTOD(05-27-08)、CTOT(05-27-08 11:14:20a))。若未输入直接按回车键,屏幕会继续显示提示信息等待输入。,Visual FoxPro 6.0 程序设计.课件,-11-,4.非格式输出命令,该命令的格式如下: ?|? 该命令的功能是在Visual FoxPro的主窗口中换行
10、或不换行输出中各个表达式的值,其中,?表示换行输出,即中各个表达式的值在当前主窗口中最后一次输出位置的下一行输出;?表示不换行输出,即中各个表达式的值在当前主窗口中最后一次输出位置后直接输出,并不换行。,Visual FoxPro 6.0 程序设计.课件,-12-,5.格式输入输出命令,该命令格式如下: SAY GET READ其中各参数的说明如下:表示在Visual FoxPro的主窗口中指定的位置输入输出。起始行列号均为0,行和列可以是常量值,也可以是数值型表达式。SAY GET :如果后面没有READ选项,将在指定的位置输出表达式和变量的值;如果后面有READ选项,则对变量的原有值进行编
11、辑修改,并将结果保存在变量中。其中的变量可以是已赋值的内存变量,也可以是字段变量,类型可以是数值型、字符型、逻辑型、日期型、日期时间型、备注型、通用型等。,Visual FoxPro 6.0 程序设计.课件,-13-,图6-5 程序编辑窗口的输入,图6-6 结果显示,【例6-2】编写程序prog2.prg,使用格式输入输出命令,修改学生信息表student中指定学号的学生记录的字段值。 程序编辑窗口的输入如图6-5,运行时在屏幕中输入“王燕燕”,运行结果如图6-6。,Visual FoxPro 6.0 程序设计.课件,-14-,6.其他辅助命令,(1)清屏命令清屏命令主要用于清除VFP主窗口中
12、的内容,清除完后光标回到窗口的左上角,该命令格式如下:CLEAR(2)终止程序命令该命令的功能是终止程序的运行,返回VFP的主窗口,同时释放所有私有变量,其格式如下:CANCEL(3)退出系统命令该命令的功能是退出VFP系统,回到操作系统,退出前将关闭所有文件,清除所有变量,其格式如下:QUIT(4)设置会话状态命令该命令的格式如下:SER TALK ON|OFF该命令用于设置是否显示命令执行过程中的状态信息,默认时为SET TALK ON,即打开会话状态。通常在执行单命令或调试程序时,设置为ON状态;而在程序执行时设置为OFF状态。,Visual FoxPro 6.0 程序设计.课件,-15
13、-,6.1.3 应用程序的执行,运行程序文件的方法有多种,常用的方法主要有以下3种:单击“程序”|“运行”命令,在打开的“运行”对话框中选择要运行的程序文件,然后单击“运行”按钮即可运行该程序文件。在“项目管理器”对话框的“全部”选项卡中,先选中要运行的程序,然后单击“运行”按钮,即可执行该程序。在命令窗口中输入命令:DO ,也可以执行相应的程序文件。事实上,在程序输入完毕后,不关闭程序编辑窗口,直接单击工具栏的“运行”按钮可以直接运行程序,若程序无语法错误,可以得到运行结果,若程序中存在语法错误,则会弹出“程序错误”对话框,给出错误的提示信息,此时,可以单击“取消”按钮,或按【Esc】键终止
14、程序的运行,再根据错误提示修改程序。,Visual FoxPro 6.0 程序设计.课件,-16-,6.2 程序控制结构,6.2.1 顺序结构程序设计 6.2.2 分支结构程序设计 6.2.3 循环结构程序设计,Visual FoxPro 6.0 程序设计.课件,-17-,6.2程序控制结构,程序的控制结构包括顺序结构、分支结构和循环结构3种,每一种控制结构可以包含一个或多个语句,任何程序都是由这3种基本控制结构构成的。,Visual FoxPro 6.0 程序设计.课件,-18-,6.2.1 顺序结构,顺序结构是程序设计中最简单、最常用的基本结构,在该结构中,程序按照命令语句书写的先后顺序依
15、次执行,该结构的流程图如图6-7所示。顺序结构是任何程序的主体基本结构,在分支结构和循环结构内部,也常以顺序结构作为其子结构,前面介绍的例子使用的都是顺序结构。顺序结构的基本组成语句是数据的输入输出、赋值语句等,数据的输入和输出已在上一节介绍,下面介绍顺序结构中常用的赋值语句和语句的续行与注释功能。,Visual FoxPro 6.0 程序设计.课件,-19-,1.赋值语句,程序设计中经常要使用变量,变量在使用之前需要设定一个初始值,使用过程中也可能要重新赋值,因此可以使用赋值语句将指定的值赋给变量或对象的某个属性,赋值语句主要有如下两种格式:(1)使用赋值符号“=”该语句的格式如下:=该语句
16、的意思是将表达式的值计算出来后赋给变量名所代表的存储单元。(2)使用STORETO命令该命令的格式如下:STORE TO 该命令是将表达式的值计算出来后赋值变量名表中的每个变量。如:STORE 3*5 TO a,b,c,d 是将变量a,b,c,d同时赋值为15,Visual FoxPro 6.0 程序设计.课件,-20-,在使用赋值语句时需要注意以下几点:应注意区分赋值符号与数学中的等号。a=3应读作“将数值3赋给变量a”,a=a+1表示将原来a的值加上1后再放到原来a的存储单元中,即将原来a的值加上1后再赋给a。因此,下面两个语句的意思是不同的:X=y &表示将y的值赋给xy=x &表示将x
17、的值赋给y若要对日期型或日期时间型内存变量赋值,如果表达式是同样类型的常量,必须用花括号“ ”括起来并在前面加一个“”符号,如果表达式是字符串,则应用转换函数将其转换为相应的类型。例如:t1=2008/5/27 t2=2008-5-27 11:14:20a t3=CTOD(05-27-08) t4=CTOT(05-27-08 11:14:20a)赋值符号的左边只能是变量,不能是表达式,如x+y=z是错误的赋值语句。,Visual FoxPro 6.0 程序设计.课件,-21-,2.语句的续行,当一条语句很长时,在程序编辑窗口中书写或阅读都不方便,例如: select top 50 percen
18、t 学号,姓名,身高,year(出生日期) 出生年份from student order by 出生年份 desc,身高这时,为了便于书写和理解,可以使用语句的续行功能,用分号“;”将较长的语句分为两行或多行。因此上述语句可以改写为: select top 50 percent 学号,姓名,身高,year(出生日期) 出生年份; from student; order by 出生年份 desc,身高注意:作为续行符的分号只能出现在行尾。,Visual FoxPro 6.0 程序设计.课件,-22-,3.语句的注释,为了提高程序的可读性,通常在程序的适当位置加上相应的注释,Visual FoxP
19、ro中提供了两种注释语句。(1)程序注释该语句的格式如下:NOTE|* 该语句通常单独放置一行,用于对程序进行注释,程序运行时,不执行以NOTE或*开头的行。(2)行注释语句格式如下:& 该语句通常放在某行命令之后,用于对该行命令进行注释。注意:不能在命令语句行的续行分号后面加入注释。,Visual FoxPro 6.0 程序设计.课件,-23-,6.2.2 分支结构,分支结构也称为选择结构,是在程序执行时,根据不同的条件,选择执行不同的语句。Visual FoxPro中提供了两种分支结构语句,分别是IF语句和DO CASE语句。1.IF语句IF语句主要有两种形式:单分支形式和双分支形式。(1
20、)单分支形式单分支形式的格式如下: IF ENDIF注意:IF和ENDIF必须成对使用,并分两行书写。,Visual FoxPro 6.0 程序设计.课件,-24-,其中条件表达式是关系表达式或逻辑表达式,语句执行时,首先计算条件表达式的值,若为真(.T.)则执行语句块中的语句,否则不执行语句块。无论是否执行语句块中的语句,程序都将转向ENDIF后面的下一条语句继续执行。流程图如图。,Visual FoxPro 6.0 程序设计.课件,-25-,【例6-3】从键盘上输入两个数x和y,比较大小,若x小于y,则交换两个变量值,使得x不小于y。分析:根据题目要求,若满足“x小于y”这个条件,则执行“
21、交换两个变量值”的操作,因此IF后面的应是“x,应是“交换两个变量值”。由于计算机内存有易被覆盖的特点,因此计算机中交换两个变量的值只能借助于第三个中间变量来间接交换,如图6-9所示,则交换两个变量值的代码应为:t=xx=yy=t,Visual FoxPro 6.0 程序设计.课件,-26-,本题程序代码如下:*prog3.prginput x= to xinput y= to yif xy t=x x=y y=tendif?x=,x?y=,y,Visual FoxPro 6.0 程序设计.课件,-27-,(2)双分支形式,双分支格式: IF ELSE ENDIF语句执行时,根据条件表达式的值
22、选择执行两个语句块中的一个。若条件表达式的值为真(.T.),则执行IF后面的语句块1,然后执行ENDIF后面的语句;若条件表达式的值为假(.F.),则执行ELSE后面的语句块2,然后执行ENDIF后面的语句。其流程图如图6-10所示。,Visual FoxPro 6.0 程序设计.课件,-28-,用双分支实现,其程序代码如下:if x=0 y=cos(x)+sqrt(x2+1)else y=log(x2)+x-10endif 也可用单分支实现,其程序代码如下:y=cos(x)+sqrt(x2+1)if x0 y=log(x2)+x-10endif,【例6-4】计算分段函数:,Visual Fo
23、xPro 6.0 程序设计.课件,-29-,(3)IF语句的嵌套,IF语句的上述两种形式中的语句块可以包含任何合法的VFP语句,当然也可以包含另一条IF语句,这就构成了IF语句的嵌套,利用IF语句的嵌套可以实现多分支的选择结构, 【例6-5】从键盘上输入3个数a、b、c,求这3个数的最大值并输出。分析:假设ab且ac,则最大值肯定是a,若这个条件不满足,而所满足的条件是ba且bc,则最大值肯定是b,否则最大值肯定是c。,Visual FoxPro 6.0 程序设计.课件,-30-,程序代码如下:,*prog5.prginput 请输入a的值 to ainput 请输入b的值 to binput
24、 请输入c的值 to cif ab and ac t=aelse if ba and bc t=b else t=c endifendif?三个数中的最大值是:,t,Visual FoxPro 6.0 程序设计.课件,-31-,2.DO CASE语句,该语句的格式如下: DO CASE CASE CASE CASE OTHERWISE ENDCASE语句执行时,依次判断条件表达式的值,一旦某一条件满足,则执行相应语句块;如果所有条件表达式的值都为假,若无OTHERWISE子句,则不执行任何语句,若有OTHERWISE子句,则执行OTHERWISE后面的语句块n+1,无论执行哪一个语句块后,都不
25、再判断下面的条件,而转去执行ENDCASE后面的语句,其流程图如图6-11所示,Visual FoxPro 6.0 程序设计.课件,-32-,【例6-6】某百货公司打折促销的优惠方法:每位顾客一次性购物: 500元以上者,按九五折优惠; 1000元以上者,按九折优惠; 2000元以上者,按八五折优惠; 5000元以上者,按八折优惠。编写程序,实现输入购物款数,计算并输出优惠后的价格。,程序代码如下:*prog6.prginput 请输入原价: to xdo casecase x500y=xcase x1000 y=x*0.95case x2000y=x*0.9case x5000y=x*0.8
26、5otherwisey=x*0.8endcase?优惠后的价格是:,y,Visual FoxPro 6.0 程序设计.课件,-33-,6.2.3 循环结构,VFP提供了3种循环语句:当型循环DO WHILE语句、计数型循环FOR语句和扫描型循环SCAN语句。1. 当型循环DO WHILE语句该语句的格式如下: DO WHILE EXITLOOP ENDDO,Visual FoxPro 6.0 程序设计.课件,-34-,【例6-7】编制程序求1+2+3+100的和,并输出结果。 分析:实现自然数的累加,应该设置一个累加变量和一个计数变量,累加变量的初值为0,计数变量从1开始逐次累加到累加变量中,
27、每累加一次,计数变量加1,直到计数变量为100为止。 程序代码如下:*prog7.prgs=0i=1do while i=100s=s+ii=i+1enddo?s=,s,Visual FoxPro 6.0 程序设计.课件,-35-,【例6-8】统计学生信息表student中年龄在20岁以上的学生人数,并输出结果。程序代码如下:*prog8.prguse studentn=0 &计数变量初值为0do while not eof() &循环条件是还未到表尾 if year(date()-year(出生日期)20n=n+1 endif skip &修改记录指针,指向下一记录,若没该句,将造成死循环e
28、nddouse?年龄大于20岁的人数有:,n,Visual FoxPro 6.0 程序设计.课件,-36-,该语句的格式如下:FOR = TO STEP EXIT LOOPENDFOR|NEXT语句执行时,首先给循环变量赋予初值,与终值比较,若超过终值,则循环体一次也不执行,直接转去执行ENDFOR|NEXT后面的语句;若不超过终值,则依次执行循环体中的语句,遇到ENDFORNEXT语句,将循环变量加上步长后,程序转回到循环初始语句,继续判断,流程图如图6-13所示。步长可正可负.步长为1时,可省略STEP子句。当循环次数事先已知时,通常使用计数型循环,循环次数可以根据下式计算:INT(ABS
29、(终值-初值)/步长)+1,2.计数型循环FOR语句,Visual FoxPro 6.0 程序设计.课件,-37-,【例6-9】编制程序实现100以内的奇数累加和,并输出结果。分析:实现100以内奇数的累加,循环变量的初值应为1,终值应为99,循环变量的步长应为2。【例6-10】从键盘上输入一个大于1的自然数,判断是否为素数(除1和它本身外,不能被其他任何一个整数整除的自然数)。分析:判断某数n是否为素数,最简单的方法是:从i=2,3,n-1逐个判断n能否被i整除,只要有一个能整除,n就不是素数,退出循环;若都不能整除,则n是素数。可进一步证明:若n不能被2中的任何一个整数整除,则n为素数。,
30、Visual FoxPro 6.0 程序设计.课件,-38-,3.扫描型循环SCAN语句,该语句的格式如下: SCAN FOR EXIT LOOP ENDSCAN扫描型循环语句专门用来对当前打开的数据表进行操作,它对指定范围满足条件的记录逐一扫描,找到一条满足条件的记录就执行一次循环体语句,每执行一次,记录指针后移,直到所有满足条件的记录都执行完毕。说明:语句中缺省时默认为ALL。其中的EXIT和LOOP子句的功能和DO WHILE循环中的功能相同。,Visual FoxPro 6.0 程序设计.课件,-39-,【例6-11】用扫描型循环SCAN语句统计学生信息表student中年龄在20岁以
31、上的学生人数,并输出结果。 程序代码如下:*prog11.prg use student n=0 scan for year(date()-year(出生日期)20 n=n+1 endscan ?年龄大于20岁的人数有:,n,Visual FoxPro 6.0 程序设计.课件,-40-,4.循环的嵌套,在一个循环体内又包含了一个完整的循环结构时称为循环结构的嵌套。在实际应用中,三种循环语句可以相互嵌套,会呈现出多种复杂形式,在编程或阅读程序时要注意各层循环变量的变化规律。在使用循环嵌套时需要注意以下几点:循环嵌套时,必须完整嵌套,不能交叉嵌套;循环体内可以嵌套分支语句,嵌套时也要求完整嵌套,不
32、能交叉嵌套。内重循环的循环变量与外重循环的循环变量不能同名,以免混淆。多重循环的循环次数等于每一重循环的循环次数的乘积。,Visual FoxPro 6.0 程序设计.课件,-41-,【例6-12】打印九九乘法表,运行界面如图6-14所示。 程序代码如下:*prog12.prgclear &先将VFP主窗口清空1,30 say 九九乘法表2,28 say -?for i=1 to 9 for j=1 to 9 ?str(i,1)+*+STR(j,1)+=+str(i*j,2) ?space(2) &每个算式之间空两格 endfor ? &当前行算式输出完以后,换行再输出下一行endfor,Vi
33、sual FoxPro 6.0 程序设计.课件,-42-,数组这种数据结构在程序设计中经常使用,在Visual FoxPro中,只能定义一维数组和二维数组。因为数组中数组元素的下标是有序的,可以以数组元素的下标作为循环变量,利用循环结构来处理数组中每个数组元素。一般用一重循环来处理一维数组,用二重循环来处理二维数组,下面以一维数组为例进行介绍。(1)一维数组的基本操作假设定义有一维数组dimension a(10),下面以该数组为例介绍一维数组的基本操作。,数组元素的输出for i=1 to 10 ?a(i)endfor,数组元素的输入for i=1 to 10 input to a(i)en
34、dfor,5.数组问题,Visual FoxPro 6.0 程序设计.课件,-43-,数组元素的求和 s=0 for i=1 to 10 s=s+a(i) endfor,求数组元素中的最大值 max=a(1) for i=1 to 10 if(a(i)max) max=a(i) endif endfor,Visual FoxPro 6.0 程序设计.课件,-44-,数组最典型的应用是排序,排序的算法有多种,如选择法、冒泡法、插入法等,下面介绍冒泡法排序。假设定义了一个数组dimension a(10),则冒泡法排序的基本思想是:从第一个元素开始,对数组中两两相邻的元素比较,即a(1)与a(2)
35、比较,若为逆序,则a(1)与a(2)交换,然后a(2)与a(3)比较直到最后a(9)与a(10)比较,这时最大的数沉底成为数组中的最后一个元素,一些较小的数如同气泡一样上浮一个位置,这是第一趟排序。然后对a(1)a(9)中的9个数进行同上述一样的比较,次最大数放入a(9)中,完成第2趟排序。依此类推,进行9趟排序后,所有数均有序。因此可以用二重循环来实现这个排序,外循环确定进行几趟排序,内循环确定每趟排序中比较几次。代码如下: for i=1 to 9 &确定排序的趟数 for j=1 to 10-I &确定每趟排序中比较的次数 if a(j)a(j+1) &若相邻的两个数为逆序,则交换t=a
36、(j)a(j)=a(j+1)a(j+1)=t endif endfor endfor,(2)一维数组的排序,Visual FoxPro 6.0 程序设计.课件,-45-,【例6-13】随机产生20个学生成绩,求出他们的平均成绩,并统计出高于平均成绩的学生数,再将这20个学生成绩按升序排列后输出。分析:Visual FoxPro提供了随机数函数RAND(),可以产生一个01(不包括1)之间的随机数。学生成绩通常在0100之间,为了产生这之间的随机数,可以用表达式INT(RAND()*100)+1来实现。程序代码如下: *prog12.prg,Visual FoxPro 6.0 程序设计.课件,-
37、46-,cleardimension a(20)for i=1 to 20 a(i)=int(rand()*100)+1endfors=0for i=1 to 20 s=s+a(i)endforav=s/20?平均成绩是:,avn=0for i=1 to 20 if a(i)av n=n+1 endifendfor,?高于平均成绩的人数为:,nfor i=1 to 19 for j=1 to 20-iif a(j)a(j+1)t=a(j)a(j)=a(j+1)a(j+1)=tendif endforendfor?for i=1 to 20 ?a(i)endfor,Visual FoxPro 6
38、.0 程序设计.课件,-47-,6.3 过程与过程调用,6.3.1 子程序设计与调用 6.3.2 过程与过程文件 6.3.3 局部变量和全局变量、过程调用中的参数传递,Visual FoxPro 6.0 程序设计.课件,-48-,6.3.1 子程序设计与调用,在程序设计中,经常会遇到同一段功能代码在不同的程序段执行多次的情况,这时往往将该功能代码单独编写成一个独立的程序文件存在磁盘上,需要时调用它,这个独立的模块称为子程序。程序之间通过相互调用来建立关系。在Visual FoxPro中,子程序是被其他程序调用的程序文件,主程序能调用子程序,但子程序不能调用主程序,可是子程序可以调用其他的子程序
39、,构成子程序的嵌套调用。在模块化程序设计中,通常将功能和结构相对独立的功能模块,单独编写成一个独立的子程序。子程序结构不仅易于调试和维护,而且当需要时可以多次调用,减少重复编程,提高程序的通用性。子程序的表现形式有过程、自定义函数和方法3种。,Visual FoxPro 6.0 程序设计.课件,-49-,1.子程序的建立子程序是一个独立的程序文件,文件扩展名为.PRG,它的建立与前面所说的程序建立的方法一样。2.子程序的调用 DO WITH 其中WITH 是可选项,用于主程序与子程序之间的参数传递,实际参数列表中的各项可以是常量、变量或表达式,相互之间用逗号隔开。3.子程序的返回 RETURN
40、 TO MASTER|TO 执行子程序时,遇到RETURN命令,就返回到调用它的主程序,或是上一级子程序中调用命令的下一条语句继续执行。通常子程序的最后一条语句是RETURN命令,若缺省,则当子程序执行到最后时将自动执行RETURN功能,返回到主调程序中。,Visual FoxPro 6.0 程序设计.课件,-50-,图6-17是子程序嵌套调用时的程序执行过程示意图。,Visual FoxPro 6.0 程序设计.课件,-51-,【例6-14】分别建立如上图所示的各程序文件,分析执行主程序main.prg的执行结果。程序代码如下:,*main.prgclear?正在执行main.prg?开始调
41、用子程序sub1.prgdo sub1?从子程序sub1.prg中返回,*sub1.prg?正在执行sub1.prg?开始调用子程序sub2.prgdo sub2?从子程序sub2.prg中返回?开始调用子程序sub3.prgdo sub3?从子程序sub3.prg中返回return,*sub2.prg?正在执行sub2.prgreturn,*sub3.prg?正在执行sub3.prgreturn,Visual FoxPro 6.0 程序设计.课件,-52-,6.3.2 过程与过程文件,在编写一个大型程序时,可能划分为许多功能模块,如果都写成子程序,就要创建很多程序文件,这些程序文件都存放在磁
42、盘上,每调用一次子程序就访问一次磁盘,需要花费一定的时间,如果程序中调用子程序较多,访问磁盘的次数就多,因此影响程序运行速度。另外,每调用一次子程序将打开一个文件,而由于系统允许同时打开文件数目的限制,调用子程序的嵌套层数也受到限制,否则程序不能正常运行。因此引入过程的概念,其实过程和子程序非常类似,只是将多个子程序的功能模块代码保存在一个程序文件中,在该程序文件中每个子程序都单独定义,而含有多个子程序的程序文件就称为过程文件,这样打开一个过程文件就意味着打开了所有的过程。当然过程也可以不形成过程文件,直接与调用它的程序放在同一个文件中,不过应把过程放在主程序代码之后,不能将主程序代码放在过程
43、之后。,Visual FoxPro 6.0 程序设计.课件,-53-,1.过程的定义,过程定义的语法格式如下: PROCEDURE PARAMETERS RETURN ENDPROC其中各参数的说明如下:PROCEDURE :过程的起始语句。PARAMETERS :有此子句称为有参过程,否则称为无参过程。有参过程中,该子句必须是第一条命令语句。中形参的个数最多为27个,且只能是内存变量,相互之间用逗号隔开。RETURN :该子句表示将控制返回到调用该过程的语句的下一条语句继续执行。若缺省了该子句,则在过程结束处自动执行一条隐含的RETURN语句。ENDPROC:过程的结束语句,该语句可以省略,
44、若省略,则过程结束于下一条PROCEDURE语句或程序文件尾。,Visual FoxPro 6.0 程序设计.课件,-54-,2.过程的调用,调用过程的语法格式如下: DO WITH 实参列表中的各项可以是常量、变量或一般表达式,相互之间用逗号隔开。【例6-15】利用过程来计算圆面积。程序代码如下:clearinput 请输入圆的半径: to rs=0do area with r,s?半径为,r,的圆的面积为:,s*area过程procedure area parameters r,s s=3.14*r*r returnendproc,Visual FoxPro 6.0 程序设计.课件,-55
45、-,3.过程文件的建立,过程文件是由若干个过程组合而成的,它的建立方法与程序文件的建立方法相同,扩展名也为.PRG。4.过程文件的打开与关闭调用过程文件中的过程前,首先要打开包含它的过程文件。(1)过程文件的打开SET PROCEDURE TO , , ADDITIVE该语句用于打开指定的过程文件,使该过程文件中所有的过程均可供调用。可以同时打开多个过程文件,如果命令中带有ADDITIVE子句,则在打开当前过程文件时,以前打开的过程文件不关闭,即以前打开的过程文件中的过程仍可以被调用;若命令中未带该子句,则在打开当前过程文件时,以前打开的所有过程文件都会被关闭,即以前打开的过程文件中的所有过程
46、都不能再被调用。(2)过程文件的关闭语句格式1为:SET PROCEDURE TO语句格式2为:CLOSE PROCEDURE,Visual FoxPro 6.0 程序设计.课件,-56-,【例6-16】调用过程文件中的求阶乘的过程,求1!+2!+n!。 程序代码如下:,*prog16.prgclearset procedure to jcinput 请输入n的值: to nstore 0 to s,jfor i=1 to ndo fact with i,js=s+jendforset procedure to?1!+2!+n!=,s,*jc.prgprocedure factparamete
47、rs x,yt=1for i=1 to xt=t*iendfory=treturnendproc,Visual FoxPro 6.0 程序设计.课件,-57-,6.3.3 自定义函数,函数分为系统函数与自定义函数, Visual FoxPro提供了几百个系统函数供用户调用,大大方便了用户的编程,但在解决实际问题时,系统提供的函数可能不能满足用户的需求,这时可以自己定义和编写的函数,这样的函数称为自定义函数。函数和过程的作用十分相似,用户自定义的函数实质上是带有返回值的子程序或过程。1.自定义函数的建立自定义函数的语法格式如下: FUNCTION PARAMETERS RETURN ENDFUN
48、C,Visual FoxPro 6.0 程序设计.课件,-58-,自定义函数的函数名不能与VFP系统函数同名,也不能和内存变量同名。自定义函数通常会计算出一个值,由RETURN 语句返回,若RETURN后面缺省表达式,默认函数返回值为.T.,若省略RETURN语句,则函数执行结束时,系统自动执行一个隐含的RETURN命令。自定义函数可作为一个独立的模块放在调用它的程序文件中,通常放在程序文件的底部;也可以作为一个独立的程序文件,供所有程序调用,这时可以省略自定义函数的起始语句FUNCTION ,若不省略该语句,则函数名必须与程序文件名相同;自定义函数还可以放在过程文件中,随着过程文件的打开而打
49、开,以供调用。2.自定义函数的调用 函数名(实际参数列表)函数定义好后,可供程序在任何地方调用。函数调用时,实际参数的个数与形式参数的个数必须相等,且依次虚实结合。若是无参函数,调用时圆括号不能省略。,Visual FoxPro 6.0 程序设计.课件,-59-,【例6-17】将上例改用自定义函数来实现,其中函数放在调用程序所在的程序文件中。 分析:若通过自定义函数来实现求某个数的阶乘,主调模块应通过参数将该数传递给被调函数,被调函数可以使用返回值将计算结果返回给主调模块,因此函数中只需有一个形式参数:求阶乘的数。 程序代码如下:,*prog17.prgclearinput 请输入n的值: t
50、o ns=0for i=1 to ns=s+fact(i)endforset procedure to?1!+2!+n!=,sfunction factparameters xt=1for j=1 to xt=t*jendforreturn tendfunc,Visual FoxPro 6.0 程序设计.课件,-60-,6.3.4参数传递,主程序在调用子程序、过程和自定义函数时,经常需要把主程序中的数据传递给子程序、过程和自定义函数,然后再将处理的结果返回给主程序,这就需要通过实际参数与形式参数间的参数传递来实现。参数传递中要求实际参数与形式参数依次相对应,实参与形参对应的次序应一致、类型应一