主 讲,梁 爽
Visual FoxPro程序设计第六章 Visual FoxPro程序设计内容提要,
了解并掌握 VFP的程序设计语言,
重点掌握程序的建立、运行、修改、
基本输入输出命令,以及程序设计的三种基本控制结构,顺序结构,选择结构 和 循环结构 。
前言程序的的概念,
( 1) 程序,计算机能分析执行的命令序列集合
( 2) 程序设计,将解决实际问题所用的命令按一定的逻辑顺序编制成程序,并以文件的形式存放在磁盘中的过程。
Visual FoxPro的程序由一系列命令组成,
运行程序文件就是执行文件的各条命令。一个复杂的应用程序通常包含多个程序,一个程序可以调用另一个程序,称为应用程序模块化。
6.1 程序文件的建立、执行和编辑
1.建立程序文件
( 1 ) 命令方式
MODIFY COMMAND 程序文件名
( 2 ) 菜单方式打开,文件,菜单,选择,新建,;在,新建,
窗口,选择,程序,,再单击,新建文件,钮 。
2,保存程序程序输入、编辑完毕,单击 【 文件 】 |
【 保存 】 菜单项,或按 Ctrl+W复合键,在“另存为”对话框中指定程序文件的存放位置和文件名,并单击“保存”按钮。
程序文件的默认扩展名是,PRG。
3.修改程序
(1)命令方式
MODIFY COMMAND 程序文件名
(2)菜单方式
,文件 /打开,- ( 类型 ),程序,-,确定,

6.1.2 程序的运行程序文件建立后,可以用多种方式,多次执行它 。 下面是两种常用的方式 。
( 1) 菜单方式
,程序/运行,-选择要运行的程序-,运行,

( 2) 命令方式
DO 程序文件名注:在使用 DO命令时,Visual FoxPro会自动对程序文件编译并产生与主文件名相同的目标程序,然后执行该目标程序 。
执行程序文件时,将依次执行文件中的命令,
直到所有命令执行完毕,要结束当前执行的程序可使用以下命令:
(1) CANCEL:终止程序运行,清除所有的私有变量,返回到命令窗口;
(2) RETURN:结束程序执行,返回调用它的上级程序,若无上级程序则返回到命令窗口;
(3) QUIT:结束程序执行并退出 Visual FoxPro系统,返回到操作系统一.程序结束命令
6.1.3 程序的书写规则
1.命令的分行
VFP程序是命令行的序列,每个命令都以回车键结束,一行只能写一条命令;若一条命令太长,一行写不下,也可分行书写,并在分行处加上续行符,;,,再按回车键。
2,命令注释
【 格式 1】 NOTE 注释内容 用于命令行开头处
【 格式 2】 * 注释内容 用于命令行开头处
【 格式 3】 && 注释内容 用于命令行后,以解释命令作用
【 功能 】 帮助读者阅读程序、增强理解程序作用程序中常用的开头部分,
CLEAR && 清屏
SET TALK OFF && 关闭人机对话
SET DEFAULT TO [盘符,\路径 ] && 设置默认路径
SET DATE YMD && 设置日期格式为年月日程序中常用的结尾部分,
SET TALK ON && 打开人机对话
CANCEL && 清除变量,返回到交互方式状态
RETURN && 返回调用程序处
QUIT && 退出 VFP
USE && 关闭已打开的表
6.1.4 键盘输入命令
1,INPUT命令
【 格式 】 INPUT [提示信息 ] TO 内存变量
【 功能 】 将用户从键盘上输入的内容,赋值给指定内存变量。该命令可接受 N,C,D,L型数据,数据形式可以是常量、变量、函数和表达式。输入字符型数据要加定界符。
例 6-2 根据入学成绩显示学生姓名、班级
CLEAR
SET TALK OFF
USE 学生表
INPUT "请输入学生的入学成绩," TO CJ
LOCATE FOR 入学成绩 =CJ
&&WAIT
DISPLAY FIELDS 姓名,班级
USE
SET TALK ON
RETURN
【 例 】 从键盘输入两个任意正数,求以两数为边长的长方形面积 。
SET TALK OFF
CLEAR
INPUT,长方形一边的长为:,TO A
INPUT,长方形另一边的长为:,TO B
S=A*B
,长方形的面积为:,,S
CANCEL
2,ACCEPT命令
【 格式 】 ACCEPT [提示信息 ] TO 内存变量
【 功能 】 将用户从键盘上输入的内容(字符串),
赋值给指定内存变量。
该命令只接受字符型数据,输入的字符串不需要加定界符例 6-1根据输入姓名,查找并显示其基本情况
CLEAR
SET TALK OFF
USE 学生表
ACCEPT "请输入学生姓名," TO NAME
&&INPUT "请输入学生姓名," TO NAME
LOCATE FOR 姓名 =NAME
&&WAIT
DISPLAY
USE
SET TALK ON
RETURN
3,WAIT命令
【 格式 】 WAIT [提示信息 ][TO内存变量 ]
【 功能 】 显示提示信息,暂停程序执行,直到用户按任意键或单击鼠标时继续执行程序 。
若选择可选项 [TO <内存变量 >],将输入的单个字符作为字符型数据赋给指定的 <内存变量 >;若用户是按 Enter键或单击鼠标,<内存变量 >的值为空串 。
若省略所有可选项,屏幕显示,键入任意键继续 ……,。
4,三条输入命令的异同
INPUT命令可接受数值型,字符型,逻辑型,日期型和日期时间型数据,数据形式可以是常量,
变量,函数和表达式,如果是字符串,需用定界符,输入完毕按回车键结束 。
ACCEPT命令只能接受字符型数据,不需定界符,
输入完毕按回车键结束;
WAIT命令只能输入单个字符,且不需定界符,输入完毕不需按回车键;
Visual FoxPro系统提供的命令丰富,且功能强大,把这些命令和程序设计语句有效地组织在一起,就形成了实现某一特定功能的程序。
Visual FoxPro系统的程序有两个特点:一是程序控制流模式,由顺序、选择、循环三种基本结构构成。二是面向对象可视化的结构程序模块,在每个模块的内部也是由程序控制流组成。常见的控制结构如下:
6.2 程序的控制结构
1.顺序结构顺序结构是在程序执行时,根据程序中语句的书写顺序依次执行的命令序列。 Visual FoxPro系统中的大多数命令都可以作为顺序结构中的语句
2.选择结构选择结构是在程序执行时,根据不同的条件,
选择执行不同的程序语句,用来解决有选择、有转
3.循环结构循环结构则能够使某些语句或程序段重复执行若干次 。 如果某些语句或程序段需要在一个固定的位置上重复操作,使用循环是最好的选择 。
6.2.1 顺序结构
1.功能:顺次、逐条地执行程序中的命令。
2.要点:
( 1)弄清要解决的问题
( 2)设计出解决问题的方法、步骤
( 3)针对每个步骤选择适当的命令
( 4)严格按照次序把命令记录下来
3,特点命令的排列顺序就是命令的执行顺序,每条命令执行一次且只执行一次。
【 例 1】 在学生表,dbf中,统计入学成绩在 600分以上的学生人数。
clear
use xsda
count all for 入学成绩 >=600 to n
use
"入学成绩大于或等于 600分的学生人数为,",n
例 6-1根据输入姓名,查找并显示其基本情况
CLEAR
SET TALK OFF
USE 学生表
ACCEPT "请输入学生姓名," TO NAME
LOCATE FOR 姓名 =NAME
WAIT
DISPLAY
USE
SET TALK ON
RETURN
例 6-2 根据入学成绩显示学生姓名、班级
CLEAR
SET TALK OFF
USE 学生表
INPUT "请输入学生的入学成绩," TO CJ
LOCATE FOR 入学成绩 =CJ
WAIT
DISPLAY FIELDS 姓名,班级
USE
SET TALK ON
RETURN
6.2.2 分支 (选择 )结构分支结构形式有如下三种
1.单向分支
2.双向分支
3.多路分支
1
单向分支语句,即根据用户设置的条件表达式的值,
决定某一操作是否执行。
( 1)语句格式:
IF〈 条件表达式
ENDIF
( 2)语句功能:
当满足条件,即 (条件表达式 )的值为真时,执行 〈 命令序列 〉 ;否则,执行 ENDIF后面的第一条命令。 IF
与 ENDIF必须成对出现,否则程序无法执行。
IF
休息,上网
ENDIF
条件式达式假命令 序列
ENDIF 之后语句真例 6-4 将学生表,DBF中入学成绩大于 500分(含
500)以上学生成绩增加 10%。
SET TALK OFF
CLEAR
USE 学生表
LOCATE FOR 入学成绩 >=500
IF FOUND()
DISPLAY FIELDS 姓名,入学成绩
REPLACE 入学成绩 WITH 入学成 *(1+0.1)
DISPLAY FIELDS 姓名,入学成绩
ENDIF
USE
SET TALK ON
RETURN
【 例 1】 计算球的体积 ( 若 R小于 0,则不计算 )
SET TALK OFF
CLEAR
INPUT,请输入球的半径:,TO R
IF R > 0
V = 4/3*3.14159*R^3
,球的体积是:,+STR(V,7,2)
ENDIF
SET TALK ON
RETURN
2.
双向分支语句,即根据用户设置的条件表达式的值,选择两个操作中的一个来执行 。
( 1) 语句格式:
IF〈 条件表达式 〉
〈 命令序列 1〉
ELSE
〈 命令序列 2〉
ENDIF
( 2) 语句功能:
当 〈 条件表达式 〉 的值为真时,执行 〈 命令序列
1〉 中的命令;否则,执行 〈 命令序列 2〉 中的命令;
执行完 〈 命令序列 1〉 或 〈 命令序列 2〉 后都将执行
ENDIF后面的命令 。
IF
休息,上网
ELSE
继续作业
ENDIF
真条 件 式
ENDIF 后面的语句命 令 序 列 2命 令 序 列 1

【 例 2】 判断闰年 ( 年份能被 4整除,但不能被 100整除,
或能被 400整除,则为闰年 )
SET TALK OFF
CLEAR
INPUT,请输入年份:,TO Y
IF Y/4=INT(Y/4),AND,Y/100<>INT(Y/100) ;
.OR,Y/400=INT(Y/400)
Y,”是闰年 !,
ELSE
Y,”不是闰年 !,
ENDIF
SET TALK ON
CANCEL
或,IF Y%4 = 0,AND,Y%100
<> 0,OR,Y%400 = 0
【 例 3】 根据学生成绩,确定学生等级
SET TALK OFF
CLEAR
USE Xscj
DISPLAY ALL
ACCEPT "请输入学生学号," TO Xh
LOCATE FOR 学号 = Xh
IF 平均 >=90
"学号为 "+Xh+"的表现为:优秀 "
ELSE
IF 平均 >=80
"学号为 "+Xh+"的表现为:良好 "
ELSE
"学号为 "+Xh+"的表现为:一般 "
ENDIF
ENDIF
RETURN
3.
多路分支语句,即根据多个条件表达式的值,
选择执行对应的命令系列 。
( 1)语句格式:
DO CASE
CASE 条件表达式 1
命令序列 1
CASE 条件表达式 2
命令序列 2
… …
CASE 条件表达式 N
命令序列 N
[ OTHERWISE
命令序列 N+1]
ENDCASE
( 2) 语句功能:
该语句根据给出的 N个 〈 条件表达式 〉 的值,选择 N个
〈 命令序列 〉 中的一个执行;当所有 CASE中 〈 条件表达式 〉
的值都不满足时,则执行 ( 命令序列 N+1〉,执行后再执行
ENDCASE后面的命令;如果无 OTHERWISE项,就直接执行
ENDCASE后面的命令 。
真条件式 2
语句序列 1
E N D C A S E 后面语句条件式 n
O t h e r w i s e
条件式 1
真语句序列 2
真语句序列 n
有语句序列 n +1

【 例 4】 根据学生成绩,确定学生等级
USE Xscj
ACCEPT,请输入学生学号:” TO Xh
LOCATE FOR 学号 = Xh
DO CASE
CASE 平均 >= 90
,学号为,+ Xh +”的表现为:优秀,
CASE 平均 >= 80 AND 考试成绩 <90
,学号为,+ Xh +”的表现为:良好,
OTHERWISE
,学号为,+ Xh +”的表现为:一般,
ENDCASE
4.
( 1) IF… … ENDIF和 DO CASE… … ENDCASE 必须配对使用,DO CASE与第一个 CASE 条件表达式之间不应有任何命令 。
( 2) 条件表达式 可以是各种表达式或函数的组合,
其值必须是逻辑值 。
( 3) 命令序列 可以由一个或多个命令组成,可以是条件控制语句组成的嵌套结构 。
( 4) DO CASE… … ENDCASE 命令,每次最多只能执行一个 〈 命令序列 〉 。 在多个 CASE项的 〈 条件表达式 〉 值为真时,只执行第一个 〈 条件表达式 〉 值为真的 〈 命令行序列 〉,然后执行 ENDCASE的后面的命令 。
一个循环结构一般应具备如下的条件:
( 1)循环的初始条件:一般为给循环控制变量赋初值;
( 2)循环头:循环语句的起始,设置、判断循环条件;
( 3)循环尾:循环语句的结尾;
( 4)循环体:位于循环头和循环尾之间、循环控制重复执行的语句序列三、循环结构
1,DO WHILE循环语句
【 格式 1】 DO WHILE 条件表达式语句序列
ENDDO
ENDDO
条件表达式真循环体假进入循环后,先判断 <条件 >
是否成立,成立,则执行一遍循环体,当遇到 ENDDO时回到循环头,再次判断 <条件 >,如仍成立,则又执行循环体,如此反复进行,直到 <条件 >不成立为止 。
【 格式 2】 DO WHILE 条件表达式语句序列
[LOOP]
[EXIT]
ENDDO
LOOP语句:强行返回到循环开始语句 。
EXIT语句:强行跳出循环,接着执行 ENDDO后的语句
ENDDO后面语句条件表达式真假循环体
[LOOP]
[EXIT]
几种常用条件
1,FOUND( ):测试用 LOCATE,CONTINUE、
FIND,SEEK等命令查找是否成功 (常用于
,IF-ENDIF”中)
2,NOT EOF( ):测试是否未到文件尾。即要对所有记录进行操作,一般应加,SKIP”以移动指针。
3,.T.(永远为真),即永远进行操作,要用语句,EXIT”来强制退出。
【 例 1】 显示 Xscj表中某学号学生的所有成绩 。
SET TALK OFF
CLEAR
USE Xscj
ACCEPT,请输入学生的学号:,TO XH
DO WHILE,NOT,EOF()
IF 学号 = XH
DISPLAY
ENDIF
SKIP
ENDDO
USE
SET TALK ON
RETURN
【 例 2】 通过输入姓名,查找学生,并且可以反复查找。
USE xsda
AA="Y"
DO WHILE UPPER(AA)="Y"
ACCEPT "请输入姓名," TO NA
LOCATE FOR 姓名 =NA
IF FOUND()
DISP
ELSE
"查无此人! "
ENDIF
ACCEPT "还要继续查找吗 (Y/N)? " TO AA
ENDDO
【 例 3】 求 1+ 2+ 3+ …… + 100之和
SET TALK OFF
CLEAR
sum = 0
i = 1
DO WHILE i <=100
sum = sum + i
i = i + 1
ENDDO
,1+ 2+ 3+ …… + 100 =,,sum
SET TALK ON
RUTURN
思考:
1、怎么求偶数和或者奇数和?
2、怎么实现任意输入一个数求累加和?
【 例 4】 将学生表中所有入学成绩大于 500(含 500)
以上的学生成绩增加 10%。
USE 学生表
LOCATE FOR 入学成绩 >=500
DO WHILE NOT EOF()
IF FOUND()
DISPLAY FIELDS 姓名,入学成绩
REPLACE 入学成绩 WITH 入学成绩 *(1+0.1)
DISPLAY FIELDS 姓名,入学成绩
WAIT
ENDIF
CONTINUE
ENDDO
USE
【 例 5】 根据 XSCJ表中的平均成绩,确定学生的等级。
USE Xscj
DO WHILE NOT EOF()
DO CASE
CASE 平均 >=90
REPLACE 等级 WITH "优秀 "
CASE 平均 >=80 AND 平均 <90
REPLACE 等级 WITH "良好 "
OTHERWISE
REPLACE 等级 WITH "一般 "
ENDCASE
SKIP
ENDDO
DISP ALL
USE
2,FOR循环语句
【 格式 】 FOR 循环变量 = 初值 TO 终值 [STEP 步长 ]
命令系列
[EXIT]
[LOOP]
ENDFOR【 说明 】
① 循环变量是控制循环的内存变量,它的值在初值和终值之间时,执行循环体,超过终值时退出循环 。 每循环一次它的值自动增加一个步长;
② 初值,终值和步长都可以是数值表达式 。 循环执行过程中,初值,终值和步长都不会改变,并由此确定循环的次数;
若省略 STEP <步长 >,则默认 〈 步长 〉 为 1;
③ LOOP和 EXIT命令可以出现在循环体内 。 执行 LOOP命令时,结束本次循环,循环变量增加一个步长值,返回 FOR
循环头判断循环条件是否成立 。 执行 EXIT命令时,程序跳出循环,执行循环尾后面的语句 。
【 例 1】 计算 1到 N的奇数和
SET TALK OFF
CLEAR
INPUT,请输入一个正数:,TO P
S = 0
FOR i = 1 TO P STEP 2
S = S+i
ENDFOR
,1到,,P,”的奇数和为:,,S
SET TALK ON
CANCEL
1、若要求偶数和,该如何?
2、用 DO循环,是怎样做的?
设 I = 0
多设一个变量,赋初值为 1,循环时每次增加 2
3,SCAN
【 格式 】 SCAN[ 范围 ] [ FOR 条件式 ]
[LOOP]
[EXIT]
ENDSCAN
【 说明 】
① 用记录指针来控制循环次数,对表中指定范围内满足条件的所有记录进行操作。循环一次,指针移动到下一条满足条件的记录,直到指针指向文件尾。
② LOOP和 EXIT命令可以出现在循环体内。执行
LOOP命令时,结束本次循环,指针指向下一条记录。
执行 EXIT命令时,程序退出循环,执行 ENDSCAN后面的语句
【 例 1】 在 Xsda表,查找所有男生的记录 (查找男生记录,prg)
SET TALK OFF
CLEAR
USE Xsda
SCAN FOR 性别 =,男,
DISP
ENDSCAN
USE
SET TALK ON
RETURN
课堂练习
求 1-N的累乘。(分别用 DO循环和 FOR
循环实现)
在 XSDA.DBF中查找并显示所有没有补考的学生。