Presentation is loading. Please wait.

Presentation is loading. Please wait.

第六章 Visual Foxpro 基 础 2007.3 荆楚理工学院.

Similar presentations


Presentation on theme: "第六章 Visual Foxpro 基 础 2007.3 荆楚理工学院."— Presentation transcript:

1 第六章 Visual Foxpro 基 础 2007.3 荆楚理工学院

2 3.正确理解主索引、候选索引、惟一索引、普通索引的概念,能准确为表选定索引。
第六章 目的与要求: 1.能熟练地建立项目、数据库、表。 2.能正确确定表中各字段的类型、宽度。 3.正确理解主索引、候选索引、惟一索引、普通索引的概念,能准确为表选定索引。 2007.3 荆楚理工学院

3 准备: 第六章 1.添加工具栏 添加”数据库设计器”:“显示”菜单“工具栏…”命令 2.修改默认目录
即确定工作目录:“工具”菜单”选项…”命令 “文件位置”标签修改“默认目录”,单击“设置为默认目录”按钮单击“确定”按钮。 目的是:便于今后保存数据。 3.使用系统设置 “工具”菜单”选项…”命令 “区域”标签,选中“使用系统设置”复选框。在“货币和数字”栏,将货币符号修改为¥。 2007.3 荆楚理工学院

4 6.1 项目管理器 6.1 项目管理器 项目管理器是Visual FoxPro(简称VFP)应用程序开发过程中所有对象与数据的“控制中心(Control Center)”,它可以集成管理所有与开发的应用程序有关的各类型文件,把应用程序的多个文件组成一个文件,或者组成为.APP应用程序文件或.EXE可执行文件。 2007.3 荆楚理工学院

5 6.1 项目管理器 6.1.1 创建项目管理器 方法一:利用菜单创建 “文件”菜单“新建…”命令“文件类型”单选“项目”后,单击“新建文件”或“向导”大按钮。… 将新建的项目保存在默认目录中。 方法二:利用命令创建 CREATE PROJECT < 项目名|?> 项目是一个表,记录了创建一个应用程序所需要的所有文件以及文件间的所有关系、引用和连接。每一个项目都有一个以.PJX为扩展名及一个以.PJT为扩展名的文件。 2007.3 荆楚理工学院

6 6.1 项目管理器 项目管理器的构成及功能 2007.3 荆楚理工学院

7 6.1 项目管理器 操作项目管理器 项目管理器简化了建立和修改文件的过程,在相应的选项中选定要建立或修改的文件类型之后,只需单击“新建”或“修改”按钮即可达到操作的目的,同时VFP激活相应的设计工具。 通常情况下,项目管理器可以以分离窗口的形式出现,可以通过单击窗口右上角的箭头将其进行折叠,以节省屏幕空间。在折叠视图下将只显示标签,并且右上角的箭头变成下箭头。折叠项目管理器后,可以根据需要,在工作区中重新安排各标签。 2007.3 荆楚理工学院

8 6.1.4 用项目管理器构造应用程序 构造一个应用程序的步骤: 设置起始点 安装应用程序环境 显示初始界面 控制事件循环 恢复原始环境
6.1 项目管理器 用项目管理器构造应用程序 构造一个应用程序的步骤: 设置起始点 安装应用程序环境 显示初始界面 控制事件循环 恢复原始环境 应用程序都应该有一个主文件作为其执行的起始点,它可以是包含在一个项目中的任何程序、表单或查询文件。选择“项目” “设置主文件”来建立应用程序的起始点。在项目中,只有一个文件能设置成为主文件。 在安装应用程序环境时应注意:在安装源程序中,应先将初始环境存储起来,然后启动一个应用程序特定的环境,包括初始化变量、建立默认路径、引用外部库(External Library)和过程(Procedure)文件等。 一旦安装环境并且已经显示初始界面,就应该准备建立一个事件循环去等待用户交互。控制事件循环的方法是:发出READ EVENTS命令启动处理事件;发出CLEAR EVENTS命令去停止处理事件。 初始用户界面可以是一个开始屏幕、菜单栏、表单或者任何其他组件。可以在主程序中通过使用DO命令去运行一个菜单,或者通过DO FORM命令去运行一个表单,或者通过设置一个表单为主程序来初始化用户界面。 2007.3 荆楚理工学院

9 6.1 项目管理器 添加文件到一个项目 在建立了应用程序的框架后,就可以准备将其他文件添加到项目中,并将它们的功能并入应用程序。添加文件到项目中的一个好方法是去连编此项目。 连编项目的具体步骤如下: ① 测试项目。 ② 将项目连编为一个应用程序文件。 2007.3 荆楚理工学院

10 6.1 项目管理器 生成应用程序 要从应用程序创建一个最终的文件,需要把它连编为一个应用程序文件,该文件带有.APP的扩展名.若要运行该应用程序文件,需要首先启动VFP,然后才能载如.APP文件。 连编一个应用程序的步骤: ①在项目管理器中单击[连编]按钮. ②在弹出的对话框[操作]选项组中选中[连编应用程序]或[连编可执行程序]选项. ③在选项组中选择其他复选框并单击[确定] 此外还可以在命令窗口使用BUILD APP或BUILD EXE命令来创建应用程序.如:项目为XSGLXT.PJX连编成应用程序MYAPP.APP,则在窗口中输入命令: BUILUD APP MYAPP FROM XSGLXT BUILD EXE MYEXE FROM XSGLXT 2007.3 荆楚理工学院

11 在项目管理器中可以通过[新建]功能创建数据库,表,视图,查询,连接,存储过程,表单,报表等项目所需要的对象.
6.1 项目管理器 6.1.7 利用项目管理器设计数据库和表 在项目管理器中可以通过[新建]功能创建数据库,表,视图,查询,连接,存储过程,表单,报表等项目所需要的对象. 1.在项目中创建数据库 “项目”菜单“数据库”命令“新建”单选后,确定新建数据库的名称和路径.单击[保存]按钮,VFP系统就会自动打开”数据库设计器”工具栏,在工具栏中有”新建表”,”添加表”,”移去表”,”新建远程视图”,”新建本地视图”,”修改表”,”浏览表”,”编辑存储过程”和”连接”等功能. 2.在项目中设计表 表分为自由表和数据表两类,自由表就是不在数据库中的表,不受数据库的约束,可以自由打开, 数据表是添加在数据库中的表,要打开此表先要打开数据库.创建方法: 项目”菜单“数据库” “数据”命令“新建”,弹出表设计器,图如下 2007.3 荆楚理工学院

12 6.1 项目管理器 6.1.7 利用项目管理器设计数据库和表 2007.3 荆楚理工学院

13 6.1 项目管理器 6.1.7 利用项目管理器设计数据库和表   在表设计器中输入表的字段名,字段类型,宽度,小数位等,选择字段的有效性,显示方式及字段有效性默认值,输入完成后按[是]进入数据录入状态,如录入数据到表. 2007.3 荆楚理工学院

14 6.2 关于建立表及表结构的基本处理命令 6.2.1 显示表结构的命令 格式:DISPLAY STRUCTURE [IN NWORKAREA|CTABLEALIAS[TO PRINTER[PROMPT]|TO FILE FILENAME][NOCONSOLE] 功能:显示当前表结构的有关信息.包括表文件名,记录个数,最后一次修改日期,各字段的字段号,字段名,类型,宽度和小数位,一条记录的字节总数. 参数描述: 2007.3 荆楚理工学院

15 6.2 关于建立表及表结构的基本处理命令 6.2.1 显示表结构的命令 IN NWORKAREA|CTABLEALIAS字句表示在除当前工作区以外的其他工作区显示表的结构, NWORKAREA指定显示NWORKAREA所确定的工作区中打开的表的结构; CTABLEALIAS指定显示以CTABLEALIAS为别名的表的结构. TO PRINTER字句表示将操作结果送到打印机. TO FILE FLIENAME字句表示将操作结果输出到FILENAME指定的磁盘文件中. NOCONSOLE字句表示不将表结构显示到VFP的主窗口,而输出到指定的其他地方. 2007.3 荆楚理工学院

16 格式:CREATE [FILENAME|?] 功能:创建一个新的VFP表结构. 参数描述:
6.2 关于建立表及表结构的基本处理命令 6.2.2 建立”表”命令 1.建立表结构命令 格式:CREATE [FILENAME|?] 功能:创建一个新的VFP表结构. 参数描述: FILENAME|?其中”FILENAME”为新建表的表名,”?”表示要打开创建对话框,”|”表示从前两个参数中任选一个. 2007.3 荆楚理工学院

17 格式:COPY STRUCTURE TO <TABLENAME>[FILEDS<FILEDLIST>]
6.2 关于建立表及表结构的基本处理命令 6.2.2 建立”表”命令 2.建立表结构的其他方法 (1)复制表结构 格式:COPY STRUCTURE TO <TABLENAME>[FILEDS<FILEDLIST>] 功能:将当前打开的表文件结构的部分或全部复制为<TABLENAME>所指定一个表结构. 2007.3 荆楚理工学院

18 功能:将当前表的结构复制生成一个特殊的表文件,即表结构文件 参数描述:
6.2 关于建立表及表结构的基本处理命令 6.2.2 建立”表”命令 (2)生成表结构文件 格式:COPY STRUCTURE EXTENDED TO <FILENAME>[DATABASE<DATABASENAME>[NAME<LONGTABLENAME]][FILEDS<FILEDLIST> 功能:将当前表的结构复制生成一个特殊的表文件,即表结构文件 参数描述: 2007.3 荆楚理工学院

19 DATABASE<DATABASENAME>指定一个数据库文件名,将新创建的表结构文件添加到该数据库中.
6.2 关于建立表及表结构的基本处理命令 6.2.2 建立”表”命令 DATABASE<DATABASENAME>指定一个数据库文件名,将新创建的表结构文件添加到该数据库中. NAME<LONGTABLENAME>为创建的新表文件添加到数据库中时指定一个长文件名,最长可到128个字符. FILEDS<FILEDLIST>指定当前表结构中哪些字段作为表结构文件的字段.如果省略该字句,当前表中的字段都将加入到新表结构文件. 2007.3 荆楚理工学院

20 格式:CREATE<FILENAME>FROM <TABLESTRUCTUREFILENAME>
6.2 关于建立表及表结构的基本处理命令 6.2.2 建立”表”命令 (3)将表结构文件还原成表结构 格式:CREATE<FILENAME>FROM <TABLESTRUCTUREFILENAME> 功能:将表结构文件还原成为普通文件.新建的表文件是个没有记录的表结构框架. 2007.3 荆楚理工学院

21 此命令是一条全屏操作命令,可以删除字段,插入新字段,修改字段名,宽度,类型和小数点
6.2 关于建立表及表结构的基本处理命令 6.2.3 修改”表”结构 格式:MODIFY STRUCTURE 功能:打开表设计器,修改当前表文件的结构. 此命令是一条全屏操作命令,可以删除字段,插入新字段,修改字段名,宽度,类型和小数点 2007.3 荆楚理工学院

22 6.3.1 常量 VFP支持多种类型的常量. 1.数值常量:数值(N)和浮点数(F).
6.3 常量,变量,表达式 6.3.1 常量 VFP支持多种类型的常量. 1.数值常量:数值(N)和浮点数(F). 2.字符常量(字符串):包括可打印的ASCII字符以及空格,还包括所有的汉字和各种符号. 3.日期常量:以月/日/年形式出现或YY.MM.DD如{04/28/96}或{^2001/01/03}. 4.逻辑常量:只有两个值,即逻辑”真”和逻辑”假”,用.T.,.Y.和.F.,.N.表示. 5.货币常量 2007.3 荆楚理工学院

23 6.3.2 变量 1.内存变量:打开VFP系统后自定义的变量,可以被重新赋值但不允许重新定义或改变数据类型
6.3 常量,变量,表达式 6.3.2 变量 1.内存变量:打开VFP系统后自定义的变量,可以被重新赋值但不允许重新定义或改变数据类型 2.字段变量:打开表时自动建立的,字段变量的变量名即为表字段名. 3.数组 (1)数组定义 格式:DIMENSION<ARRAYNAME(NROWS1)[,NCOLUMNS1])>[,<ARRAYNME2(NROWS2[,NCOLUMNS2])>]… 功能:定义一个或多个一维或二维数组. 2007.3 荆楚理工学院

24 6.3.2 变量 (2)数组赋值命令 格式:STORE<EEXPRSSION>TO<ARRAYNAMELIST>
6.3 常量,变量,表达式 6.3.2 变量 (2)数组赋值命令 格式:STORE<EEXPRSSION>TO<ARRAYNAMELIST> 格式2:<ARRAYNAME>=<EEXPRSSION> 功能:将表达式的值赋给数组或数组元素. (3)数组与表的字段之间的相互数据传递 格式:SCATTER[FILEDS<FILEDNAMELIST>|FILEDS LIKE<SKELETON>|FILEDS EXCEPT<SKELETON>][MEMO] TO <ARRAYNAME>|TO<ARRAYNAME>BLANK|MEMVAR|NAME<OBJIECTNAME> 功能:将单条记录数据赋值给数组元素. 2007.3 荆楚理工学院

25 6.3.2 变量 4.内存变量的基本操作 (1)内存变量的赋值操作
6.3 常量,变量,表达式 6.3.2 变量 4.内存变量的基本操作 (1)内存变量的赋值操作 格式:STORE<表达式>TO <VARNAMELIST>|<ARRAYNAMELIST> 功能:将表达式的值赋给一个变量或多个变量. (2)显示内存变量 格式1:LIST MEMORY[LIKE<FILESKELETON>][TO PRINTER[PROMPT]/TO FILE<FILENAME>][NOCONSOLE] 格式2:DISPLAY MEMORY[LIKE<FILESKELETON>][TO PRINTER[PROMPT]/TO FILE<FILENAME>][NOCONSOLE] 功能:显示当前内存中定义的自定义内存变量和系统内存变量有关信息.但都不显示字段变量. 2007.3 荆楚理工学院

26 6.3 常量,变量,表达式 6.3.2 变量 (3)保存变量 格式:SAVE TO <FIELNAME>|MEMO<MEMOFIELDNAME>[ALL LIKE <SKELETON>|ALL EXCEPT<SKELETON> 功能:将内存变量以文件形式存入磁盘,文件名由<FIELNAME>指定. (4)删除内存变量 格式1:RELEASE<MEMVARLIST> 功能:删除指定的内存变量 格式2:CLEAR MEMORY 功能:删除当前内存的所有内存变量. 2007.3 荆楚理工学院

27 6.3.3 表达式与运算符 1.表达式的概念:由运算符和括号将常量,变量和函数连接起来的有意义的式子称为表达式. 显示表达式:
6.3 常量,变量,表达式 6.3.3 表达式与运算符 1.表达式的概念:由运算符和括号将常量,变量和函数连接起来的有意义的式子称为表达式. 显示表达式: 格式1:?<EEXPRESSIONLIST> 格式2:??>EEXPRESSIONLIST> 功能:计算表达式的值,将结构显示在屏幕上,?从下一行的开始端开始显示表达式的值,??则从光标当前所在的位置开始显示表达式值. 2.运算符:是对数据对象进行操作运算的符号.VFP运算符分五类:算术运算符,关系运算符,逻辑运算符,字符串运算符,日期运算符 2007.3 荆楚理工学院

28 6.4 常用函数 6.4 常用函数 FoxPro为用户提供了700多条命令、函数和内存变量,极大地提高了它的性能。本节仅讨论数值计算类,字符处理类,时间类,数据库类等四类常用函数的格式和功能。 在讨论中使用了下列通用表达式: <expN>-代表数值表达式, <expC>-代表字符表达式, <expL>-代表逻辑表达式, <expD>-代表日期表达式, <expr>-代表一般表达式。 2007.3 荆楚理工学院

29 6.4 常用函数 数值计算类函数 一、三角函数与反三角函数 1.ACOS(<expN>) 该函数按指定的<expN>值(余弦值),返回相应的角度值(单位:弧度)。表达式<expN>的有效范围是[-1,1],函数返回值的范围是[0,π]。 2.ASIN(<expN>) 该函数按指定的<expN>值(正弦值),返回相应的角度(单位:弧度)。表达式<expN>的有效范围是[-1,1],函数返回值的范围是[-π/2,π/2]。 2007.3 荆楚理工学院

30 6.4 常用函数 数值计算类函数 3.ATAN(<expN>) 该函数按给定指定<expN>值(正切值),返回相应的角度(单位:弧度)。表达式<expN>的有效范围是整个实数集,但函数返回值的范围是[-π/2,π/2]。 4.ATN2(<expN1>,<expN2>) 该函数按给定正弦值<expN1>和余弦值<expN2>返回相应的反正切值(单位:弧度)。小数位与ACOS()相同。 2007.3 荆楚理工学院

31 6.4 常用函数 数值计算类函数 5.COS(<expN>) 该函数按指定<expN>值,计算相应的余弦值。表达式<expN>的有效范围是整个实数集,单位为弧度,函数的返回值的范围是[-1,1]。 6.SIN(<expN>) 该函数返回指定表达式<expN>的正弦值。表达式<expN>值的有效范围是实数集,单位为弧度,函数的取值范围是[-1,1]。 7.TAN(<expN>) 该函数返回指定表达式<expN>的正切值。 2007.3 荆楚理工学院

32 6.4 常用函数 数值计算类函数 二、金融函数 8.FV(<expN1>,<expN2>,<expN3>) 该函数返回每期投资额<expN1>,期利率<expN2>,连续投资<expN3>期后,本利和的未来值,使用时要注意时间单位的一致性。 9.PAYMENT(<expN1>,<expN2>,<expN3>) 该函数计算贷款额为<expN1>,期利率为<expN2>,分<expN3>期等额归还全部本利和,则每期应付和款额。 10.PV(<expN1>,<expN2>,<expN3>) 该函数返回每期投资额为<expN1>,期利率为<expN2>,连续投资<expN3>后,本利和的现值。 2007.3 荆楚理工学院

33 6.4 常用函数 数值计算类函数 三、转换函数 11.DTOR(<expN>) 该函数将指定的角度值<expN>转换成相应的弧度值。 12.RTOD(<expN>) 该函数将指定的弧度值<expN>转换成相应的角度值。 13. VAL(<expC>) 该函数将指定的由数字组成的字符表达式<expC>转换成数值。该函数在表达式<expC>中从左到右处理数字,直到遇到第一个非数字字符而终止。 2007.3 荆楚理工学院

34 6.4 常用函数 数值计算类函数 四、其他数值函数 14.CEILING(<expN>) 该函数返回大于或等于指定数值表达式<expN>值的最小整数。 15.EVALUATE(<expC>) 该函数计算指定字符表达式<expC>的值,表达式<expC>的值可以是字符型、数值型、日期型、逻辑型或备注型,而表达式<expC>本身可以是一个字符串、一个合法的FoxPro表达式、内存变量、数组元素或其他类型的字段。 16.ROUND(<expN1>,<expN2>) 该函数返回指定表达式<expN1>按<expN2>位小数四舍五入后的数值。 2007.3 荆楚理工学院

35 6.4 常用函数 字符处理类函数 一、字符寻找函数 17.AT(<expC1>,<expC2>[,<expN>]) 该函数返回表达式<expC1>在表达式<expC2>中第<expN>次出现的起始位置,如果找不到,函数返回数值0。表达式<expN>的缺省值为1,函数对字符的大小写敏感。 18.ATC(<expC1>,<expC2>[,<expN>]) 该函数的功能与AT()相似,但它对表达式中字母的大小不敏感。 19.LIKE(<expC1>,<expC2>) 若表达式<expC1>与表达式<expC2>匹配,该函数返回真值,否则返回假值。表达式<expC1>中允许存在通配符“*”或“?”。 2007.3 荆楚理工学院

36 6.4 常用函数 字符处理类函数 二、字符截取函数 20.ALLTRIM(<expC>) 该函数返回删除表达式<expC>的前后空格后的字符。 21.LEFT(<expC>,<expN>) 该函数返回<expC>最左边<expN>个字符串。 22.RIGHT(<expC>,<expN>) 该函数返回表达式<expC>的右边<expN>个字符串。 23.SUBSTR(<expC>,<expN1>[,<expN2>]) 该函数从表达式<expC>的第<expN1>个字符开始,返回<expN2>个字符。<expN1>的缺省值为1,<expN2>的缺省值为全部字符数。其中<expC>可以是表达式或备注字段。 2007.3 荆楚理工学院

37 6.4 常用函数 字符处理类函数 三、字符替代类函数 24.CHRTRAN(<expC1>,<expC2>,<expC3>) 该函数将表达式<expC1>中与表达式<expC2>中相匹配的字符用表达式<expC3>中相应的字符去替代。若<expC3>的字符数比<expC2>的多,多余的字符被忽略;若<expC3>中的字符比<expC2>的少,则<expC2>中的多余字符被替代成空格。 2007.3 荆楚理工学院

38 6.4.2 字符处理类函数 25.PADL(<expr>,<expN>[,<expC>])
6.4 常用函数 字符处理类函数 25.PADL(<expr>,<expN>[,<expC>]) 26.PADR(<expr>,<expN>[,<expC>]) 27.PADC(<expr>,<expN>[,<expC>]) 函数PADL()、PADR()和PADC()分别在表达式<expr>的左边、右边或两边填充字符<expC>,并使填充后的字符串长度为<expN>。 28.STR(<expN1>[,<expN2>[,<expN3>]]) 该函数从表达式<expN1>中返回<expN2>个字符(小数点计算在内),其中<expN3>规定返回的字符串中的小数位数。如果<expN2>值小于表达式<expN1>小数点左边位数,则函数返回一串空号,表示数值溢出。 2007.3 荆楚理工学院

39 6.4 常用函数 字符处理类函数 29.STRTRAN(<expC1>,<expC2>[,<expC3>][,<expN1>][,<expN2>]) 该函数在表达式<expC1>中找到表达式<expC2>,就用表达式<expC3>代替表达式<expC1>中相应字符。其中,表达式<expN1>指定用表达式<expC3>替代表达式<expC1>的起始位置,即第<expN1>次出现<expC2>的位置开始替代,缺省值为1。<expN2>指出替代的次数,缺省值为全部字符数。若找不到,则不替换。 2007.3 荆楚理工学院

40 6.4 常用函数 时间类函数 一、日期(年、月、日)函数 30.CMONTH(<expD>) 该函数返回给定日期表达式<expD>值的月份。 31.CTOD(<expC>) 该函数根据字符表达式<expC>,返回相应的日期表达式。表达式<expC>的缺省格式为mm/dd/yy。 32.DATE() 该函数返回当前的系统日期,这一日期由操作系统自行决定。但是,命令SET CENTURY和SET DATE以及SET MARK TO都可改变返回的字符串格式。 2007.3 荆楚理工学院

41 6.4 常用函数 时间类函数 33.DAY(<expD>) 返回给定日期表达式<expD>指定月份的数值型日期,取值范围为1-31。 34.MONTH(<expD>) 该函数返回给定日期表达式<expD>的月份值(数值型)。 35.YEAR(<expD>) 该函数返回给定日期表达式<expD>的年份。 36.DTOC(<expD>[,1]) 该函数根据给定日期表达式<expD>值返回字符型日期,参数[1]表示按索引格式返回。 37.DTOS(<expD>[,1]) 该函数根据给定日期表达式<expD>值返回yyyy mm dd格式的字符串日期。 2007.3 荆楚理工学院

42 6.4 常用函数 时间类函数 二、星期和时间函数 38.CDOW(<expD>) 该函数根据日期表达式<expD>的值返回相应的星期几。 39.DOW(<expD>) 该函数根据日期表达式<expD>的值返回相应的星期几。 40.SECONDS() 该函数返回从0时开始,到现在已经走过的秒数,它的数值精确到毫秒。 41.TIME([<expN>]) 该函数返回当前系统时间,并按hh:mm:ss形式表示。若带有参数<expN>,则精确到1/18秒,表达式<expN>可取任意值。 2007.3 荆楚理工学院

43 6.4 常用函数 数据库类函数 一、关于数据库文件的函数 42.ALIAS([<expN>|<expC>]) 该函数返回当前工作区(不带参数)或指定工作区<expN>|<expC>的别名,若工作区中没有打开的数据库文件,则函数返回空串。 43.DBF([<expN>|<expC>]) 该函数返回当前工作区或指定工作区<expN>|<expC>中数据库的名称。若工作区中不存在打开的数据库,函数返回空串。 2007.3 荆楚理工学院

44 6.4 常用函数 数据库类函数 44.SELECT([0|1]) 该函数以数值型返回当前工作区号(若使用参数0)或当前可用的最大的工作区号(若使用参数1)。 45.UNIQUE() 如果指定的索引由UNIQUE关键字或命令SET UNIQUE ON一起产生,则函数返回逻辑真,否则返回逻辑假。 46.USED([<expN>|<文件别名>]) 该函数测试当前工作区(或特指工作区)中是否打开了数据文件,是则返回.T.,否则返回.F.。 2007.3 荆楚理工学院

45 6.4 常用函数 数据库类函数 二、关于索引文件的函数 47.NDX(<expN>)[,<工作区号>|<工作区号>|<文件别名>) 该函数返回当前工作区(或特指工作区)数据文件的某个单项索引(.IDX索引)的索引文件名。每个数据文件最多可同时打开多个单项索引文件,函数根据<expN>的值返回与打开次序相应的单项索引文件的文件名。如果<expN>的值大于打开的单项索引文件的个数,函数返回一个空串。 2007.3 荆楚理工学院

46 6.4.4 数据库类函数 48.CDX(<expN>[,<工作区号>|<文件别名>])
6.4 常用函数 数据库类函数 48.CDX(<expN>[,<工作区号>|<文件别名>]) 49.MDX(<expN>[,<工作区号>|<文件别名>]) CDX函数根据<expN>的值返回当前工作区(或特指工作区)相应的组合索引文件的文件名。如果该数据文件存在结构组合索引,则<expN>的值为1时,返回结构组合索引文件名;其值为2时,返回第一个独立组合索引文件名……。否则,“l”对应于第一个独立组合索引文件,“2”对应于第二个独立组合索引,依次类推。 MDX函数和CDX函数等价。 2007.3 荆楚理工学院

47 6.4 常用函数 数据库类函数 50.ORDER([<工作区号>|<文件别名>[,<expN>]]) 在打开一个数据文件时可以同时打开对该数据文件所建立各种类形的多个索引文件,其排序规则已如上述。在打开单项索引文件后,数据文件的显示(或处理)的次序由第一个单项索引文件的索引表达式所决定,否则数据文件按物理次序进行处理。通过SET ORDER命令可以改变索引控制文件(或索引控制标记),使该数据文件的显示(或处理)的次序由另一个单项索引文件的索引表达式控制,或是由某一个组合索引的某个索引标记的索引表达式控制。我们称这个单项索引文件为索引控制文件(称组合索引标记为索引控制标记)。 2007.3 荆楚理工学院

48 6.4 常用函数 数据库类函数 三、关于记录的函数 51.BOF([<expN>|<expC>]) 若当前工作区或指定工作区<expN>|<expC>中数据库记录指针已反向移过第一条记录,函数返回真值,否则返回假值。 52.DELETED([<expN>|<expC>]) 该函数返回当前记录的逻辑删除状况,若该记录带有删除标记,则返回逻辑真,否则返回逻辑假。 53.EOF([<expN>|<expC>]) 若当前工作区或指定工作区<expN>|<expC>中数据库记录指针已越过最后一条记录,则返回逻辑真,否则返回逻辑假。 2007.3 荆楚理工学院

49 6.4 常用函数 数据库类函数 四、关于字段的函数 54.FCOUNT([<expN>|<expC>]) 该函数返回当前或指定工作区<expN>|<expC>中数据库的字段数。 55.FIELD(<expN1>[,<expN2>|<expC>]) 该函数返回当前或指定工作区<expN2>|<expC>中数据库的指定字段号<expN1>的字段名称。若表达式<expN1>值为1,返回该数据库的第一个字段名称,余类推。 2007.3 荆楚理工学院

50 6.5.1 打开或选择数据表命令 1.打开表文件命令 格式:USE[[DATABASENAME!]<TABLE>
6.5 对表操作的基本命令 打开或选择数据表命令 1.打开表文件命令 格式:USE[[DATABASENAME!]<TABLE> |<SQLVIEWNAME>?][IN<NWORKAREA> <CTABLEALIAS>][AGAIN][ALIAS <CTABLEALIAS>][EXCLUSIVE][SHARED] [NOUPADTAE] 功能:在指定的工作区打开指定的表文件, 并为该表起个别名. 2007.3 荆楚理工学院

51 6.5.1 打开或选择数据表命令 2.选择工作区 格式:SELECT<NWORKAREA|CTABLEALIAS>|0
6.5 对表操作的基本命令 打开或选择数据表命令 2.选择工作区 格式:SELECT<NWORKAREA|CTABLEALIAS>|0 功能:选择一个工作区为当前工作区. 3.关闭多表文件 格式1:CLOSE DATABASE 功能:关闭当前打开的数据库和所有打开的表文件 格式2:CLOSE TABLE 格式3:CLOSE ALL 2007.3 荆楚理工学院

52 2.打开索引命令USE 或SET INDEX TO 3.设置主索引命令SET ORDER TO 4.索引文件的重建或更新REINDEX
6.5 对表操作的基本命令 索引排序命令 1.建立索引命令INDEX ON 2.打开索引命令USE 或SET INDEX TO 3.设置主索引命令SET ORDER TO 4.索引文件的重建或更新REINDEX 2007.3 荆楚理工学院

53 1.记录指针绝对定位GO/GO TO[RECORD] 2.记录指针相对定位SKIP 3. 直接查询定位LOCATE 4.快速查询命令SEEK
6.5 对表操作的基本命令 移动指针与查询命令 1.记录指针绝对定位GO/GO TO[RECORD] 2.记录指针相对定位SKIP 3. 直接查询定位LOCATE 4.快速查询命令SEEK 5.对话查询GETEXPR 2007.3 荆楚理工学院

54 6.5.4 数据统计 1. 求记录个数的命令COUNT 2.求和命令SUM 3. 求平均值命令AVERAGE 6.5 对表操作的基本命令
数据统计 1. 求记录个数的命令COUNT 2.求和命令SUM 3. 求平均值命令AVERAGE 2007.3 荆楚理工学院

55 6.6 Visual FoxPro程序设计语句 目的与要求: 1.掌握程序文件的建立与修改的方法。 2.掌握常用的VFP命令。
3.掌握顺序结构程序设计方法。 4.掌握选择结构程序设计方法。 5.掌握循环结构程序设计方法。 6.理解数组的概念、定义和使用方法。 7.理解子程序,掌握过程的使用方法。 学时分配: 共16学时(含实验8学时)。 2007.3 荆楚理工学院

56 6.6 Visual FoxPro程序设计语句 6.6 Visual FoxPro程序设计语句 在Visual FoxPro中,支持两种类型的编程。一种是早期FoxPro和Xbase语言所支持的过程编程方式(Procedural programming),另一种是面向对象的编程方式(Object oriented programming)。 一般来说,对于制作简单的应用程序,使用过程编程方式比较容易,同时,这也是面向对象编程方式的基础。因此本节只介绍过程编程方式。 2007.3 荆楚理工学院

57 6.6 Visual FoxPro程序设计语句 程序文件的建立、运行和修改 Visual FoxPro的程序是由ASCII码组成的文本文件,因此可以用任何文本编辑器或字处理软件来建立,以生成一磁盘文件。 Visual FoxPro程序源文件的扩展名是.PRG,程序在运行时,为了加快执行速度会自动编译,产生主文件名与.PRG相同,扩展名为.FXP的文件,在Visual FoxPro下若修改了.PRG文件,系统也会自动重新编译。 在Visual FoxPro中,建立程序的最简单的方法是用Visual FoxPro本身提供的编辑器。 2007.3 荆楚理工学院

58 6.6.1 程序文件的建立、运行和修改 1.用菜单选择方式建立、运行和修改程序文件 建立或修改程序的步骤为:
6.6 Visual FoxPro程序设计语句 程序文件的建立、运行和修改 1.用菜单选择方式建立、运行和修改程序文件 建立或修改程序的步骤为: ① 从菜单中选择“文件”“新建”,或从主工具条中选择“新建”按钮。 ② 在“新建”对话框中选择“程序”→“新文件”大按钮。 ③ 在打开的“程序1”窗口中输入程序。 ④ 程序输入完后,系统要求先存盘后执行。 ⑤ 程序文件存盘后,按工具条中的“运行”按钮执行正在打开窗口中的程序。 ⑥ 修改文件时,从菜单中选择“文件”“打开”,或者从工具条中选择“打开”按钮。屏幕显示“打开”对话框。 2007.3 荆楚理工学院

59 6.6.1 程序文件的建立、运行和修改 2.用输入命令方式建立、运行和修改程序文件 (1)修改或建立程序命令MODIFY COMMAND
6.6 Visual FoxPro程序设计语句 程序文件的建立、运行和修改 2.用输入命令方式建立、运行和修改程序文件 (1)修改或建立程序命令MODIFY COMMAND 功能:打开一个编辑窗口,从中可以修改或创建程序文件。 语法:MODIFY COMMAND [<程序文件名>|? [NOEDIT][SAME][SAVE] 2007.3 荆楚理工学院

60 6.6.1 程序文件的建立、运行和修改 (2)运行程序命令DO 功能:执行一程序或过程。 语法:DO <程序文件名>
6.6 Visual FoxPro程序设计语句 程序文件的建立、运行和修改 (2)运行程序命令DO 功能:执行一程序或过程。 语法:DO <程序文件名> <程序文件名>:指定要执行的程序的名称。如果执行的程序不包含扩展名,系统就按EXE(可执行版本)、 APP(一个应用程序)、 FXP(已编译的版本)、 PRG(程序)的顺序查找并执行这些版本的程序。 2007.3 荆楚理工学院

61 6.6.1 程序文件的建立、运行和修改 功能:指定默认的驱动器、目录或文件夹。 语法:SET DEFAULT TO [<路径>]
6.6 Visual FoxPro程序设计语句 程序文件的建立、运行和修改 (3)设置当前路径命令SET DEFAULT TO 功能:指定默认的驱动器、目录或文件夹。 语法:SET DEFAULT TO [<路径>] <路径>:指定驱动器、目录或文件夹、子目录或文件夹、使用MS-DOS简化符号(\或..)的上述选项。 2007.3 荆楚理工学院

62 6.6 Visual FoxPro程序设计语句 顺序结构程序设计 1.顺序结构程序设计的概念 所谓顺序现象,是指一个客观事物在其发展过程中,从某一环节开始的诸子环节呈现出按照次序、线性连续的关联特性的现象。 程序设计的顺序,是指在程序设计中,某程序块(或操作块)(即程序中有限个连续的指令或语句)的诸子程序(或子操作块)呈现出按照次序、线性连续的关联特性的现象。 2007.3 荆楚理工学院

63 6.6.2 顺序结构程序设计 2.输出命令 ?|?? 功能:计算一列表达式的值,然后按指定格式输出表达式的值。
6.6 Visual FoxPro程序设计语句 顺序结构程序设计 2.输出命令 ?|?? 功能:计算一列表达式的值,然后按指定格式输出表达式的值。 语法:?|?? [<表达式>][PICTURE <模式符>] [FUNCTION <功能符>][V <显示宽度>] [AT <显示列数>][FONT <字模名>[,<字体大小>]][STYLE <字体风格>] 【例1】输出3个“Visual FoxPro”字符串。 程序如下。 ? “Visual FoxPro” CANCEL 2007.3 荆楚理工学院

64 6.6.2 顺序结构程序设计 3.输出打印命令 ??? 功能:将输出结果直接送到打印机上。 语法:??? [字符表达式]
6.6 Visual FoxPro程序设计语句 顺序结构程序设计 3.输出打印命令 ??? 功能:将输出结果直接送到打印机上。 语法:??? [字符表达式] [字符表达式]:为送往打印机的字符。 2007.3 荆楚理工学院

65 6.6.2 顺序结构程序设计 4.内存变量内部赋值命令STORE|= 功能:建立内存变量,并把一个数据保存到一个或多个内存变量中。
6.6 Visual FoxPro程序设计语句 顺序结构程序设计 4.内存变量内部赋值命令STORE|= 功能:建立内存变量,并把一个数据保存到一个或多个内存变量中。 语法1:STORE <表达式> TO <内存变量表> 语法2:<内存变量>=<表达式> 【例2】已知a=6,b=8,将它们的值互换后输出。 【例3】鸡兔同笼,已知鸡兔总头数为h=16,总脚数为f=40,求鸡兔各有多少只? 2007.3 荆楚理工学院

66 [例2]程序如下: a=6 b=8 t=a a=b b=t ? “a=”,a ? “b=”,b CANCEL
6.6 Visual FoxPro程序设计语句 [例2]程序如下: a=6 b=8 t=a a=b b=t ? “a=”,a ? “b=”,b CANCEL 2007.3 荆楚理工学院

67 [例3]程序如下: h=16 f=40 x=(4*h-f)/2 y=(f-2*h)/2 ? “共有鸡:”,x,”只”
6.6 Visual FoxPro程序设计语句 [例3]程序如下: h=16 f=40 x=(4*h-f)/2 y=(f-2*h)/2 ? “共有鸡:”,x,”只” ? “共有兔:”,y,”只” CANCEL 2007.3 荆楚理工学院

68 6.6.2 顺序结构程序设计 5.任意类型键盘输入命令 INPUT
6.6 Visual FoxPro程序设计语句 顺序结构程序设计 5.任意类型键盘输入命令 INPUT 功能:建立内存变量,并且用键盘输入的方式将数值型、字符型、逻辑型或日期型数据赋值给内存变量。 语法:INPUT [<提示>] TO <内存变量> 【例4】已知球半径r,计算沿直径截面圆的面积、球体体积和球表面积(要求四舍五入保留三位小数)。 2007.3 荆楚理工学院

69 INPUT “请输入球半径r=”TO r &&球的半径为r pi=3.14 &&圆周率为pi s=pi*r^2 &&计算圆面积
6.6 Visual FoxPro程序设计语句 [例4]程序如下: *计算圆面积、球体积、球表面积 INPUT “请输入球半径r=”TO r &&球的半径为r pi= &&圆周率为pi s=pi*r^ &&计算圆面积 f=4*pi*r^ &&计算球表面积 v=4/3*pi*r^ &&计算球体积 s=ROUND(S,3) v=round(v,3) ? “圆面积为:”,s ? “球表面积为:”,f ? “球体积:”,v CANCEL 2007.3 荆楚理工学院

70 6.6.2 顺序结构程序设计 6.字符型键盘输入命令 ACCEPT 功能:建立内存变量,并用键盘输入的方式将字符型数据赋值给内存变量。
6.6 Visual FoxPro程序设计语句 顺序结构程序设计 6.字符型键盘输入命令 ACCEPT 功能:建立内存变量,并用键盘输入的方式将字符型数据赋值给内存变量。 语法:ACCEPT [<提示>] TO <内存变量> 【例5】输入姓名和年龄,并打印出来。 程序如下: ACCEPT “请输入姓名:”TO name INPUT “请输入年龄:”TO age ? ? “姓名:”,name,”年龄:”,age CANCEL 2007.3 荆楚理工学院

71 6.6.2 顺序结构程序设计 7.程序暂停、等待接收单字符命令 WAIT
6.6 Visual FoxPro程序设计语句 顺序结构程序设计 7.程序暂停、等待接收单字符命令 WAIT 功能:显示一条提示并暂停程序运行,直到按下任一键或鼠标按键,程序才继续执行。 语法:WAIT [<提示>] [TO <内存变量>] [WINDOW [AT <行坐标>,<列坐标>]] [NOWAIT] [CLEAR|NOCLEAR] [TIMEOUT <等待秒数>] 【例6】用WAIT命令暂停显示 2007.3 荆楚理工学院

72 6.6.2 顺序结构程序设计 程序如下: ? “1 Visual FoxPro” WAIT ? “2 Visual FoxPro”
顺序结构程序设计 程序如下: ? “1 Visual FoxPro” WAIT ? “2 Visual FoxPro” WAIT WINDOW NOWAIT ?“3 Visual FoxPro” WAIT WINDOW TIMEOUT 3 CANCEL 2007.3 荆楚理工学院

73 语法:=<表达式1>[,<表达式2>...] 两点说明:
6.6 Visual FoxPro程序设计语句 8.计算表达式值命令 = 功能:计算一或多个表达式的值。 语法:=<表达式1>[,<表达式2>...] 两点说明: ① 该命令的作用是计算一个或多个表达式的值,并且不返回其值。常用于需要执行一个Visual FoxPro函数或用户定义函数的功能,但并不需要将该函数的返回值赋给一个内存变量、数组或数组元素的情况下。 ② 作为符号“=”,在逻辑表达式中它被用作比较运算符,在赋值命令中给变量赋值,在这两种情况下,“=”是一种操作符,而不是一个命令。 2007.3 荆楚理工学院

74 9.终止程序运行命令 CANCEL 功能:终止程序的运行。 语法:CANCEL 10.程序注释命令 (1)行首注释命令NOTE|*
6.6 Visual FoxPro程序设计语句 9.终止程序运行命令 CANCEL 功能:终止程序的运行。 语法:CANCEL 10.程序注释命令 (1)行首注释命令NOTE|* 功能:在程序中加注释信息。 语法:NOTE|* [注释] (2)行尾注释命令&& 功能:在命令语句的尾部加注释信息。 语法:&&[注释] 2007.3 荆楚理工学院

75 6.6.2 顺序结构程序设计 11.文本输出命令 TEXT...ENDTEXT
6.6 Visual FoxPro程序设计语句 顺序结构程序设计 11.文本输出命令 TEXT...ENDTEXT 功能:在屏幕上显示TEXT和ENDTEXT之间的所有文本信息。 语法:TEXT <文本信息> ENDTEXT 12.输出文本行信息命令 \|\\ 功能:输出文本行信息 语法1:\ <文本行信息> 语法2:\\ <文本行信息> 2007.3 荆楚理工学院

76 6.6 Visual FoxPro程序设计语句 选择结构程序设计 1.选择结构程序设计的概念 所谓分支现象,是指一个客观事物在其发展过程中在某一环节分支出两个或两个以上相对独立、彼此相异的子环节的现象。 程序(或算法)设计中的分支,是指在程序中从某一程序块分支出两个或两个以上相对独立、彼此相异的子程序块的现象,并称这些子程序块为它们的分支。 选择结构,是一种常用的主要基本结构,一般稍有使用价值的程序都要或多或少地用到这种基本结构。它是计算机科学用以描述客观世界普遍存在的分支现象的重要手段。 按照选择结构执行的路径多少,选择结构分为:双分支选择结构(具有两个分支)和多分支选择结构(具有三个或三个以上分支)。 2007.3 荆楚理工学院

77 6.6.3 选择结构程序设计 2.单条件选择命令 IF 功能:用来进行各种条件判断,使程序中的命令有条件地执行。
6.6 Visual FoxPro程序设计语句 选择结构程序设计 2.单条件选择命令 IF 功能:用来进行各种条件判断,使程序中的命令有条件地执行。 语法: IF <条件> [命令组1] [ELSE [命令组2]] ENDIF 两点说明: ① 单条件双分支选择结构只能在程序中使用。 ② IF、ELSE、ENDIF必须各占一行。IF和ENDIF必须成对出现。 当条件为.T. 当条件为.F.,且else存在 2007.3 荆楚理工学院

78 分析:设行李重量为w公斤,应付运费为p元,则运费公式为
6.6 Visual FoxPro程序设计语句 【例9】铁路托运行李,从甲地到乙地,按规定每客票托运行李不超过50公斤时,每公斤0.25元,如超过50公斤,超过部分按每公斤0.45元计算。编写一个程序,把行李重要输入计算机,让计算机算出运费,并打印出付款清单。 分析:设行李重量为w公斤,应付运费为p元,则运费公式为 写出程序 2007.3 荆楚理工学院

79 [例9]程序如下: *设w为行李重量,p为运费 INPUT “请输入行李重量:”TO w IF w<=50 P=0.25*w ELSE
6.6 Visual FoxPro程序设计语句 6.6 Visual FoxPro程序设计语句 [例9]程序如下: *设w为行李重量,p为运费 INPUT “请输入行李重量:”TO w IF w<=50 P=0.25*w ELSE P=50*0.25+(w-50)*0.45 ENDIF ? “应付运费为:”,p,”元” CANCEL 2007.3 荆楚理工学院

80 6.6.3 选择结构程序设计 【例10】求表达式 的值。 根据所给公式和条件,写出程序。 6.6 Visual FoxPro程序设计语句
选择结构程序设计 【例10】求表达式 的值。 根据所给公式和条件,写出程序。 2007.3 荆楚理工学院

81 [例10]程序如下: 6.6 Visual FoxPro程序设计语句 INPUT “x=”TO x IF x>10 y=x^3
ELSE IF x>=0 y=x^5 y=x^2 ENDIF ? “y=”,y CANCEL 2007.3 荆楚理工学院

82 【例11】已知系数a、b、c,编写程序,求一元二次方程ax2+bx+c=0的根。
6.6 Visual FoxPro程序设计语句 【例11】已知系数a、b、c,编写程序,求一元二次方程ax2+bx+c=0的根。 问题分析:根据一元二次方程的系数a、b、c的取值,有以下几种情况: (1)当a<>0时,有两个根。 当判别式>0时,有两个不同的实根; 当判别式=0时,有两个相同的实根; 当判别式<0时,有两个不同的虚根; (2)当a=0,b<>0时,有一个根。 (3)当a=0,b=0时,方程无意义。 根据上面分析,写出程序。 2007.3 荆楚理工学院

83 INPUT “a=”TO a && 输入二次方程的系数a,b,c INPUT “b=”TO b INPUT “c=”TO c
6.6 Visual FoxPro程序设计语句 [例11]程序如下: INPUT “a=”TO a && 输入二次方程的系数a,b,c INPUT “b=”TO b INPUT “c=”TO c IF a<> && 有两个根 delta=b^2-4*a*c re=-b/(2*a) im=SQRT(ABS(delta))/(2*a) IF delta>= && 有两个实根 root1=re+im root2=re-im 2007.3 荆楚理工学院

84 ? “两个虚根为:”,re,”+”,im,”i”,re,”-“,im,”i” ENDIF ELSE IF b<>0
6.6 Visual FoxPro程序设计语句 ? “两个实根为:”,root1,root2 ELSE && 有两个虚根 ? “两个虚根为:”,re,”+”,im,”i”,re,”-“,im,”i” ENDIF ELSE IF b<>0 ? “只有一个根:”,-c/b ? “方程退化!” CANCEL 2007.3 荆楚理工学院

85 功能:从多个选择结构中,选择一个条件为真的路线作为程序执行的路线。 语法: DO CASE CASE <条件1> [命令组1]
6.6 Visual FoxPro程序设计语句 3.多条件多分支选择命令 DO CASE 功能:从多个选择结构中,选择一个条件为真的路线作为程序执行的路线。 语法: DO CASE CASE <条件1> [命令组1] [CASE <条件2> [命令组2]] [OTHERWISE [命令组n+1]] ENDCASE 当条件1 .F. .T. 执行 全.F. 当条件2为.T. 有OTHERWISE 无OTHERWISE 2007.3 荆楚理工学院

86 6.6 Visual FoxPro程序设计语句 【例12】设计个人纳税计算程序。按税法规定,工资、薪金所得,使用超额累进税率。以每月收入额减去1600元后的余额,为应纳税所得额,税率如下表: 级数 全月应纳税所得额 税率(%) 1 不超过500元 5 2 500~2000元 10 3 2000~5000元 15 4 5000~20000元 20 20000~40000元 25 6 40000~60000元 30 7 60000~80000元 35 8 80000~100000元 40 9 超过100000元 45 2007.3 荆楚理工学院

87 6.6 Visual FoxPro程序设计语句 问题分析:由于采用超额累计法计算,因此要计算出每级的纳税额。先计算出每级顶点纳税数额,设500元、2000元、…、100000元时应纳税额为s500、s2000、…、s100000。 根据分析,写出程序。 2007.3 荆楚理工学院

88 程序如下: 6.6 Visual FoxPro程序设计语句 s500=500*0.05 &&500元纳税25元
s2000=s500+( )* &&2000元纳税175元 s5000=s2000+( )*0.15 &&5000元纳税625元 s20000=s5000+( )*0.20 &&20000元纳税3625元 s40000=s20000+( )*0.25 &&40000元纳税8625元 s60000=s40000+( )*0.30 &&60000元纳税14625元 s80000=s60000+( )*0.35 &&80000元纳税21625元 s100000=s80000+( )* &&100000元纳税29625元 INPUT “请输入本月应纳税所得额(元):”TO t DO CASE CASE t<=500 s=t*0.05 CASE t<=2000 s=s500+(t-500)*0.10 CASE t<=5000 2007.3 荆楚理工学院

89 s=s2000+(t-2000)*0.15 CASE t<=20000 s=s5000+(t-5000)*0.20
6.6 Visual FoxPro程序设计语句 s=s2000+(t-2000)*0.15 CASE t<=20000 s=s5000+(t-5000)*0.20 CASE t<=40000 s= s20000+(t-20000)*0.25 CASE t<=60000 s=s40000+(t-40000)*0.30 CASE t<=80000 s=s60000+(t-60000)*0.35 CASE t<=100000 s=s80000+(t-80000)*0.40 OTHERWISE s=s (t )*0.45 ENDCASE ? “本月应纳税:”,s,”元” CANCEL 2007.3 荆楚理工学院

90 6.6.4 循环结构程序设计 6.6 Visual FoxPro程序设计语句 1.循环结构程序设计的概念
循环结构程序设计 1.循环结构程序设计的概念 所谓循环,是指一个客观事物在其发展过程中,从某一环节开始有规律地反复经历相似的若干环节的现象。 程序设计中的循环(简称循环),是指在程序设计中,从某处开始有规律地反复执行某一操作块(程序块)的现象,并称重复执行的该操作块(或程序块)为它的循环体。 循环结构是计算机科学中用以描述客观世界广泛存在的循环现象的重要手段,用它可以避免重复不必要的操作,简化程序,节省内存,提高效率。 循环结构,按其循环体内是否嵌套有从属的子循环,可分为单循结构和多循结构;按其循环体执行方式和条件,可分为当型、直到型与步长型循环结构 在Visual FoxPro中,提供了“当型”、“步长型”和“表扫描型”循环命令。 2007.3 荆楚理工学院

91 “当型”循环的根本特点为: 6.6 Visual FoxPro程序设计语句 .F. 循环条件 .T. 循环体 程序块 荆楚理工学院
2007.3 荆楚理工学院

92 功能:当给定的条件为真时,就使DO WHILE…ENDDO之间的命令重复执行实现程序循环。
6.6 Visual FoxPro程序设计语句 2.当型循环命令 DO WHILE 功能:当给定的条件为真时,就使DO WHILE…ENDDO之间的命令重复执行实现程序循环。 条件为.T. 条件为.F. 语法: DO WHILE <条件> 无exit 当条件为.T.时,loop将控制直接转回到do while子句,而不执行loop和enddo之间的命令。 [命令组] 有exit [EXIT] [LOOP] ENDDO 2007.3 荆楚理工学院

93 【例14】用循环语句打印5个“Visual FoxPro”字符串。
问题分析:把字符串作为循环体循环5次。用变量x作为计数器,累计打印次数。在这里,变量x称作循环控制变量或循环变量,由它控制循环与否。写出程序。 【例15】有一张厚0.5mm,面积足够大的纸,将它不断地对折。问对折多少次后,其厚度可达珠穆朗玛峰的高度(8848米)。 问题分析:每次对折都是上次厚度的2倍,然后用此厚度与珠峰的高度作比较,每次循环作一次计数,以便统计对折的次数。根据分析,写出程序。 2007.3 荆楚理工学院

94 例[14]程序如下: vfp=” Visual FoxPro” x=1 DO WHILE x<=5 ? vfp x=x+1 ENDDO
CANCE 2007.3 荆楚理工学院

95 例[15]程序如下: n=0 h=0.5 DO WHILE h<8848000 n=n+1 h=2*h ENDDO
6.6 Visual FoxPro程序设计语句 例[15]程序如下: n=0 h=0.5 DO WHILE h< n=n+1 h=2*h ENDDO ? “对折次数为:”,n CANCEL 2007.3 荆楚理工学院

96 功能:根据给定的次数重复执行一组命令,实现程序循环。
6.6 Visual FoxPro程序设计语句 3.步长型循环命令 FOR 功能:根据给定的次数重复执行一组命令,实现程序循环。 语法:FOR <内存变量>=<初值> TO <终值> [STEP <步长值>] [命令组] [EXIT] [LOOP] ENDFOR|NEXT 【例16】求1+2+3+…+99+100的值。 问题分析:可以采用累加的方法,用循环变量x来产生1、2、3、…、99、100要用到的数。用s保存累加和,从1开始,每次增加1,送到累加变量s中。写出程序。 2007.3 荆楚理工学院

97 例[16]程序如下: s=0 FOR x=1 TO 100 s=s+x ENDFOR ? “s=”,s CANCEL
6.6 Visual FoxPro程序设计语句 例[16]程序如下: s=0 FOR x=1 TO 100 s=s+x ENDFOR ? “s=”,s CANCEL 2007.3 荆楚理工学院

98 问题分析:先用累乘器t求某数阶乘,每求一个阶乘值就存入累加器s中.写出程序。
6.6 Visual FoxPro程序设计语句 【例17】求1+2!+3!+4!+…+20!。 问题分析:先用累乘器t求某数阶乘,每求一个阶乘值就存入累加器s中.写出程序。 单层循环可以解决一些简单的问题,但实际上有许多问题需要用两层甚至多层循环才能解决。在一个循环中又包含另一个循环称为循环嵌套.在外层的叫外循环,在内层的叫内循环。 多重循环结构的根本特点是:外层循环(变量)相对稳定,内存循环(变量)逐一变化,即“多层循环,内(层)外(层)有别,外(层)变一次,内(层)变一遍”。现以双重循环为例简述之。 【例18】打印九九乘法表,即1×1=1,1×2=2,…,9×9=81。写出程序。 2007.3 荆楚理工学院

99 例[17]程序如下: s=0 t=1 FOR n=1 TO 20 t=t*n s=s+t ENDFOR ? “s=”,s CANCEL
6.6 Visual FoxPro程序设计语句 例[17]程序如下: s=0 t=1 FOR n=1 TO 20 t=t*n s=s+t ENDFOR ? “s=”,s CANCEL 2007.3 荆楚理工学院

100 ? STR (a,1),"×",STR(b,1),"=",STR(p,2) ENDFOR ? WAIT WINDOW CANCEL
6.6 Visual FoxPro程序设计语句 例[18]程序如下: FOR a=1 TO 9 FOR b=1 TO 9 P=a*b ? STR (a,1),"×",STR(b,1),"=",STR(p,2) ENDFOR ? WAIT WINDOW CANCEL 2007.3 荆楚理工学院

101 功能:在当前选择的表Table/.DBF文件中移动记录指针,如果遇到符合条件的记录就执行一组命令。 语法:SCAN [NOOPTIMIZE]
6.6 Visual FoxPro程序设计语句 4.数据表扫描循环命令 SCAN 功能:在当前选择的表Table/.DBF文件中移动记录指针,如果遇到符合条件的记录就执行一组命令。 语法:SCAN [NOOPTIMIZE] [<范围>][FOR|WHILE <条件>] [命令组] [EXIT] [LOOP] ENDSCAN 两点说明: ① SCAN自动把记录指针移向下一个符合指定条件的记录,并执行同样的命令组。 ② 命令组中可以嵌套控制结构的命令语句(IF、DO CASE、DO WHILE、FOR、SCAN)。 2007.3 荆楚理工学院

102 6.6 Visual FoxPro程序设计语句 数组 1.数组和数组单元的概念 (1)数组 将一组排列有序的、个数有限的变量作为一个整体,用一个统一的名字来表示,则这些有序变量的全体称为数组;或者说,数组是用一个名字代表顺序排列的一组数,顺序号就是下标变量的值。 (2)数组单元 在同一数组中,构成该数组的成员称为数组单元(或数组元素、下标变量)。数组里面的每一个数据用数组单元名来标识。在Visual FoxPro中,引用数组中的某一单元,应指出数组名和用括号括起来的数组单元在数组中的位置(顺序号)的下标。 2007.3 荆楚理工学院

103 ① 下标变量名由数组名后面跟用括号括起来的下标所组成。若下标变量为二维数组,则括号中的两个下标用逗号隔开。例如a(5),A(2,3)。
6.6 Visual FoxPro程序设计语句 在使用下标变量时,应注意以下几点: ① 下标变量名由数组名后面跟用括号括起来的下标所组成。若下标变量为二维数组,则括号中的两个下标用逗号隔开。例如a(5),A(2,3)。 ② 下标可以是常量、变量或表达式。例如a(4),a(i),a(i+5)。 ③ 下标值若为非整数,则自动取整,其值必须大于零。也就是说,数组的第一个元素的下标总是1。例如a(1),a(2,4)都是合法的,而a(0),a(-3,3)则是非法的。 ④ 下标变量的类型就是最近一次被赋值的类型。 ⑤ 下标变量像简单变量一样,可以被赋值和引用。 2007.3 荆楚理工学院

104 语法:DIMENSION <数组名> (<数值表达式1> [,<数值表达式2>])
6.6 Visual FoxPro程序设计语句 2.建立数组命令 DIMENSION 功能:建立一维或二维的内存变量数组。 语法:DIMENSION <数组名> (<数值表达式1> [,<数值表达式2>]) [,<数组名> (<数值表达式1> [,<数值表达式2>]),...] ☀ 从以下几个方面进一步理解DIMENSION: ① 可以用一个DIMENSION命令建立多个数组。 例如:DIMENSION a(5),b(2,3),c(8) ② 在该命令中,既可以用方括号,也可以用圆括号将<数值表达式>括起来。 例如:DIMENSION a(5),b[2,3],c(8) 2007.3 荆楚理工学院

105 例如:定义一个二维数组,然后分别用内存变量显示命令DISPLAY MEMORY显示赋值前后的情况。
6.6 Visual FoxPro程序设计语句 ③ 内存变量数组的特点为:数组的最小下标是1;二维数组中的单元按行的次序顺序排列,因此二维数组也可当作一维数组去存取;同一数组中各个单元可以采用不同的数据类型,其类型由最近一次STORE或SCATTER决定;DIMENSION建立的数组中各个单元的初始值,均为逻辑型.F.。 例如:定义一个二维数组,然后分别用内存变量显示命令DISPLAY MEMORY显示赋值前后的情况。 CLEAR DIMENSION xx(2,3) DISPLAY MEMORY LIKE xx 运行此程序,结果表明,数组xx的6个单元的内容是逻辑型.F.,因为还没有赋值。 2007.3 荆楚理工学院

106 内存变量数组建立后,可对数组中的各个单元赋值,例如用STORE|= 等。一旦数组单元被赋值,其单元中的内容便是被赋值后的内容。例如:
6.6 Visual FoxPro程序设计语句 内存变量数组建立后,可对数组中的各个单元赋值,例如用STORE|= 等。一旦数组单元被赋值,其单元中的内容便是被赋值后的内容。例如: DIMENSION xx(2,3) STORE "AA"TO xx(1,2) STORE 5 TO xx(6) xx(1)=.T. xx(2,2)="HELLO" DISPLAY MEMORY LIKE xx 运行以上程序,数组xx各个单元已被赋值,并显示其数据类型。 2007.3 荆楚理工学院

107 在给数组变量赋值时,如果未指明下标,则将对数组中有所有单元同时赋以同一值。例如:
6.6 Visual FoxPro程序设计语句 在给数组变量赋值时,如果未指明下标,则将对数组中有所有单元同时赋以同一值。例如: CLEAR DIMENSION yy(5) yy=3 DISPLAY MEMORY LIKE yy 运行程序结果表明,在引用数组时,如果未指明下标,则为该数组的第一个单元。 2007.3 荆楚理工学院

108 6.6 Visual FoxPro程序设计语句 ④ 可以通过再次使用DIMENSION来重新定义数组维数(改变数组的大小和维数)。数组的大小可以增加或减小。一维数组可以转换为二维数组,二维数组也可以转换为一维数组。 A.定义一个只有2个单元的一维数组并赋初值 clear DIMENSION aa(2) STORE “A”TO aa(1) STORE “B”TO aa(2) DISPLAY MEMORY LIKE aa 2007.3 荆楚理工学院

109 重新定义数组维数后,如果一个数组中元素的个数减少了,则数组元素及它所包含的任何数据都将删除。
6.6 Visual FoxPro程序设计语句 重新定义数组,使其数组元素增加到4个: DIMENSION aa(4) STORE “A”TO aa(1) STORE “B”TO aa(2) DISPLAY MEMORY LIKE aa 运行之,其结果正说明:重新定义数组维数后,如果一个数组中元素的个数增加了,则原来数组中所有元素的内容复制到重新定义维数的数组中,其余的数组元素被初始化为假。 重新定义数组维数后,如果一个数组中元素的个数减少了,则数组元素及它所包含的任何数据都将删除。 2007.3 荆楚理工学院

110 DIMENSION aa(4) &&定义一维数组aa(4) STORE “A”TO aa(1) STORE “B”TO aa(2)
6.6 Visual FoxPro程序设计语句 B.当一个一维数组重新定义为二维数组,则原一维数组中的内容按元素对行顺序复制到新的数组中,增加的数组元素初始化为假。例如,定义一个有4个单元的一维数组,并赋值: clear DIMENSION aa(4) &&定义一维数组aa(4) STORE “A”TO aa(1) STORE “B”TO aa(2) STORE “C”TO aa(3) STORE “D”TO aa(4) DISPLAY MEMORY LIKE aa 运行. 2007.3 荆楚理工学院

111 DIMENSION aa(2,3) &&定义为二维数组aa(2,3) STORE “A”TO aa(1) STORE “B”TO aa(2)
6.6 Visual FoxPro程序设计语句 重新定义数组,增加其维数: DIMENSION aa(2,3) &&定义为二维数组aa(2,3) STORE “A”TO aa(1) STORE “B”TO aa(2) STORE “C”TO aa(3) STORE “D”TO aa(4) DISPLAY MEMORY LIKE aa 运行之结果表明,数组维数增加后,原单元中的值被复来,其余单元为逻辑假。 当二维数组转换为一维数组时,原二维数组中的内容按行的元素顺序复制到数组中。行的元素的顺序是:第一行第一个元素成为一维数组第一个元素,第一行第二元素成为第二个元素,依此类推。 2007.3 荆楚理工学院

112 【例19】输入10个学生的成绩,打印出其平均值。
6.6 Visual FoxPro程序设计语句 3.一维数组 如果一个数组只有一个下标,则称该数组为一维数组,或者说用一个数组名和一个下标就能唯一地标识一个数组单元。在一维数组中,各元素又称“单下标变量”。 【例19】输入10个学生的成绩,打印出其平均值。 问题分析:可以采用循环输入,每次循环输入一个成绩,其成绩存放在数组s中,循环10次,成绩累加到变量su中,平均成绩保存在变量av中。写出程序。 2007.3 荆楚理工学院

113 6.6 Visual FoxPro程序设计语句 [例19]程序如下: clear n=10 DIMENSION s(10)
STORE 0 TO su,av i=1 DO WHILE i<=n cc="请输入第"+STR(i,2)+"个成绩:" INPUT cc TO s(i) su=su+s(i) i=i+1 ENDDO av=su/n ? "平均成绩为:",round(av,1) CANCEL 2007.3 荆楚理工学院

114 6.6 Visual FoxPro程序设计语句 【例21】设某校某班共10名学生,为了评定某门课程的奖学金,按规定超过全班平均成绩10%者为一等奖,超过5%者为二等奖。试设计程序,打印出应获奖学金的学生名单(包括姓名、成绩、奖学金等级)。 问题分析:由于对10名学生的数据需用两次(一次用于求平均成绩,另一次用于挑选获奖者),所以应设计描述其姓名、学号、成绩的三个一维数组。根据分析,写出程序。 2007.3 荆楚理工学院

115 DIMENSION name(10),number(10),points(10) &&定义姓名、学号、成绩数组 s=0 &&总成绩累加器初值
6.6 Visual FoxPro程序设计语句 [例21]程序如下: * 求获奖学生 clear SET TALK OFF DIMENSION name(10),number(10),points(10) &&定义姓名、学号、成绩数组 s= &&总成绩累加器初值 FOR i=1 TO &&输入各学生数据 INPUT "第"+STR(i,1)+"个学生的姓名:" TO name(i) INPUT "第"+STR(i,1)+"个学生的学号:" TO number(i) INPUT "第"+STR(i,1)+"个学生的成绩:" TO points(i) s=s+points(i) &&求总成绩 ENDFOR 2007.3 荆楚理工学院

116 IF points(i)>first ? name(i),number(i),points(i),"获一等奖" ELSE
6.6 Visual FoxPro程序设计语句 s=s/10 first=s*1.1 second=s*1.05 FOR i=1 TO 10 IF points(i)>first ? name(i),number(i),points(i),"获一等奖" ELSE IF points(i)>second ? name(i),number(i),points(i),"获二等奖" ENDIF ENDFOR CANCEL 2007.3 荆楚理工学院

117 【例22】计算全班学生每门课的总平均成绩。假设全班有3个学生,每个学生考5门课。
6.6 Visual FoxPro程序设计语句 4.二维数组 在二维数组中,第一个下标称为“行下标”,第二个下标称为“列下标”,必须用两个下标才能唯一地确定一个数组单元在数组中的位置。二维数组的单元又称“双下标变量”。 【例22】计算全班学生每门课的总平均成绩。假设全班有3个学生,每个学生考5门课。 问题分析:我们可以用s数组存放这些数据以第一个下标表示学生号,以第二个下标表示课程号。s(i,j)表示第i个学生的第j门课的成绩。平均成绩取小数点后一位第二位四舍五入。我们要把3个学生5门课的成绩存入数组,可以采用循环语句,循环输入每个学生的各科成绩。计算的每门课的平均成绩也用循环。根据分析,写出程序。 2007.3 荆楚理工学院

118 DIMENSION s(3,5) &&建立二维数组 i=1 DO WHILE i<=3 &&输入每个学生的各课成绩 j=1
6.6 Visual FoxPro程序设计语句 [例22]程序如下: clear DIMENSION s(3,5) &&建立二维数组 i=1 DO WHILE i<= &&输入每个学生的各课成绩 j=1 DO WHILE j<=5 ts="输入"+STR(i,1)+"个学生,第"+STR(j,1)+"门课的成绩:" INPUT ts TO s(i,j) j=j+1 ENDDO i=i+1 2007.3 荆楚理工学院

119 DO WHILE j<=5 &&计算每门课的平均成绩 su=0 i=1 DO WHILE i<=3 su=su+s(i,j)
6.6 Visual FoxPro程序设计语句 ? "COURSE","AVERAGE" &&打印表头 j=1 DO WHILE j<= &&计算每门课的平均成绩 su=0 i=1 DO WHILE i<=3 su=su+s(i,j) i=i+1 ENDDO av=ROUND(su/5,1) &&四舍五入,取小数点后一位 ? j,av j=j+1 CANCEL 2007.3 荆楚理工学院

120 6.6 Visual FoxPro程序设计语句 子程序及变量的局域性 1.子程序 能够完成一定功能的可供其它程序使用(调用)的独立程序段,这种程序段被称为子程序。它独立存在,但可以被多次调用,调用的程序被称为主程序。 我们就可以仍然用顺序、选择、循环这三种基本结构去构造它。 子程序结构分为:子程序、函数、过程三类。 2007.3 荆楚理工学院

121 功能:执行一个Visual FoxPro主程序或调用一个子程序。
子程序及变量的局域性 (1)子程序的调用 DO 功能:执行一个Visual FoxPro主程序或调用一个子程序。 语法:DO <程序文件名>|<过程名>[WITH<参数表>] 2007.3 荆楚理工学院

122 功能:终止一个程序、过程或用户定义函数的执行,返回到上一级调用程序、最高级调用程序、另外一个程序或者命令窗口。
6.6 Visual FoxPro程序设计语句 子程序及变量的局域性 (2)子程序的返回 功能:终止一个程序、过程或用户定义函数的执行,返回到上一级调用程序、最高级调用程序、另外一个程序或者命令窗口。 语法:RETURN [TO MASTER|TO <程序名>|<表达式>] 下面用三个图示说明主程序调用子程序的过程。 2007.3 荆楚理工学院

123 主程序 子程序(sprg.prg) DO sprg CANCEL RETURN 6.6 Visual FoxPro程序设计语句
主程序第一次调用子程序,由第一条DO sprg命令处转去执行子程序,当执行到子程序的RETURN命令时,便返回到主程序中本次调用子程序DO命令的下一条命令,并继续执行主程序,遇到第二次调用子程序的DO sprg命令,则再次转去执行子程序,从子程序的RETURN命令返回到本次调用子程序DO命令的下一条命令,再继续执行主程序的其它命令。 主程序 子程序(sprg.prg) DO sprg CANCEL RETURN 2007.3 荆楚理工学院

124 一个程序(或子程序)遇到调用子程序命令就转去执行子程序,而本程序的余下部分要等从子程序返回后才得以继续执行。
6.6 Visual FoxPro程序设计语句 一个程序(或子程序)遇到调用子程序命令就转去执行子程序,而本程序的余下部分要等从子程序返回后才得以继续执行。 主程序 子程序(sprg1.prg) DO sprg2 RETURN 子程序(sprg2.prg) RETURN DO sprg1 CANCEL 2007.3 荆楚理工学院

125 在某一个子程序的RETURN命令中使用TO MASTER短语,则从此子程序直接返回到第一级主程序,其间子程序DO命令以下的命令均不执行。
6.6 Visual FoxPro程序设计语句 在某一个子程序的RETURN命令中使用TO MASTER短语,则从此子程序直接返回到第一级主程序,其间子程序DO命令以下的命令均不执行。 主程序 子程序(sprg1.prg) DO sprg2 RETURN 子程序(sprg2.prg) RETURN TO MASTER DO sprg1 CANCEL 2007.3 荆楚理工学院

126 子程序和其它程序的唯一区别是,它的程序末尾或返回处必须有RETURN命令。子程序文件名的扩展名也默认为.PRG。
6.6 Visual FoxPro程序设计语句 (3)子程序的建立 子程序作为一个独立的程序单位,与其它程序一样可以从菜单中选择“文件”+“新建”,或者从工具条中选择“新建”按钮,或者直接在命令窗口中用MODIFY COMMAND命令来建立,或者用其它文字编辑软件进行建立、修改和保存。在建立子程序时,每个子程序必须单独使用一个文件名,并且不能把各个子程序、主程序写在一个文件中。 子程序和其它程序的唯一区别是,它的程序末尾或返回处必须有RETURN命令。子程序文件名的扩展名也默认为.PRG。 2007.3 荆楚理工学院

127 6.6 Visual FoxPro程序设计语句 【例24】求s=a!+b!+c! 问题分析:要计算s=a!+b!+c!,先要分别计算出a!,b!和c!。由于3个求阶乘的运算过程完全相同,因此可以用子程序来计算任意阶乘p!,每次调用子程序前给p一个值,并把其所求结果放入ps变量中(ps=p!),返回主程序后接收ps。这样三次调用子程序便可求得s。写出程序。 2007.3 荆楚理工学院

128 DO E:\TZW\数据库原理\程序\eg24jc.prg s=ps p=b s=s+ps p=c
6.6 Visual FoxPro程序设计语句 例[24]程序如下: CLEAR INPUT "a="TO a INPUT "b="TO b INPUT "c="TO c s=0 ps=1 p=a DO E:\TZW\数据库原理\程序\eg24jc.prg s=ps p=b s=s+ps p=c 2007.3 荆楚理工学院

129 DO E:\TZW\数据库原理\程序\eg24jc.prg s=s+ps ? "s=",s CANCEL
6.6 Visual FoxPro程序设计语句 DO E:\TZW\数据库原理\程序\eg24jc.prg s=s+ps ? "s=",s CANCEL *计算阶乘子程序eg24jc.prg,并保存在E:\TZW1\数据库原理\程序下 * eg24jc.prg ps=1 FOR i=1 TO p ps=ps*i ENDFOR RETURN 2007.3 荆楚理工学院

130 Visual FoxPro中的内存变量按其属性可以分为主从型、全局型(public)和局部型(private)三种。 (1)主从型内存变量
2.内存变量的属性和作用域 Visual FoxPro中的内存变量按其属性可以分为主从型、全局型(public)和局部型(private)三种。 (1)主从型内存变量 程序中使用的内存变量,凡未经特殊说明的均属于主从型内存变量,这些内存变量可以在本级程序及以下各级子程序中使用,其值可以在子程序中改变,返回主程序时保留改变后的值。 某一级程序定义的主从型内存变量,在本级程序结束时被清除,因此不能进入上一级程序。若在子程序中定义它,它不能进入上一级程序;若在主程序中定义它,它可以到下级子程序中使用,当低层程序在执行过程中改变了该变量的值时,在返回本级主程序时被改变的值仍然保存,主程序可以继续使用子程序改变后的值。 2007.3 荆楚理工学院

131 6.6 Visual FoxPro程序设计语句 (2)全局型内存变量 全局型内存变量是指在上、下各级程序中都可使用、修改的内存变量。全局型内存变量可以由主程序定义,也可以由子程序定义,全局变量就像在一个程序中定义的变量一样,可以任意改变和调用,当程序执行完后,其值仍然保存。若要清除这种变量,必须用RELEASE命令。定义变量具有全局属性须用下面命令。 功能:定义全局变量或数组。 语法1:PUBLIC <内存变量表>|ALL|ALL LINK <通配符>|ALL EXCEPT <通配符> 语法2:PUBLIC [ARRAY]<数组名>(<数值表达式1>[,<数值表达式2>])[,<数组名>(<数值表达式1>[,<数值表达式2>]),…] 2007.3 荆楚理工学院

132 功能:隐藏当前程序中指定的内存变量或数组。
6.6 Visual FoxPro程序设计语句 (3)局部型内存变量 如果某个程序中使用的局部变量与高层次程序中的局部变量或全局变量同名,为了避免同名变量在使用上的混淆,或者为了使主程序中的同名变量在子程序调用后返回时,仍保待原值,可在子程序中把它们定义为局部变量。 功能:隐藏当前程序中指定的内存变量或数组。 语法:PRIVATE <内存变量表>|ALL|ALL LIKE <通配符>|ALL EXCEPT <通配符> 2007.3 荆楚理工学院

133 6.6 Visual FoxPro程序设计语句 【例28】说明局部型内存变量。 写出程序。 在主程序中定义了a,并被赋值。到了子程序,由于a被定义为局部变量,也被赋值。此时内存中存在着两个名为a的变量且值不相同,返回主程序后,子程序定义的变量a被清除,而主程序的a被恢复了本来的属性并保持原值。 内存变量可隐蔽的特点使得我们在开发大型应用程序时,在不同层次的程序中可以使用同名内存变量而不致发生混乱。 2007.3 荆楚理工学院

134 DO E:\TZW\数据库原理\程序\eg28jb1.prg ? "222",a a=15 ? "333",a
6.6 Visual FoxPro程序设计语句 例[28]程序如下: a=10 ? "111",a DO E:\TZW\数据库原理\程序\eg28jb1.prg ? "222",a a=15 ? "333",a DO E:\TZW\数据库原理\程序\eg28jb2.prg ? "444",a CANCEL *子程序eg28jb1.prg PRIVATE a a=20 ? "jb1",a return *子程序eg28jb2.prg a=30 ? "jb2",a return 2007.3 荆楚理工学院

135 调用子程序时可以把数据传递给子程序,也可以把子程序中的数据传递回来。
6.6 Visual FoxPro程序设计语句 子程序及变量的局域性 3.调用子程序时的数据传递 调用子程序时可以把数据传递给子程序,也可以把子程序中的数据传递回来。 通常在编制一个子程序时,要考虑它需要输入哪些量,进行处理后输出哪些量。正确地提供一个子程序的输入数据和正确地引用其输出数据,是使用子程序的关键问题,也就是调用程序和被调用程序之间的数据传递。这种数据传递可以通过两种方式来解决。 2007.3 荆楚理工学院

136 6.6.6 子程序及变量的局域性 (1)用主从变量和全局变量实现数据传递 【例29】计算矩形面积的程序。 写出程序。
6.6 Visual FoxPro程序设计语句 子程序及变量的局域性 (1)用主从变量和全局变量实现数据传递 【例29】计算矩形面积的程序。 写出程序。 从该程序我们可以看出,用主从变量和全局变量实现数据传递时,主程序和子程序中必须有名字相同的内存变量,如程序中的s、gao、kuan变量,可以在主程序与子程序之间传递数据。 2007.3 荆楚理工学院

137 DO E:\TZW\数据库原理\程序\eg29jxmj.prg ? s CANCEL *eg29jxmj.PRG s=gao*kuan
6.6 Visual FoxPro程序设计语句 例[29]程序如下: gao=5 kuan=6 s=0 DO E:\TZW\数据库原理\程序\eg29jxmj.prg ? s CANCEL *eg29jxmj.PRG s=gao*kuan RETURN 2007.3 荆楚理工学院

138 6.6.6 子程序及变量的局域性 (2)用参数实现数据传递
6.6 Visual FoxPro程序设计语句 子程序及变量的局域性 (2)用参数实现数据传递 参数传递就是在编写子程序时,将这些要输入、输出的变量用PARAMETERS命令来说明,在调用时,通过改进的DO命令来提供输入值和接受输出结果。 功能:指定子程序中的局部变量名,并由这些局部变量接收由上级程序中,用DO…WITH<参数>传递来的参数,将其依次赋给<内存变量表>中的各局部变量,也可以回送子程序运行的结果。 语法:PARAMETERS <内存变量表> 【例30】计算矩形面积。要求用参数实现数据传送。 写出程序。 2007.3 荆楚理工学院

139 DO E:\TZW\数据库原理\程序\eg30jxmj WITH gao,kuan,mj ? mj CANCEL
6.6 Visual FoxPro程序设计语句 [例30]程序如下: gao=5 kuan=6 mj=0 DO E:\TZW\数据库原理\程序\eg30jxmj WITH gao,kuan,mj ? mj CANCEL   *eg30jxmj.prg子程序 PARAMETERS g,k,m m=g*k RETURN 2007.3 荆楚理工学院

140 6.6 Visual FoxPro程序设计语句 子程序及变量的局域性 4.用户定义函数 尽管Visual FoxPro提供了很多内部函数,但有时用户还需要为应用程序定义一些特殊的函数。这些函数被称为用户定义函数(User Defined Function),简称UDF。UFD与内部函数一样,可以在程序、命令窗口或函数嵌套中使用,但并不是所有的命令子句都支持UDF,支持UDF的命令和子句请查阅有关手册。 在Visual FoxPro中两种形式的UDF:独立UDF和依附UDF。 2007.3 荆楚理工学院

141 6.6.6 子程序及变量的局域性 (1)独立用户定义函数
6.6 Visual FoxPro程序设计语句 子程序及变量的局域性 (1)独立用户定义函数 一个独立用户定义函数实际上就是一个子程序文件,唯一的差别是在RETURN语句后带有表达式。 功能:用户定义函数。 语法:[PARAMETERS<内存变量表>] [PRIVATE ALL] [命令组] RETURN [<表达式>] 【例31】定义一个计算求立方数的函数。 写出程序。 2007.3 荆楚理工学院

142 ? x,cube(x) &&函数cube(x)的前面不能加路径 x=x+1 ENDDO CANCEL *cube.prg求立方数函数
6.6 Visual FoxPro程序设计语句 [例31]程序如下: x=1 DO WHILE x<=10    ? x,cube(x)    &&函数cube(x)的前面不能加路径    x=x+1 ENDDO CANCEL *cube.prg求立方数函数 PARAMETERS v PRIVATE ALL vt=v*v*v RETURN vt 2007.3 荆楚理工学院

143 依附用户定义函数不能作为一个独立的程序文件,它以FUNCTION<函数名>开头,可存在某程序的后面、某过程文件中。
6.6 Visual FoxPro程序设计语句 (2)依附用户定义函数 依附用户定义函数不能作为一个独立的程序文件,它以FUNCTION<函数名>开头,可存在某程序的后面、某过程文件中。 功能:标识用户定义函数的开始。 语法:FUNCTION <函数名> [PARAMETERS <内存变量表>] [PRIVATE ALL] [命令组] RETURN [<表达式>] 【例32】例31用依附用户定义函数编写。 写出程序。 2007.3 荆楚理工学院

144 [例32]程序如下: x=1 DO WHILE x<=10 ? x,cube(x) x=x+1 ENDDO CANCEL
6.6 Visual FoxPro程序设计语句 [例32]程序如下: x=1 DO WHILE x<=10        ? x,cube(x)        x=x+1 ENDDO CANCEL *cube求立方数函数 FUNCTION cube PARAMETERS v Private ALL RETURN v*v*v 2007.3 荆楚理工学院

145 把多个子程序合并成一个大的文件,而在这个大的文件中,每个子程序仍然是独立的,这个大的公用程序文件被称作过程文件。
6.6 Visual FoxPro程序设计语句 5.过程文件 把多个子程序合并成一个大的文件,而在这个大的文件中,每个子程序仍然是独立的,这个大的公用程序文件被称作过程文件。 过程文件也是程序命令文件,同其它程序一样,可以用MODIFY COMMAND或其它文字编辑软件编辑。 (1)过程文件的组织 功能:在程序文件中,标识一个过程的开始。 语法:PROCEDURE <过程名> 【例35】假如有三个子程序:s1.prg,s2.prg,s3.prg,把它们组织到过程文件eg35.prg中。 写出程序。 2007.3 荆楚理工学院

146 在过程文件被打开之前,过程中所包含的过程是不能被任何程序调用的,因此,在调用前,过程文件必须预先用过程打开命令打开。
6.6 Visual FoxPro程序设计语句 (2)过程文件的打开 在过程文件被打开之前,过程中所包含的过程是不能被任何程序调用的,因此,在调用前,过程文件必须预先用过程打开命令打开。 功能:打开一个过程文件。 语法:SET PROCEDURE TO [<过程文件名>] 【例36】把例25的三个子程序组织到过程文件eg36yuan.prg中。 写出程序。 2007.3 荆楚理工学院

147 SET PROCEDURE TO E:\TZW\数据库原理; \程序\eg36yuan.prg DO WHILE .T. CLEAR
6.6 Visual FoxPro程序设计语句 [例36]程序如下: SET PROCEDURE TO E:\TZW\数据库原理; \程序\eg36yuan.prg DO WHILE .T. CLEAR ? "********圆计算程序********" ? " 计算圆面积" ? " 计算圆周长" ? " 计算圆体积" ? " 退 出" ? "*************************" WAIT "请选择:" TO xh DO CASE CASE xh="0" EXIT 2007.3 荆楚理工学院

148 6.6 Visual FoxPro程序设计语句 CASE xh="1" DO E:\TZW\数据库原理\程序\eg25ymj.prg
DO E:\TZW\数据库原理\程序\eg25yzc.prg CASE xh="3" DO E:\TZW\数据库原理\程序\eg25ytj.prg ENDCASE ENDDO RETUR *eg36yuan.prg过程文件 *****计算圆面积***** PROCEDURE ymj INPUT "请输入圆半径:" TO r s= *r^2 ? s WAIT RETURN 2007.3 荆楚理工学院

149 6.6 Visual FoxPro程序设计语句 *eof:ymj *****计算圆周长***** PROCEDURE yzc
INPUT "请输入圆半径:" TO r s=2* *r ? s WAIT RETURN *eof:yzc *****计算圆体积***** PROCEDURE ytj s=4/3* *r^3 *eof:ytj 2007.3 荆楚理工学院

150 1.练习使用各命令,注意各可选项和各参数的用途。
6.6 Visual FoxPro程序设计语句 上机实践任务 1.练习使用各命令,注意各可选项和各参数的用途。 2.练习各示例程序,注意体会各相关命令的用法。 3.学习编写实用程序。 2007.3 荆楚理工学院


Download ppt "第六章 Visual Foxpro 基 础 2007.3 荆楚理工学院."

Similar presentations


Ads by Google