1、1第三章第三章 Visual FoxPro程序设计基础程序设计基础基本学习目标:基本学习目标:1掌握建立、修改、运行程序的方法掌握建立、修改、运行程序的方法2掌握和使用顺序结构、选择结构和循环结构掌握和使用顺序结构、选择结构和循环结构进阶学习目标:进阶学习目标:1灵活运用各种结构进行程序设计灵活运用各种结构进行程序设计2了解多模块程序结构了解多模块程序结构23.1 程序概述程序概述 程序程序:为了完成某项任务而编写的命令序列。为了完成某项任务而编写的命令序列。 程序的本质都是进行数值计算或数据处理,程序的本质都是进行数值计算或数据处理,得出有用的信息。得出有用的信息。 程序是完成大型的、复杂的
2、、综合性较强而程序是完成大型的、复杂的、综合性较强而且需要多次重复执行的任务的最适合方式。且需要多次重复执行的任务的最适合方式。 VFP同时支持面向过程(同时支持面向过程(OP)和面向对象)和面向对象(OO)的程序设计方法。其中)的程序设计方法。其中OP是是OO的的基础。基础。33.1.1 程序设计的步骤程序设计的步骤1. 建立建立2. 编辑编辑3. 保存保存4. 执行执行5. 调试调试相关概念:相关概念:程序程序代码:以命令形式出现的指令、函数或任何代码:以命令形式出现的指令、函数或任何VFP能理能理解的操作指令。解的操作指令。保存程序保存程序代码代码的文件称为的文件称为命令文件、程序文件或
3、程序。命令文件、程序文件或程序。代码的使用:在程序、命令窗口中,以及表单、类、菜单、代码的使用:在程序、命令窗口中,以及表单、类、菜单、报表等的事件、过程或方法程序中。报表等的事件、过程或方法程序中。41.建立程序建立程序建立程序:建立程序: 3种方法种方法(1)命令:)命令:MODIFY COMMAND 文件名文件名MODIFY FILE 文件名文件名(2)选择)选择“文件文件”|“新建新建”| 选择文件类型为选择文件类型为“程程序序”| 单击单击“新建文件新建文件”按钮。按钮。(3)在项目管理器中选择)在项目管理器中选择“代码代码”选项卡选项卡 | 选择选择“程程序序”|单击单击“新建(新
4、建(N)”按钮。按钮。无论使用哪种方法,无论使用哪种方法,VFP都会打开程序窗口,用户就都会打开程序窗口,用户就可在其中编制代码,完成程序设计。可在其中编制代码,完成程序设计。52.程序的编辑和保存程序的编辑和保存(1)编辑:先打开:)编辑:先打开:3种方法种方法命令:命令:MODIFY COMMAND | FILE 程序文件名程序文件名 菜单:菜单:“文件文件”|“打开打开”| 选择文件类型为选择文件类型为“程程序序”| 选择需要打开的程序文件选择需要打开的程序文件 | 单击单击“确定确定”按按钮。钮。项目管理器:选项目管理器:选“代码代码”选项卡,选中需打开的选项卡,选中需打开的程序文件,
5、再单击程序文件,再单击“修改(修改(M)”按钮。按钮。(2)保存(应随时保存),默认扩展名)保存(应随时保存),默认扩展名.PRG。5种种方法:方法:按下按下 Ctrl + S快捷键,存盘但不退出程序窗口。快捷键,存盘但不退出程序窗口。按下按下Ctrl + W则存盘退出程序窗口。则存盘退出程序窗口。选择选择“文件文件”|“保存保存”或或“另存为另存为”命令。命令。单击工具栏上的单击工具栏上的“保存保存”按钮。按钮。在关闭程序窗口系统询问是否保存时选择是即可在关闭程序窗口系统询问是否保存时选择是即可保存保存63.执行程序:执行程序:4法法(1)命令:)命令:DO 执行程序文件时,将依次执行文件中
6、的命令,直到所有命令执行完毕,或执行程序文件时,将依次执行文件中的命令,直到所有命令执行完毕,或者执行到以下命令:者执行到以下命令:CANCEL:终止程序运行,清除所有的私有变量,返回命令窗口;终止程序运行,清除所有的私有变量,返回命令窗口;RETURN:结束程序执行,返回调用它的上级程序,若无上级程序则结束程序执行,返回调用它的上级程序,若无上级程序则返回命令窗口;返回命令窗口;QUIT:结束程序执行并退出结束程序执行并退出VFP,返回操作系统。,返回操作系统。(2)菜单)菜单:选选“程序程序”|“运行运行”命令打开命令打开“运行运行”对话框,选择需执行对话框,选择需执行的程序后单击的程序后
7、单击“运行运行”按钮。按钮。(3)项目管理器:)项目管理器:在在“代码代码”选项卡中选择需要执行的程序文件再单选项卡中选择需要执行的程序文件再单击击“运行(运行(U)”按钮。按钮。(4)程序窗口中:)程序窗口中:按下按下Ctrl + E或单击工具栏上的或单击工具栏上的“!”运行按钮,运行按钮,也可以右击程序窗口,从快捷菜单中选择也可以右击程序窗口,从快捷菜单中选择“执行执行XXX.PRG”命令(命令(XXX. PRG表示当前程序窗口中的程序文件名)表示当前程序窗口中的程序文件名)73.1.2 程序中的常用命令程序中的常用命令 简单的输入输出简单的输入输出 数组与表中数据的传送命令数组与表中数据
8、的传送命令 内存变量与表中记录的传送命令内存变量与表中记录的传送命令81.简单的输入输出命令简单的输入输出命令 ACCEPT INPUT WAIT SAY GET TEXTENDTEXT9(1) ACCEPT命令命令格式:格式:ACCEPT TO 功能:功能:提示并等待用户输入一个字符串给指定内存提示并等待用户输入一个字符串给指定内存变量。变量。注意:该命令只能输入字符型数据,所输入的注意:该命令只能输入字符型数据,所输入的字符串不需要加定界符。字符串不需要加定界符。 10【例【例3-1】打开并显示数据表的内容】打开并显示数据表的内容CLEARACCEPT “请输入数据库名:请输入数据库名:”
9、 TO kmOPEN DATABASE &kmACCEPT 请输入表名请输入表名 TO bmUSE &bmLISTUSE11(2) INPUT命令命令格式:格式:INPUT TO 功能:用以提示并等待用户输入数据。可以输功能:用以提示并等待用户输入数据。可以输入字符型、数值型、逻辑型、日期型和日期入字符型、数值型、逻辑型、日期型和日期时间型等类型数据,而且可以是常量、变量、时间型等类型数据,而且可以是常量、变量、函数或表达式等形式,按回车键结束输入。函数或表达式等形式,按回车键结束输入。系统会将用户输入数据(若需要,则先行计系统会将用户输入数据(若需要,则先行计算出结果)赋值给指定内存变量。算
10、出结果)赋值给指定内存变量。12【例【例3-2】输入长方形的长和宽,】输入长方形的长和宽,求面积求面积CLEARINPUT “长方形的长为:长方形的长为:” TO changINPUT “长方形的宽为:长方形的宽为:” TO kuans=chang * kuan? “长方形的面积为:长方形的面积为:” , s13(3) WAIT命令命令格式:格式:WAIT TO WINDOW AT,NOWAIT CLEAR|NOCLEAR TIMEOUT功能:暂停并显示提示信息,用户按任意键或单击功能:暂停并显示提示信息,用户按任意键或单击鼠标时才继续执行程序。鼠标时才继续执行程序。说明:可选项说明:可选项T
11、O ,将输入的单个字符,将输入的单个字符存入指定的存入指定的;若用户是按;若用户是按Enter键或单键或单击鼠标,击鼠标,的值为空串。若省略所有可的值为空串。若省略所有可选项,屏幕显示选项,屏幕显示“键入任意键继续键入任意键继续”的默认提的默认提示信息。示信息。14【例【例3-3】按学号查】按学号查“学生成绩学生成绩”CLEARUSE 学生成绩学生成绩ACCEPT “请输入待查学生的学号:请输入待查学生的学号: TO nIF LEN(n)=0WA I T “ 输 入 无 效 , 结 束 程 序 运 行 !输 入 无 效 , 结 束 程 序 运 行 ! ” ; WINDOW TIMEOUT 5E
12、LSELIST FOR n =学号学号ENDIFUSE15ACCEPT、WAIT、INPUT比较1. ACCEPT命令只能接受字符串,不需要定界符,命令只能接受字符串,不需要定界符,输入完毕按回车键结束输入完毕按回车键结束2. WAIT命令只能输入单个字符,也不需定界符,命令只能输入单个字符,也不需定界符,但输入完毕不需按回车键但输入完毕不需按回车键3. INPUT命令功能最强,可接受数值型、字符型、命令功能最强,可接受数值型、字符型、逻辑型、日期型和日期时间型数据,数据形式可逻辑型、日期型和日期时间型数据,数据形式可以是常量、变量、函数和表达式,如果是字符串,以是常量、变量、函数和表达式,如
13、果是字符串,需要用定界符,输入完毕按回车键结束。需要用定界符,输入完毕按回车键结束。16(4) 定位输入输出命令定位输入输出命令SAY GET DEFAULT 功能:功能:在指定行列位置显在指定行列位置显示示的值,并允许修的值,并允许修改改的值。的值。指定数据起始显示位置指定数据起始显示位置需要显示的串需要显示的串需要输入或需要输入或修改的变量修改的变量变量的初值变量的初值说明:说明:行号和列号都从行号和列号都从0开始开始的十进制整数。的十进制整数。先输出先输出表达式表达式1 (背景色以标准型显示)(背景色以标准型显示) ,再空一格后接着显示变量,再空一格后接着显示变量值(背景色以增强型显示)
14、,无值(背景色以增强型显示),无SAY子句则从指定位置显示变量值子句则从指定位置显示变量值 。变量要有初值(可用变量要有初值(可用DEFAULT 指定)其类型在编辑期间不能改变,字指定)其类型在编辑期间不能改变,字符型的宽度和数值型的小数位数也不可更改。符型的宽度和数值型的小数位数也不可更改。GET子句必须由子句必须由READ子句激活后才能编辑子句激活后才能编辑GET变量值。直到光标移变量值。直到光标移出由这些出由这些GET变量组成的区域时变量组成的区域时READ命令才算执行结束。命令才算执行结束。17CLEARUSE 学生成绩学生成绩2,5 SAY 待修改的记录号:待修改的记录号: GET
15、JLH DEFA 1READGO JLHSCATTER MEMV &将记录数据导出到与字段变量将记录数据导出到与字段变量同名的一组内存变量中同名的一组内存变量中4,5 SAY 学号:学号: GET M.学号学号6,5 SAY 高数:高数: GET M.高数高数8,5 SAY 英语:英语: GET M.英语英语10,5 SAY 计算机:计算机: GET M.计算机计算机READ14,5 SAY 保存修改?保存修改?(Y/N): GET OK DEFA yREADIF UPPER(OK) = “Y GATHER MEMV 16,5 SAY 存盘完毕!存盘完毕!ELSE 16,5 SAY 你放弃了修
16、改。你放弃了修改。ENDIFUSE【例【例3-4】修改】修改“学生成绩学生成绩” 记记录录18(3) 文本输出命令文本输出命令 、 或或 命令命令格式:格式: | 文本串文本串功能:功能: :先换行,再原样输出文本串中的所有字符。先换行,再原样输出文本串中的所有字符。 :不换行直接输出。:不换行直接输出。若文本串中有需要计算的表达式,可若文本串中有需要计算的表达式,可先用命令先用命令 SET TEXTMERGE ON 设置文本的合并计算,然设置文本的合并计算,然后用一对后用一对将要计算的表达式括起来。这样,在输出到将要计算的表达式括起来。这样,在输出到部分时,先计算出其中的表达式的值,再将该值
17、和剩余文部分时,先计算出其中的表达式的值,再将该值和剩余文本串输出来。如:本串输出来。如:SET TEXTMERGE ON今天是今天是月月日日& 若今天是若今天是9月月5日则会输出日则会输出“今天是今天是9月月5日日”的文的文本。本。19 textend text 命令命令格式:格式:TEXT文本行文本行1文本行文本行2文本行文本行3 END TEXT功能:功能:先换行,然后将先换行,然后将textend text之间的所之间的所有文本行原样输出。有文本行原样输出。202.数组与表中数据的传送命令数组与表中数据的传送命令(1)将表中数据传送给数组)将表中数据传送给数组格式:格式:COPY TO
18、 ARRAY FIELDS | FIELDS LIKE| FIELDS EXCEPT范围子句范围子句 条件子句条件子句 NOOPTIMIZE功能:功能:将当前工作区中打开的表中的数据传送到一将当前工作区中打开的表中的数据传送到一维维/二维数组中。一维数组仅存一条记录,二维数二维数组中。一维数组仅存一条记录,二维数组可存多条记录。组可存多条记录。21数组与表中数据数组与表中数据的传送说明:如的传送说明:如右图所示:右图所示:表中的备注字段表中的备注字段不会存入数组不会存入数组如:如:COPY TO ARRAY aTemp FIELDS LIKE a* , p* & 把表中符合字段首字符为把表中符
19、合字段首字符为a或或p的记录存入数组的记录存入数组aTemp中。中。如:如:COPY TO ARRAY aMyArray ;FIELDS LIKE A*, P* EXCEPT PARTNO* & 把表中符合字段首字符为把表中符合字段首字符为A或或P但以但以PARTNO开头的字段开头的字段 除外的记录数据存入数组除外的记录数据存入数组aMyArray中中说明说明22如:如:USE 学生成绩学生成绩 & 打开打开 “学生成绩学生成绩”表表DIMENSION a(3,4)& 定义定义3行行4列的二维数组列的二维数组COPY NEXT 3 TO ARRAY a & 把表中头把表中头3条记录存入二维数组
20、条记录存入二维数组a中。中。DISPLAY MEMORY LIKE a & 显示数组中各元素信息,结果如图所示:显示数组中各元素信息,结果如图所示: 23(2 2)将数组中的数据添加到数据表中)将数组中的数据添加到数据表中格式:格式:APPEND FROM ARRAY FOR 条件条件;FIELDS | FIELDS LIKE | FIELDS EXCEPT 功能:功能:与与COPY TO ARRAY刚好相反,是将数组中符合刚好相反,是将数组中符合条件的数据追加到当前工作区中打开的数据表中。条件的数据追加到当前工作区中打开的数据表中。说明:说明:若数组列数多,则忽略多余列。反之,若数组列数少,
21、则多出的若数组列数多,则忽略多余列。反之,若数组列数少,则多出的字段被置为相应类型的空值。如字符型的则置为指定宽度的空格串。字段被置为相应类型的空值。如字符型的则置为指定宽度的空格串。忽略数组中的备注型、通用型数据。忽略数组中的备注型、通用型数据。若数组中某列的值与相应字段的类型不匹配,则对应字段也被置若数组中某列的值与相应字段的类型不匹配,则对应字段也被置为相应类型的空值。为相应类型的空值。二维数组中有多少行,则在表中追加相应行数的记录。若是一维二维数组中有多少行,则在表中追加相应行数的记录。若是一维数组,仅追加一行,具体参照二维数组中的一行来处理。数组,仅追加一行,具体参照二维数组中的一行
22、来处理。24如:如:DIMENSION a(4)a=60a(1)=2000130205USE 学生成绩学生成绩 & 打开打开 “学生成绩学生成绩”表表APPEND FROM ARRAY aUSE该段代码将在该段代码将在“学生成绩学生成绩”表中追加一条新记录,表中追加一条新记录,其学号、高数、英语、计算机字段的值分别为其学号、高数、英语、计算机字段的值分别为2000130205,60,60,60。253.内存变量与表中记录的传送命令内存变量与表中记录的传送命令(1)将当前记录传送到数组或内存变量中)将当前记录传送到数组或内存变量中格式:格式:SCATTER FIELDS TOMEMVAR BLA
23、NK功能:功能:与与COPY TO ARRAY功能相似。用来将功能相似。用来将数据表中当前记录的内容导出到数组或者与字数据表中当前记录的内容导出到数组或者与字段变量同名的内存变量中。段变量同名的内存变量中。26说明说明当使用当使用TO子句时,相当于子句时,相当于COPY TO ARRAY到一维数组中。但不同的是当数组列数少到一维数组中。但不同的是当数组列数少于表中字段数时,会自动扩大数组到适合大小。于表中字段数时,会自动扩大数组到适合大小。当使用当使用MEMVAR子句时,将数据表中当前记录的子句时,将数据表中当前记录的内容导出到与字段变量同名的一组内存变量中。内容导出到与字段变量同名的一组内存
24、变量中。若这些同名的内存变量不存在,则自动创建这组若这些同名的内存变量不存在,则自动创建这组变量。若同时还有变量。若同时还有BLANK子句,则只创建这组变子句,则只创建这组变量,并不传送数据。量,并不传送数据。忽略表中的备注型、通用型字段数据。忽略表中的备注型、通用型字段数据。27(2 2)用数组或内存变量值替换当前记录)用数组或内存变量值替换当前记录格式:格式:GATHER FROMMEMVAR | NAME FIELDS | FIELDS LIKE | FIELDS EXCEPT MEMO功能:功能:与与SCATTER命令的传送方向刚好相反,命令的传送方向刚好相反,是以数组或指定内存变量中
25、的数据替换当前是以数组或指定内存变量中的数据替换当前工作区里打开的数据表中的当前记录。工作区里打开的数据表中的当前记录。28说明:说明:若选用若选用FROM子句,则与子句,则与APPEND FROM ARRAY 从一维数组中添加记录类似,只是此处是替换当从一维数组中添加记录类似,只是此处是替换当前记录而不是追加记录。当数组列数大于表中字段数,则前记录而不是追加记录。当数组列数大于表中字段数,则忽略多余的元素。反之,表中多出的字段的值不受影响。忽略多余的元素。反之,表中多出的字段的值不受影响。若选用若选用MEMV子句,则使用同名的内存变量值来替换表中子句,则使用同名的内存变量值来替换表中相应的字
26、段值。相应的字段值。若需要替换表中的备注字段值,可加上若需要替换表中的备注字段值,可加上MEMO子句,但是子句,但是不能替换通用字段值。不能替换通用字段值。若选用若选用NAME 子句,则可用指定对象中的同名属子句,则可用指定对象中的同名属性值来替换表中当前记录相应的字段值。性值来替换表中当前记录相应的字段值。29USE 学生成绩学生成绩 & 打开打开 “学生成绩学生成绩”表表SCATTER MEMV BLANKM.学号学号=2000130209STORE 70 TO M.高数高数, M.英语英语, M.计算机计算机APPEND BLANKGATHER MEMV USE在在“学生成绩学生成绩”表
27、追加一条新记录,其学号、高数、英表追加一条新记录,其学号、高数、英语、计算机字段值分别为语、计算机字段值分别为2000130209,70,70,70303.1.3 系统运行环境的命令设置系统运行环境的命令设置 (1)SET DEFAUT TO &设置默认搜索目录设置默认搜索目录搜索顺序:搜索顺序:I.当前目录,当前目录,II. 命令指定的目录,命令指定的目录,III.系统默认目录。系统默认目录。若都找不到,才报告出错信息。若都找不到,才报告出错信息。(2)SET CENTURY ON | OFF设置设置D、T型型 “年年”的显示位数。默认的显示位数。默认OFF,2位;位;ON,4位。位。(3)
28、SET FIELDS TO | ALL | ALL LIKE | EXCEPT &设置字段表(投影),选取用户设置字段表(投影),选取用户关心的字段,不在关心的字段,不在中的字段数据不显示。用中的字段数据不显示。用SET FIELDS OFF恢复所有字段。恢复所有字段。(4)SET SAFETY ON | OFF & 设置安全操作提示设置安全操作提示若设为若设为ON,将同名新文件覆盖旧文件时会询问是否覆盖,此时,将同名新文件覆盖旧文件时会询问是否覆盖,此时选择否可不覆盖,否则覆盖;用选择否可不覆盖,否则覆盖;用ZAP命令彻底删除表中的所命令彻底删除表中的所有记录时也会询问是否彻底删除表中的所有
29、记录,选择否可有记录时也会询问是否彻底删除表中的所有记录,选择否可不删除,否则删除。若设为不删除,否则删除。若设为OFF,则遇到上面两种情况都不,则遇到上面两种情况都不提示而直接覆盖或删除。默认为提示而直接覆盖或删除。默认为ON。31(5)SET TALK ON | OFF 功能:功能: 打开或关闭对话开关,默认为打开或关闭对话开关,默认为ON。若设为若设为ON,允许把对话结果发送到,允许把对话结果发送到VFP主窗口、系主窗口、系统信息窗口、图形状态栏或用户自定义窗口中。统信息窗口、图形状态栏或用户自定义窗口中。若先为若先为OFF后再改为后再改为ON,那么对话结果将传送到,那么对话结果将传送到
30、发出发出 SET TALK OFF命令之前的输出位置。命令之前的输出位置。若设为若设为OFF:阻止把对话结果发送到:阻止把对话结果发送到VFP主窗口、系主窗口、系统信息窗口、图形状态栏或用户自定义窗口中统信息窗口、图形状态栏或用户自定义窗口中323.2 程序的基本结构程序的基本结构1.顺序结构:顺序结构:按语句的书写顺序依次执行。按语句的书写顺序依次执行。VFP中的大中的大多数命令都可以作为顺序结构中的语句。多数命令都可以作为顺序结构中的语句。2.分支结构:分支结构:根据不同的条件,选择执行不同的程序语根据不同的条件,选择执行不同的程序语句,用来解决有选择、有转移的诸多问题的控制结构。句,用来
31、解决有选择、有转移的诸多问题的控制结构。3.循环结构:循环结构:使某些语句或程序段重复执行若干次。如使某些语句或程序段重复执行若干次。如果某些语句或程序段需要在一个固定的位置上重复操果某些语句或程序段需要在一个固定的位置上重复操作,使用循环是最好的选择。作,使用循环是最好的选择。4.过程结构:过程结构:在许多应用程序中,有一些程序段需要反在许多应用程序中,有一些程序段需要反复执行多次,这些程序段不在一个固定的位置上,而复执行多次,这些程序段不在一个固定的位置上,而是分散在程序的许多位置上重复执行,可将其与嵌入是分散在程序的许多位置上重复执行,可将其与嵌入它的程序分开,形成独立的程序序列,待使用
32、时再调它的程序分开,形成独立的程序序列,待使用时再调入程序中,以实现不同位置上的重复操作。这样做增入程序中,以实现不同位置上的重复操作。这样做增强了程序的可读性和模块化。我们称这种具有独立功强了程序的可读性和模块化。我们称这种具有独立功能而且可以被其它程序调用的程序序列为过程。能而且可以被其它程序调用的程序序列为过程。333.2.1 分支结构分支结构分支结构形式有三种分支结构形式有三种单向分支单向分支双向分支双向分支多向分支。多向分支。341.单向分支:有条件执行某一单向分支:有条件执行某一操作。操作。(1)单向分支语句:)单向分支语句:IF条件表达式条件表达式语句序列语句序列ENDIF(2)
33、执行过程:)执行过程:第一步:计算条件表达式的值。第一步:计算条件表达式的值。第二步:决定是否执行语句序列。若该值为第二步:决定是否执行语句序列。若该值为真,则执行语句序列;否则,不执行。真,则执行语句序列;否则,不执行。第三步:执行第三步:执行ENDIF后面的第一条命令。后面的第一条命令。35【例【例3-5】求一元二次方程】求一元二次方程ax2bxc0的实的实根。根。INPUT TO aINPUT TO bINPUT TO czb2-4*a*cIF z=0 x1=(-b+SQRT(z)/(2*a)x2=(-b-SQRT(z)/(2*a)? x1 , x2ENDIF362.双向分支:从两个分支
34、中选双向分支:从两个分支中选择一个执行。择一个执行。(1)语句格式:)语句格式:IF条件表达式条件表达式语句序列语句序列1ELSE语句序列语句序列2ENDIF(2)执行过程:)执行过程:第一步:计算条件表达式的值。第一步:计算条件表达式的值。第二步:决定执行哪个操作。当该值为真时,执行第二步:决定执行哪个操作。当该值为真时,执行语句序列语句序列1中的命令;否则,执行语句序列中的命令;否则,执行语句序列2中的命令。中的命令。第三步:执行第三步:执行ENDIF后面的第一条命令。后面的第一条命令。37【例【例3-6】编写一密码校验程序】编写一密码校验程序(假设密码为(假设密码为ABC)CLEARAC
35、CEPT “请输入您的密码:请输入您的密码:” TO mmIF mm=”ABC”CLEAR? ”欢迎使用本系统!欢迎使用本系统!”ELSEWAIT ”密码错误!密码错误!”ENDIF383.多向分支:从多个分支中选择多向分支:从多个分支中选择一个执行一个执行(1)语句格式:)语句格式:DO CASE CASE条件表达式条件表达式1 CASE条件表达式条件表达式2 CASE条件表达式条件表达式n语句序列语句序列n OTHERWISE 语句序列语句序列n+1ENDCASE39(2)执行过程:)执行过程:第一步:计算条件表达式第一步:计算条件表达式1的值。的值。第二步:决定下一步的操作。若该值为真,
36、执行语句序列第二步:决定下一步的操作。若该值为真,执行语句序列1,转第转第2n+2步,否则执行第三步的操作。步,否则执行第三步的操作。第三步:计算条件表达式第三步:计算条件表达式2的值。的值。第四步:决定下一步的操作。若该值为真,执行语句序列第四步:决定下一步的操作。若该值为真,执行语句序列2,转第转第2n+2步,否则执行第五步的操作。步,否则执行第五步的操作。第五步:计算条件表达式第五步:计算条件表达式3的值。的值。第六步:决定下一步的操作。若该值为真,执行语句序列第六步:决定下一步的操作。若该值为真,执行语句序列3,转第转第2n+2步,否则执行第七步的操作。步,否则执行第七步的操作。第第2
37、n-1步:计算条件表达式步:计算条件表达式n的值。的值。第第2n 步:决定下一步的操作。若该值为真,执行语句序列步:决定下一步的操作。若该值为真,执行语句序列n,转第转第2n+2步,否则执行第步,否则执行第2n+1步的操作。步的操作。第第2n+1步:若有步:若有OTHERWISE子句则执行语句序列子句则执行语句序列n+1。第第2n+2步:执行步:执行ENDCASE后的第一条命令。后的第一条命令。40CLEARINPUT “请输入收入:请输入收入:” TO pDO CASECASE p800r=0CASE p2000r=0.05CASE p5000r=0.08OTHERWISEr=0.1ENDC
38、ASETax = p * r? ”税金为:税金为:”, taxRETURN【例【例3-7】如表】如表5-1,编程求税金。,编程求税金。414.使用分支语句的注意事项使用分支语句的注意事项(1)IF ENDIF和和DO CASE ENDCASE 必须配对使必须配对使用,用,DO CASE与第一个与第一个CASE条件表达式之间不应条件表达式之间不应有任何命令。有任何命令。(2)条件表达式可以是各种表达式或函数的组合,)条件表达式可以是各种表达式或函数的组合,其值必须是逻辑值。其值必须是逻辑值。(3)语句序列可以由一个或多个命令组成,也可以)语句序列可以由一个或多个命令组成,也可以是条件控制语句和循
39、环控制语句组成的嵌套结构。是条件控制语句和循环控制语句组成的嵌套结构。(4)DO CASE ENDCASE 命令根据给出的命令根据给出的n个条件个条件表达式的值,选择表达式的值,选择n+1个语句序列中的一个执行。个语句序列中的一个执行。每次最多只能执行一个语句序列。在多个每次最多只能执行一个语句序列。在多个CASE项项的条件表达式值为真时,只执行第一个条件表达的条件表达式值为真时,只执行第一个条件表达式值为真的语句序列。当所有式值为真的语句序列。当所有CASE中条件表中条件表达式的值都是假时,如果有达式的值都是假时,如果有OTHERWISE项,则执项,则执行语句序列行语句序列n+1,否则一个分
40、支也不执行。,否则一个分支也不执行。423.2.2 循环结构循环结构循环结构有三种语句:循环结构有三种语句:DO WHILEFOR SCAN431. DO WHILE循环循环DO WHILE LOOP EXIT ENDDO执行过程:参阅图执行过程:参阅图5-6第一步:求解循环头第一步:求解循环头DO WHILE 后的后的,若值为,若值为.T.,则依次执行循环体中的,则依次执行循环体中的语句,否则转第五步。循环体为位于语句,否则转第五步。循环体为位于DO WHILE和和ENDDO之间的语句序列。之间的语句序列。第二步:循环体执行过程中,若执行了第二步:循环体执行过程中,若执行了LOOP语句,则结
41、束本次循环,转到第一步。语句,则结束本次循环,转到第一步。第三步:循环体执行过程中,若执行了第三步:循环体执行过程中,若执行了EXIT语句,则强行跳出循环,转到第五步。语句,则强行跳出循环,转到第五步。第四步:若循环体中所有语句均已经执行,转第一步。第四步:若循环体中所有语句均已经执行,转第一步。第五步:本循环语句执行结束,转去执行第五步:本循环语句执行结束,转去执行ENDDO之后的语句。之后的语句。 44【例【例3-8】用】用DO WHILE循环将学生档案表中循环将学生档案表中“张三张三”之前(含之前(含“张三张三”)的所有学生的数据显示出来。)的所有学生的数据显示出来。Clearuse 学
42、生档案学生档案do while .not. eof( )DISPif 姓名姓名 张三张三 skiploopendifexitenddouseRETURN45FOR 循环变量循环变量 = 初值初值 TO 终值终值 STEP 步长步长 LOOP EXIT ENDFOR | NEXT2. FOR循环循环执行过程:参阅图执行过程:参阅图5-7。第一步:将初值赋给循环变量。第一步:将初值赋给循环变量。第二步:判断循环变量的值是否超过终值。超过的含义是:若步长大于第二步:判断循环变量的值是否超过终值。超过的含义是:若步长大于0,则循环变量大于终值即为超过终值;若,则循环变量大于终值即为超过终值;若步长小于
43、步长小于0,则循环变量小于终值就是超过。根据判断的结果决定本结构的是否再执行。若未超过,则执行循环体,则循环变量小于终值就是超过。根据判断的结果决定本结构的是否再执行。若未超过,则执行循环体(为(为FOR到与之配对的到与之配对的ENDFOR或或NEXT之间的所有语句。若超过,转第六步。之间的所有语句。若超过,转第六步。第三步:若执行第三步:若执行LOOP命令,结束本次循环,循环变量增加一个步长值,转第二步。若省略命令,结束本次循环,循环变量增加一个步长值,转第二步。若省略STEP ,则步,则步长为默认值长为默认值1。第四步:若执行第四步:若执行EXIT命令,转第六步。命令,转第六步。第五步:若
44、循环体中所有语句均已经执行,转第二步。第五步:若循环体中所有语句均已经执行,转第二步。第六步:结束第六步:结束FOR循环,执行其后的语句。循环,执行其后的语句。 46CLEARs= 1fh = 1FOR i= 2 TO 100s = s + i * fhfh = -1 * fhENDFOR? ”12-3100” , sRETURN【例【例3-9】编程求编程求1234599100之和。之和。47CLEARINPUT “请从键盘输入一个数:请从键盘输入一个数:” TO xSTORE x TO max , minFOR i=2 TO 10INPUT “请从键盘输入一个数:请从键盘输入一个数:” TO
45、 xIF max x min=xENDIFENDFOR? “最大值为:最大值为:” , max? “最小值为:最小值为:” , minRETURN【例【例3-10】从键盘输入从键盘输入10个数,编程找出其中的最大值和最小值个数,编程找出其中的最大值和最小值483.“指针指针”型循环:型循环:SCAN ENDSCANSCAN FOR| WHILE ENDSCAN功能:在指定的范围内,用数据记录指针来控制循环功能:在指定的范围内,用数据记录指针来控制循环次数。执行语句时,首先判断函数次数。执行语句时,首先判断函数EOF()的值,若()的值,若其值为其值为“真真”,则结束循环,否则,结合,则结束循环
46、,否则,结合或或,执行语句序列(满足条件,执行语句序列(满足条件时执行);然后,记录指针移到指定的范围和条件内时执行);然后,记录指针移到指定的范围和条件内的下一条记录,重新判断函数的下一条记录,重新判断函数EOF()的值,直到函()的值,直到函数数EOF()的值为真时结束循环。()的值为真时结束循环。49CLEARUSE 学生档案学生档案SCAN FOR NOT 是否贷款是否贷款? 姓名姓名 ,出生地出生地ENDSCANUSERETURN【例【例3-11】输出】输出“学生档案学生档案”表中所有表中所有未贷款学生的姓名和出生地。未贷款学生的姓名和出生地。504.使用循环语句的说明使用循环语句的
47、说明(1)DO WHILEENDDO、FORENDFOR、SCANENDSCAN须配对使用。须配对使用。(2)语句序列可以是任何)语句序列可以是任何VFP命令或语句,若为循环语句命令或语句,若为循环语句则构成多重循环。则构成多重循环。(3)循环变量应是数值型的内存变量或数组元素。)循环变量应是数值型的内存变量或数组元素。(4)EXIT和和LOOP命令嵌入在循环体内,命令嵌入在循环体内, 可以出现在语句序可以出现在语句序列的任意位置,用以改变循环次数,但是不能单独使用。列的任意位置,用以改变循环次数,但是不能单独使用。(5)EXIT的功能是跳出循环,转去执行的功能是跳出循环,转去执行ENDDO、
48、ENDFOR、ENDSCAN后面的第一条命令后面的第一条命令(6)LOOP的功能是转回到循环的开始处,重新对的功能是转回到循环的开始处,重新对“条件条件”进进行判断,相当于执行了一次行判断,相当于执行了一次ENDDO、ENDFOR、ENDSCAN命令,它可以改变语句序列中部分命令的执行次数。命令,它可以改变语句序列中部分命令的执行次数。513.2.3 结构的嵌套应用结构的嵌套应用顺序、分支和循环等结构可以相互嵌套,但不顺序、分支和循环等结构可以相互嵌套,但不允许交叉,必须保证下一个嵌套要完整地包允许交叉,必须保证下一个嵌套要完整地包含在上一个的结构体内。正确的嵌套关系如:含在上一个的结构体内。
49、正确的嵌套关系如:DO WHILE FOR = TO STEP SCAN 范围范围 FOR | WHILE ENDSCANENDFORENDDO52【例【例3-12】用多重循环编程输】用多重循环编程输出下三角形乘法口诀表出下三角形乘法口诀表53【例【例3-12】程序:】程序:CLEARFOR i=1 TO 9 j=1 DO WHILE j=ik=i * j? STR(j , 1 ) + * + STR( i, 1 ) + = + STR( k , 2 ) + j=j+1 ENDDO ?ENDFORRETURN 543.3 自定义函数和过程自定义函数和过程 在程序设计中,常把完成一个功能的程序编
50、在程序设计中,常把完成一个功能的程序编写成一个单元,以便在其他程序中使用该功写成一个单元,以便在其他程序中使用该功能时调用该程序。这种为完成一个特定功能能时调用该程序。这种为完成一个特定功能而编写的程序称为自定义函数或过程。而编写的程序称为自定义函数或过程。 函数的特点:有返回值函数的特点:有返回值 过程的特点:忽略返回值,重视处理流程过程的特点:忽略返回值,重视处理流程553.3.1 自定义函数自定义函数Visual FoxPro8虽然提供了三百多种函数,但不可能完全满足虽然提供了三百多种函数,但不可能完全满足用户的各种需求,为了满足某些特殊需要,用户的各种需求,为了满足某些特殊需要,Vis
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。