《VisualFoxPro程序设计》第六章结构化程序设计.ppt

上传人:tia****nde 文档编号:2721887 上传时间:2019-11-29 格式:PPT 页数:81 大小:448KB
返回 下载 相关 举报
《VisualFoxPro程序设计》第六章结构化程序设计.ppt_第1页
第1页 / 共81页
《VisualFoxPro程序设计》第六章结构化程序设计.ppt_第2页
第2页 / 共81页
《VisualFoxPro程序设计》第六章结构化程序设计.ppt_第3页
第3页 / 共81页
点击查看更多>>
资源描述
Visual FoxPro 6.0 程序设计.课件,-1-,第6章 结构化程序设计,6.1 程序文件 6.2 程序控制结构 6.3 过程与过程调用 6.4 程序的调试,提示:单击各个标题前的动画符号“ ” ,链接到相应的章节。,Visual FoxPro 6.0 程序设计.课件,-2-,在程序设计的方法中,结构化程序设计是程序设计的基本方法。结构化程序设计的基本思想是逐步求精、模块化和自顶向下,将一个复杂的程序系统的设计任务分成多个易于控制和处理的子任务,每个子任务都是可独立编程的子程序、过程或函数模块。其程序控制结构有顺序结构、分支结构和循环结构三种。,Visual FoxPro 6.0 程序设计.课件,-3-,6.1 程序文件,6.1.1 程序文件建立 6.1.2 简单的交互方式输入输出命令 6.1.3 应用程序的调试与执行,Visual FoxPro 6.0 程序设计.课件,-4-,6.1 程序文件,前面已经介绍了Visual FoxPro的交互式操作方式:菜单操作方式和命令操作方式。这两种方式对于需要大量重复操作的数据库管理工作来说,效率低下;而且这两种方式都要求用户熟练掌握Visual FoxPro中的各种数据操作,这在实际应用环境中并不现实。因此,Visual FoxPro提供了程序文件方式来管理数据库,即通过程序文件编辑工具,将数据库操作的命令、函数等编制成一个有序序列存放在程序文件中,然后通过菜单操作方式或命令操作方式运行该程序文件,即可完成相应的一系列操作,程序文件的扩展名为.PRG。,Visual FoxPro 6.0 程序设计.课件,-5-,6.1.1 程序文件的建立,Visual FoxPro中编写的代码都存放在纯文本格式的文件中,因此任何可以建立、编辑文本文件的工具都可以创建和编辑Visual FoxPro程序文件,通常使用的是Visual FoxPro提供的内部编辑器。程序文件建立的方法有多种,常用的有下列3种方法。 1.菜单方式 单击“文件”|“新建”命令,在弹出的“新建”对话框中,选择文件类型为“程序”,然后单击“新建文件”按钮,即可打开如图所示的程序编辑窗口。,在编辑窗口中可以逐条输入命令,程序文件建立好后,可以单击“文件”“保存”命令来保存该程序文件。,Visual FoxPro 6.0 程序设计.课件,-6-,2.项目管理器方式,(1)单击“文件”|“新建”命令,在弹出的“新建”对话框中,选择文件类型为“项目”,然后单击“新建文件”按钮,在打开的“创建”对话框中输入项目文件名后,单击“保存”按钮,即可打开“项目管理器”对话框。 (2)在“项目管理器”对话框的“全部”选项卡中,单击“代码”前的“+”号展开“代码”文件夹,选择“程序”选项,然后单击“新建”按钮,如图所示,也可打开程序编辑窗口。,Visual FoxPro 6.0 程序设计.课件,-7-,3.命令方式,命令格式如下: MODIFY COMMAND 在命令窗口中输入该命令后,也会打开程序编辑窗口。 其中各参数的说明如下: 如果命令中给出,若该文件不存在,则打开以该文件名为标题的程序编辑窗口;若该文件已存在,则在程序编辑窗口中打开该文件,可以重新进行编辑修改。 如果命令中缺省,则会打开默认以“程序1”、“程序2”为标题的程序编辑窗口,在保存时,用户应重新为程序文件命名。 若中未给出包含盘符和路径的绝对路径,默认保存在当前文件中;中可以缺省程序文件的扩展名,系统会自动加上扩展名.PRG。,Visual FoxPro 6.0 程序设计.课件,-8-,6.1.2 简单的交互方式输入输出命令,在程序的执行过程中,经常需要从键盘输入数据,或将运行结果在屏幕上显示出来,这就需要在程序设计中使用到交互式的输入输出命令。 1.输入单字符命令 输入单字符命令的格式如下: WAIT TO 其中各参数的说明如下: 表示在等待用户输入时,在屏幕上显示的提示内容,通常是一个字符串,需用单引号、双引号或方括号作为定界符括起来,也可以是字符串变量。若省略该项,屏幕上显示的是系统默认的提示信息“按任意键继续”。 TO 表示将输入的单个字符赋给内存变量。输入字符时,不需输入字符的定界符,否则内存变量得到的是第一个定界符;若未输入字符就按回车键或单击鼠标,则内存变量得到空值。若省略该项,则输入的字符不能保留。 注意:该命令一般只是为了显示提示信息,等待用户按任意键后继续执行。,Visual FoxPro 6.0 程序设计.课件,-9-,2.输入字符串命令,输入字符串命令的格式如下: ACCEPT TO 其中各参数的说明如下: 表示在等待用户输入时,在屏幕上显示的提示内容,通常是一个字符串,需用单引号、双引号或方括号作为定界符括起来,也可以是字符串变量。 TO 表示将输入的字符串赋给内存变量。输入字符串时,不需输入字符串的定界符,否则定界符也会作为字符串的一部分被赋给内存变量;若未输入字符就按回车键或单击鼠标,则内存变量得到空值。若省略该项,则输入的字符不能保留。 【例6-1】编写程序文件prog.prg,要求根据键盘输入的学生姓名,显示该学生的学生信息。 分析:要在表中查询满足条件的记录,首先应打开该表,根据题目要求,本题应先打开的是学生信息表student,再用ACCEPT命令将所输入的学生姓名存放到内存变量中,再根据该值在表中进行查询并显示,所有操作结束后应关闭该表。,Visual FoxPro 6.0 程序设计.课件,-10-,程序编辑窗口的输入如图6-3所示,运行时在屏幕中输入“王燕燕”,结果如图6-4所示。,图6-3 程序编辑窗口的输入,图6-4 结果显示,Visual FoxPro 6.0 程序设计.课件,-11-,3.输入任意数据命令,输入任意数据命令的格式如下: INPUT TO 其中各参数的说明如下: 表示在等待用户输入时,在屏幕上显示的提示内容,通常是一个字符串,需用单引号、双引号或方括号作为定界符括起来,也可以是字符串变量。 TO 表示将输入的数据赋给内存变量。INPUT命令可以接受字符型、数值型、逻辑型、日期型和日期时间型数据,可以接受常量、变量或一般表达式。数值型常量可直接输入,字符型常量必须加定界符,逻辑型常量必须加圆点定界符(如.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 程序设计.课件,-12-,4.非格式输出命令,该命令的格式如下: ?|? 该命令的功能是在Visual FoxPro的主窗口中换行或不换行输出中各个表达式的值,其中,?表示换行输出,即中各个表达式的值在当前主窗口中最后一次输出位置的下一行输出;?表示不换行输出,即中各个表达式的值在当前主窗口中最后一次输出位置后直接输出,并不换行。,Visual FoxPro 6.0 程序设计.课件,-13-,5.格式输入输出命令,该命令格式如下: SAY GET READ 其中各参数的说明如下: :表示在Visual FoxPro的主窗口中指定的位置输入输出。起始行列号均为0,行和列可以是常量值,也可以是数值型表达式。 SAY GET :如果后面没有READ选项,将在指定的位置输出表达式和变量的值;如果后面有READ选项,则对变量的原有值进行编辑修改,并将结果保存在变量中。其中的变量可以是已赋值的内存变量,也可以是字段变量,类型可以是数值型、字符型、逻辑型、日期型、日期时间型、备注型、通用型等。,Visual FoxPro 6.0 程序设计.课件,-14-,图6-5 程序编辑窗口的输入,图6-6 结果显示,【例6-2】编写程序prog2.prg,使用格式输入输出命令,修改学生信息表student中指定学号的学生记录的字段值。 程序编辑窗口的输入如图6-5,运行时在屏幕中输入“王燕燕”,运行结果如图6-6。,Visual FoxPro 6.0 程序设计.课件,-15-,6.其他辅助命令,(1)清屏命令 清屏命令主要用于清除VFP主窗口中的内容,清除完后光标回到窗口的左上角,该命令格式如下:CLEAR (2)终止程序命令 该命令的功能是终止程序的运行,返回VFP的主窗口,同时释放所有私有变量,其格式如下:CANCEL (3)退出系统命令 该命令的功能是退出VFP系统,回到操作系统,退出前将关闭所有文件,清除所有变量,其格式如下:QUIT (4)设置会话状态命令 该命令的格式如下:SER TALK ON|OFF 该命令用于设置是否显示命令执行过程中的状态信息,默认时为SET TALK ON,即打开会话状态。通常在执行单命令或调试程序时,设置为ON状态;而在程序执行时设置为OFF状态。,Visual FoxPro 6.0 程序设计.课件,-16-,6.1.3 应用程序的执行,运行程序文件的方法有多种,常用的方法主要有以下3种: 单击“程序”|“运行”命令,在打开的“运行”对话框中选择要运行的程序文件,然后单击“运行”按钮即可运行该程序文件。 在“项目管理器”对话框的“全部”选项卡中,先选中要运行的程序,然后单击“运行”按钮,即可执行该程序。 在命令窗口中输入命令:DO ,也可以执行相应的程序文件。 事实上,在程序输入完毕后,不关闭程序编辑窗口,直接单击工具栏的“运行”按钮可以直接运行程序,若程序无语法错误,可以得到运行结果,若程序中存在语法错误,则会弹出“程序错误”对话框,给出错误的提示信息,此时,可以单击“取消”按钮,或按【Esc】键终止程序的运行,再根据错误提示修改程序。,Visual FoxPro 6.0 程序设计.课件,-17-,6.2 程序控制结构,6.2.1 顺序结构程序设计 6.2.2 分支结构程序设计 6.2.3 循环结构程序设计,Visual FoxPro 6.0 程序设计.课件,-18-,6.2程序控制结构,程序的控制结构包括顺序结构、分支结构和循环结构3种,每一种控制结构可以包含一个或多个语句,任何程序都是由这3种基本控制结构构成的。,Visual FoxPro 6.0 程序设计.课件,-19-,6.2.1 顺序结构,顺序结构是程序设计中最简单、最常用的基本结构,在该结构中,程序按照命令语句书写的先后顺序依次执行,该结构的流程图如图6-7所示。顺序结构是任何程序的主体基本结构,在分支结构和循环结构内部,也常以顺序结构作为其子结构,前面介绍的例子使用的都是顺序结构。 顺序结构的基本组成语句是数据的输入输出、赋值语句等,数据的输入和输出已在上一节介绍,下面介绍顺序结构中常用的赋值语句和语句的续行与注释功能。,Visual FoxPro 6.0 程序设计.课件,-20-,1.赋值语句,程序设计中经常要使用变量,变量在使用之前需要设定一个初始值,使用过程中也可能要重新赋值,因此可以使用赋值语句将指定的值赋给变量或对象的某个属性,赋值语句主要有如下两种格式: (1)使用赋值符号“=” 该语句的格式如下:= 该语句的意思是将表达式的值计算出来后赋给变量名所代表的存储单元。 (2)使用STORETO命令 该命令的格式如下:STORE TO 该命令是将表达式的值计算出来后赋值变量名表中的每个变量。如:STORE 3*5 TO a,b,c,d 是将变量a,b,c,d同时赋值为15,Visual FoxPro 6.0 程序设计.课件,-21-,在使用赋值语句时需要注意以下几点: 应注意区分赋值符号与数学中的等号。a=3应读作“将数值3赋给变量a”,a=a+1表示将原来a的值加上1后再放到原来a的存储单元中,即将原来a的值加上1后再赋给a。因此,下面两个语句的意思是不同的: X=y &表示将y的值赋给x y=x &表示将x的值赋给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 程序设计.课件,-22-,2.语句的续行,当一条语句很长时,在程序编辑窗口中书写或阅读都不方便,例如: select top 50 percent 学号,姓名,身高,year(出生日期) 出生年份from student order by 出生年份 desc,身高 这时,为了便于书写和理解,可以使用语句的续行功能,用分号“;”将较长的语句分为两行或多行。因此上述语句可以改写为: select top 50 percent 学号,姓名,身高,year(出生日期) 出生年份; from student; order by 出生年份 desc,身高 注意:作为续行符的分号只能出现在行尾。,Visual FoxPro 6.0 程序设计.课件,-23-,3.语句的注释,为了提高程序的可读性,通常在程序的适当位置加上相应的注释,Visual FoxPro中提供了两种注释语句。 (1)程序注释 该语句的格式如下:NOTE|* 该语句通常单独放置一行,用于对程序进行注释,程序运行时,不执行以NOTE或*开头的行。 (2)行注释 语句格式如下:& 该语句通常放在某行命令之后,用于对该行命令进行注释。 注意:不能在命令语句行的续行分号后面加入注释。,Visual FoxPro 6.0 程序设计.课件,-24-,6.2.2 分支结构,分支结构也称为选择结构,是在程序执行时,根据不同的条件,选择执行不同的语句。Visual FoxPro中提供了两种分支结构语句,分别是IF语句和DO CASE语句。 1.IF语句 IF语句主要有两种形式:单分支形式和双分支形式。 (1)单分支形式 单分支形式的格式如下: IF ENDIF 注意:IF和ENDIF必须成对使用,并分两行书写。,Visual FoxPro 6.0 程序设计.课件,-25-,其中条件表达式是关系表达式或逻辑表达式,语句执行时,首先计算条件表达式的值,若为真(.T.)则执行语句块中的语句,否则不执行语句块。无论是否执行语句块中的语句,程序都将转向ENDIF后面的下一条语句继续执行。 流程图如图。,Visual FoxPro 6.0 程序设计.课件,-26-,【例6-3】从键盘上输入两个数x和y,比较大小,若x小于y,则交换两个变量值,使得x不小于y。 分析:根据题目要求,若满足“x小于y”这个条件,则执行“交换两个变量值”的操作,因此IF后面的应是“x,应是“交换两个变量值”。 由于计算机内存有易被覆盖的特点,因此计算机中交换两个变量的值只能借助于第三个中间变量来间接交换,如图6-9所示,则交换两个变量值的代码应为: t=x x=y y=t,Visual FoxPro 6.0 程序设计.课件,-27-,本题程序代码如下: *prog3.prg input “x=“ to x input “y=“ to y if xy t=x x=y y=t endif ?“x=“,x ?“y=“,y,Visual FoxPro 6.0 程序设计.课件,-28-,(2)双分支形式,双分支格式: IF ELSE ENDIF 语句执行时,根据条件表达式的值选择执行两个语句块中的一个。若条件表达式的值为真(.T.),则执行IF后面的语句块1,然后执行ENDIF后面的语句;若条件表达式的值为假(.F.),则执行ELSE后面的语句块2,然后执行ENDIF后面的语句。其流程图如图6-10所示。,Visual FoxPro 6.0 程序设计.课件,-29-,用双分支实现,其程序代码如下: if x=0 y=cos(x)+sqrt(x2+1) else y=log(x2)+x-10 endif 也可用单分支实现,其程序代码如下: y=cos(x)+sqrt(x2+1) if x0 y=log(x2)+x-10 endif,【例6-4】计算分段函数:,Visual FoxPro 6.0 程序设计.课件,-30-,(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 程序设计.课件,-31-,程序代码如下:,*prog5.prg input “请输入a的值“ to a input “请输入b的值“ to b input “请输入c的值“ to c if ab and ac t=a else if ba and bc t=b else t=c endif endif ?“三个数中的最大值是:“,t,Visual FoxPro 6.0 程序设计.课件,-32-,2.DO CASE语句,该语句的格式如下: DO CASE CASE CASE CASE OTHERWISE ENDCASE 语句执行时,依次判断条件表达式的值,一旦某一条件满足,则执行相应语句块;如果所有条件表达式的值都为假,若无OTHERWISE子句,则不执行任何语句,若有OTHERWISE子句,则执行OTHERWISE后面的语句块n+1,无论执行哪一个语句块后,都不再判断下面的条件,而转去执行ENDCASE后面的语句,其流程图如图6-11所示,Visual FoxPro 6.0 程序设计.课件,-33-,【例6-6】某百货公司打折促销的优惠方法:每位顾客一次性购物: 500元以上者,按九五折优惠; 1000元以上者,按九折优惠; 2000元以上者,按八五折优惠; 5000元以上者,按八折优惠。 编写程序,实现输入购物款数,计算并输出优惠后的价格。,程序代码如下: *prog6.prg input “请输入原价:“ to x do case case x500 y=x case x1000 y=x*0.95 case x2000 y=x*0.9 case x5000 y=x*0.85 otherwise y=x*0.8 endcase ?“优惠后的价格是:“,y,Visual FoxPro 6.0 程序设计.课件,-34-,6.2.3 循环结构,VFP提供了3种循环语句:当型循环DO WHILE语句、计数型循环FOR语句和扫描型循环SCAN语句。 1. 当型循环DO WHILE语句 该语句的格式如下: DO WHILE EXIT LOOP ENDDO,Visual FoxPro 6.0 程序设计.课件,-35-,【例6-7】编制程序求1+2+3+100的和,并输出结果。 分析:实现自然数的累加,应该设置一个累加变量和一个计数变量,累加变量的初值为0,计数变量从1开始逐次累加到累加变量中,每累加一次,计数变量加1,直到计数变量为100为止。 程序代码如下: *prog7.prg s=0 i=1 do while i=100 s=s+i i=i+1 enddo ?“s=“,s,Visual FoxPro 6.0 程序设计.课件,-36-,【例6-8】统计学生信息表student中年龄在20岁以上的学生人数,并输出结果。 程序代码如下: *prog8.prg use student n=0 &计数变量初值为0 do while not eof() &循环条件是还未到表尾 if year(date()-year(出生日期)20 n=n+1 endif skip &修改记录指针,指向下一记录,若没该句,将造成死循环 enddo use ?“年龄大于20岁的人数有:“,n,Visual FoxPro 6.0 程序设计.课件,-37-,该语句的格式如下: FOR = TO STEP EXIT LOOP ENDFOR|NEXT 语句执行时,首先给循环变量赋予初值,与终值比较,若超过终值,则循环体一次也不执行,直接转去执行ENDFOR|NEXT后面的语句;若不超过终值,则依次执行循环体中的语句,遇到ENDFORNEXT语句,将循环变量加上步长后,程序转回到循环初始语句,继续判断,流程图如图6-13所示。 步长可正可负.步长为1时,可省略STEP子句。 当循环次数事先已知时,通常使用计数型循环,循环次数可以根据下式计算: INT(ABS(终值-初值)/步长)+1,2.计数型循环FOR语句,Visual FoxPro 6.0 程序设计.课件,-38-,【例6-9】编制程序实现100以内的奇数累加和,并输出结果。 分析:实现100以内奇数的累加,循环变量的初值应为1,终值应为99,循环变量的步长应为2。 【例6-10】从键盘上输入一个大于1的自然数,判断是否为素数(除1和它本身外,不能被其他任何一个整数整除的自然数)。 分析:判断某数n是否为素数,最简单的方法是:从i=2,3,n-1逐个判断n能否被i整除,只要有一个能整除,n就不是素数,退出循环;若都不能整除,则n是素数。可进一步证明:若n不能被2中的任何一个整数整除,则n为素数。,Visual FoxPro 6.0 程序设计.课件,-39-,3.扫描型循环SCAN语句,该语句的格式如下: SCAN FOR EXIT LOOP ENDSCAN 扫描型循环语句专门用来对当前打开的数据表进行操作,它对指定范围满足条件的记录逐一扫描,找到一条满足条件的记录就执行一次循环体语句,每执行一次,记录指针后移,直到所有满足条件的记录都执行完毕。 说明: 语句中缺省时默认为ALL。 其中的EXIT和LOOP子句的功能和DO WHILE循环中的功能相同。,Visual FoxPro 6.0 程序设计.课件,-40-,【例6-11】用扫描型循环SCAN语句统计学生信息表student中年龄在20岁以上的学生人数,并输出结果。 程序代码如下: *prog11.prg use student n=0 scan for year(date()-year(出生日期)20 n=n+1 endscan ?“年龄大于20岁的人数有:“,n,Visual FoxPro 6.0 程序设计.课件,-41-,4.循环的嵌套,在一个循环体内又包含了一个完整的循环结构时称为循环结构的嵌套。在实际应用中,三种循环语句可以相互嵌套,会呈现出多种复杂形式,在编程或阅读程序时要注意各层循环变量的变化规律。 在使用循环嵌套时需要注意以下几点: 循环嵌套时,必须完整嵌套,不能交叉嵌套;循环体内可以嵌套分支语句,嵌套时也要求完整嵌套,不能交叉嵌套。 内重循环的循环变量与外重循环的循环变量不能同名,以免混淆。 多重循环的循环次数等于每一重循环的循环次数的乘积。,Visual FoxPro 6.0 程序设计.课件,-42-,【例6-12】打印九九乘法表,运行界面如图6-14所示。 程序代码如下: *prog12.prg clear &先将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,Visual FoxPro 6.0 程序设计.课件,-43-,数组这种数据结构在程序设计中经常使用,在Visual FoxPro中,只能定义一维数组和二维数组。因为数组中数组元素的下标是有序的,可以以数组元素的下标作为循环变量,利用循环结构来处理数组中每个数组元素。一般用一重循环来处理一维数组,用二重循环来处理二维数组,下面以一维数组为例进行介绍。 (1)一维数组的基本操作 假设定义有一维数组dimension a(10),下面以该数组为例介绍一维数组的基本操作。,数组元素的输出 for i=1 to 10 ?a(i) endfor,数组元素的输入 for i=1 to 10 input to a(i) endfor,5.数组问题,Visual FoxPro 6.0 程序设计.课件,-44-,数组元素的求和 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 程序设计.课件,-45-,数组最典型的应用是排序,排序的算法有多种,如选择法、冒泡法、插入法等,下面介绍冒泡法排序。 假设定义了一个数组dimension a(10),则冒泡法排序的基本思想是:从第一个元素开始,对数组中两两相邻的元素比较,即a(1)与a(2)比较,若为逆序,则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(j) a(j)=a(j+1) a(j+1)=t endif endfor endfor,(2)一维数组的排序,Visual FoxPro 6.0 程序设计.课件,-46-,【例6-13】随机产生20个学生成绩,求出他们的平均成绩,并统计出高于平均成绩的学生数,再将这20个学生成绩按升序排列后输出。 分析:Visual FoxPro提供了随机数函数RAND(),可以产生一个01(不包括1)之间的随机数。学生成绩通常在0100之间,为了产生这之间的随机数,可以用表达式INT(RAND()*100)+1来实现。 程序代码如下: *prog12.prg,Visual FoxPro 6.0 程序设计.课件,-47-,clear dimension a(20) for i=1 to 20 a(i)=int(rand()*100)+1 endfor s=0 for i=1 to 20 s=s+a(i) endfor av=s/20 ?“平均成绩是:“,av n=0 for i=1 to 20 if a(i)av n=n+1 endif endfor,?“高于平均成绩的人数为:“,n for i=1 to 19 for j=1 to 20-i if a(j)a(j+1) t=a(j) a(j)=a(j+1) a(j+1)=t endif endfor endfor ? for i=1 to 20 ?a(i) endfor,Visual FoxPro 6.0 程序设计.课件,-48-,6.3 过程与过程调用,6.3.1 子程序设计与调用 6.3.2 过程与过程文件 6.3.3 局部变量和全局变量、过程调用中的参数传递,Visual FoxPro 6.0 程序设计.课件,-49-,6.3.1 子程序设计与调用,在程序设计中,经常会遇到同一段功能代码在不同的程序段执行多次的情况,这时往往将该功能代码单独编写成一个独立的程序文件存在磁盘上,需要时调用它,这个独立的模块称为子程序。程序之间通过相互调用来建立关系。在Visual FoxPro中,子程序是被其他程序调用的程序文件,主程序能调用子程序,但子程序不能调用主程序,可是子程序可以调用其他的子程序,构成子程序的嵌套调用。 在模块化程序设计中,通常将功能和结构相对独立的功能模块,单独编写成一个独立的子程序。子程序结构不仅易于调试和维护,而且当需要时可以多次调用,减少重复编程,提高程序的通用性。子程序的表现形式有过程、自定义函数和方法3种。,Visual FoxPro 6.0 程序设计.课件,-50-,1.子程序的建立 子程序是一个独立的程序文件,文件扩展名为.PRG,它的建立与前面所说的程序建立的方法一样。 2.子程序的调用 DO WITH 其中WITH 是可选项,用于主程序与子程序之间的参数传递,实际参数列表中的各项可以是常量、变量或表达式,相互之间用逗号隔开。 3.子程序的返回 RETURN TO MASTER|TO 执行子程序时,遇到RETURN命令,就返回到调用它的主程序,或是上一级子程序中调用命令的下一条语句继续执行。通常子程序的最后一条语句是RETURN命令,若缺省,则当子程序执行到最后时将自动执行RETURN功能,返回到主调程序中。,Visual FoxPro 6.0 程序设计.课件,-51-,图6-17是子程序嵌套调用时的程序执行过程示意图。,Visual FoxPro 6.0 程序设计.课件,-52-,【例6-14】分别建立如上图所示的各程序文件,分析执行主程序main.prg的执行结果。程序代码如下:,*main.prg clear ?“正在执行main.prg“ ?“开始调用子程序sub1.prg“ do sub1 ?“从子程序sub1.prg中返回“,*sub1.prg ?“正在执行sub1.prg“ ?“开始调用子程序sub2.prg“ do sub2 ?“从子程序sub2.prg中返回“ ?“开始调用子程序sub3.prg“ do sub3 ?“从子程序sub3.prg中返回“ return,*sub2.prg ?“正在执行sub2.prg“ return,*sub3.prg ?“正在执行sub3.prg“ return,Visual FoxPro 6.0 程序设计.课件,-53-,6.3.2 过程与过程文件,在编写一个大型程序时,可能划分为许多功能模块,如果都写成子程序,就要创建很多程序文件,这些程序文件都存放在磁盘上,每调用一次子程序就访问一次磁盘,需要花费一定的时间,如果程序中调用子程序较多,访问磁盘的次数就多,因此影响程序运行速度。另外,每调用一次子程序将打开一个文件,而由于系统允许同时打开文件数目的限制,调用子程序的嵌套层数也受到限制,否则程序不能正常运行。 因此引入过程的概念,其实过程和子程序非常类似,只是将多个子程序的功能模块代码保存在一个程序文件中,在该程序文件中每个子程序都单独定义,而含有多个子程序的程序文件就称为过程文件,这样打开一个过程文件就意味着打开了所有的过程。当然过程也可以不形成过程文件,直接与调用它的程序放在同一个文件中,不过应把过程放在主程序代码之后,不能将主程序代码放在过程之后。,Visual FoxPro 6.0 程序设计.课件,-54-,1.过程的定义,过程定义的语法格式如下: PROCEDURE PARAMETERS RETURN ENDPROC 其中各参数的说明如下: PROCEDURE :过程的起始语句。 PARAMETERS :有此子句称为有参过程,否则称为无参过程。有参过程中,该子句必须是第一条命令语句。中形参的个数最多为27个,且只能是内存变量,相互之间用逗号隔开。 RETURN :该子句表示将控制返回到调用该过程的语句的下一条语句继续执行。若缺省了该子句,则在过程结束处自动执行一条隐含的RETURN语句。 ENDPROC:过程的结束语句,该语句可以省略,若省略,则过程结束于下一条PROCEDURE语句或程序文件尾。,Visual FoxPro 6.0 程序设计.课件,-55-,2.过程的调用,调用过程的语法格式如下: DO WITH 实参列表中的各项可以是常量、变量或一般表达式,相互之间用逗号隔开。 【例6-15】利用过程来计算圆面积。 程序代码如下: clear input “请输入圆的半径:“ to r s=0 do area with r,s ?“半径为“,r,“的圆的面积为:“,s *area过程 procedure area parameters r,s s=3.14*r*r return endproc,Visual FoxPro 6.0 程序设计.课件,-56-,3.过程文件的建立,过程文件是由若干个过程组合而成的,它的建立方法与程序文件的建立方法相同,扩展名也为.PRG。 4.过程文件的打开与关闭 调用过程文件中的过程前,首先要打开包含它的过程文件。 (1)过程文件的打开 SET PROCEDURE TO , , ADDITIVE 该语句用于打开指定的过程文件,使该过程文件中所有的过程均可供调用。 可以同时打开多个过程文件,如果命令中带有ADDITIVE子句,则在打开当前过程文件时,以前打开的过程文件不关闭,即以前打开的过程文件中的过程仍可以被调用;若命令中未带该子句,则在打开当前过程文件时,以前打开的所有过程文件都会被关闭,即以前打开的过程文件中的所有过程都不能再被调用。 (2)过程文件的关闭 语句格式1为:SET PROCEDURE TO 语句格式2为:CLOSE PROCEDURE,Visual FoxPro 6.0 程序设计.课件,-57-,【例6-16】调用过程文件中的求阶乘的过程,求1!+2!+n!。 程序代码如下:,*prog16.prg clear set procedure to jc input “请输入n的值:“ to n store 0 to s,j for i=1 to n do fact with i,j s=s+j endfor set procedure to ?“1!+2!+n!=“,s,*jc.prg procedure fact parameters x,y t=1 for i=1 to x t=t*i endfor y=t return endproc,Visual FoxPro 6.0 程序设计.课件,-58-,6.3.3 自定义函数,函数分为系统函数与自定义函数, Visual FoxPro提供了几百个系统函数供用户调用,大大方便了用户的编程,但在解决实际问题时,系统提供的函数可能不能满足用户的需求,这时可以自己定义和编写的函数,这样的函数称为自定义函数。函数和过程的作用十分相似,用户自定义的函数实质上是带有返回值的子程序或过程。 1.自定义函数的建立 自定义函数的语法格式如下: FUNCTION PARAMETERS RETURN ENDFUNC,Visual FoxPro 6.0 程序设计.课件,-59-,自定义函数的函数名不能与VFP系统函数同名,也不能和内存变量同名。 自定义函数通常会计算出一个值,由RETURN 语句返回,若RETURN后面缺省表达式,默认函数返回值为.T.,若省略RETURN语句,则函数执行结束时,系统自动执行一个隐含的RETURN命令。 自定义函数可作为一个独立的模块放在调用它的程序文件中,通常放在程序文件的底部;也可以作为一个独立的程序文件,供所有程序调用,这时可以省略自定义函数的起始语句FUNCTION ,若不省略该语句,则函数名必须与程序文件名相同;自定义函数还可以放在过程文件中,随着过程文件的打开而打开,以供调用。 2.自定义函数的调用 函数名(实际参数列表) 函数定义好后,可供程序在任何地方调用。函数调用时,实际参数的个数与形式参数的个数必须相等,且依次虚实结合。若是无参函数,调用时圆括号不能省略。,Visual FoxPro 6.0 程序设计.课件,-60-,【例6-17】将上例改用自定义函数来实现,其中函数放在调用程序所在的程序文件中。 分析:若通过自定义函数来实现求某个数的阶乘,主调模块应通过参数将该数传递给被调函数,被调函数可以使用返回值将计算结果返回给主调模块,因此函数中只需有一个形式参数:求阶乘的数。 程序代码如下:,*prog17.prg clear input “请输入n的值:“ to n s=0 for i=1 to n s=s+fact(i) endfor set procedure to ?“1!+2!+n!=“,s function fact parameters x t=1 for j=1 to x t=t*j endfor return t endfunc,Visual FoxPro 6.0 程序设计.课件,-61-,6.3.4参数传递,主程序在调用子程序、过程和自定义函数时,经常需要把主程序中的数据传递给子程序、过程和自定义函数,然后再将处理的结果返回给主程序,这就需要通过实际参数与形式参数间的参数传递来实现。 参数传递中要求实际参数与形式参数依次相对应,实参与形参对应的次序应一致、类型应一致、参数个数通常也一致,但可以不相同,若个数不相同时,形参的个数不能少于实参的个数,否则系统产生运行错误,若形参的个数多于实参的个数,多余的形参取初始值为.F.;但参数名不要求相同,即对应的实参与形参可以不同名。 根据形参值的改变是否影响实参的值,可以将参数传递分为两类:值传递和引用传递。,Visual FoxPro 6.0 程序设计.课件,-62-,1.值传递 值传递中形参值的改变不影响实参的值,形参与实参使用不同的内存空间。在主程序调用子程序、过程和自定义函数时,形参单独分配空间,系统会计算出主程序中实参的值,并把它们赋值给相应的形参。形参在程序调用过程中若发生值的改变,不影响实参原来的值。 值传递的两种情况: (1)程序调用时,可以使用如下两种格式的语句: 文件名|过程名|函数名(实际参数列表) 或者: DO 文件名|过程名 WITH (实际参数列表) 即将实际参数加上圆括号后再放到实参列表中,默认的是值传递的方式。 (2)若程序调用格式为:文件名|过程名|函数名(实际参数列表),可在程序调用之前使用命令设置参数传递的方式为值传递,命令格式如下: SET UDFPARMS TO VALUE,Visual FoxPro 6.0 程序设计.课件,-63-,2.引用传递,引用传递中形参值的改变影响实参的值,形参与实参使用的是同一个内存空间(尽管它们的名字可能不同)。 引用传递的3种情况: (1) 程序调用时,使用如下的语句调用格式: DO 文件名|过程名 WITH 实际参数列表 (2) 若程序调用格式为:文件名|过程名|函数名 (实际参数列表),可在程序调用之前使用命令设置参数传递的方式为引用传递,命令格式如下: SET UDFPARMS TO REFERENCE。 (3)使用标记实际参数 程序调用时,在实际参数前加标记,则强制参数以引用方式传递,Visual FoxPro 6.0 程序设计.课件,-64-,【例6-18】值传递和引用传递示例。程序prog18.prg如下: clear store 0 to a,b do sub with a,(b) &参数a是引用传递,参数b是值传递 ?“第1次调用:“,a,b set udfparms to value &设置为值传递方式 store 0 to a,b sub(a,(b) &参数a,b均为值传递方式 ?“第2次调用:“,a,b set udfparms to reference &设置为引用传递方式 store 0 to a,b sub(a,(b) &参数a是引用传递,参数b是值传递 ?“第3次调用:“,a,b store 0 to a,b sub(a,b) &参数a,b均为引用传递方式 ?“第4次调用:“,a,b procedure sub parameters x,y x=x+10 y=y+10 return endproc,Visual FoxPro 6.0 程序设计.课件,-65-,6.3.5 变量的作用域,内存变量在程序中的作用范围称为内存变量的作用域。根据变量作用域的不同,可将内存变量分为3类:本地变量(局部变量)、私有变量和公共变量(全局变量)。 1. 本地变量(局部变量) 本地变量的作用域只包括定义它的模块,不能在其它模块中使用。本地变量一经定义,就在内存中分配了存储单元,一旦离开了本模块,本地变量所占的存储单元就被释放,因此不能再被使用。 定义本地变量的语法格式:LOCAL 该命令将内存变量表中的变量定义为本地变量,并将这些变量的初值赋值为.F.。 注意:LOCAL命令可以定义本地变量,也可定义本地数组。LOCAL命令与LOCATE命令的前4个字符相同,因此不可缩写。,Visual FoxPro 6.0 程序设计.课件,-66-,2.私有变量 私有变量的作用域包括定义它的模块及其调用的子程序、过程或函数模块,定义私有变量的语法格式如下: PRIVATE 该命令将内存变量表中的变量定义为私有变量,并将这些变量的初值赋值为.F.。 PRIVATE命令可以定义私有变量,也可定义私有数组。程序中未加定义而直接使用的内存变量是私有变量。 当被调用的子程序、过程或函数模块中有与主调模块序中的变量同名时,且希望起作用的是被调用模块中的变量时,可以在被调用模块中用PRIVATE命令声明该变量,来隐藏上级主调模块中的同名变量,使得主调模块中的同名变量在被调模块中暂时被屏蔽,直到被调模块执行结束后,返回到主调模块中,再恢复使用主调模块中的同名变量。 在多人开发的应用程序中为了防止不同模块中因变量名相同而造成失误,可以在各自开发的子程序模块中定义私有变量,以屏蔽主调模块中的同名变量。,Visual FoxPro 6.0 程序设计.课件,-67-,3. 公共变量(全局变量) 公共变量的作用域包括程序的所有模块,定义公共变量的语法格式如下: PUBLIC 该命令将内存变量表中的变量定义为公共变量,并将这些变量的初值赋值为.F.。 PUBLIC命令可以定义公共变量,也可定义公共数组。 用PUBLIC命令定义的公共变量在整个程序运行过程中始终有效,始终占有内存的存储单元,即使程序运行结束,系统也不会自动释放存储单元,而只能用RELEASE命令或CLEAR ALL命令才能清除公共变量。 若某模块中建立的内存变量要供其它模块使用,必须将这种变量用PUBLIC命令声明为公共变量。在命令窗口中定义的变量或数组都是公共变量,但这些公共变量不能在程序中引用。若同一模块中有同名的各种变量,起作用的优先次序为:本地变量私有变量全局变量。,Visual FoxPro 6.0 程序设计.课件,-68-,clear public c &定义公共变量c,作用域包括各个模块 a=1 b=10 &a,b未加定义而直接使用,为私有变量 c=100 do sub1 ?“主程序中的a,b,c值分别为:“,a,b,c proc sub1 local b &本地变量b,作用在sub1模块中 a=2 &使用的是上级主调模块中的变量a b=20 c=200 &使用的是上级主调模块中的c do sub2 ?“sub1中的a,b,c值分别为:“,a,b,c endproc proc sub2 private a &定义私有变量a,屏蔽上级模块的a a=3 b=30 &使用最上级模块中的私有变量b c=300 &使用最上级模块中的公共变量c ?“sub2中的a,b,c值分别为:“,a,b,c Endproc,【例6-18】观察程序,体会变量的作用域。,Visual FoxPro 6.0 程序设计.课件,-69-,6.4 程序的调试,6.4.1 程序常见错误 6.4.2 调试器窗口 6.4.3 “调试”菜单,Visual FoxPro 6.0 程序设计.课件,-70-,6.4 程序的调试,程序调试是指在发现程序有错误的情况下,确定出错的位置并纠正错误,直到达到预定的设计要求为止。程序调试往往是先分模块调试,当各个模块都调试通过后,再将各模块联合起来进行调试。为了减少程序的调试时间,在编程时应尽量减少出错,因此应了解程序中的常见错误。,Visual FoxPro 6.0 程序设计.课件,-71-,6.4.1 程序常见错误,1.语法错误 指程序中的命令语句使系统不能识别而无法操作的错误,这类错误在程序编译时或程序运行时系统会给出出错信息,可以根据系统的提示来纠正。常见的系统编译提示信息及可能出现的错误见下表。,Visual FoxPro 6.0 程序设计.课件,-72-,2.逻辑错误,逻辑错误是指每一个语句都符合语法要求,但最后的运算结果不正确。如计算公式不对、语句执行次序不对、程序结构错误等。 发现程序有错误,就应该确定出错的位置并纠正错误,如何确定出错的位置是关键。语法错误通过编译提示的错误信息通常可以确定出错位置;但对于逻辑错误,不易确定错误的位置。因此,Visual FoxPro提供了可视化调试程序的工具调试器,借助调试器,用户能有效地进行程序的调试。,Visual FoxPro 6.0 程序设计.课件,-73-,6.4.2 调试器窗口,单击“工具”|“调试器”命令,或在命令窗口中输入“DEBUG”命令,打开调试器如图,Visual FoxPro 6.0 程序设计.课件,-74-,1.“跟踪”窗口 用来显示正在调试执行的程序文件,以便调试和观察。单击调试器窗口中的“文件”|“打开”命令可以打开需要调试执行的程序文件。打开后,程序将显示在“跟踪”窗口中,如图6-22所示。“跟踪”窗口左侧显示的代码指示符号“”用来指示调试中正在执行的代码行。在调试程序过程中,经常需要将程序执行到某个位置停下来,以便分析当前程序执行的变量输出情况,该位置称为断点。若需在某行设置断点,可以双击该代码行,在该行左侧将会出现一个红色的实心圆点“”,当程序执行到该行时,将中断程序运行。,图6-22 “跟踪”窗口,Visual FoxPro 6.0 程序设计.课件,-75-,除了在“跟踪”窗口中双击代码行来设置断点外,还可以单击“工具”|“断点”命令,打开如图6-23所示的“断点”对话框来进行断点设置。,图6-23 “断点”对话框,Visual FoxPro 6.0 程序设计.课件,-76-,2. “监视”窗口 用来监视指定表达式在程序调试过程中的取值变化情况。在“监视”的文本框内输入需要监视的表达式,回车后被加入监视列表框中,当程序调试执行时,列表框中将显示所有监视表达式的名称、当前值和类型,如图6-24所示。 双击监视表达式,可对其编辑修改;若删除该表达式,右击监视表达式,在弹出菜单中选“删除监视”命令即可。,图6-24 “监视”窗口,Visual FoxPro 6.0 程序设计.课件,-77-,3.“调用堆栈”窗口 显示当前正在执行的程序、过程或方法程序名称。若正在执行的是一个子程序,则显示该子程序名称和各主调程序名称,其中左侧的代码指示符号“”指向正在执行的程序模块,如图6-25所示。,图6-25 “调用堆栈”窗口,Visual FoxPro 6.0 程序设计.课件,-78-,4.“调试
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!