
VisualFoxPro程序设计初步课件.ppt
41页第第7章章 FoxPro程序设计初步程序设计初步 第第7章章 FoxPro程序设计程序设计Visual FoxProVisual FoxPro的工作方式的工作方式程序文件的建立与编辑程序文件的建立与编辑程序的基本结构程序的基本结构分支结构分支结构循环结构循环结构过程过程第第7章章 FoxPro程序设计初步程序设计初步 Visual FoxPro的工作方式Visual FoxPro系统提供有三种工作方式:即单命令方单命令方式式、菜单方式菜单方式及程序文件方式程序文件方式 1.1.单命令方式单命令方式 所谓单命令方式,即在Command 窗口输入一条命令,完成一个操作的工作方式 2.2.菜单方式菜单方式所谓菜单方式,即通过打开不同的菜单选择并完成不同的操作 3. 3.程序文件方式程序文件方式 程序文件(简称程序)也叫做命令文件将对数据库资源进行操作管理的命令和对系统环境进行设置的命令,集中在一个以(以(.PRG.PRG)为扩展名的命令文件)为扩展名的命令文件中,然后再通过菜单方式或命令方式运行该命令文件所谓命令方式,即通过程序文件中的命令完成不同的操作。
第第7章章 FoxPro程序设计初步程序设计初步 7.1.1 程序的概念有关此Visual FoxPro程序的几点说明 :1.注释语句.注释语句【格式1】NOTE <注释内容>【格式2】* <注释内容>【格式3】&& <注释内容>【功能】增强程序文件的易读性或放弃<注释内容>中语句的执行 2.对话开关语句.对话开关语句【格式】SET TALK OFF|ON【功能】关闭或打开命令执行时的对话开关3.命令的分行.命令的分行Visual FoxPro程序是命令行的序列,每个命令都以回车键结束,一行只能写一条命令;若一条命令太长,一行写不下,也可分行书写,并在分行处加上续行符“;”,再按回车键第第7章章 FoxPro程序设计初步程序设计初步 7.1.2 程序文件的建立、修改与执行1 1.建立或修改程序文件.建立或修改程序文件 可用两种方式调用系统内置的文本编辑器建立或修改程序文件 : 命令方式命令方式 MODIFY COMMAND [<盘符>] [<路径>]〈程序文件名〉或 MODIFY FILE [<盘符>] [<路径>]〈程序文件名〉菜单方式菜单方式 打开“文件”菜单,选择“新建”;在“新建”窗口,选择“程序”,再选择“新建文件”2.保存程序.保存程序 程序输入、编辑完毕,单击【文件】|【保存】菜单项,或按Ctrl+W复合键,在“另存为”对话框中指定程序文件的存放位置和文件名,并单击“保存”按钮保存程序文件并退出文本编辑器。
程序文件的默认扩展名是默认扩展名是.PRG第第7章章 FoxPro程序设计初步程序设计初步 3.执行程序.执行程序程序文件建立后,可以用多种方式、多次执行它下面是两种常用的方式1)菜单方式)菜单方式 ① 单击【程序】|【运行】菜单项,打开“运行”对话框; ② 从文件列表框中选择要运行的程序文件,并单击“运行”命令按钮,启动运行该程序文件 ((2)命令方式)命令方式【格式】DO [<盘符>][<路径>\]<文件名>【功能】执行指定<盘符>、<路径>下的程序文件 注:执行程序文件时,将依次执行文件中的命令,直到所有命令执行完毕,或者执行到以下命令:① CANCAL:终止程序运行,清除所有的私有变量,返回命令窗口;② RETURN:结束程序执行,返回调用它的上级程序,若无上级程序则返回命令窗口;③ QUIT:结束程序执行并退出Visual FoxPro系统,返回操作系统 第第7章章 FoxPro程序设计初步程序设计初步 7.1.3 简单的输入输出命令1..ACCEPT命令命令【格式】ACCEPT [<提示信息>] TO <内存变量>【功能】在程序执行过程中,将用户交互式输入的内容作为字符串赋值给指定内存变量。
该命令只接受字符型数据,输入的字符串不需要加定界符该命令只接受字符型数据,输入的字符串不需要加定界符2.INPUT命令命令 【格式】INPUT [<提示信息>] TO <内存变量>【功能】在程序执行过程中,将用户交互式输入的内容赋值给指定内存变量 可以输入字符型、数值型、逻辑型、日期型和日期时间型等可以输入字符型、数值型、逻辑型、日期型和日期时间型等类型数据,而且可以是常量、变量、函数或表达式等形式类型数据,而且可以是常量、变量、函数或表达式等形式,按回车键结束输入,系统将输入的数据赋值给<内存变量>第第7章章 FoxPro程序设计初步程序设计初步 【例】编程从键盘输入某数据库的文件名,要求打开该数据库并显示其内容程序文件名为PROG2.PRGMODI COMMAND PROG2SET TALK OFFCLEARACCEPT “请输入数据库名:” TO AAAOPEN DATABASE &AAAACCEPT "请输入表名" TO BBBUSE &BBBLISTUSESET TALK ONRETURN(p1.prg)第第7章章 FoxPro程序设计初步程序设计初步 【例】从键盘输入两个任意正数,编程求以两数为边长的长方形面积。
程序文件名为PROG4.PRGSET TALK OFFCLEARINPUT “长方形一边的长为:” TO AINPUT “长方形另一边的长为:” TO BS=A*B? “长方形的面积为:” , SSET TALK ONRETURN(p2.prg)第第7章章 FoxPro程序设计初步程序设计初步 3..WAIT命令命令•【 格 式 】 WAIT [<提 示 信 息 >][TO<内 存 变 量 >] [WINDOW [AT<行>,<列>]] [NOWAIT] [CLEAR|NOCLEAR] [TIMEOUT<数值表达式>]•【功能】显示提示信息,暂停程序执行,直到用户按任意键或单击鼠标时继续执行程序• 若选择可选项[TO <内存变量>],将输入的单个字符作为字符型数据赋给指定的<内存变量>;若用户是按Enter键或单击鼠标,<内存变量>的值为空串• 若省略所有可选项,屏幕显示“键入任意键继续……”默认提示信息 第第7章章 FoxPro程序设计初步程序设计初步 【例】在STUDENT数据库的STUD表中显示任意一个系学生的情况程序文件名为PROG6.PRGSET TALK OFFCLEAROPEN DATABASE STUDENTUSE STUDWAIT “请输入待查学生的系号(1—3):” TO NIF VAL(N)<1 .OR. VAL(N)>3WAIT “输入无效,结束程序运行!” WINDOW TIMEOUT 5RETURNELSESTORE “0”+N TO AAALIST FOR 系别号=AAAENDIFCLOSE DATABASESET TALK ONRETURN 第第7章章 FoxPro程序设计初步程序设计初步 4.三条输入命令的异同.三条输入命令的异同•ACCEPT命令只能接受字符型数据,不需定界符,输入完毕按回车键结束;• WAIT命令只能输入单个字符,且不需定界符,输入完毕不需按回车键;• INPUT命令可接受数值型、字符型、逻辑型、日期型和日期时间型数据,数据形式可以是常量、变量、函数和表达式,如果是字符串,需用定界符,输入完毕按回车键结束。
第第7章章 FoxPro程序设计初步程序设计初步 程序的基本结构程序的基本结构 Visual FoxPro系统提供的命令丰富,且功能强大,把这些命令和程序设计语句有效地组织在一起,就形成了实现某一特定功能的程序 Visual FoxPro系统的程序有两个特点:一是程序控制流模式(面向过程),由顺序、分支、循环三种基本结构构成二是面向对面向对象象可视化的结构程序模块,在每个模块的内部也是由程序控制流组成常见的控制结构如下: 1 1.顺序结构.顺序结构 2 2.分支结构.分支结构 3 3.循环结构.循环结构 4 4.过程.过程( (函数函数) )结构结构第第7章章 FoxPro程序设计初步程序设计初步 分支结构分支结构1 1.单向分支.单向分支 【格式1】 IF〈条件表达式〉 〈命令行序列1〉 [ELSE 〈命令行序列2〉] ENDIF语句功能: 该语句首先计算〈条件表达式〉的值,当〈条件表达式〉的值为真时,执行〈命令行序列1〉;否则,执行〈命令行序列2〉。
第第7章章 FoxPro程序设计初步程序设计初步 【例】编写一密码校验程序(假设密码为ABC)程序文件名为P3.PRGSET TALK OFFCLEARACCEPT “请输入您的密码:” TO AAAIF AAA=”ABC”CLEAR? ”欢迎使用本系统!”ELSE?”密码错误!”WAITQUITENDIFSET TALK ON(p3.prg)第第7章章 FoxPro程序设计初步程序设计初步 【例】编写一查询学生基本情况的程序,P4.PRGset talk offopen database jsjdjksuse t_bmbclearaccept "请输入学生的准考证号:" to zzzlocate for zkzh=zzzif .not. eof()?"姓名:" + xm?"性别:" + IIF(xb,"男","女")?"出生日期:" + DTOC(csrq,1)else?"查无此人!!!"endifclose databasereturn第第7章章 FoxPro程序设计初步程序设计初步 3 3.多向分支.多向分支 多向分支语句,即根据多个条件表达式的值,选择执行多个操作中的一个对应执行 。
语句格式:语句格式: DO CASE CASE〈条件表达式1〉 <命令行序列1〉 CASE〈条件表达式2〉 <命令行序列2〉 … … CASE〈条件表达式N〉〈命令行序列N〉 [OTHERWISE 〈命令行序列N+1〉] ENDCASE第第7章章 FoxPro程序设计初步程序设计初步 【例】假设收入(P)与税率(R)的关系如下表,编程求税金程序文件名为P5.PRG 0 P<800R= 0.05 800 ≤ P<2000 0.08 2000≤P<5000 0.1 P≥5000 SET TALK OFFCLEARINPUT “请输入收入:” TO PDO CASECASE P<800 R=0CASE P<2000 R=0.05CASE P<5000 R=0.08OTHERWISE R=0.1ENDCASETAX=P*R? ”税金为:”,TAXSET TALK ON RETURN (p5.prg) 第第7章章 FoxPro程序设计初步程序设计初步 4 4.使用分支语句应注意的几点.使用分支语句应注意的几点 (1)IF… … ENDIF和DO CASE… … ENDCASE 必须配对使用,DO CASE与第一个CASE〈条件表达式〉之间不应有任何命令。
(2)〈条件表达式〉可以是各种表达式或函数的组合,其值必须是逻辑值 (3)〈命令行序列〉可以由一个或多个命令组成,可以是条件控制语句组成的嵌套结构 (4)DO CASE… … ENDCASE 命令,每次最多只能执行一个〈命令行序列〉在多个CASE项的〈条件表达式〉值为真时,只执行第一个〈条件表达式〉值为真的〈命令行序列〉,然后执行ENDCASE的后面的第一条命令第第7章章 FoxPro程序设计初步程序设计初步 循环结构1.DO WHILE循环语句【格式1】DO WHILE <条件表达式> <语句序列> ENDDO一个循环结构一般应具备如下的条件:(1)循环的初始条件:一般为给循环控制变量赋初值;(2)循环头:循环语句的起始,设置、判断循环条件;(3)循环尾:循环语句的结尾;(4)循环体:位于循环头和循环尾之间、循环控制重复执行的语句序列 第第7章章 FoxPro程序设计初步程序设计初步 【格式2】DO WHILE <条件表达式> <语句序列1> [LOOP] <语句序列2> [EXIT] <语句序列3> ENDDO •LOOP语句:强行返回到循环开始语句。
•EXIT语句:强行跳出循环,接着执行ENDDO后的语句 第第7章章 FoxPro程序设计初步程序设计初步 【例】编程求1+2+3+……+100之和程序文件名为P6.PRGSET TALK OFFCLEARS=0I=1DO WHILE I<=100 S=S+I I=I+1ENDDO? ”1+2+3+……+100=”,SSET TALK ONRETURN第第7章章 FoxPro程序设计初步程序设计初步 【例】逐条显示在jsjdjks数据库的t_cjb表中bscj>=90的所有记录程序文件名为P7.PRGp71.prg)SET TALK OFFCLEAROPEN DATABASE jsjdjksUSE t_cjbDO WHILE .NOT. EOF()IF bscj>=90DISPLAYENDIFSKIPENDDOCLOSE DATABASESET TALK ONRETURN SET TALK OFFCLEAROPEN DATABASE jsjdjksUSE t_cjbLOCATE FOR bscj>=90DO WHILE .NOT. EOF()DISPLAYWAITCONTINUEENDDOCLOSE DATABASESET TALK ONRETURN第第7章章 FoxPro程序设计初步程序设计初步 【例】编程显示STUDENT数据库的STUD表中除“李宁”以外的所有记录。
SET TALK OFFCLEAROPEN DATABASE STUDENTUSE STUDDO WHILE .NOT. EOF() IF 姓名=”李宁” SKIP LOOP ENDIF DISPLAY SKIPENDDOCLOSE DATABASESET TALK ONRETURN第第7章章 FoxPro程序设计初步程序设计初步 2..FOR循环语句循环语句 【格式】【格式】FOR <循环变量循环变量>=<初值初值> TO <终值终值> [STEP<步长步长>] <循环体循环体> ENDFOR|NEXT 使用FOR循环语句的有关说明:① 省略STEP <步长>,则〈步长〉为默认值1;②〈初值〉、〈终值〉和〈步长〉都可以是数值表达式,但这些表达式仅在循环语句开始执行时计算一次循环语句执行过程中,初值、终值和步长是不会改变的,并由此确定循环的次数;③ 可以在循环体内改变循环变量的值,但会改变循环执行次数; ④ EXIT和LOOP命令可以出现在循环体内执行LOOP命令时,结束本次循环,循环变量增加一个步长值,返回FOR循环头判断循环条件是否成立。
执行EXIT命令时,程序跳出循环,执行循环尾后面的语句 第第7章章 FoxPro程序设计初步程序设计初步 【例6-23】从键盘输入10个数,编程找出其中的最大值和最小值程序文件名为P8.PRGSET TALK OFFCLEARINPUT “请从键盘输入”+alltrim(str(i))+“个数:" TO ASTORE A TO MAX,MINFOR I=2 TO 10?? “请从键盘输入”+I+??i??“个数:” TO AIF MAXA MIN=AENDIFENDFOR? “最大值为:” , MAX? “最小值为:” , MINSET TALK ONRETURN第第7章章 FoxPro程序设计初步程序设计初步 4 4..使用循环语句时应注意的几点使用循环语句时应注意的几点 (1)DO WHILE和ENDDO、FOR和ENDFOR必须配对使用配对使用 (2)〈命令行序列〉可以是任何FoxPro命令或语句,也可以是循环语句,即可以为多重循环 (3)〈循环变量〉应是数值型的内存变量或数组元素循环变量〉应是数值型的内存变量或数组元素。
(4)EXITEXIT和和LOOPLOOP命命令令嵌嵌入入在在循循环环体体内内,,可可以以改改变变循循环环次次数数,,但但是是不不能能单单独独使使用用EXIT的功能是跳出循环,转去执行ENDDO、ENDFOR后面的第一条命令;LOOP的功能是转回到循环的开始处,重新对“条件”进行判断,相当于执行了一次ENDDO、ENDFOR命令,它可以改变〈命令行序列〉中部分命令的执行次数EXIT、LOOP可以出现在〈命令行序列〉的任意位置第第7章章 FoxPro程序设计初步程序设计初步 5.多重循环.多重循环多重循环即循环的嵌套,是在一个循环结构的循环体中又包含另一个循环我们称外层循环为外循环,被包含的循环为内循环嵌套层数一般没有限制,但内循环的循环体必须完全包含在外循环的循环体中,不能相互交叉正确的嵌套关系如:DO WHILE <条件表达式1> <语句序列11> DO WHILE <条件表达式2> <语句序列21> DO WHILE <条件表达式3> <语句序列3> ENDDO <语句行序列22> ENDDO <语句行序列12> ENDDO 第第7章章 FoxPro程序设计初步程序设计初步 【例】编程输出下三角形乘法口诀表。
程序文件名为P9.PRGSET TALK OFFCLEARX=1DO WHILE X<=9Y=1DO WHILE Y<=XS=X*Y?? STR(Y,1)+"*"+STR(X,1)+"="+STR(S,2)+" "Y=Y+1ENDDO?X=X+1ENDDOSET TALK ONRETURN第第7章章 FoxPro程序设计初步程序设计初步 7.3 7.3 多模块程序多模块程序应用程序一般都是包含多个程序模块,模块是一个相对独立的程序段,它可以被其他模块所调用,也可以去调用其他的模块通常被其他模块调用的模块称为子子程程序序,后之为主主程序程序7.3.1 7.3.1 模块的定义和调用模块的定义和调用格式:格式:PROCEDURE|FUNCTION <过程名过程名><命令序列命令序列>[ RETURN [表达式表达式] ][ENDPROC、、ENDFUNC]注意:过程执行到RETURN时将跳转到调用程序,并返回表达式的值如果缺少RETURN时,将默认返回一个逻辑真.T.第第7章章 FoxPro程序设计初步程序设计初步 1 .过程.过程/模块文件的建立模块文件的建立 过程文件的建立方法与程序文件相同。
可用MODIFY COMMAND <过程文件名过程文件名> 命令或调用其他文字编辑软件来建立2 .过程.过程/模块的调用模块的调用格式格式1::DO <文件名文件名>|<过程名过程名>格式格式2::<过程名过程名>( ) &&即在名字后加一对小括号即在名字后加一对小括号注:格式2即可以作为命令使用(返回值被忽略),也可以作为函数出现在表达式里第第7章章 FoxPro程序设计初步程序设计初步 &&p10.prgset procedure to p12clear* p11()do f1?"流程序结束"* 过程f1procedure f1?"过程f1开始"?"调用f3( )"?"返回值:",f3( )?"过程f1结束"endproc&&p11.prg? "子程序p11开始"?"调用f3( )"x=f2()?"返回值为:",x?"子程序p11结束"return&&p12.prgprocedure f2returnprocedure f3return 100第第7章章 FoxPro程序设计初步程序设计初步 2.过程文件的打开.过程文件的打开 如果被调用某过程文件与主程序不在同一同件中时,必须先打开该过程文件,打开过程文件命令为: 【格式】SET PROCEDURE TO <过程文件名过程文件名> [ADDITIVE] 任何时候系统只能打开一个过程文件,当当打打开开一一个个新新的的过过程程文文件件时时,,原原已已打打开开的的过过程程文文件件自自动动关关闭闭。
如如果果选选用用ADDITIVE,,那那么在打开过程文件时,并不关闭原先已打开的过程文件么在打开过程文件时,并不关闭原先已打开的过程文件3.过程文件的关闭.过程文件的关闭关闭过程文件可用下列命令: 【格式一】SET PROCEDURE TO 【格式二】CLOSE PROCEDURE [过程文件]第第7章章 FoxPro程序设计初步程序设计初步 7.3.3 过程调用中的参数传递过程调用中的参数传递过程可以接收调用程序传递过来的参数,并能够根据接收到的参数控制程序流程或对接收的参数进行处理,从而大提供了模块程序功能设计的灵活性1.有参过程中的形式参数定义.有参过程中的形式参数定义有参过程中的形式参数定义语句为: 【格式】PARAMETERS|LPARAMETERS <参数表> 该语句必需是过程中第一条语句<参数表>中的参数可以是任意合法的内存变量名,用PARAMETERS命令声明的形参变量被看作过程程序的私有变量私有变量而LPARAMETERS则被看成是局部变量局部变量第第7章章 FoxPro程序设计初步程序设计初步 2.程序与被调用过程间的参数传递.程序与被调用过程间的参数传递程序与被调用过程间的参数传递是通过过程调用命令DO <过程名过程名> WITH <参数表参数表>来实现的。
说明】(1)DO命令<参数表>中参数称为实实际际参参数数,PARAMATERS命令<参数表>中的参数称为形形式式参参数数两两个个<参参数数表表>中中的的参数必须相容,即个数相同,类型和位置一一对应参数必须相容,即个数相同,类型和位置一一对应;(2)Visual FoxPro的参数传递规则为:如果实际参数是常数实际参数是常数或表达式则传值或表达式则传值,如果实际参数是变量则传址如果实际参数是变量则传址,即传递的不是实参变量的值而是实参变量的地址,这样,过程中对形参变量值的改变也将使实参变量值改变如果实参是内如果实参是内存变量而又希望进行值传递,可以用圆括号将该内存变量存变量而又希望进行值传递,可以用圆括号将该内存变量括起来,强制该变量以值方式传递数据括起来,强制该变量以值方式传递数据 第第7章章 FoxPro程序设计初步程序设计初步 【例】用参数传递编程,计算圆的面积 主程序名P13.prgSET TALK OFFCLEARS=0INPUT ”请输入圆的半径:” TO RDO AREA WITH R,S? ”圆的面积为:”,SSET TALK ON PROCEDURE AREA && 计算面积的过程PARAMETER X,Y && 形参说明Y=3.1416*X**2RETURN第第7章章 FoxPro程序设计初步程序设计初步 SET TALK OFFCLEARS=0INPUT "请输入圆的半径:" TO RDO AREA WITH R,(S) &&强制按传值方式? "圆的面积为:",SSET TALK ON?PROCEDURE AREA && 计算面积的过程PARAMETER X,Y && 形参说明Y=3.14*X**2RETURN第第7章章 FoxPro程序设计初步程序设计初步 7.3.6 内存变量的作用域内存变量的作用域1.全局变量 全局变量是指在所有程序模块中都有效的内存变量 在程序或过程中定义全局变量的语句为:【格式】PUBLIC <内存变量表内存变量表>【例例】 public g , h说明:(1)用PUBLIC语句定义过的内存变量,在程序执行期间可以在任何层次的程序模块中使用;(2)变量定义语句要放在使用此变量的语句之前,否则会出错;(3)任何已经定义为全局变量的变量,可以用PUBLIC语句再定义,但不允许重新定义为局部变量;(4)使用全局变量可以增强模块间的通信,但会降低模块间的独立性。
第第7章章 FoxPro程序设计初步程序设计初步 2.私有变量.私有变量 私有变量是指在建立它的程序以及被此程序调用的程序中有效的内存变量 在程序中没有被PUBLIC或LOCAL说明的内存变量都被看作是私有变量有有时时为为避避免免在在子子程程序序中中修修改改全全局局变变量量或或上上层层私私有有变变量量,,我我们们可可以以用用以以下下命命令令来来隐隐藏藏指指定定的的全全局局变变量量或或上上上上层层私有变量私有变量格式1】PRIVATE <内存变量表>【格式2】PRIVATE ALL [LIKE | EXCEPT <通配符>]第第7章章 FoxPro程序设计初步程序设计初步 3.局部变量.局部变量 局部变量是指中能在建立它的程序中使用,不能在上层或下层程序/模块中使用的内存变量 局部变量也可以用LOCAL说明,命令格式为:【格式】LOCAL <内存变量表>第第7章章 FoxPro程序设计初步程序设计初步 &&程序p15.prgrelease all&& 清除内容变量public x1&&说明全局变量local x2&&说明局部变量store 'abcd' to x3&&???x2 = 1234do f6? '主程序中...'? 'x1=',x1? 'x2=',x2? 'x3=',x3return* 过程f6procedure f6? '子程序中...'x2=5678? 'x1=',x1? 'x2=',x2? 'x3=',x3return第第7章章 FoxPro程序设计初步程序设计初步 7.4 程序调试程序调试VF提供了调试环境,而从使用我们更容易修改程序中错误。
1.进入调试环境:命令: debug。
