版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章
VisualFoxPro程序设计7.1程序与程序文件VisualFoxPro支持两种程序设计:结构化程序设计(面向过程的编程方式)面向对象的程序设计7.1.1程序1.程序的概念程序是命令的有序集合程序以文本文件的形式存储在磁盘上,称为程序文件程序文件的扩展名为.prg
2.程序方式与交互方式的区别程序可完成复杂的任务,命令只能完成简单任务命令不被保存,程序可长期保存并可多次修改和运行一个程序中可以调用其他程序,命令则不能7.1.2程序文件的建立、编辑、保存和运行1.建立和编辑程序文件(1)命令方式格式:modifycommand[<程序文件名>]说明:扩展名.prg可以省略,由系统自动添加。(2)菜单或工具栏方式7.1.2程序文件的建立、编辑、保存和运行2.保存程序文件保存:菜单或工具栏按钮、关闭窗口、组合键【Ctrl+W】【ESC】或【Ctrl+Q】放弃当前修改7.1.2程序文件的建立、编辑、保存和运行3.程序文件的运行(1)命令方式运行程序格式:DO<程序文件名>[With<参数>]
说明:文件名可以是.prg文件,也可以是其他类型文件如:.exe、.mpr、.qpr,所以要加上扩展名。(2)菜单或工具栏方式运行程序7.1.3程序中常出现的错误遗漏关键字和变量之间的空格遗漏定界符,或定界符使用了中文标点符号关键字、变量名和文件名拼写错误内存变量没有初始化表达式和函数中的数据类型不匹配控制语句缺少结束语句控制语句嵌套错误7.2程序中常用的命令7.2.1基本输入命令1.Input命令格式:INPUT[提示信息]TO<内存变量>功能:从键盘上接收数据(可为任何类型)赋给内存变量说明:提示信息要使用定界符定界,提示信息可以省略不能不输入任何内容直接按回车键输入的字符数据需加定界符,输入日期数据时加大括号{},输入逻辑值时加圆点定界符(.)。举例:inputtoAAinput"请输入学生姓名:"tonameinput"请输入该生的出生日期:"tobirthInput"请输入该生的党员值:"to党员2.Accept命令格式:ACCEPT[提示信息]TO<内存变量>功能字符串接收命令,仅从键盘上接收字符型数据并赋给内存变量。输入的字符串不加定界符,否则,系统会认为定界符也是输入字符串本身的一部分。如果想输入123,此时的123也是字符型数据不能用于计算。举例:accept"请输入学生证号"tonoaccepttoabaccept“请输入学生姓名"toXM3.Wait命令格式:WAIT[提示信息][TO<内存变量>][Window][Timeout<表达式>]功能:等待用户按键盘上任一个键。说明省略提示信息后,系统默认为提示“按任一键继续…”。
waittox<内存变量>用于保存用户按键的字符,可省略此项。如指定Window项,主窗口的右上角会出现一个Wait提示窗口,来显示提示信息,否则显示在屏幕工作中。如指定[Timeout<表达式>]项,用于设定等待时间,Timeout为间隔秒数,一旦超时,系统自动往下执行。
wait"请输入一个字母"tomwindowtimeout3【例7-1】输入任意一个数据,判断该数的数据类型。程序如下:CLEARINPUT“请输入任意类型的一个数据”TOX?X,“的数据类型为:”,VARTYPE(X)第一次运行:请输入任意类型的一个数据:123第二次运行:请输入任意类型的一个数据:"123"第三次运行:请输入任意类型的一个数据:.T.第四次运行:请输入任意类型的一个数据:{^1991-05-03}
【例7-2】查询学生表中某些学生的信息。程序如下:USE学生.DBFACCEPT"请输入您要查询的学生姓名"TONAMELOCATEFOR姓名=NAMEDISPWAIT“您还要查询其他内容?”WINDOWTIMEOUT5INPUT"请输入您要查询的学生的身高"TOHEIGHTLOCATEFOR身高=HEIGHTDISPUSERETURN7.2.2基本输出命令1.表达式输出命令格式:?|??<表达式1>[,<表达式2>…]功能:对一个或多个表达式求值,并将结果输出到系统主窗口上。说明:?:表达式的值换行显示;??:表达式的值不换行显示;
?:单个?表示需要光标换行。举例:?3+4,date(),6>7use学生表?姓名,性别,出生日期???姓名,身高,体重2.文本输出命令格式:Text<文本信息>
EndText功能:将文本信息输出在屏幕上。说明:Text和EndText必须成对出现。举例:text
系统主菜单1.数据输入2.数据查询
3.数据统计
4.退出系统endtext
7.2.3定位输入输出命令1.定位输出命令格式:@<行,列>SAY<表达式>功能:在屏幕指定位置输出表达式的值。说明:<行,列>:指定了输出的位置。标准屏幕是25行80列,左上角顶点为(0,0),右下角坐标为(24,79)。行、列都可以为表达式,还可为小数。举例:@10,10say"hello!"@15,20say"howareyou!"@20,35say"大家好!"2.定位输入命令格式:@<行,列>[SAY(提示信息)]GET<变量>…READ功能:在屏幕指定位置接收键盘输入的新值说明SAY子句:用于显示提示信息,提示信息加定界符GET子句:用于为显示变量的值,并允许输入新值
GET子句中的变量必须有确定的初值
初值决定了该变量的类型和宽度
READ:使GET后的<变量>进入编辑状态;让光标自动跳到该变量值所在位置上等待编辑修改;可在多个定位输入命令后面使用一个read语句。clearname="张晓磊"grade=98.6birth={^2002-09-07}团员=.t.@0,10say"name"getnameread@1,10say"grade"getgraderead@2,10say"birth"getbirthread@3,10say"团员"get团员read?name,grade,birth,团员clearuse学生表go2@0,10say"姓名:"get姓名@1,10say"性别:"get性别@2,10say"出生日期:"get出生日期@3,10say"党员:"get团员@3,10say"身高:"get身高read7.2.4清屏命令格式:CLEAR功能:清除屏幕或窗口中的显示内容,光标回到屏幕左上角。7.2.5终止程序执行和返回命令1.Cancel终止程序执行,关闭所有打开的程序,返回命令窗口。2.Return结束当前程序执行,返回到调用它的上一级主程序,若无上级程序则返回命令窗口。3.Quit退出VisualFoxpro系统。7.2.6MessageBox()函数1.语法格式:MESSAGEBOX(提示信息[,对话框的属性[,对话框窗口标题]])2.功能:显示一个自定义的对话框。常用作提示之用,也可作一些简单的选择,比如“确定”、“取消”等3.举例:messagebox("请选择",32+3+0,"测试")4.说明:(1)提示信息:对话框中所用到的提示文字。(2)对话框的属性:MESSAGEBOX(提示信息[,对话框的属性[,对话框窗口标题]])例如:messagebox("请选择",32+3+0,"测试")值图标16红色叉号32问号48感叹号64字母i值对话框按钮属性0仅有一个“确定”按钮1有“确定”和“取消”按钮2“终止”、“重试”、“忽略”3“是”、“否”、“取消”4“是”和“否”按钮5“重试”和“取消”按钮值默认按钮0第1个256第2个512第3个设置图标设置按钮属性设置默认按钮(3)对话框窗口标题MESSAGEBOX(提示信息[,对话框的属性[,对话框窗口标题]])例如:messagebox("请选择",32+3+0,"测试")(4)返回值:该函数执行后有返回值,类型为数值型
n=messagebox("请选择",32+3+0,"测试")
?n值键1确定2取消3终止4重试5忽略6是7否7.3程序的基本控制结构程序的概念命令(或语句)的有序集合,以文件(.prg)形式存储一个程序一般包括三个部分:数据定义或输入部分数据处理部分数据输出部分程序的三种基本控制结构:顺序结构选择结构循环结构
7.3.1顺序结构顺序结构程序的含义按语句排列的先后顺序,从上到下依次执行各语句。每个语句执行一次,且只执行一次。【例7-3】编程计算圆的周长和面积。ClearInput"请输入圆的半径"ToRPi=3.14L=2*PI*RS=PI*R*R?"圆的周长为:",L?"圆的面积为:",S
Return命令序列1命令序列2……命令序列n输入半径R的值定义圆周率变量pi计算周长L和面积S输出L和S的值清屏幕【例7-4】查询学生表中所有男同学和女同学的学生证号,姓名,性别和年龄,并分别显示男同学和女同学的信息。程序分析:clearuse学生表?"男同学的信息"disp
学生证号,姓名,性别,;(year(date())-year(出生日期));for性别="男"?"女同学的信息"disp
学生证号,姓名,性别,;(year(date())-year(出生日期));for性别="女"use打开学生表提示先显示男同学信息逐页显示男同学信息关闭打开的表清屏幕提示先显示女同学信息逐页显示女同学信息7.3.2选择结构选择结构又称分支结构,它是在程序执行过程中,通过判断某些条件是否成立来控制程序走向的程序结构。分支程序结构的分类:单(向)分支双(向)分支多(向)分支1.单(向)分支格式:IF<条件><命令序列1>ENDIF功能:若<条件>成立,则执行<命令序列1>;否则执行ENDIF后面的语句。说明:
IF和ENDIF必须成对出现。<条件>是一个逻辑值表达式。<命令序列1>可以是多条语句的集合。命令序列1条件?不成立成立clearinput"请输入一个正整数"toxifx>0?"输入的是正整数"?"x=",xendifreturn【例7-5】判断一个数是正负、负数、还是零。程序分析:ClearInput"请输入一个数"toNIfN>0?"是正数。"EndifIfN<0?"是负数。"EndifIfN=0?"是零。"Endif
【例7-6】在学生表中根据所输入的学生证号查找该学生记录。程序分析:ClearUse学生表Accept"请输入所要查找的学生证号:"TOXSZHLocateFor学生证号=XSZHIfFound()
DispEndIfUseReturn2.双(向)分支格式IF<条件><命令序列1>ELSE<命令序列2>ENDIF功能:若〈条件〉成立,则执行<命令序列1>,否则执行<命令序列2>。说明:IF和ENDIF必须成对出现;ELSE本身占一行。命令序列1条件?不成立成立命令序列2【例7-7】用双分支实现判断一个数的正负。程序分析:ClearInput"请输入一个数"toNIfN>=0?"是正数。"Else?"是负数。"Endif?"程序运行结束"RETURN是正数N>=0否是是负数输入一个数程序运行结束分支语句的嵌套IF<条件>IF<条件><语句序列1>ELSE<语句序列2>ENDIFELSE
IF<条件><语句序列2>ENDIFENDIFClearInput"请输入一个数"toNIFN>0?"是正数。"ELSEIFN=0?"是零。"ELSE?"是负数。"ENDIFENDIF?"程序运行结束"RETURNClearInput"请输入一个数"toNIFN>=0IFN>0?"是正数。"ELSE?"是零。"ENDIFELSE?"是负数。"ENDIF?"程序运行结束"RETURN【例7-8】在学生表中根据所输入的姓名查找该学生记录
程序分析:ClearUse学生表Accept"请输入所要查找的姓名:"TOXMLocateFor姓名=XMIfFound()
DispELSE?”查无此人!”EndIfUseReturn显示当前记录找到?否是显示查无此人按XM查找记录关闭表打开学生表输入要查找的姓名-XM3.多(向)分支格式:DOCASECASE<条件1><命令序列1>CASE<条件2><命令序列2>…………CASE<条件n><命令序列n>[OTHERWISE<命令序列n+1>]ENDCASE条件1otherwise条件2条件n…ENDCASE的下一条命令命令序列1命令序列2命令序列n命令序列n+1YYYNNN【例7-9】根据所输入的日期判定今天是星期几。程序分析:输入日期
INPUT
根据日期判断星期几
DOW(日期变量)程序结构分析:单分支双分支多分去Input"请输入今天日期:"ToDIFDOW(D)=1?"日期日"ENDIFIFDOW(D)=2?"日期一"ENDIFIFDOW(D)=3?"日期二"ENDIFIFDOW(D)=4?"日期三"ENDIFIFDOW(D)=5?"日期四"ENDIFIFDOW(D)=6?"日期五"ENDIFIFDOW(D)=7?"日期六"ENDIF【例7-9】根据所输入的日期判定今天是星期几。程序分析:输入日期
INPUT根据日期判断星期几
DOW(日期变量)程序结构分析:单分支双分支(嵌套)多分去Input"请输入今天日期:"ToDIFDOW(D)=1?"日期日"ELSEIFDOW(D)=2?"日期一"ELSEIFDOW(D)=3?"日期二"ELSEIFDOW(D)=4?"日期三"ELSEIFDOW(D)=5?"日期四"ELSEIFDOW(D)=6?"日期五"ELSEIFDOW(D)=7?"日期六"ENDIFENDIFENDIFENDIFENDIFENDIFENDIF【例7-9】根据所输入的日期判定今天是星期几。程序分析:输入日期
INPUT根据日期判断星期几
DOW(日期变量)程序结构分析:单分支双分支多分去Input"请输入今天日期:"ToDDoCaseCaseDow(D)=1?“星期日”CaseDow(D)=2?“星期一”CaseDow(D)=3?“星期二”CaseDow(D)=4?“星期三”CaseDow(D)=5?“星期四”CaseDow(D)=6?“星期五”OTHERWISE?“星期六”EndCaseAccept"请输入学生证号:"ToXSZHUse成绩表LocateFor学生证号=XSZHDoCaseCase期末成绩>=90?"优秀"
Case期末成绩>=80and期末成绩<=89?"良好"
Case期末成绩>=70and期末成绩<=79?"中等"
Case期末成绩>=60and期末成绩<=69?"及格"
Case期末成绩<60?"不及格"EndCase【例7-10】根据所输入的学生证号,,为成绩表中“期末成绩”字段的值判定等级。期末成绩在:
90分以上的为优秀,
80至89为良好,
70至79为中等,
60至69为及格,
60以下为不及格。
程序分析:
★学生证号的输入
★成绩的判断
★分支结构7.3.3循环结构循环结构(简称循环):程序中,根据某些条件有规律地重复执行某程序段被重复执行的程序段,称为循环体循环体通过循环结构语句来实现循环循环结构可以减少程序代码重复书写的工作量,使编程效率大大提高,VFP的循环结构语句主要三种当型循环步长型循环表扫描型循环命令格式1DOWHILE<条件>循环体语句ENDDO1.当型循环(DOWHILE……ENDDO)循环体语句条件?NENDDO后面语句Y语句功能:(1)判断<条件>是否为真(.T.),是真执行循环体语句,否则执行ENDDO后面语句(2)执行DOWHILE和ENDDO之间的命令序列(循环体)(3)遇到ENDDO,转(1)(4)结束循环,转到ENDDO后面的语句。【例7-11】输出1至100之间所有能被3整除的数。ClearY=1DoWhileY<=100Ifmod(Y,3)=0?Y
EndIfY=Y+1EndDoRETURN显示y值y<=100?NENDDO后面语句Y定义变量y=1y整除3?YNy值增1【例7-12】把学生表所有民族为汉族的学生逐条输出。程序PR7-12.prg如下:ClearUse学生表.dbfDoWhilenotEOF()
If民族="汉族"
Disp
EndIfSkipEndDOUSE命令格式2DOWHILE<条件>[命令序列1]
[EXIT]
[命令序列2]
[LOOP][命令序列3]ENDDO语句功能:在执行循环体语句的过程中遇到exit语句,立即结束循环体的执行,转到ENDDO的后面;在执行循环体语句的过程中遇到loop语句,立即结束循环体的本次执行,转到DOWHILE处,重新判断循环条件。EXIT和LOOP命令只能出现在循环体中,并且可以出现在循环体中的任何位置。【例7-12-1】编写一个能多次计算任意半径的圆的周长和面积的程序,当输入的半径小于或等于0时,停止运行。Clearinput"请输入圆的半径:"torPi=3.14L=2*PI*RS=PI*R*R?"圆的周长为:",L?"圆的面积为:",SClearR=1dowhileR>0Input"请输入圆的半径:"ToRifR<=0loop
endifL=2*3.14*RS=3.14*R*R?"圆的周长为:",L?"圆的面积为:",SenddoCleardowhile.T.Input"请输入圆的半径:"ToRifR<=0exit
endifL=2*3.14*RS=3.14*R*R?"圆的周长为:",L?"圆的面积为:",Senddo2.步长型循环(FOR…ENDFOR)格式:FOR<循环变量>=<初值>TO<终值>[STEP<步长>]<命令序列>[LOOP][EXIT]ENDFOR|NEXT说明:(1)<初值>、<终值>和<步长>是数值表达式(2)<步长>值可以为正,也可以为负。省略时默认值为1。步长值不能为0,否则造成死循环。(3)ENDFOR可以用NEXT代替。(4)循环次数=INT[(终值-初值)/步长]+1fori=1to1+7sete2?iendfor2.步长型循环(FOR…ENDFOR)格式:FOR<循环变量>=<初值>TO<终值>[STEP<步长>]<命令序列>[LOOP][EXIT]ENDFOR|[NEXT]循环的执行过程:(1)将初值赋给循环变量,(2)循环变量与终值比较,若超过终值转(5),否则转(3)(3)执行循环体(EXIT和LOOP意义同前)(4)遇到ENDFOR子句时,循环变量自动按<步长>增值,然后转(2)(5)退出循环,执行ENDFOR后面的语句fori=1to1+7sete2?iendfor【例7-13】计算1+2+3+……+100=?ClearS=0Fori=1to100S=S+iNexti?“1=2+3+……+100=”,SRETURNS=0i=1DOWHILEi<=100S=S+ii=i+1ENDDO【例7-14】向学生表中一次添加10条新记录。采用循环结构,每次添加一条记录先插入一条空记录利用定位输入输出命令输入记录内容
ClearUse学生表Fori=1to10APPENDBLANK
@2,1SAY"学生证号:"GET学生证号PICTURE"9999999999"@4,1SAY"姓名:"GET姓名
@6,1SAY"性别:"GET性别
@8,1SAY"出生日期:"GET出生日期
@10,1SAY"民族:"GET民族
READENDFORUSE格式:SCAN[<范围>][FOR<条件>][WHILE<条件>]<命令序列>[LOOP][EXIT]ENDSCAN功能:在表的指定<范围>内扫描,查找满足<条件>的记录并执行循环体中的命令序列。说明:(1)默认<范围>为ALL;
(2)每执行一遍循环体,指针自动下移一个记录,并自动判断是否指向文件尾,是则结束循环,转到ENDSCAN后面。3.表扫描型循环(SCAN…ENDSCAN)SCAN<命令序列>ENDSCANdowhilenoteof()<命令序列>skipenddo【例7-15】查询学生表中所有女党员并输出。clearuse学生表scanfor党员and性别="女"displayendscanusereturn【例7-15-1】将上述程序,用当型循环改写【例7-15-2】将上述程序,用步长型循环改写7.4子程序、过程与自定义函数7.4.1子程序1.子程序的概念子程序与主程序:子程序是指可以被多次反复地调用,能完成特定功能的特殊程序段,以独立的程序文件方式存储;相对而言,把调用子程序的程序称为“主程序”。子程序的优点:子程序是相对独立的、通用的一段代码。一个程序由若干个子程序组成,子程序独立编码和测试,子程序还可以重复使用,这样可以方便地生成程序,减少代码的编写量,并易于修改和维护程序。主程序:ClearDojc.prg
&&调用子程序jc.prgReturnjc.prg:P=1FORi=1TO100P=P*iENDFOR?"100的阶乘为",pRETURN7.4.1子程序2.子程序的建立:MODIFYCOMMAND子程序文件名3.子程序的调用调用语句格式:DO<子程序文件名>[With<参数列表>]
说明:
WITH用于主程序和子程序间参数的传递子程序参数定义:PARAMETERS<参数列表>子程序返回语句的四种格式
RETURN
返回到调用它的上一级主程序或VFP窗口
RETURN<表达式>
将表达式的值返回给调用程序
RETURNTO<程序文件名>
返回指定程序文件
RETURNTOMASTER
直接返回到第一级主程序7.4.1子程序子程序调用语句的执行过程(功能)执行调用语句时,系统将指定的子程序调入内存并执行该子程序,程序转到子程序中;当执行到子程序中的返回语句时,程序返回主程序,执行该调用语句的下一条可执行语句。主程序:ClearDozj1.prgDozj2.prgReturnzj1.prg:P=1FORi=1TO100P=P*iENDFOR?"100的阶乘为",pRETURNZj2.prg:S=0FORi=1TO100S=S+iENDFOR?"1-100的和为",SRETURN【例7-16】用子程序求任意一个数的阶乘。ClearInput"请输入要求阶乘的数:"ToMDoJieCheng.prgWithMReturn**JieCheng.prg子程序**PARAMETERSNP=1FORi=1TONP=P*iENDFOR?N,"的阶乘为",pRETURN主程序PR7-16-1.prg如下(带两个参数):ClearInput"请输入要求阶乘的数:"ToMX=1DoJieCheng.prgWithM,X?M,"的阶乘为",XReturn**JieCheng.prg子程序**PARAMETERSN,PFORi=1TONP=P*iENDFORRETURN7.4.2过程和过程文件1.过程过程的的概念:
过程是以PROCEDURE<过程名>开头,以ENDPROC结尾的一段程序。它可以放在调用程序中,也可以独立存储为一个过程文件。过程定义的语法格式:
PROCEDURE<过程名>PARAMETERS<参数表><命令序列>[RETURN[<表达式>]]ENDPROC【例7-17】把求任意一个数的阶乘的程序用过程来实现。程序与过程在一个程序文件中(不带参数):ClearInput"请输入要求阶乘的数:"ToNDoJC
*******过程JC,也在程序PR7-17-1中ProcedureJCP=1FORi=1TONP=P*iENDFOR?N,"的阶乘为",pENDPROCRETURN程序PR7-17-2.prg如下(带一个参数):ClearInput“请输入要求阶乘的数:”ToMDoJCWithM
*******过程JC,也在程序PR7-17-2中*****ProcedureJC
PARAN
P=1
FORi=1TON
P=P*i
ENDFOR
?N,”的阶乘为”,pENDPROCRETURN2.过程文件过程文件:包括一个或多个过程的程序文件(.prg)。语法格式:
PROCEDURE<过程名1><命令序列1>RETURNENDPROCPROCEDURE<过程名2><命令序列2>RETURNENDPROC…………PROCEDURE<过程名n><命令序列n>RETURNENDPROC过程文件的建立:与程序文件的建立方法完全相同过程文件的打开与过程的调用要调用过程,必须先打开包含此过程的过程文件。打开过程文件的格式:
SETPROCEDURETO[<过程文件1>[,<过程文件2>,…]][ADDITIVE]说明:可以打开一个或多个过程文件。过程文件打开后,文件中所有过程都可以被调用参数ADDITIVE表示不关闭原先已打开过程文件过程文件的关闭
SETPROCEDURETO
或
CLOSEPROCEDURE【例7-18】输入任意半径,计算圆的周长,圆的面积和球的体积用过程文件实现。程序分析:主程序
main.prg过程文件
pp.prg*******主程序main.prg********ClearInput"请输入半径:"ToRSetProceduretoPP.prg
DoZCWithRDoMJWithRDoTJWithRSetProcedureTo**过程文件PP.prg****ProcZC
PARA
X
L=2*PI()*X
?”周长为:”,LENDPROCPROCMJ
PARA
X
S=PI()*X*X
?”面积为:”,SENDPROCPROCTJ
PARAX
V=4/3*PI()*X*X*X
?“体积为:”,VENDPROC内容回顾程序
例如:求任意一个整数的阶乘和1到该整数的和子程序过程函数ClearInput"请输入一个整数:"ToNP=1FORi=1TONP=P*iENDFOR?N,"的阶乘为:",pS=0FORi=1TONS=S+iENDFOR?"1-",N,"的和为:",SRETURN**主程序:m1.prg**ClearInput"请输入一个整数:"ToMDosub1withMDosub2withMRetrun**sub1.prg**paramertersNP=1FORi=1TONP=P*iENDFOR?N,"的阶乘为",pReturn**sub2.prg**paramertersNS=0FORi=1TONS=S+iENDFOR?"1-",N,"的和为",SReturnClearInput"请输入一个整数:"ToMSetProceduretopd.prgdopd1withMdopd2withMSetProcedurttoreturn***过程文件pd.prg****procedurepd1ParametersNP=1FORi=1TONP=P*iENDFOR?N,"的阶乘为:",pendprocprocedurepd2ParametersNS=0FORi=1TONS=S+iENDFOR?"1-",N,"的和为:",Sendproc**主程序:m1.prg**ClearInput"请输入一个整数:"ToMDosub1withMDosub2withMRetrun内容回顾程序 例如:求任意一个整数的阶乘和1到该整数的和子程序过程函数系统函数用户定义函数date()year(date())int(123.4)mod(23,2)bof()eof()found()recno()reccount()
7.4.3用户自定义函数用户自定义的函数和系统内部函数一样,以函数的方式调用,即:
函数名([<参数表>])用户自定义的函数不能与系统函数同名。用户自定义函数的语法格式:FUNCTION<函数名>
PARAMETER<形参变量名表>
<命令序列>
RETURN[<表达式>]ENDFUNC【例7-19】用函数实现求组合CLEARINPUT"第一个数:"TOrINPUT"第二个数:"TOnC=JC(n)/(JC(r)*JC(n-r))?"从",n,"里取",r,"的组合为",CRETURN***JC()函数:求任意一个数x的阶乘**FUNCTIONJCPARAMETERSXP=1FORi=1TOXP=P*iENDFORRETURNP&&返回P的值ENDFUNC7.4.4参数传递和变量的作用域1.参数传递 在主程序调用子程序时,有时需要调用程序与被调用程序之间进行参数传递。调用程序用DO<被调用程序名>WITH<实参列表>把实参数据传递给被调用程序中的形参数据,被调用程序中用PARAMETERS<形参列表>来接收参数。**主程序:m1.prg**ClearInput"请输入一个整数:"ToMDosub1withMRetrun**sub1.prg**paramertersNP=1FORi=1TONP=P*iENDFOR?N,"的阶乘为",pReturn(1)参数传递在VFP中分为两种方式第一种参数传递方式:按值传递将实参值的副本传递给形参,形参值的改变不影响实参变量的值。第二种参数传递方式:按地址(引用)传递将实参的地址传给形参,此时形参变量和实参变量同用一个地址内数据,形参的改变直接影响实参值。参数传递方式的设置:
SETUDFPARMSTOVALUE|REFERENCE
其中:VALUE表示按值传递,REFERENCE表示按地址传递。(2)两种格式进行带参调用:第一种调用方式格式1:DO<被调用程序名>WITH<实参列表>说明:如果实参是非变量的常量或表达式即具体值,此时的参数传递为按值传递;但如果实参是变量,这时是按地址传递第二种调用方式格式2:<被调用程序名>(<实参列表>)说明:默认情况下都按值传递,如果想要按地址传递可用命令SETUDFPARMS重新设定。
SETUDFPARMSTOREFERENCEClear?"@@采用格式2的参数传递"Y=1?"格式2按值传递"PP(Y)?"外部",Y?"------------------"Y=1SetUDFPARToREFERE?"格式2按地址传递"PP(Y)?"外部",Y?"######################"?"@@采用格式1的参数传递"Y=1?"格式1按地址传递"DOPPWITHY?"外部",Y?"------------------"Y=1SetUDFPARMSToValues?"格式1按值传递"DOPPWITHY?"外部",Y?"------------------"Y=1?"格式1常量按值传递"DOPPWITH1?"外部",Y?"------------------"RETURN*过程PP*PROCPPPARAXX=2*X+1?"内部",XRETURNENDPROC【例7-20】两种格式、两种方式的参数传递应用。@@采用格式2的参数传递格式2按值传递内部3外部1————————————格式2按地址传递内部3外部3###########################@@采用格式1的参数传递格式1按地址传递内部3外部3————————————格式1按值传递内部3外部3————————————格式1按常量按值传递内部3外部17.4.4参数传递和变量的作用域2.变量作用域(1)变量的作用域:是指变量作用的有效范围。(2)按变量的作用域来划分,变量可分为种:①全局变量(public)②私有变量(private)
③本地变量(local)①全局变量PUBLIC在所有程序模块中都有效的内存变量全局变量在程序或过程结束后不会自动释放,必须使用RELEASE或CLEARMEMORY命令才能释放。全局变量的作用域为从定义点开始,到退出FoxPro时所执行的所有的程序或过程。全局变量须先说明(定义)后使用,通常在主程序中定义,也可在子程序中定义,还可在命令窗口中定义。格式:PUBLIC<变量名表>举例:publica,b,c说明:变量被说明时即被产生,同时赋初值.F.②私有变量PRIVATE在建立它的程序模块以及该程序嵌套调用的各级子程序中使用的内存变量。局部变量一旦离开定义它们的程序,就将失去意义。程序中没有被说明为全局的内存变量,都被看成是局部变量。局部变量也可以用PRIVATE来说明。格式1:<变量名表>格式2:PRIVATEALL[LIKE<通配符变量名>/EXCEPT<通配符变量名>]说明:变量被说明的同时并不产生变量,当第一次被赋值时才产生。没被说明,但在程序中被赋初值,系统默认其为单元的局部变量(隐式说明)。在主程序中说明的局部变量其作用域等同于整个程序的全局变量。③本地变量Local
用Local定义的本地内存变量只能在定义它的程序模块中存在,一旦定义它的程序运行完毕,本地变量就会从内存中释放。其它程序中不能访问本地变量。【例7-21】全局变量、局部变量及其作用域示例。**主程序**CLEARCLEARMEMORYPublicA1A1="1"DO子程序1?"主程序中内存变量有:"LISTMEMORYLIKEA*RETURNPROCEDURE子程序1PUBLICA2A2="2"PRIVATEA3STORE"3"TOA1,A2,A3?"子程序1中第一次显示内存变量"LISTMEMORYLIKEA*DO子程序2?"子程序1中第二次显示内存变量"LISTMEMORYLIKEA*RETURNPROCEDURE子程序2PRIVATEA2LOCALA4STORE4TOA1,A2,A3,A4?"子程序2中第一次显示内存变量"LISTMEMORYLIKEA*RETURN子程序1中第一次显示内存变量A1PubC"3"A2PubC"3"A3PrivC"3"子程序2中第一次显示内存变量A1PubN4A2(hid)C"3"A3PrivN4A4本地N4A2PrivN4子程序1中第二次显示内存变量A1PubN4A2PubC"3"A3PrivN4主程序中内存变量有:A1PubN4A2PubC"3"程序填空*-------------------------------------------------------*【程序填空】*-------------------------------------------------------*功能:下面程序是计算1+3+5+…+99之和的程序。*请在【】处添上适当的内容,使程序完整。*-------------------------------------------------------SETTALKOFF***********SPACE**********【?】***********SPACE**********FORI=1TO99【?】S=S+IENDFOR***********SPACE**********?"结果=",【?】SETTALKONRETURN答案:=======(答案1)=======s=0=======(答案2)=======step2=======(答案3)=======s=========或=========str(s)=========或=========str(s,4)*-------------------------------------------------------*【程序填空】*-------------------------------------------------------*功能:依次显示XSDB.DBF数据表中的记录内容。请在【】处添上适当*的内容,使程序完整。*-------------------------------------------------------SETTALKOFF***********SPACE**********【?】***********SPACE**********DOWHILE【?】DISP***********SPACE**********【?】ENDDOUSESETTALKONRETURN答案:=======(答案1)=======usexsdb=======(答案2)=======.not.eof()=========或=========!eof()=========或=========noteof()=========或=========Eof()!=.T.=======(答案3)=======SKIP*-------------------------------------------------------*【程序填空】*-------------------------------------------------------*功能:现有职工工资库文件GZ.DBF和职工档案DA.DBF。*要求对职工工资库文件中的“基本工资”、“应发工资”*、“扣款工资”和“实发工资”的字段进行赋值。*请在【】处添上适当的内容,使程序完整。*-------------------------------------------------------SETTALKOFFCLEARSELEAUSEGZINDEXON编号TOGZBHSYSELEBUSEDA***********SPACE**********INDEON【?】TODABHSYSELEA***********SPACE**********UPDAON编号FROMDAREPL基本工资WITH【?】***********SPACE**********【?】应发工资WITH基本工资+奖金,扣款合计WITH水费+电费+房租费,实发工资WITH实发工资-扣款合计LISTCLOSEDATABASESETTALKONRETURN答案:=======(答案1)=======编号=======(答案2)=======B.基本工资=========或=========B->基本工资=======(答案3)=======REPLALL程序改错*-------------------------------------------------------*【程序改错】*-------------------------------------------------------*题目:表XSDA.DBF结构为:学号(C,6),姓名(C,6),性别(C,2),入学成绩(N,6,2)。本程序实现按学号查找记录,直到输入"#"为止。*-------------------------------------------------------*注意:不可以增加或删除程序行,也不可以更改程序的结构。*-------------------------------------------------------SETTALKOFFUSEXSDA**********FOUND**********ACCEPT"请输入要查找的学号"ONXHDOWHILEXH!="#"**********FOUND**********LOCATEFOR学号="CJ"IFFOUND()?学号,姓名,入学成绩
ELSE?"无此学号"ENDIFACCEPT"请继续输入要查找的学号"TOXH**********FOUND**********ENDFOR?"谢谢使用本查找系统"USESETTALKONRETU答案:=======(答案1)=======ACCEPT"请输入要查找的学号"TOXH=======(答案2)=======LOCATEFOR学号=XH=======(答案3)=======ENDDO=========或=========ENDD*-------------------------------------------------------*【程序改错】*-------------------------------------------------------*题目:计算出1-50以内(包含50)能被3和5整除的数之和。*-------------------------------------------------------*注意:不可以增加或删除程序行,也不可以更改程序的结构。*-------------------------------------------------------SETTALKOFFCLEARX=0**********FOUND**********Y=1**********FOUND**********DOWHILNOTEOF()X=X+1DOCASECASEMOD(X,5)=0ANDMOD(X,3)=0Y=Y+XCASEX<=50LOOPCASEX>50EXITENDCASEENDDO**********FOUND**********?XSETTALKONRETU答案:=======(答案1)=======Y=0=======(答案2)=======DOWHIL.T.=======(答案3)=======
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年全球及中国成人电动踏板车行业头部企业市场占有率及排名调研报告
- 2025-2030全球聚酯树脂行业调研及趋势分析报告
- 2025年全球及中国中心供氧站行业头部企业市场占有率及排名调研报告
- 大数据分析服务项目合同
- 2025合同模板股权合作协议范本
- 2025企业管理资料劳务合同样本页文档范本
- 钢质防火门制作安装合同
- 中介公司房产交易合同范本
- 奶牛场承包经营合同
- 销售回购合同
- 多图中华民族共同体概论课件第十三讲先锋队与中华民族独立解放(1919-1949)根据高等教育出版社教材制作
- 高考英语单词3500(乱序版)
- 《社区康复》课件-第五章 脊髓损伤患者的社区康复实践
- 北方、南方戏剧圈的杂剧文档
- 灯谜大全及答案1000个
- 白酒销售经理述职报告
- 部编小学语文(6年级下册第6单元)作业设计
- 洗衣机事业部精益降本总结及规划 -美的集团制造年会
- 2015-2022年湖南高速铁路职业技术学院高职单招语文/数学/英语笔试参考题库含答案解析
- 2023年菏泽医学专科学校单招综合素质模拟试题及答案解析
- 铝合金门窗设计说明
评论
0/150
提交评论