第五章VFP程序设计基础•VFP程序设计语言概述•面向过程程序设计(结构化程序设计)•面向对象程序设计结束放映?YES(是)NO(否)VFP提供了一整套的程序设计语言,供用户进行应用程序开发。这些语言可以在命令窗口、程序设计、表单事件中使用。在命令窗口仅是了解或理解各种命令的功能及语法,但有些命令在窗口中是不能使用的。在程序设计、表单事件中使用,才能达到某种要求。程序设计方法程序设计方法面向过程的程序设计(结构化程序设计)程序由三种基本结构组成,程序按照开发者规定的流程进行。面向对象的程序设计从应用程序开发者的角度来看,不再着重于代码的全部流程,而主要考虑建立对象和赋予对象怎样的特征与行为。从用户的角度来看,运算的顺序不是按应用程序开发者在设计时规定好的流程进行,而是根据用户的需要进行。结构化程序设计的概念在程序设计方法学中,结构化程序设计是程序设计的基本方法。所谓结构化程序设计,通常是指用结构化编程语句来编写程序。其基本思想是逐步求精、模块化,其程序控制的基本结构是顺序、分支(选择)、循环,程序的流程由程序员控制,程序设计相对简单。结构化程序设计是面向对象程序设计的基础。本节主要介绍程序的创建和保存、程序的运行及其结构化语句、过程和用户自定义函数。面向对象程序设计是一种系统化的程序设计方法,允许抽象化、模块化的分层结构。面向对象的程序设计是通过对类、子类和对象等的设计来体现的。利用类可以简化程序设计,提高程序代码的可重用性。通过类之所以可以简化应用程序的设计,是因为类具有继承性、多态性、封装性、抽象性等特点。面向对象的程序设计概述•创建程序方法之一:“项目管理器”-“代码”选项卡-“程序”项-“新建”按钮方法之二:主菜单的“文件”-“新建”命令-“程序”项-“新建文件”按钮方法之三:常用工具栏“新建”按钮-“程序”项-“新建文件”按钮方法之四:命令窗口:MODIFYCOMMAND[程序名]注意:1、只有方法之一,新建的程序在“项目管理器”中能见到,其他三种方法都不见到,必须在“项目管理器”中用“添加”按钮,才能加入在“项目管理器”中。2、创建程序后,注意保存文件:主菜单的“文件”-“保存”命令3、扩展名为:.PRG输入下列程序段,看执行的结果是什么CLEARNEWNUM=0FORI=1TO100NEWNUM=NEWNUM+IENDFOR?NEWNUM另一程序为:CLEARNEWNUM=0FORI=1TO9?FORJ=1TO9??STR(I,2)+'*'+STR(J,1)+'='+STR(I*J,2)ENDFORENDFOR•修改程序修改程序前,要打开指定的程序,其方法:方法之一:“项目管理器”-“代码”选项卡-“程序”项-选定要修改的程序-“修改”按钮方法之二:主菜单的“文件”-“打开”命令-在对话框中选定要修改的程序-“确定”按钮方法之三:常用工具栏“打开”按钮-选定要程序的程序-“确定”按钮方法之四:命令窗口:MODIFYCOMMAND[程序名]/?•运行程序方法之一:“项目管理器”-选定要执行的程序序-“运行”按钮(常用工具栏的“运行”按钮)方法之二:命令窗口:DO程序名[.PRG]面向过程程序设计(结构化程序设计)程序的基本结构顺序结构、分支(选择)结构、循环结构例题分析过程和用户自定义函数(UDF)过程和用户自定义函数•过程和用户自定义函数的概念•UDF的创建、保存和调用•参数传递的两种方式过程和用户自定义函数(UDF)的概念用户自定义函数扩充了VFP语言,通过定义UDF来为自己的应用程序建立一些专用函数。UDF包括保存在独立程序文件(.PRG)中、程序中的过程和函数、以及数据库的存储过程中。在VFP中,过程和函数的区别不大。为了创建一个过程或函数,需要使用PROCEDURE或FUNCTION命令给过程或函数赋予一个过程名或函数名,其后可是任意条数的其他语句,以实现特定的功能。UDF的创建过程的定义如下:PROCEDURE过程名PARAMETERS参数表语句组[RETURN表达式]ENDPROCUDF的创建函数的定义如下:FUNCTION函数名PARAMETERS参数表语句组[RETURN表达式]ENDFUNC为了使一个UDF能够接受一定的参数,在PROCEDURE或FUNCTION命令后面的第一个可执行语句必须是PARAMETERS语句。语法如下:PARAMETERSParameterList参数ParameterList指定接收数据的内存变量或数组的列表。其中的参数应用逗号分隔。最多可传递27个参数。例如:PROCEDUREmyudfPARAMETERSp1,p2,p3语句组ENDPROCUDF的参数RETURN语句返回一个值给调用程序。省略了RETURN语句的UDF,其缺省的返回值为真(.T.)。函数的返回值可以直接打印在活动窗口中,也可以用一个变量接收下来。如:var=myfunc()UDF的返回值UDF的保存UDF的保存将一个自定义函数以独立文件保存(文件名应与函数名同名)例题分析保存在一个程序文件的最后例题作为过程文件(将几个函数保存在一个文件中。例题存储在数据库当中,作为数据库的存储过程例题:求1到10的阶乘的和CLEARnResult=0FORn=1TO10nResult=nResult+jc(n)ENDFOR?nResult***********以下部分为自定义函数FUNCTIONJCPARAMETERSnum&&传递一个数值参数num,返回num的阶乘s=1FORn=1TOnums=s*nENDFORRETURNs例题:********自定义函数JC()用于计算阶乘FUNCTIONjcPARAMETERSnum&&传递一个数值参数num,返回num的阶乘s=1FORn=1TOnums=s*nENDFORRETURNs********自定义函数LJH()用于计算累加和FUNCTIONljhPARAMETERSnum&&传递一个数值参数num,返回num的累加和s=0FORn=1TOnums=s+nENDFORRETURNs调用一个过程,可以使用DO命令;调用一个函数,则与VFP中的标准函数的调用完全相同,可直接用该函数的名称和随后的一对括号来调用。如:DOmyproc[INProgramName][WITHParameterList]=myfunc(ParameterList)例如:DOMyudfWITHtp1,tp2,tp3=Myudf(tp1,tp2,tp3)UDF的调用UDF的调用UDF的调用如果过程或函数存在于单独的程序文件中,则可以使用SETPROCEDURETO命令访问它们。例如,保存过程或函数的文件名为PROCS.PRG,可使用如下命令来访问它们:SETPROCEDURETOprocs.prg参数传递的两种方式有两种方式将参数传送给UDF:按引用传递方式和按值传递方式。按引用(Reference)传递方式是将作为参数的变量和数组元素的地址传递给UDF,当一个值在被调用过程中更改时,新值传递回调用程序中相关的变量或数组。按值(Value)传递方式是把变量和数组元素的值直接传递给UDF,当UDF中参数的值发生变化时,原来的变量或数组元素的值不变化。系统默认情况下,系统通过值将参数传递给自定义函数,通过引用将参数传递给过程。在调用之前可以使用SETUDFPARMSTOREFERENCE|VALUE命令来改变参数传递的方式。强制设定一种传递方法:用括号括起一个变量,则设定按值传递;在变量之前加@符号,设定以引用传递方式。例题FUNCTIONpluparaaa=a+1ReturnaSetudfparamstovalueStore1tognz?plu(gnz),gnzSetudfparamstorefeStore1tognz?plu(gnz),gnz按值传递按地址传递Store1tognz?plu((gnz)),gnzStore1tognz?plu(@gnz),gnz定义一个函数ntoc(),当传递给一个0~9之间的阿拉伯数字时,返回一个中文的“零~九”。在命令窗口中执行MODIFYCOMMANDntoc命令,在编辑窗口中输入如下代码:FUNCTIONntocPARAMETERSpDigitLOCALcStringcString=零一二三四五六七八九returnsubstr(cString,pDigit*2+1,2)ENDFUNC可以把该函数保存为独立的程序文件ntoc.prg。以下是对该函数的调用:?ntoc(3)&&显示“三”UDF的例题分析例:把普通的日期改写成汉语字符形式functiondtoccparadedatecyear=str(year(dedate),4)+年cmonth=str(month(dedate),2)+月cday=str(day(dedate),2)+日retucyear-cmonth-cdayendfuncUDF的例题分析程序的创建和保存VFP程序是包含一系列命令的文本文件。可以使用菜单或工具栏中的“新建”命令或在命令窗口中执行如下命令来创建程序:MODIFYCOMMAND或MODIFYCOMMAND程序文件名运行程序程序创建之后便可运行。方法有:1.若程序包含在一个项目中,则在“项目管理器”中选定它并选择“运行”命令。2.在“程序”菜单中选择“运行”菜单项。在程序列表中,选择想要运行的程序,单击“运行”按钮。3.在“命令”窗口中,按如下方式键入DO命令以及要运行的程序名:DO程序文件名4.在程序的编辑窗口打开的情况下,按组合键【Ctrl+E】。顺序(sequential)顺序结构是指一组命令按照特定的次序存放在程序文件中,程序运行时,依次执行程序中的各条命令行。例如:USEJSAPPENDBLANKEDITUSE◆例题分析例1:已知圆的半径,求圆的周长和面积。R=5S=2*R*3.14159AREA=R**2*3.14159?”圆的周长为”,S?”圆的面积”,AREA例2:将A,B中的数对调。A=5B=10C=AA=BB=C?A,B顺序结构例题分析条件分支(conditionalbranching)条件分支结构用于程序中根据条件的测试结果执行不同的运算。VFP中有两条命令实现条件分支:▲IF…ELSE…ENDIF▲DOCASE…ENDCASE在VFP中还可使用IIF()函数实现条件分支。IF…ELSE…ENDIF语句语句格式:IF条件表达式命令组1[ELSE命令组2]ENDIF该语句指定当条件表达式结果为.T.和.F.时程序执行语句的顺序。若含有ELSE子句,则条件表达式结果为.T.时,执行命令组1,否则执行命令组2;若不含有ELSE子句,则条件表达式结果为.T.时,执行命令组1,否则执行ENDIF后面的语句。请参见流程图。◆例题分析对条件表达式求值命令组1命令组2IFENDIF.T..F.IF…ELSE…ENDIF语句流程图例1:根据变量X的正负符号情况决定变量Y的值为1或-1。X=5IFX0Y=1ELSEY=-1ENDIF?Y例2:求A,B两数中的最大数。A=5B=10MAX=AIFBMAXMAX=BENDIF?MAX或:A=5B=10IFABMAX=AELSEMAX=BENDIF?MAXIF…ELSE…ENDIF语句例题分析例3:Dbirthday={^1985/10/15}Ifdbirthday=date()nage=year(date())-year(dbirthday)?’年龄为’+alltrim(str(nage))Else?”日期错误,无法计算年龄!”endifDOCASE…ENDCASE语句语句格式:DOCASECASE条件表达式1命令组1[CASE条件表达式2命令组2…………CASE条件表达式n命令组n][OTHERWISE其他命令组]ENDCASE◆例题分析该语句执行时,首先从第一个CASE开始,判断其后的条件表达式的值是否为真,当遇到第一个结果为真的CASE表达式时,就执行它后面的命令组,