版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章VisualFoxPro程序设计基础本章学习目标了解程序、程序文件和建立及运行程序文件的方法。掌握程序中常用命令的使用方法。重点掌握VisualFoxPro结构化程序设计方法。熟练掌握IF-ELSE-ENDIF、DOCASE-ENDCASE、DOWHILE-ENDDO、FOR-NEXT、SCAN-ENDSCAN循环语句的使用。掌握程序设计的模块化思想,学会正确建立过程和函数的方法和使用。了解变量的作用域及其用法7.1程序文件7.2程序中的常用命令7.3程序的结构与控制命令7.4过程与过程调用本章目录7.5变量的作用域和参数调用7.6自定义函数7.1.1程序文件的建立和编辑7.1程序文件所谓程序,就是按照解决某一实际问题的要求,将VisualFoxPro命令按一定的逻辑顺序组合起来,并以文件(称为命令文件,或源程序文件)的形式存放于磁盘上。这样,计算机就能按照文件中的命令序列自动连续地执行每一条命令,高效率地完成预定任务。VisualFoxPro的程序设计有面向过程的程序设计和面向对象的程序设计。本章和第8章介绍面向过程程序设计和面向对象程序设计的基本思想和方法。VisualFoxPro的命令在操作数据时,可以有命令方式、菜单方式和程序方式。程序文件是一个文本文件,可用任何一种编辑软件建立和编辑。VisualFoxPro提供了程序代码编辑器,可省去调用外部程序的额外内存开销。建立或编辑程序文件有两种方式:命令方式和菜单方式。⑴命令格式MODIFYCOMMAND[FileName|?]或MODIFYFILE[FileName|?]⑵功能
启动VisualFoxPro文本编辑器来建立或编辑程序文件。若程序文件不存在,建立新的程序文件;若程序文件已存在,则从磁盘中调入程序文件到内存,并显示在编辑器窗口以便修改。1.命令方式⑶说明①FileName:指定要打开或创建的程序文件名。若不指定新建程序文件的扩展名,VisualFoxPro自动指定.PRG为扩展名。MODIFYCOMMAND支持含有星号“*”和问号“?”通配符(wildcard)的文件梗概。名称与这个文件匹配的每一个文件都在编辑窗口中打开。②若省略文件名,将给打开的编辑窗口赋以一个初始名称“程序1.PRG”。当关闭编辑窗口时,可以用另外的文件名保存该文件。③如果使用MODIFYFILE命令建立程序文件,则程序文件的扩展名.PRG不能少。④?:显示“打开”对话框。可以从中选择一个已有程序或键入要创建的新程序名。【例7-1】编写一程序,通过键盘输入一个华氏温度值,然后利用公式转换成摄氏温度并输出。其中f和c分别表示华氏温度和摄氏温度。用命令方式建立程序文件的方法和步骤如下:①在命令窗口中键入命令:MODIFYCOMMANDEx07-01,如图7-1所示。②在“ex08-01.prg”编辑窗口中,输入程序所需要的命令行(要求每条命令占一行,如果命令行字符太多,右在关键字后加“
;”,符号“
”表示空格),如图7-2所示。
③程序输入完成后,按Ctrl+W键,或单击窗口的“关闭”按钮,存盘并返回到命令窗口中。如果放弃该程序的编辑,可按Esc键,或按Ctrl+Q不存盘退出。图7-1在命令窗口输入命令图7-2程序编辑窗口⑴建立文件步骤①打开“文件”菜单,单击“新建”命令,进入“新建”对话框。然后选中“程序”项,进入编辑窗口。②在编辑窗口输入程序所需要的各个命令行。③所有命令输入完成后,打开“文件”菜单,单击“保存”命令,或按Ctrl+W键。此时,系统会自动提示输入程序文件名,输入程序文件名后,系统自动将程序文件存入磁盘。⑵编辑文件步骤①打开“文件”菜单,单击“打开”命令,出现“打开”对话框。2.菜单方式②在编辑窗口输入程序所需要的各个命令行。③所有命令输入完成后,打开“文件”菜单,单击“保存”命令,或按Ctrl+W键。此时,系统会自动提示输入程序文件名,输入程序文件名后,系统自动将程序文件存入磁盘。图7-3“打开”对话框③修改完成后,打开“文件”菜单,单击“保存”命令,或按Ctrl+W键,系统将修改后的程序文件用原文件名存盘,而修改之前的文件仍保留,只是文件名后的扩展名自动改为.BAK。修改后的程序文件也可重新命名:打开“文件”菜单,单击“另存为”命令,输入新文件名。按下ESC或Ctrl+Q组合键,可放弃本次的修改并退出编辑。⑵编辑文件步骤①打开“文件”菜单,单击“打开”命令,出现“打开”对话框。②在“打开”对话框中,输入或选择要修改的文件名。然后,单击“打开”按钮,系统自动按输入或选择的文件名将程序文件调入内存,并显示在文本编辑窗口以供修改,如图7-3所示。程序文件的执行有以下3种命令和菜单两种方式。7.1.2程序文件的运行1.命令方式⑴命令格式DOProgramName1|ProcedureName[INProgramName2][WITHParameterList]⑵功能将一个VisualFoxPro程序或过程从磁盘调入内存并执行,如在命令窗口中输入DOEx08-01并回车,程序的运行结果如图7-4所示。⑴命令格式DOProgramName1|ProcedureName[INProgramName2][WITHParameterList]⑵功能将一个VisualFoxPro程序或过程从磁盘调入内存并执行,如在命令窗口中输入DOEx08-01并回车,程序的运行结果如图7-4所示。⑶说明①ProgramName1:指定要执行的程序的名称,执行的程序可以不包含扩展名。使用DO也可执行带扩展名(.MPR、SPR或者.QPR)的菜单程序、表单程序或者查询。图7-4程序的运行界面在VisualFoxPro程序代码编辑环境下,打开“程序”菜单,单击“运行”命令,然后在屏幕显示的对话框中确定或输入要执行的程序文件名。2.菜单方式3.在编辑状态下执行程序要运行一个程序,用户也可在程序代码编辑状态下执行,方法有:⑴单击“常用”工具栏上的“运行”按钮。⑵直接按下Ctrl+E组合键。⑶在编辑代码窗口中,直接单击鼠标右键,在弹出的快捷菜单中选择“执行XX.PRG”命令即可运行该程序,其中XX代表程序文件名。程序代码编辑窗口中,选定要执行的代码行,然后鼠标右键,在弹出的快捷菜单中选择“运行所选区域”命令即可,如图7-5所示。按下ESC键9中执行“程序”菜单中的“取消”命令),及时进行中断并返回到程序代码编辑窗口。图7-5运行部分代码②ProcedureName:指定要执行的过程的名称,详细内容见本章的7.4节。③INProgramName2:执行ProgramName2指定的程序文件中的一个过程;而WITHParameterList:指出要传递给程序或过程的参数列表。
7.2.1注释命令7.2程序中的常用命令为了增加程序的可读性,对程序中的命令适当地加一注释是一个好习惯。对于注释文字,VisualFoxPro既不检查也不执行。注释命令有3条命令。⑴命令格式
NOTE|*|&&[Comments]⑵功能在程序文件中指示注释行的开始,注释行不可执行。⑶说明①NOTE|*:作用相同,用于整行注释,且放在注释行的开始位置。NOTE要和注释内容以一个空格隔开,而“*”可以没有空格符。②&&:一般放在一条命令行的后面,常用于对该命令进行说。③Comments:指定注释的内容。若注释内容,多于一行时,可在注释行的末尾加上一个半角的分号“;”,作为续行标志说明在下一行上继续该行注释。不能在命令行续行的分号后面加入&&和注释。例如:NOTEEx07-01.PRG*本程序将华氏温度转换成摄氏温度f=VAL(f) &&将字符转换为数值7.2.2程序中的几个结束命令当程序执行完毕后,一般使用下面的几个结束命令明确告诉系统结束,以释放内容。⑴命令格式
RETURN[eExpression|TOMASTER|TOProcedureName]⑵功能:结束正在执行的过程,并返回到上级主调过程的调用处,如果RETURN所在的过程本身就是主程序,则返回VisualFoxPro窗口。当执行RETURN命令时,VisualFoxPro释放PRIVATE类型的内存变量。如果省略return命令,也执行一个隐含的RETURN命令。⑶说明①eExpression:返回给调用程序的表达式。如果省略RETURN命令或省略返回表达式,则程序自动将“真”(.T.)返回给调用程序。②TOMASTER:将控制返回给最高层次的调用程序。③TOProcedureName:将控制返回给指定过程。⑴命令格式
CANCEL⑵功能:终止程序的运行,清除程序的私有变量并返回到命令窗口。1.返回命令2.终止命令7.2.3交互式输入输出命令⑴命令格式
QUIT⑵功能:终止程序运行后,清除所有用户内存变量,关闭所有文件,退出VisualFoxPro,并返回到Windows状态。3.退出命令1.字符串输入命令(ACCEPT)⑴命令格式ACCEPT[cMessageText]TOcMVarName⑵功能在屏幕的提示符cMessageText的后面,通过键盘上输入一个字符串并按回车键,系统将把输入的字符串赋给指定的内存变量cMVarName,并使程序继续执行进后续的语句。⑶说明①cMessageText:指定的提示信息文本,缺省时不予提示。②TOcMVarName:指定写入的字符型内存变量,不得缺省。注意:由键盘上输入的字符串时无需加定界符。如加了定界符,则定界字符也算作字符串的一部分。【例7-2】在“学生.dbf”表中,按姓名显示某学生的记录。程序代码,参见P264。⑴命令格式
INPUT[cMessageText]TOMVarName⑵功能与ACCEPT功能类似,但它接收由键盘上输入的表达式运算的结果。⑶说明表达式数据类型可以是N、C、L和D型。输入C型数据时,要使用单引号“'”、双引“"”号或中括号“[]”作为定界符。输入L型数据时,T和F两边的小圆点不能省略。输入D型数据时,要用CTOD()函数或大括号“{}”将字符串转换成日期型变量。若表达式是变量,则该变量必须事先已定义;如果是表达式,则表达式内的各个变量、函数都必须有定义。【例7-3】按给定的学号,显示学生的所修课程成绩。程序编制如下:***Ex07-03.PRG***clearinput'输入要查询的学号:'toxhselect学号,课程名,成绩,学分from成绩join课程on成绩.课程号=课程.课程号where学号=xhtoscreencancel&&执行上述程序屏幕显示如下:2.表达式输入命令(INPUT)⑴命令格式
WAIT[cMessageText][TOcMVarName][WINDOW[ATnRow,nColumn]][NOWAIT][TIMEOUTnSeconds]⑵功能显示信息文本并暂停VisualFoxPro程序执行,直到用户按任意键或单击鼠标左键或超过时限。此命令的特点是只要按下任意键无需按回车键即可继续向下执行。⑶说明①若省略cMessageText参数,则VisualFoxPro显示默认的信息“按任意键继续……”。如果cMessageText参数为空字符串,则不显示信息,直到按某个键,VisualFoxPro才结束等待,继续执行程序。②WINDOW[ATnRow,nColumn]]:该选项可以将所要显示的信息在一个窗口显示,该窗口默认的位置为屏幕的右上角,可使用[ATnRow,nColumn]子句指定窗口显示位置。
③NOWAIT:在显示信息后,立即继续执行程序。④TIMEOUTnSeconds:用来设定WAIT命令等待的时间,单位:秒。如果超过限定时间,程序将自动继续向下运行WAIT语句下面的程序语句。【例7-4】Wait命令练习。程序编制参见P266。3.单字符输入命令(WAIT)在前面的各章节中,都接触过CLEAR命令,现给出它的完整格式。⑴命令格式
CLEAR[ALL
|CLASSClassName|CLASSLIBClassLibraryName|EVENTS
|FIELDS|GETS|MEMORY|MENUS|PROGRAM|
WINDOWS]⑵功能从内存中释放指定的项目。如果没有其他子句,则可清除VisualFoxPro主窗口中显示的信息,使光标移到窗口左上角。⑶说明:①ALL:除系统变量、编译程序缓冲区、对象类型变量外,关闭其余的所有文件、变量、窗口、菜单,将工作区号置为1。②FIELDS:释放用SETFIELDS生成的一个列表,并且执行SETFIELDSOFF。③GETS:释放所有的@…GET控制。④MEMORY:释放除系统内存变量外的所有的公共内存变量、私有内存变量和数组。。⑤PROGRAM:释放编译程序缓冲区。其他子句将陆续介绍。4.CLEAR命令格式输入输出是指在数据输入输出时,可以控制数据在窗口中的输入输出位置。⑴命令格式格式1
@<nRow,nColumn>[SAY<Expression1>]
GET<MemVarName|FieldName>
[FUNCTION<cFormatCode>][PICTURE<cFormatCode>][DEFAULT<Expression2>][RANGE<nLowerBound1>,<nUpperBound>][VALID<lExpression>]格式2
READ[SAVE]⑵功能:格式1是在屏幕指定的坐标位置上显示输入提示信息,然后通过格式2激活命令1中GET子句的变量值。执行到READ命令时,光标停在变量位置等待用户对该变量的值进行修改。⑶说明①@<nRow,nColumn>:指定@…SAY命令输出结果的位置。nRow和nColumn分别表示VisualFoxpro主窗口(或用户自定义窗口)中系统菜单下面的行和列数。nRow的编号从上向下编号,第一行记为第0行;nColumn从左到右编号,第一列记为第0列。7.2.4格式输入命令②SAY<Expression1>:指定从nRow,nColumn处开始计算并显示Expression1的内容。③GET<MemVarName|FieldName>:指显示或保存内容的内存变量、数组元素或字段。④FUNCTION<cFormatCode>|PICTURE<cFormatCode>:指定决定显示或保存在内存变量、数组元素或字段中内容的格式。表7-1和表7-2分别列出了PICTUREcFormatCode(格式符)和FUNCTIONcFormatCode(功能符)的代码及功能。表7-1PICTURE格式符代码表⑤DEFAULT<Expression2>:如果指定的变量不存在,将自动创建并初始化。当内存变量存在,或指定的是字段时,则忽略DEFAULT子句。⑥RANGE<nLowerBound>,<nUpperBound>:表示表示输入数据的上限nUpperBound和下限nLowerBound。⑦VALID<lExpression>:该子句表示数据输入和显示的条件lExpression。⑧一个READ命令可以激活多个GET后的变量,但READ执行以后,不能再编辑该命令之前的GET变量,要想使这些变量仍能被以后的READ所编辑,可以用SAVE子句。⑨不用READ命令,则@…SAY…GET…FUNCTION|PICTURE可以只用于输出。表7-2FUNCTION功能符代码表【例7-5】编一程序,用于向“学生.dbf”表中追加记录程序执行后,屏幕显示如下:程序代码,参见P268。注意:功能描述符(FUNCTION)作用于整个数据,而格式描述符(PICTURE)仅作用于数据中对应位置的单个字符。格式符也称为匹配字符。格式描述符的个数确定输入输出数据的宽度。有时可以省略功能描述符,而将该功能写在格式描述符之中。其使用格式为:
PICTURE“@功能描述符号格式描述符号”例如,下面是一个格式输出的例子,程序如下:clearx=1999.99y=-7156.33z=009901d=ctod('99.10.13')@2,30sayxfunction'b'picture'####.##'@3,30sayyfunction'x'picture'####.##'@4,30sayzfunction'l'picture'@l######'@5,30saydfunction'e'cancel&&程序执行后显示如下:VisualFoxPro提供了一条用于文本原样输出的特殊命令,格式如下:⑴命令格式
TEXTTextLinesENDTEXT⑵功能:屏幕上按原样显示TEXT和ENDTEXT之间的内容TextLines。⑶说明:TEXT与ENDTEXT需配对使用,不能省略其中任一子句。如果在TEXT与ENDTEXT中含有表达式,该表达式必须用括号“<<>>”括起来,并且设置SETTEXTMERGE为ON状态,否则表达式的值无法输出。【例7-6】编一程序,可对表“学生.dbf”进行追加、修改、删除记录的操作。
***Ex07-06.PRG***clearuse学生text学生数据记录操作选单1---追加记录2---修改记录3---删除记录endtextinpu"请选择项目(1,2,3):"toxzwait"按任意键继续执行"closeallcancel7.2.5文本输出命令
在VisualFoxpro程序中,我们还常常使用几个环境设置的辅助命令。这些命令前面我们已经使用过,这里将其中的含义介绍如下。7.2.6其它命令1.设置会话状态命令⑴命令格式
SETTALKON|OFF|WINDOW[WindowName]|NOWINDOW⑵功能VisualFoxPro命令执行时会在屏幕上显示命令执行的有关信息,称为“会话(TALK)”。对话方式可以帮助用户了解命令执行的情况,但频繁显示执行信息与输出语句的输出结果相互夹杂,既使得屏幕显得凌乱不堪,又会严重降低程序的执行速度。用户可通过SETTALK命令设置会话状态,决定VisualFoxPro是否显示命令结果。⑶说明①ON:(缺省值)允许将会话设置到VisualFoxPro窗口、系统信息窗口、图形状态窗口、或者用户自定义的窗口。②OFF:在上述窗口中关闭会话。③WINDOW[WindowName]:指定要打开或关闭会话的用户自定义窗口名。④NOWINDOW:直接在VisualFoxPro窗口关闭或打开会话。⑴命令格式
SETSAFETYON|OFF⑵功能:当用户向VisualFoxPro发出修改、删除、清表等涉及到文件安全的命令时,系统给出一个文件操作确认提示窗口,向用户提供下一步操作的选择。是否需要该提示窗口,可通过此命令来设置⑶说明:参数ON表示需要,默认为ON;OFF表示不需要。2.设置系统提供保护状态命令⑴命令格式
SETDEFAULTTO[cPath]⑵功能:设置VisualFoxPro默认的使用的驱动器、目录或文件夹。⑶说明:参数cPath为要设置的缺省路径。若想将默认目录恢复成为VisualFoxPro启动目录,应使用不带参数的setdefault命令,即:SETDEFAULTTO例如,设用户的文件夹为“d:\jxgl”,将该文件夹设置为本次VisualFoxPro的缺省路径。SETDEFAULTTOd:\jxgl此后,在本次VisualFoxPro运行期间,只要文件名中无路径前缀,则一定指d:\jxgl文件夹中的文件。3.设置默认路径命令⑴命令格式
SETPATHTO[cPath1][,|;[cPath2]]…⑵功能指定查找文件的路径。⑶说明参数cPath用于指定查找文件的目录。用逗号或分号隔开不同的目录。不带参数cPath的SETPATHTO命令把路径恢复为默认目录。例如,有如下的文件查找命令:SETPATHTOd:\jxgl\data;e:\VISUALFOXPRO6此命令设置成功后,使用文件时,系统首先从默认目录查找文件;若文件不存在,则顺序在d:\jxgl\data和e:\VISUALFOXPRO6目录(文件夹)中查询文件,如文件不存在,则出现如图7-6所示文件不存在的提示信息对话框。4.设置查找文件路径命令图7-6“系统”提示信息对话框与SETPATHTO命令一样,SETPATHTO命令只对本次VisualFoxPro运行期间有用。如果再一次运行VisualFoxPro时,则需重新设置。通过上面的例子,我们了解了VisualFoxPro编写程序的方法和常用命令的使用。不管程序复杂还是简单,一个程序大体都可以分为三个部分。⑴程序初始化部分在这个部分中,一般将完成对程序运行环境的设置和变量的初始化工作,例如例7-1中的:Clear语句。最常用到的是一系列的SET语句。⑵程序主体部分该部分用来完成本程序的任务。例如例7-1中的从“c=0”语句开始到“?"当华氏温度为"+…”语句之间的语句都是程序的主体语句。⑶系统环境设置与恢复部分该部分的任务是当程序所预定的任务完成后,在结束程序运行之前,将系统环境恢复到原设置状态,常用的命令有关闭文件、一系列SET语句、程序结束语句等。当然,在程序中也应包含若干个注释语句,以增加程序的可读性。7.2.7一般程序设计的全过程和流程图的含义一般来说,要完整地编写一个程序,需要有以下几个步骤:⑴明确问题:弄清实际问题的基本要求,简化次要因素。⑵建立模型:确定解决问题的数学方法或图形方法。⑶构成流程:画出解决问题的方法和步骤的流程图。1.一般程序设计的全过程⑷编制程序:根据流程图,编写程序。⑸调试程序:发现和解决程序中的错误。⑹交用户使用:用户在使用过程中提出意见并进行修改。⑺最后:程序废弃。2.几个常见流程图图形和含义在VisualFoxPro程序设计过程中,常常使用下面几个图形符号用于构成程序的流程和步骤,它们有:①开始或结束图:一般用于环境设置和结束命令,如图7-7所示。②过程图:一般用于一个或几个命令的执行,或一个过程的执行,如图7-8所示。③条件图:用于决策,即依据条件执行A或执行B,如图7-9所示。④循环图:用于需要反复执行的程序段,如图7-9所示。图7-7开始或结束图7-8过程图图7-9条件选择(分支)图7-10循环图7.3.1顺序结构7.3程序的结构与控制命令程序是计算机解决问题所需的一序列代码化指令、符号化指令或符号化语句,计算机按照一定的顺序执行这些语句,逐步完成整个工作。为了描述语句的执行过程,编程语言提供了一套描述机制,这种机制一般称为“控制结构”,它们的作用是控制语句的执行过程。描述“控制结构”的语句(命令)称为“控制语句”,带有“控制语句”的程序,我们说该程序具有结构的程序。VisualFoxPro提供的控制结构有三种:顺序结构、分支(或选择)结构和循环结构。所谓顺序结构(SequentialStructure),它是最简单,最基本的一种结构。如图7-11所示,顺序结构的每一块可以包含一条或若干条可执行的命令语句。【例7-7】统计并显示“学生.DBF”和“成绩.DBF”中男同学人数和男团员的所修课程的平均分数。分析与程序代码,参见P273。图7-11顺序结构7.3.2分支结构【例7-8】编写一个程序,求一内半径R1=10cm、外半径R2=20cm的球环的体积。要求四舍五入保留到小数点后4位。分析与程序代码,参见P274。分支结构(BranchStructure)程序可以根据判定或测试的结果,在两条或多条程序路径中选择一条去执行不同的操作。1.IF分支结构IF/ELSE/ENDIF结构有如下两种形式:⑴IF双分支结构IF双分支结构命令语句的使用格式如下:
IFlExpression[THEN] Statements1[ELSE Statements2]ENDIF该语句的功能是:当程序运行至IF语句时,先判断表达式lExpression的值,当为“真”(.T.)时,执行程序段Statements1,否则执行Statements2。无论是执行语句块Statements1还是执行语句块Statements2,执行完后均执行ENDIF后面的语句。如果忽略ELSE子句,则IF选择结构可简化为IF单分支结构。⑵IF单分支结构,其命令语句使用格式为:
IFlExpression[THEN] StatementsENDIFIF结构程序的执行流程图,如图7-12所示。IF结构中可以出现另一个或多个IF结构,称为IF分支结构的嵌套或多重选择结构。IF结构的嵌套形式如下:IFlExpression[THEN] Statements1 IFlExpression[THEN]
Statements2[ELSE Statements3]ENDIF[ELSE Statements4] IFlExpression[THEN]
Statements5[ELSE Statements6]ENDIFENDIF(a)单分分支结构(b)双分支结构图7-12IF结构2.IF分支结构的嵌套【例7-9】编写一程序,当用户输入查询的学生姓名后,可查询显示学生的情况,如无此学生,则显示对话框“查无此人”。分析:要查询学生的情况,首先要打开该学生所在学生数据表,然后通过键盘输入要查询的学生姓名。通过输入的姓名和数据表相应的字段的值进行比较,即可得出结论。程序代码,参见P275,如图所示。【例7-10】某商场为了促进销售,采用了购货打折的优惠方法,即每位顾客一次购货款在300元以上,给予9.5折优惠;购货款在600元以上,给予9折优惠;购货款在1000元以上,给予8.5折优惠。编写程序SY7-6.PRG,根据优惠条件计算每位顾客的应付货款。分析:根据给定的条件,设每位顾客购货款为X,有优惠条件的应付款为Y,应付款的计算表达式如下:
本题要使用IF结构的嵌套。程序代码,参见P276。
在分支结构的程序中,如果有多于2种条件供选择,尽管可以使用IF结构的嵌套外,还可使用一种称为多分支(路)选择结构的一组语句DOCASE/ENDCASE。多分支结构语句的语法格式如下:⑴命令格式
DOCASE
CASElExpression1
Statements1
CASElExpression2
Statements2
……
CASElExpressionn
Statementsn
[OTHERWISE
Statementsn+1]ENDCASE⑵功能多分支选择语句,程序运行时,该结构将执行第一个条件表达式为真(.T.)时下面的命令语句序列,该命令语句执行完毕后退出选择结构;如果所有条件都不满足,则执行OTHERWISE下的命令语句序列。执行完后转向执行ENDCASE后续的语句程序。多分支结构的执行流程图如图7-13所示。3.CASE多分支(路)选择结构图7-13多分支结构的执行流程图如,在例7-10中,计算函数Y值的代码使用多分支结构时,其命令程序代码如下:***Ex07-10.PRG***settalkoffclearallinput"请输入顾客购货款金额"toxdocase casex>=1000 y=0.85*x casex>=600y=0.9*xcasex>=300y=0.95*xotherwisey=xendcase?"每位顾客购货款:",x?"优惠后顾客应付款:",yreturn1.条件循环DoWhile/EndDo程序中,一段代码需要有规律地反复执行多次,这时就要用到循环结构(LoopStructure)。循环结构被重复执行的程序代码称为循环体,循环体的执行与否及次数多少视循环类型与条件而定。一个无限循环(简称为“死循环”)。循环结构程序的执行流程图如图7-14所示。7.3.3循环结构图7-14循环结构程序的流程图
有3种用于循环结构的命令语句,即DoWhile/EndDo条件循环结构语句、For/EndFor计数循环结构语句和Scan/EndScan指针循环结构语句。条件循环是根据条件表达式的值,决定循环体内语句的执行次数,也称为当型循环。⑴命令格式
DOWHILElExpressionStatement1[LOOP]Statement2[EXIT]Statement3ENDDO⑵功能该命令语句执行时,先判断条件表达式lExpression的值,若为“真”(.T.),则执行循环体内的命令语句序列,即DO与ENDDO之间的命令;若为“假”(.F.),则执行ENDDO后面的命令。⑶说明①DOWHILE和ENDDO子句要配对使用。②DOWHILElExpression是循环语句的入口;ENDDO是循环语句的出口;中间命令语句序列是重复执行的循环体。循环体中除可以使用前面介绍的一般命令外,还可以嵌套使用分支结构。③LOOP语句称为循环短路语句。当循环碰见该命令时,立即停止执行LOOP和ENDFOR之间的语句而将控制转移到DOWHILE入口语句,使循环进入下次循环。④EXIT是强行退出本层循环的语句。在循环中,若条件表达式lExpression的值永远为“真”(.T.),这时表达式lExpression可直接写成.T.,这样的循环,称为无限循环或死循环(InfiniteLoop)。一旦遇到死循环,则必须设置有条件的退出机制。⑤LOOP和EXIT只能在循环语句中使用。【例7-12】使用循环结构,统计“学生.dbf”表中总分在580分以上的学生人数。分析:要统计总分在580分以上者的人数,首先输入一个分数段,然后反复计算在分数段成绩以上者的人数,这就需要循环结构。程序代码,参见P279。2.计数循环For/EndFor计数循环是根据用户设置的循环变量的初值、终值和步长,决定循环体内语句执行次数。⑴命令格式
FORMemVarName=nInitialValueTOnFinalValue[STEPnIncrement]Statements[EXIT][LOOP]ENDFOR|NEXT⑵功能按指定的次数重复执行一组语句Statements。⑶说明①MemVarName:指定作为计数器的内存变量或数组元素。在FOR...ENDFOR语句执行之前,此内存变量或数组元素可以不存在。②nInitialValueTOnFinalValue:nInitialValue是计数器的初始值,而nFinalValue是计数器的最终值。③STEPnIncrement:nIncrement是计数器递增或递减的步长。如果nIncrement为负,则计数器递减;省略STEP,计数器每次的增量为1。④Statements:指定要执行的VisualFoxPro语句序列。【例7-13】求的值,其中n=20。分析:这实际上是一个累加过程,设i表示某一数值,则表示累加到该数的和的通项公式为:。每加一项,i值增加1。程序代码,参见P281。3.指针循环Scan/Endscan指针循环(也称记录扫描循环)是在数据表中建立的循环,它是根据用户设置的当前记录指针,对一组记录进行循环操作。
⑴命令格式
SCAN[Scope][FORlExpression1][WHILElExpression2]Statements[LOOP][EXIT]ENDSCAN
⑵功能在当前选定的表中移动记录指针,并且对满足给定条件的每一条记录逐条执行循环体内的命令序列。在使用该语句时,必须事先打开一数据表。例如,在【例7-12】中,统计总分在580分以上的学生人数,程序中循环部分用指针循环进行替换如下:scanfor总分>=fs stn=stn+1endscan?"学生总分在"+str(fs,3)+"以上者的人数是:"+str(stn,2)多重循环是指在一个循环语句内又包含另一循环语句,多重循环也称循环嵌套(NestedLoop)。
循环结构允许嵌套,这种嵌套不仅限于循环结构自身的嵌套,而且还可以是和选择结构的相互嵌套。循环嵌套层次最多可达64层,但内循环的所有语句必须完全嵌套在外层循环之中。否则,就会出现循环的交叉,造成逻辑上的混乱。下面循环嵌套是不正确的嵌套:
【例7-14】公元五世纪《张邱建算经》的百鸡问题:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡。问鸡翁母雏各几何?分析:设公、母和雏鸡的只数分别为x、y和z,则根据题意有方程式:x+y+z=100;同时100只鸡所花的钱数又必须满足:5x+3y+z/3=100。是一个典型的不定方程。因此可以采用试的方法,进行求解,如当给定公鸡数和母鸡数,小鸡数也就确定了。本题可使用两重循环。程序代码,参见P282。4.多重循环
【例7-15】利用数据表“学生.DBF”、和“成绩.DBF”,实现平均分数奖励,要求如下:①对学生表中每个学生,根据其选课成绩,确定是否奖励分数,如果该同学所有选课成绩均在90分以上,则奖励该学生10分,否则加分。②奖励完毕后,以下面的格式显示每个同学的平均成绩和奖励分数。
分析:要实现奖励加分,首先要求出90分以上的课程门数,如果90分以上的课程门数和学生所选课程总数相等,则表示所选课程均在90分以上,从而实现奖励加分。程序代码,参见P283。7.4.1过程的建立与调用7.4过程与过程调用在VisualFoxPro程序设计中,经常会遇到有些运算或程序段落在程序中多次调用的情况,为了有效地解决上述重复调用,可设计出相对独立并能完成特定功能的程序段,这种程序段称为过程(Procedure),有时也被称为子程序(Subprogram),用于调用程序段的程序称为主程序。这样的程序设计称为模块化程序设计(Modularityprogramming)。在程序设计中,把被其它过程调用的过程称为被调过程,相对地把调用其它过程的过程称为主调过程或主程序。过程调用也允许嵌套调用,最深可以嵌套调用128层。模块在调用时,并不是孤立不变的,而是相互依赖、相互作用的,确切地说,就是在模块调用时,它们之间有相互依存的数据信息传递。根据过程的存储位置,过程分可为4种不同的类型:独立程序文件过程、程序文件过程、过程文件过程、存储过程。
独立程序文件过程是一个个独立的.prg文件。创建的方法同于程序文件,用DO命令进行调用。它的缺点是当程序运行时,需要反复地访问磁盘,其运行速度较慢。过程必须先建立,然后再调用。独立程序文件过程的建立的方法与建立一般程序的方法相同;如果一个过程只允许一个程序调用,这样的过程称为程序文件过程,与独立程序文件过程所不同的是在每个过程中至少要有一个返回语句。过程被调用时,要使用DO命令进行调用执行。返回语句的命令使用格式和DO命令语句的使用方法,请参阅本章的第7.1.2节和第7.2.2节的内容。过程文件过程和存储过程,我们将在本节中的第7.4.3节和第7.4.4小节中给予介绍。下面介绍程序文件过程的建立和调用方法。建立程序文件过程的命令是PROCEDURE,该命令的格式有两种。⑴命令格式PROCEDUREProcedureName[LPARAMETERSparameter1[,parameter2],...]Statements[RETURN[TOMASTER|TOProcedureName][ENDPROC]或PROCEDURErocedureName([parameter1[,parameter2],...])Statements[RETURN[TOMASTER|TOProcedureName]][ENDPROC]⑵功能:定义一个过程或子程序。⑶说明:①PROCEDUREProcedureName:指定自定义过程的开头处和过程的名字。②LPARAMETERSparameter1[,parameter2],...:定义从主调过程传递数据到定义过程的本地(局部)变量或数组。这些变量称为形式参数,简称形参。如果过程有此子句时,则必须将此子句放在过程的开始处,即第一条语句。1.定义过程③([parameter1[,parameter2],...]):指定从主调用过程传递数据到函数过程的私有变量或数组。④RETURN[TOMASTER|TOProcedureName]:返回程序运行控制到主调过程或其它过程。RETURN子句可以出现在过程体的任何地方,以便将控制返回到主调过程或别的过程以及返回一个值。如果过程中没有RETURN命令,VisualFoxPro当过程退出时会自动隐含执行了一个RETURN。
⑤ENDPROC:过程结构的结束语句。该关键字是可选择的,如无此关键字,则当过程碰到其它的PROCEDURE命令或到达本过程结尾时,也会自动认为本过程定义结束。2.调用过程调用过程或子程序的命令使用DO语句。DO语句的语法格式如下:
DOProgramName1|ProcedureName[INProgramName2][WITHParameterList]DO语句的功能和含义,请参阅本章中第7.1.2节,这里不再叙述。【例7-16】计算阶乘之和,要求使用独立程序文件过程。分析:为求三数阶乘之和,可以事先编写一段子程序(factorial)用于求一个数的阶乘,当求第二个数的阶乘时,再调用该程序即可,这就是过程的使用思想。程序代码,参见P286。
【例7-17】利用公式,编写一程序求欧拉常数(Euler'sconstant),当通项的值小于时,认为达到精度。要求将过程和主程序代码放在一起。程序代码,参见P286。1.过程文件的建立7.4.2过程文件过程调用有两种形式,一种为外部调用,如例7-16。此种方式的调用,如果外部文件利用太多,一是系统会容易出错,二来也影响速度。为避免此种情况的发生,可将被调用的各个过程写在一个总的程序文件中,该文件称为过程文件(ProcedureFile)。一个过程文件由多个过程组成,过程文件的扩展名仍然是.PRG。一次打开一个过程文件,系统可将包含在过程文件中的所有过程都调入到计算机内存中,这样在调用过程时,可有效地提高速度,这样的调用称为过程的内部调用。VisualFoxPro允许一个过程文件最多包含128个过程。⑴命令格式
MODIFYCOMMANDProcedureFileName⑵功能建立一个过程文件。在过程文件中,可将以后所使用的各个小过程一次性地全部书写出来。在过程文件中书写过程程序段的格式如下:PROCEDUREProcedureName1Statements1RETURNENDPROCPROCEDUREProcedureName2Statements2RETURNENDPROC……PROCEDUREProcedureNameNStatementsNRETURNENDPROC2.过程文件的基本书写格式在程序中若想调用过程文件中的过程时,需要先打开过程文件,用过之后要及时关闭。⑴命令格式SETPROCEDURETO[ProcedureFileName1[,ProcedureFileName2,...]][ADDITIVE]3.过程文件的打开⑵功能打开指定的过程文件,将过程文件中所包含的子程序全部调入内存。⑶说明①ProcedureFileName1[,ProcedureFileName2,...]:指定打开文件的顺序。SETPROCEDURE可带有多个文件名,即可以立刻打开多个过程文件。②ADDITIVE:在不关闭当前已打开的过程文件的情况下打开其他过程文件。③不带任何文件名的SETPROCEDURETO的命令关闭所有打开的过程文件。也可使用RELEASEPROCEDURE关闭单个文件。④若要修改过程文件的内容,一定要先关闭打开的过程文件。打开过程文件后,凡包含在该过程文件中的过程即可被调用执行,过程调用的方式是:
DOProcedureName1[WITHParameterList]功能和含义同前所述。DO命令可以嵌套,即程序可以调用过程,过程也可以调用其他过程或子程序。4.执行过程文件中的过程5.关闭过程文件过程文件在使用完毕后,或对过程文件的过程修改后,要及时地关闭该过程文件。关闭过程文件可以使用不带过程文件名的SETPROCEDURETO语句,也可以用专门的关闭过程文件的命令。⑴命令格式CLOSEPROCEDURE或RELEASEPROCEDUREProcedureFileName1[,ProcedureFileName2…]⑵功能CLOSEPROCEDURE可关闭已打开的所有过程文件,RELEASEPROCEDURE可关闭指定的过程文件。【例7-18】编写一程序,其功能求出3~100之间的所有素数。分析:对一个自然数M(取值在3~100之间的奇数)求素数的方法是:将M依次除以3到M的算数平方根之间的所有奇数,若均不能被整除,则M即为素数,否则,M不是素数。程序代码,参见P288。7.5.1变量的作用域7.5变量的作用域和参数调用在VisualFoxPro应用程序中,会出现许多内存变量,合理地使用不同属性的内存变量,将会给设计程序带来很多方便。根据变量的作用范围不同,可将变量划分为全局变量(Public)、私有变量(Private)和本地变量(Local)三种。一个数据库应用系统不同功能的模块程序之间,存在信息传递。模块间的数据信息传递有二种形式:第一种,可以利用变量传递;第二种是利用参数传递。参数传递可充分保证数据传递的一致性,数据不会出现交叉,也不容易引起混乱。全局变量是指在程序的任何嵌套中及在程序执行期间始终有效的变量。程序执行完毕,它们不会在内存中自动释放。全局变量的定义如下:⑴命令格式
PUBLICMemVarList或
PUBLIC[ARRAY]ArrayName1(nRows1[,nColumns1])[,ArrayName2(nRows2[,nColumns2])]...⑵功能:将内存变量名表中的变量或数组定义为全局变量。1.全局变量⑶说明①MemVarList:指定一个或多个要初始化为或指定为全局变量的内存变量,变量名之间用半角的“,”隔开。②[ARRAY]ArrayName1(nRows1[,nColumns1]):指定一个或多个数组,将它们初始化或命名为全局数组。ArrayName1为数组名,(nRows1[,nColumns1])说明该数组的维数和下标大小。③用PUBLIC说明的变量,一旦建立,一直有效。在命令窗口中直接使用而由系统自动隐含建立的变量也是全局变量。④在程序中,PUBILC声明语句既可写在主程序中,也可写在任意一个过程中。用PUBLIC语句声明的变量除变量FOX、FoxPro被初始化为逻辑真(.T.)外,其余的一律被初始化为逻辑假(.F.)。但对于FOX、FOXPRO数组,各个元素也将被初始化为.F.。2.本地变量使用LOCAL关键字来定义的变量称为本地变量(或局部变量),用LOCAL定义变量的格式为:⑴格式格式
LOCALMemVarList或
LOCAL[ARRAY]ArrayName1(nRows1[,nColumns1])[,ArrayName2(nRows2[,nColumns2])]...⑵功能:声明内存变量和内存变量数组为本地变量(或局部变量),并对其进行初始化。⑶说明①在命令LOCAL中,参数的使用方法和PUBLIC相同。本地变量定义后,系统自动将其初值赋为逻辑假(.F.)。②本地变量只在定义它的程序中有效,一旦该程序运行完毕,本地变量便被自动清除。③在书写命令时,不能将该命令缩写为LOCA。【例7-22】分析下面程序的执行情况,并回答程序运行后的结果是什么?最后程序运行后的结果是:i=3,j=1,k=3。***main.prg***clearsetproceduretoproc12publici,j,kstore1toi,jdoproc1doproc2?"i="+str(i,2),"j="+str(j,2),"k="+str(k,2)return***proc12.prg***procedureproc1localji=i*2+1j=i*2+1doproc2procedureproc2k=2*j+1return私有变量是指未经PUBLIC命令定义的,只在建立它的过程及下级过程中有效的内存变量。建立私有变量的程序执行完毕,私有变量的值将被自动清除。凡是过程中未经特殊说明的内存变量,系统一律认为是私有变量,这种方式称做隐含定义方式。也可以使用专门命令PRIVATE来定义私有变量,即显式定义方式。在过程中,用PARAMTERS语句声明的形参也是私有内存变量。私有变量的作用域是定义它的过程及其被该过程所调用的各下级过程。当定义它的过程结束运行后,所有私有变量会自动清除。⑴命令格式
PRIVATEMemVarList或者
PRIVATEALL[LIKESkeleton|EXCEPTSkeleton]⑵功能在当前程序中定义的内存变量说明为私有变量。也可以隐藏指定的、在调用程序中定义的内存变量或数组。⑶说明①在命令Private中,参数的使用方法与LOCAL和PUBLIC相同命令中各参数相同。3.私有变量②[LIKESkeleton|EXCEPTSkeleton]为匹配结构,即说明具有或排除相同特点的变量为私有变量。匹配结构中可以使用通配符“*”和“?”。③在同一过程中,用隐式或显式定义的私有变量的作用域完全相同。在主程序或上级过程中未经PRIVATE语句定义的私有变量,在下级过程中也未经显式定义,那么它的新值可以带回主程序或上级过程;若在下级过程中进行了显式定义,其新值不能带回主程序或上级过程中使用。④PRIVATE并不创建变量,它只在当前程序中隐藏变量,这些变量是在高层程序中声明的。【例7-23】有下面的程序,试说明过程中全局变量和私有变量的应用,如图7-16所示。***main.prg***publicx1,x12,xyzstor5tox1,x12,xyz,xdisplaymemorylikex*dosub1?x1,x12,xyz,xdisplaymemorylikex*?ycancel***sub1.prg***privalllikex1*stor0tox1,x12,xyzx1=x1+1x12=x12+1xyz=xyz+1?x1,x12,xyz,xdisplaymemorylikex*waitdosub2return***sub2.prg***x1=x1+1x12=x12+1xyz=xyz+1displaymemory;likex*return在VisualFoxPro中,可以使用过程的带参数调用方法,这种方法是:在调用过程的命令和被调用过程的相关语句中,分别设置数量相同、数据类型一致且排列顺序相互对应的参数表。调用过程的命令将一系列参数的值传递给被调用过程中的对应参数,被调用过程运行结束时,再将参数的值返回到调用它的上一级过程或主程序中。这种调用是通过带参数过程调用命令和接受参数命令实现的。图7-16例7-23中变量的显示结果7.5.2过程的参数调用⑴命令格式
DOProgramName1|ProcedureName[INProgramName2][WITHParameterList]⑵功能:调用过程或过程文件中的过程,并为被调用过程提供参数。⑶说明:WITHParameterList又称为实参(实在参数)表,其中的参数可以是表达式、名表达式、常量、已赋值的变量、数组名或用户自定的函数,参数之间用逗号分开。1.带参数调用2.接受参数⑴命令格式
LPARAMETERSparameter1[,parameter2],…或
PROCEDUREProcedureName(parameter1[,parameter2],…)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 呼吸康复护理中的并发症预防措施
- 护理评估单的疼痛管理应用
- 呼吸系统疾病护理策略
- 护理课件制作中的跨学科融合
- 旅游行业策划师面试技巧与策略
- 快消品行业数据分析案例解析
- 快消品行业出纳工作要求及面试要点
- 快消品行业行政人员面试要点
- 零基础到资深:损耗控制经理求职成功法则
- 基于云计算的智慧城市建设探索
- 乡镇禁毒举报奖惩制度
- 2026年江西赣州市高三一模高考数学试卷试题(含答案详解)
- 2026年安徽工业职业技术学院单招综合素质考试题库及答案详解(全优)
- 2026年安徽新闻出版职业技术学院单招综合素质考试题库及一套答案详解
- 考古发掘与保护技术规范
- 《虚拟商业社会环境》-项目一
- 深度解析(2026)《HGT 3738-2004溶剂型多用途氯丁橡胶胶粘剂》(2026年)深度解析
- 月结正式合同模板(3篇)
- 锂电池设备安装施工方案
- 2026年滁州职业技术学院单招职业适应性测试题库参考答案详解
- 国铁集团安全穿透式管理培训课件
评论
0/150
提交评论