1、2023年12月18日第1页第第7章章 程序设计基础程序设计基础l7.1 程序概述程序概述l7.2 顺序结构程序设计顺序结构程序设计l7.3 选择结构程序设计选择结构程序设计l7.4 循环结构程序设计循环结构程序设计l7.5 多重循环多重循环l7.6 多模块程序设计多模块程序设计l7.7 程序的调试程序的调试l本章小结本章小结l习题习题72023年12月18日第2页本章要点l介绍介绍Visual FoxPro程序设计的基础知识,程序设计的基础知识,包括常用命令、三种基本的程序结构、多包括常用命令、三种基本的程序结构、多模块程序设计以及程序的调试等基本知识。模块程序设计以及程序的调试等基本知识。
2、2023年12月18日第3页l本章首先讲解程序文件的建立及使用,以本章首先讲解程序文件的建立及使用,以及用于程序中的常用命令,其次介绍程序及用于程序中的常用命令,其次介绍程序的三种基本控制结构:顺序结构、选择结的三种基本控制结构:顺序结构、选择结构和循环结构,然后介绍多模块构和循环结构,然后介绍多模块程序设计程序设计相关的子程序、过程、自定义函数及变量相关的子程序、过程、自定义函数及变量作用域、参数传递等内容,使大家初步掌作用域、参数传递等内容,使大家初步掌握基本的程序设计方法,逐步提高利用计握基本的程序设计方法,逐步提高利用计算机解决实际问题的能力。算机解决实际问题的能力。l程序的三种基本结
3、构是本章的核心。程序的三种基本结构是本章的核心。2023年12月18日第4页7.1 程序概述程序概述l(1)注释)注释l在程序中应该适当的添加注释,以提高程序的可读性。在程序中应该适当的添加注释,以提高程序的可读性。l行注释:行注释:Note或或*开头,该行的后面的部分均为注释开头,该行的后面的部分均为注释l其他注释:以其他注释:以&符号开头。符号开头。l功能:注释不是可以执行的程序命令,不会影响程序的功功能:注释不是可以执行的程序命令,不会影响程序的功能,但是可以为程序增强可读性。能,但是可以为程序增强可读性。l(2)命令分行)命令分行l有些时候一条命令很长,为了阅读的方便我们可以将一条有些
4、时候一条命令很长,为了阅读的方便我们可以将一条命令分成多行来写。命令分成多行来写。l程序中每条命令都以回车键结束;一行只能写一条命令。程序中每条命令都以回车键结束;一行只能写一条命令。若命令需要分行书写,在行尾输入续行符若命令需要分行书写,在行尾输入续行符“;”,那么下,那么下一行将作为本行的延续。一行将作为本行的延续。2023年12月18日第5页l7.1.1 程序的建立、编辑程序的建立、编辑l在项目管理器章节中了解到程序可以分成以下几在项目管理器章节中了解到程序可以分成以下几类:类:l(1)程序文件()程序文件(.PRG)l默认扩展名为默认扩展名为PRG。该文件为项目中的代码中所。该文件为项
5、目中的代码中所包含的程序文件,文件格式为纯文本,所以可以包含的程序文件,文件格式为纯文本,所以可以在任何文本编辑器中进行创建或编辑,如果指定在任何文本编辑器中进行创建或编辑,如果指定其他扩展名,执行的时候要指定扩展名。其他扩展名,执行的时候要指定扩展名。l(2)表单文件()表单文件(.SCX):):l默认扩展名为默认扩展名为.SCX。该文件为项目中的表单亦即。该文件为项目中的表单亦即窗体。窗体。2023年12月18日第6页l1菜单方式菜单方式l操作步骤如下:操作步骤如下:l(1)打开文本编辑窗口。)打开文本编辑窗口。l“文件文件”菜单中选择菜单中选择“新建新建”菜单,在菜单,在“新建新建”对话
6、框中选择对话框中选择“程序程序”单选按钮,并单击单选按钮,并单击“新建文件新建文件”命令。命令。l(2)在打开的文本编辑窗口中键入程序代码。)在打开的文本编辑窗口中键入程序代码。l注意:这里的编辑操作与文本文件的编辑操作没有不同,但是要注意注意:这里的编辑操作与文本文件的编辑操作没有不同,但是要注意输入的应该是程序代码,也就是说在这里输入的每一行应该是一条命输入的应该是程序代码,也就是说在这里输入的每一行应该是一条命令语句。与命令窗口不同,输入完成一行后,不会被立即执行。令语句。与命令窗口不同,输入完成一行后,不会被立即执行。l(3)保存命令文件)保存命令文件l在在“文件文件”菜单中选择菜单中
7、选择“保存保存”命令或按下命令或按下Ctrl+W组合键,然后再组合键,然后再“另存为另存为”对话框中指定程序文件存放位置和文件名,单击对话框中指定程序文件存放位置和文件名,单击“保存保存”按钮进行保存。按钮进行保存。l要打开、修改程序文件,类似新建,只是在要打开、修改程序文件,类似新建,只是在“文件文件”菜单中选打开,菜单中选打开,然后在然后在“文件类型文件类型”中选择中选择“程序程序”选项,其他的都一样。选项,其他的都一样。2023年12月18日第7页l2使用命令方式:使用命令方式:l命令格式:命令格式:lMODIFY COMMAND l文件名:文件名:l要创建或修改的命令文件的文件名,可以
8、要创建或修改的命令文件的文件名,可以包含路径。如没有指定扩展名,系统在第包含路径。如没有指定扩展名,系统在第一次保存时会自动加上默认扩展名一次保存时会自动加上默认扩展名.PRG。2023年12月18日第8页l7.1.2 程序的运行程序的运行l建立好程序文件后,就可以一多种方式多次执行建立好程序文件后,就可以一多种方式多次执行它。常用的执行方式如下。它。常用的执行方式如下。l菜单方式:菜单方式:l从从“程序程序”菜单中选择菜单中选择“运行运行”菜单项,打开了菜单项,打开了“运行运行”对话框。对话框。l从文件列表框中选择要运行的程序文件,单击从文件列表框中选择要运行的程序文件,单击“运行运行”按钮
9、。按钮。l命令方式:命令方式:lDO 2023年12月18日第9页l程序执行时,程序文件中的命令被依次执行,直程序执行时,程序文件中的命令被依次执行,直到所有的命令被执行完毕,或执行到一下程序转到所有的命令被执行完毕,或执行到一下程序转向语句。向语句。l(1)CANCEL:终止程序的执行,清除所有的:终止程序的执行,清除所有的私有变量,返回到命令窗口。私有变量,返回到命令窗口。l(2)DO:执行另外的程序。:执行另外的程序。l(3)RETURN:结束当前程序的执行,返回到:结束当前程序的执行,返回到调用它的程序,若调用程序则返回到命令窗口。调用它的程序,若调用程序则返回到命令窗口。l(4)QU
10、IT:退出:退出Visual FoxPro系统,返回到操系统,返回到操作系统。作系统。2023年12月18日第10页l7.1.3 程序中常用的命令程序中常用的命令l1INPUT命令命令l命令格式:命令格式:INPUT TO l功能:该命令等待用户输入数据,用户可以输入任意合法功能:该命令等待用户输入数据,用户可以输入任意合法的表达式。当用户以回车符结束输入时,系统将表达式的的表达式。当用户以回车符结束输入时,系统将表达式的值存入指定的内存变量中,程序继续向下运行。值存入指定的内存变量中,程序继续向下运行。l注意:注意:l(1)如果选用了)如果选用了,系统会首先显示该表达,系统会首先显示该表达式
11、的值,作为提示信息。式的值,作为提示信息。l(2)输入的数据可以是常量、变量,也可以是表达式。)输入的数据可以是常量、变量,也可以是表达式。如果不输入任何内容直接回车,将要求重新输入。如果不输入任何内容直接回车,将要求重新输入。l(3)输入常量是要求有定界符,以便系统识别输入的是)输入常量是要求有定界符,以便系统识别输入的是什么类型的常量。什么类型的常量。2023年12月18日第11页l2ACCEPT命令命令l命令格式:命令格式:ACCEPT TO l功能:该命令等待用户从键盘输入字符串。当用户按功能:该命令等待用户从键盘输入字符串。当用户按“回回车车”键结束输入时,系统将该字符串存入指定的内
12、存变量键结束输入时,系统将该字符串存入指定的内存变量中,然后继续执行。中,然后继续执行。l注意:如果选用注意:如果选用,那么系统会首先显示该字,那么系统会首先显示该字符串的值,作为提示信息。符串的值,作为提示信息。l该命令只能接受字符串。用户输入的任何字符都将作为字该命令只能接受字符串。用户输入的任何字符都将作为字符串的构成部分。符串的构成部分。l如果不输入任何内容而直接按如果不输入任何内容而直接按“回车回车”键,内存变量接收键,内存变量接收空串。空串。2023年12月18日第12页l3WAIT命令命令l命令格式:命令格式:WAIT TO WINDOW AT,NOWAIT CLEAR|NOCL
13、EAR TIMEOUT l功能:该命令显示字符表达式的值作为提示信息,功能:该命令显示字符表达式的值作为提示信息,暂停程序的执行,直到用户按任意键或单击鼠标暂停程序的执行,直到用户按任意键或单击鼠标时,程序继续执行。时,程序继续执行。l4CANCEL命令命令l命令格式:命令格式:CANCEL l功能:终止命令文件的执行,关闭所有打开的文功能:终止命令文件的执行,关闭所有打开的文件,返回件,返回Visual FoxPro主窗口。主窗口。2023年12月18日第13页l5RETURN命令命令l命令格式:命令格式:RETURN l功能:返回调用命令文件的上一级程序的调用处。功能:返回调用命令文件的上
14、一级程序的调用处。若无程序调用则返回圆点提示符。若选择若无程序调用则返回圆点提示符。若选择项时,直接返回主程序。项时,直接返回主程序。l6QUIT命令命令l命令格式:命令格式:QUITl功能:关闭所有打开的文件,退出功能:关闭所有打开的文件,退出Visual FoxPro系统,将控制交还操作系统。系统,将控制交还操作系统。2023年12月18日第14页l7CLEAR命令命令l命令格式:命令格式:CLEAR ALL/FIELDS/GETS/MEMORY/PROGRAM/TYPEAHEADl功能:按给定的命令格式来清除屏幕或系统的状功能:按给定的命令格式来清除屏幕或系统的状态信息。态信息。l8CL
15、OSE命令命令l命令格式:命令格式:CLOSE ALL/ALTERNATE/DATABASE/INDEX/PROCEDURE2023年12月18日第15页7.2 顺序结构程序设计顺序结构程序设计l程序结构是指程序中的命令或语句的流程程序结构是指程序中的命令或语句的流程结构。顺序结构、选择结构和循环结构是结构。顺序结构、选择结构和循环结构是程序的程序的3种结构。语句序列种结构。语句序列A语句序列语句序列Bl顺序结构是顺序结构是3种结构中最基本的程序结构,种结构中最基本的程序结构,按照命令在程序中的先后次序依次执行。按照命令在程序中的先后次序依次执行。其执行过程如图其执行过程如图7-1所示。所示。
16、2023年12月18日第16页图7-1 顺序结构语句序列A语句序列B2023年12月18日第17页7.3 选择结构程序设计选择结构程序设计l7.3.1 简单分支结构简单分支结构l命令格式:命令格式:IFl l ENDIFl功能:功能:可以是各种表达式的组合。可以是各种表达式的组合。当其值为当其值为.T.时,就顺序执行时,就顺序执行,然后,然后再执行再执行ENDIF后面的语句;当其值为后面的语句;当其值为.F.时,直时,直接执行接执行ENDIF后面的语句。后面的语句。2023年12月18日第18页l7.3.2 选择分支结构选择分支结构l命令格式:命令格式:IFllELSEllENDIFl功能:根
17、据功能:根据的逻辑值,选择两个语句序列中的逻辑值,选择两个语句序列中的一个执行。当条件表达式值为的一个执行。当条件表达式值为.T.时,先执行时,先执行,然后转去执行,然后转去执行ENDIF后面的语句;当条件表达式值后面的语句;当条件表达式值为为.F.时,执行时,执行,然后转去执行,然后转去执行ENDIF后后面的语句。面的语句。2023年12月18日第19页YN条件成立?语句行序列1语句行序列2列2ENDIF后面的语句图7.5 选择分支语句的执行过程2023年12月18日第20页l7.3.3 多分支结构多分支结构l在处理多分支的问题时,虽然可以用分支在处理多分支的问题时,虽然可以用分支语句嵌套的
18、办法来解决,但是编写程序时语句嵌套的办法来解决,但是编写程序时容易出错。而结构分支语句各种情况之间容易出错。而结构分支语句各种情况之间的关系是并列的,所以各种分支处于相同的关系是并列的,所以各种分支处于相同的级别,缩进的层次一致,使程序的结构的级别,缩进的层次一致,使程序的结构层次清晰、简明,从而减少了编写程序的层次清晰、简明,从而减少了编写程序的错误,增加了程序的可读性。错误,增加了程序的可读性。2023年12月18日第21页l命令格式:命令格式:l DO CASEl CASEl l CASEl l l CASEl l OTHERWISEl l ENDCASE2023年12月18日第22页l
19、功能:根据功能:根据N个条件表达式的逻辑值,选择执行个条件表达式的逻辑值,选择执行N+1个语句行序列中的一个。系统执行个语句行序列中的一个。系统执行DO CASEENDCASE语句时,首先逐个检查每个语句时,首先逐个检查每个CASE项中的条件表达式,只要遇到某个条件表项中的条件表达式,只要遇到某个条件表达式的值为达式的值为.T.时,就去执行这一时,就去执行这一CASE项下的语项下的语句行序列,然后结束整个句行序列,然后结束整个DO CASEENDCASE语句,接着执行语句,接着执行ENDCASE后面的语句。若所有后面的语句。若所有的的CASE项下的条件表达式都为项下的条件表达式都为.F.时,则
20、执行时,则执行OTHERWISE项下的语句行序列,然后去执行项下的语句行序列,然后去执行ENDCASE后面的语句。后面的语句。2023年12月18日第23页7.4 循环结构程序设计循环结构程序设计l循环结构用于执行一些重复性的操作。循环结构用于执行一些重复性的操作。Visual FoxPro 6.0提供了提供了3种基本类型的循种基本类型的循环:环:SCANENDSCAN,FORENDFOR和和DO WHILEENDDO,有两个命令可以改变循环体内语句的执行有两个命令可以改变循环体内语句的执行顺序,即顺序,即EXIT(退出循环体命令)和(退出循环体命令)和LOOP(重新开始循环体命令)。(重新开
21、始循环体命令)。2023年12月18日第24页l7.4.1 条件循环语句条件循环语句 DO WHILE.ENDDOl命令格式:命令格式:DO WHILE循环体循环体l l LOOPl l EXITl l ENDDOl功能:重复判断功能:重复判断的逻辑值,当其值为的逻辑值,当其值为.T.时,时,反复执行反复执行DO WHILE与与ENDDO之间的语句;当其值为之间的语句;当其值为.F.时,退出循环,并执行时,退出循环,并执行ENDDO后面的语句。后面的语句。2023年12月18日第25页l循环语句的执行过程:循环语句的执行过程:l(1)当程序执行到)当程序执行到DO WHILE时,计算条件表达时
22、,计算条件表达式的值。式的值。l(2)若条件表达式的值为)若条件表达式的值为“假假”时,则结束循时,则结束循环,执行环,执行ENDDO后面的语句。后面的语句。l(3)若条件表达式的值为)若条件表达式的值为“真真”时,则执行时,则执行DO WHILE后面的语句。后面的语句。l(4)当遇到)当遇到LOOP或或ENDDO时,返回到时,返回到DO WHILE,重复执行步骤(,重复执行步骤(1)()(3)。)。l(5)当遇到)当遇到EXIT时,则结束循环,转移到时,则结束循环,转移到ENDDO后面的语句去执行。后面的语句去执行。2023年12月18日第26页l7.4.2 计数循环语句计数循环语句 FOR
23、 ENDFORl命令格式:命令格式:FOR=TO STEP l lNEXTl功能:重复执行功能:重复执行FORNEXT之间的之间的N次。其中次。其中N=循环终止值循环终止值-循环起始循环起始值值+12023年12月18日第27页l7.4.3 数据表扫描循环语句数据表扫描循环语句 SCAN ENDSCANlSCAN循环语句用于处理数据表中的记录。针对表中满足循环语句用于处理数据表中的记录。针对表中满足条件的记录执行循环体中的命令序列。条件的记录执行循环体中的命令序列。l命令格式:命令格式:SCAN 范围范围 FOR WHILEl l LOOPl l EXITll ENDSCAN2023年12月1
24、8日第28页l功能:在当前数据表中,针对每个符合指功能:在当前数据表中,针对每个符合指定条件的记录,执行循环体中的程序代码。定条件的记录,执行循环体中的程序代码。在当前表中移动当前记录的指针,直到条在当前表中移动当前记录的指针,直到条件为件为.F.或到文件尾。该命令用于对当前表或到文件尾。该命令用于对当前表的满足条件的每个记录执行一组指定的操的满足条件的每个记录执行一组指定的操作,当记录指针从头到尾移动通过整个表作,当记录指针从头到尾移动通过整个表时,时,SCAN循环将记录指针指向每个满足的循环将记录指针指向每个满足的记录执行一遍记录执行一遍SCAN与与ENDSCAN 之间的之间的命令。命令。
25、2023年12月18日第29页l(1)范围范围的默认值是的默认值是ALL。取值:。取值:ALL,NEXT nRecords,RECORD nRecordNumber,REST。l(2)FOR用来指定只有符合条件的记录用来指定只有符合条件的记录才进入循环体。才进入循环体。l(3)WHILE用来指定终止循环的条件。用来指定终止循环的条件。l(4)当遇到)当遇到LOOP时,返回到时,返回到SCAN进行条件的进行条件的判断。判断。l(5)当遇到)当遇到EXIT时,则结束循环,执行时,则结束循环,执行ENDSCAN后面的语句。后面的语句。2023年12月18日第30页7.5 多重循环多重循环l如果在一个
26、循环程序的循环体内又包含着另一些循环,就构成多重循如果在一个循环程序的循环体内又包含着另一些循环,就构成多重循环,或称循环嵌套。循环嵌套的层次不限。环,或称循环嵌套。循环嵌套的层次不限。l下面是循环嵌套的一般结构示意图:下面是循环嵌套的一般结构示意图:l 循环头循环头1l l 循环头循环头2l l l 循环头循环头Nl l 循环结束循环结束Nl l 循环结束循环结束2l循环结束循环结束12023年12月18日第31页7.6 多模块程序设计多模块程序设计l1子程序子程序l2过程、函数与方法过程、函数与方法l7.6.1 过程及其过程调用过程及其过程调用l1过程及过程调用过程及过程调用lVisual
27、 FoxPro 6.0中,一个过程就是一个程序,它的建中,一个过程就是一个程序,它的建立、运行与主程序相同,并以同样的文件格式(立、运行与主程序相同,并以同样的文件格式(.PRG文文件)存放在磁盘上。但是,一个过程中至少要有一条返回件)存放在磁盘上。但是,一个过程中至少要有一条返回语句。语句。l命令格式:命令格式:RETURNTO MASTERl功能:结束过程运行,返回调用它的程序或最高一级主程功能:结束过程运行,返回调用它的程序或最高一级主程序中。序中。2023年12月18日第32页子程序或过程调用及返回示意图子程序或过程调用及返回示意图 2023年12月18日第33页l2过程文件中的过程调
28、用过程文件中的过程调用l过程定义的语法格式如下:过程定义的语法格式如下:lPROCEDURE|FUNCTIONllRETURNlENDPROC|ENDFUNC2023年12月18日第34页l3带参数的过程调用带参数的过程调用lPARAMETERS,形参变量形参变量2,l调用带参数的过程的语句格式如下。调用带参数的过程的语句格式如下。l(1)格式)格式1l DO WITH,l(2)格式)格式2l|(,)2023年12月18日第35页l4按值传递和按地址传递按值传递和按地址传递l命令的格式如下:命令的格式如下:lSET UDFPARMS TO VALUE|REFERENCEl7.6.2 用户自定义
29、函数用户自定义函数l7.6.3 自定义方法自定义方法l1用户自定义方法的建立和使用用户自定义方法的建立和使用l2参数的传递参数的传递2023年12月18日第36页l7.6.4 变量作用域变量作用域l1局部变量局部变量l命令格式:命令格式:LOCAL l2全局变量(公共变量)全局变量(公共变量)l全局变量必须使用全局变量必须使用PUBLIC关键字来说明,关键字来说明,可使用该关键字来定义局部内部变量和数可使用该关键字来定义局部内部变量和数组。全局变量在所有数组中都有效。组。全局变量在所有数组中都有效。l3私有变量私有变量2023年12月18日第37页7.7 程序的调试程序的调试l程序调试是指在发
30、现程序有错误的情况下,确定程序调试是指在发现程序有错误的情况下,确定出错的位置并纠正错误,其中关键是要确定出错出错的位置并纠正错误,其中关键是要确定出错的位置。的位置。l7.7.1 调试器环境调试器环境l调用调试器的方法一般有两种:调用调试器的方法一般有两种:l(1)选择菜单:)选择菜单:“工具工具/调试器调试器”。l(2)在命令窗口输入命令:)在命令窗口输入命令:DEBUG。l系统打开系统打开“调试器调试器“窗口,如图窗口,如图7-14所示,进入所示,进入调试器环境。调试器环境。2023年12月18日第38页图7-14 VFP调试器窗口2023年12月18日第39页l1跟踪窗口跟踪窗口l2局部窗口局部窗口l3监视窗口监视窗口l4调用堆校窗口调用堆校窗口l5调试输出窗口调试输出窗口l7.7.2 设置断点设置断点l7.7.3 调试菜单调试菜单