FoxPro For Windows http://cc.synu.edu.cn 1
FoxPro程序设计
第 5讲 程序的三种基本结构
顺序结构程序设计
分支结构程序设计
循环结构程序设计
FoxPro For Windows http://cc.synu.edu.cn 2
FoxPro程序设计
按照命令语句排列的顺序,一条接一条地依次执行。
【 例 5.18】 在 student.dbf学生登记表中查找并显示一个学生的信息。
SET TALK OFF
USE student
ACCEPT "请输入学号," TO msno
LOCATE FOR sno= msno
msno,"的有关信息如下,"
"姓名,",name
"性别,",sex
USE
SET TALK ON
RETU
请输入学号,990101
990101的有关信息如下:
姓名,王亚洲
性别,男
请输入学号,999999
999999的有关信息如下:
姓名:
性别:
顺序结构 程序设计
上面程序的缺点:未找到,也显示信息。
假设输入一个不存在的学号?
FoxPro For Windows http://cc.synu.edu.cn 3
FoxPro程序设计
分支结构是指程序执行到某处时,根据给定的条件经判断后选择
执行某些语句。难点是条件语句的设置。
分支结构 程序设计
【 例 】
IF x=5 &&条件语句
y=5*x+3
Y
ENDI &&结束语句
IF--ENDIF是一对,缺一不可。
N
<expl>为真?
<statements1>
ENDIF之后的命令
Y
IF— ENDIF 流程图
1、单分支
IF <expL>
<statements1>
ENDIF
FoxPro For Windows http://cc.synu.edu.cn 4
FoxPro程序设计
【 例 】 用单分支修改上面程序,找到后显示信息,找不到,不显示。
SET TALK OFF
USE student
ACCEPT "请输入学号," TO xh
LOCATE FOR sno= xh
IF FOUND( ) &&FOUND()查找结果测试函数,返回值,T.或,F.
xh,"的有关信息如下,"
"姓名,",name
"性别,",sex
ENDI
USE
SET TALK ON
RETU
上面程序的缺点:未找到,不显示,但也不显示错误信息。
FoxPro For Windows http://cc.synu.edu.cn 5
FoxPro程序设计
2、双分支
IF <expL>
<statements1>
ELSE
<statements2>
ENDIF
【 例 】
IF x=5
y=5*x+3
ELSE
y=5*x
ENDIF
y
<expl>为真?
<statements1> <statements2>
ENDIF之后的命令
N
Y
IF –ELSE—ENDIF流程图
FoxPro For Windows http://cc.synu.edu.cn 6
FoxPro程序设计
【 例 5.19】 用双分支修改上面程序,未找到显示 "无此人 "。
SET TALK OFF
USE student
ACCEPT "请输入学号," TO xh
LOCATE FOR sno= xh
IF FOUND( )
xh,"的有关信息如下,"
"姓名,",name
,性别:”,sex
ELSE
,对不起,库中没有这个人 "
ENDI
USE
SET TALK ON
RETU
FoxPro For Windows http://cc.synu.edu.cn 7
FoxPro程序设计
****思考:下面两程序中哪个正确?
***程序 1 ***程序 2
SET TALK OFF SET TALK OFF
USE student USE student
ACCEPT "请输入姓名," TO mname ACCEPT "请输入姓名," TO mname
LOCATE FOR sno= mname LOCATE FOR sno= mname
If found( ) If found( )
mname,“的有关信息如下:”? mname,"的有关信息如下,"
"学号,",sno? "学号,",sno
"性别,",sex? "性别,",sex
ELSE ENDI
,对不起,库中没有此人”? "对不起,库中没有此人 "
ENDI USE
USE SET TALK ON
SET TALK ON RETU
RETU
FoxPro For Windows http://cc.synu.edu.cn 8
FoxPro程序设计
【 例 5.20】 判断某年是不是闰年。
闰年条件:年份能被 400整除,或者年份能被 4整除但不能被 100整除。
SET TALK OFF
INPUT "请输入年份," TO year
IF
ELSE
ENDIF
SET TALK ON
RETU
求余函数,MOD(<数值表达式 1>,<数值表达式 2>)
MOD(36,10) MOD(36,-10) MOD(-36,10)
6 -4 4
求表达式 1除以表达式 2 的余数,符号同数值表达式 2;
结果为零表示能整除,不为零不能整除。
MOD(year,400)=0,OR,MOD(year,4)=0,AND,MOD(year,100)#0
year,"年是闰年 "
year,"年不是闰年 "
1964
1948
1600
2000
FoxPro For Windows http://cc.synu.edu.cn 9
FoxPro程序设计3,IF语句的嵌套, IF分支中使用 IF语句。
【 例 5.21】 输入一个字符,判断它属于字母、数字、特殊符号中哪一类。
SET TALK OFF
ACCEPT "请输入一个字符," TO ch
IF UPPER(ch)<="Z",AND,UPPER(ch)>="A"
ch,"是字母 "
ELSE
IF ch<="9",AND,ch>="0"
ch,"是数字 "
ELSE
ch,"是一个特殊符号 "
ENDIF
ENDIF
SET TALK ON
注意:
1,IF--ENDIF是一对,
缺一不可。
2、表达式为逻辑值;
3、嵌套时注意对应关系
小写转大写函数,UPPER(<字符串表达式 >)
大写转小写函数,LOWER(<字符串表达式 >)
FoxPro For Windows http://cc.synu.edu.cn 10
FoxPro程序设计
4、多分支,DO CASE-ENDCASE语句
DO CASE
CASE <expL1>
<statements1>
[CASE <expL2>
<statements2>
……
CASE <expLN>
<statementsN>]
[OTHERWISE
<statements>
ENDCASE
<expL1>为真?
<expL2>为真?
<expLn>为真?
<statements1>
<statements2>
<statementsn>
<statementss>
ENDCASE后语句
Y
N
依次判断,只执行条件为真的一组命令语句,之后转到
ENDCASE后。
FoxPro For Windows http://cc.synu.edu.cn 11
FoxPro程序设计
【 例 5.22】 用 CASE语句改写上例 (判断字母、数字、特殊符号 )程序,
SET TALK OFF
ACCEPT "请输入一个字符," TO ch
DO CASE
CASE UPPER(ch)<="Z".AND.UPPER(ch)>="A"
ch,"是字母 "
CASE ch<="9".AND,ch>="0"
ch,"是数字 "
OTHERWISE
ch,"是一个特殊符号 "
ENDCASE
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 12
FoxPro程序设计
【 例 5.23】 将百分制成绩转换为优、良、中、及格和不及格等级成绩。
90-100 优 ; 80-89 良 ; 70-79 中; 60-69 及格; 60分以下 不及格
SET TALK OFF
INPUT,请输入百分成绩 =” TO mscore
DO CASE
CASE mscore>=90,and,mscore<=100
Mgrade="优 "
CASE mscore>=80,and,mscore<90
Mgrade= "良 "
CASE mscore>=70,and,mscore<80
Mgrade= "中 "
CASE mscore>=60,and,mscore<70
Mgrade= "及格 "
CASE mscore<60
Mgrade= "不及格 "
OTHERWISE
Mgrade="输入错! "
ENDCASE
Mgrade
SET TALK ON
只执行
满足条件的
一个 CASE
FoxPro For Windows http://cc.synu.edu.cn 13
FoxPro程序设计
***思考:下面两程序中哪个正确?
***程序 1 ***程序 2
SET TALK OFF SET TALK OFF
INPUT "请输入成绩 =" TO mscore INPUT "请输入成绩 =" TO mscore
DO CASE DO CASE
CASE mscore>=90 CASE mscore<60
Mgrade=“优” Mgrade= "不及格 "
CASE mscore>=80 CASE mscore>=60
Mgrade=,良” Mgrade= "及格 "
CASE mscore>=70 CASE mscore>=70
Mgrade=,中” Mgrade= "中 "
CASE mscore>=60 CASE mscore>=80
Mgrade=,及格” Mgrade= "良 "
CASE mscore<60 CASE mscore>=90
Mgrade=,不及格” Mgrade="优 "
OTHERWISE OTHERWISE
Mgrade=“输入错!” Mgrade="输入错! "
ENDCASE ENDCASE
Mgrade? Mgrade
SET TALK ON SET TALK ON








FoxPro For Windows http://cc.synu.edu.cn 14
FoxPro程序设计
说明:
? IF …ENDIF 适合单重或双重分支,嵌套时依次判断。
? DO CASE …ENDCASE 适合三重以上分支,只执行
条件为真的一组语句。
? 注意语句格式,不可缺头少尾。
? 注意条件的合理性。
FoxPro For Windows http://cc.synu.edu.cn 15
FoxPro程序设计
查找
查找成功?
输出查询信息

显示错误信息


输入考号
考号验证?

成绩查询流程图
























循环结构 程序设计 ——问题的提出
FoxPro For Windows http://cc.synu.edu.cn 16
FoxPro程序设计
---DO 循环语句基本形式及其执行过程
? DO WHILE <expL> …… 循环开始语句
? <statements> …… 循环体
? ENDDO …… 循环结束语句
循环语句基本形式
循环语句执行过程 (流程图 )
<expL>为真否?
<statements>真
ENDDO后的语句

FoxPro For Windows http://cc.synu.edu.cn 17
FoxPro程序设计【 例 】 编程实现成绩查询。
SET TALK OFF
USE cjk
DO WHILE,T.
CLEAR
ACCEPT "请输入考号," TO kh
LOCA FOR sno=kh
IF FOUND()
sno,"的成绩如下,"
"语文,",yw
"数学,",sx
"英语,",yy
ELSE
"对不起,库中没有这个人 "
ENDIF
wait
ENDDO
USE
SET TALK ON
提示:
.T.为永真条件,将陷入死循环,一旦陷入死循
环,按 ESC结束程序运行。
为避免出现死循环,在循环体中必须有改变循环
控制变量值的命令 ; 条件不满足时退出循环。
FoxPro For Windows http://cc.synu.edu.cn 18
FoxPro程序设计
【 例 5.25】 改写上程序,实现按学号连续查询。
SET TALK OFF
USE cjk
DO WHILE,T.
CLEAR
ACCEPT "请输入考号," TO kh
LOCA FOR sno=kh
IF FOUND( )
sno,"的成绩如下,"
,语文:”,yw
,数学:”,sx
,英语:”,yy
ELSE
"对不起,库中没有这个人 "
ENDIF
WAIT "继续吗( Y/N)? " TO jx &&修改循环条件
IF UPPER(jx)= "N"
EXIT
ENDIF
ENDDO
USE
SET TALK ON 循环语句和条件语句嵌套
FoxPro For Windows http://cc.synu.edu.cn 19
FoxPro程序设计
LOOP和 EXIT语句:
常包含在 IF-ENDIF,DO CASE-ENDCASE语句之内。
LOOP和 EXIT命令的控制逻辑
DO WHILE <expL> DO WHILE <expL>
<statements> <statements>
LOOP EXIT
<statements> <statements>
ENDDO ENDDO
FoxPro For Windows http://cc.synu.edu.cn 20
FoxPro程序设计
【 例 】
set talk off
x=10
do whil x>0
x=x-1
X
endd
x
set talk on
retu
if x>5
loop
else
exit
endi
9
8
7
6
5
4
3
2
1
0
0
9
8
7
6
5
5
FoxPro For Windows http://cc.synu.edu.cn 21
FoxPro程序设计
---解析示例
求,1+2+3+4+5的和
SET TALK OFF
S=0
K=1
DO WHILE K<=5
S=S+K
K=K+1
ENDDO
?, S=1+2+3+4+5=”,S
SET TALK ON
RETURN
0
执行过程
S K
1初始值
第一次循环 1 2
3 3
6 4
10 5
15 6
第二次循环
第三次循环
第四次循环
第五次循环
运行结果, s=1+2+3+4+5= 15




FoxPro For Windows http://cc.synu.edu.cn 22
FoxPro程序设计
---循环结构的设计原则
求 1+2+3+4+5的和
SET TALK OFF
S=0
K=1
DO WHILE K<=5
S=S+K
K=K+1
ENDDO
?, S=1+2+3+4+5=”,S
SET TALK ON
RETURN
原则 1,循环开始的原则
原则 2,循环结束的原则


③ 循环控制变量,用来控制循环开始和结束,通常在程序中要
出现 3次。
FoxPro For Windows http://cc.synu.edu.cn 23
FoxPro程序设计
---循环结构的一般设计方法
求,1+2+3+4+5的和
SET TALK OFF
S=0
K=1
DO WHILE K<=5
S=S+K
K=K+1
ENDDO
?, S=1+2+3+4+5=”,S
SET TALK ON
RETURN
设计方法
循环体语句的设置
循环控制变量的修改
变量的设置及初始化
试一试:编程求任意自然数列和?
FoxPro For Windows http://cc.synu.edu.cn 24
FoxPro程序设计
---示例
求,5的阶乘 (5!=1*2*3*4*5)
SET TALK OFF
T=________
J=1
DO WHILE J<=5
T=________
J=J+1
ENDDO
?, T=1*2*3*4*5=”,T
SET TALK ON
RETURN
SET TALK OFF
T=________
J=1
DO WHILE J<=5
T=_________
J=J+1
ENDDO
?, T=1*2*3*4*5=”,T
SET TALK ON
RETURN
1
T*J





…J=5
…J>=1
…J=J -1
FoxPro For Windows http://cc.synu.edu.cn 25
FoxPro程序设计
---编写程序
求:任意输入的 5个数中的最大数
题目分析
1、三个变量,大、小、控制个数。
2、假定第一个数为当前最大数。
3、再次输入一个数时,与当前的最
大数进行比较,选择并确定新的最大
数做为当前最大数。
4、对于以后输入的数,重复 3的过程
,则最后保留的就是最大数。
例如:输入 3,6,2,8,5
6
num
2
3max 68
8
8max
5
FoxPro For Windows http://cc.synu.edu.cn 26
FoxPro程序设计
---求任意输入的 5个数中的最大数源程序
SET TALK OFF
INPUT,请输入第一个数:” TO max
I=1
DO WHILE I<=4
INPUT,请输入另一个数,” TO num
IF num>max
Max=num
ENDIF
I=I+1
ENDDO
,最大的数是:,,max
RETURN
FoxPro For Windows http://cc.synu.edu.cn 27
FoxPro程序设计
---总结与思考
总结
程序:求 s=1+2+3+4+5
程序:求 5!=1*2*3*4*5
程序:求任意输入的 5个数中的最大数
循环
循环条件的设置
循环变量的修改
思考
累和算法:求任意自然数列和、奇数和、偶数和
累积算法:求任意自然数列阶乘
比较选择算法:求其大、求其小
X为偶数条件:
MOD(x,2)=0
INT(x/2)=x/2
FoxPro For Windows http://cc.synu.edu.cn 28
FoxPro程序设计
【 例题 5.27】 编写程序绘制出如图所示三角形 。
SET TALK OFF
CLEAR
i=1
DO WHILE i<=3 &&循环变量 i控制行数, 值 1,2,3
j=1
DO WHILE j<=2*i-1 &&循环变量 j控制 *数, (1,123,12345)
@i,10-(i-j) SAY,*” &&*显示的位置 行 1 列 10
j=j+1 行 2 列 9,10,11
ENDDO 行 3 列 8,9,10,11,12
i=i+1
ENDDO
SET TALK ON
RETURN
外循环取一个值,然后执行内循环,内循
环都执行完后,外循环取第二个值,再执行内循环 …… 直至条件不满足时终止。
---循环嵌套,多重循环的执行
****
*****
FoxPro For Windows http://cc.synu.edu.cn 29
FoxPro程序设计
【 例 】 依次显示 STUDENT库中的记录。
*play516.prg
Set talk off
use student
DO WHILE,NOT,EOF()
disp
wait
skip
ENDDO
return
USE <filename>
DO WHILE,NOT.EOF()
……
<commands>
……
SKIP
ENDDO
EOF()函数的值起着循环控制变量的作用,它决定了循环何时终止。
SKIP起改变循环控制变量值的作用,SKIP命令每执行一次,都可
使 EOF()的值发生变化,直至为真,终止循环。
---对数据库记录依次操作
FoxPro For Windows http://cc.synu.edu.cn 30
FoxPro程序设计
SCAN-ENDSCAN循环语句( P94)
SCAN [<scope>] [FOR<expL1>] [WHILE<expL2>]
[<statements>]
[LOOP]
[EXIT]
ENDSCAN
特别为数据库的记录循环处理设计,内含 EOF( )和 SKIP的一种循环处理。
EOF()的值是循环条件,为真,退出循环;为假,执行循环体,然后记录指
针自动移到指定范围和条件内的下一记录。重新判断函数 EOF( )的值,直到
遇到文件尾,EOF( )为真时,结束循环处理。
内含 SKIP修改 EOF( )的值。
EOF()=?
<statements>
SKIP
ENDSCAN之后的语句
Y
N
---SCAN 循环语句基本形式及其执行过程
FoxPro For Windows http://cc.synu.edu.cn 31
FoxPro程序设计
【 例 】 分别用 WHIL和 SCAN循环显示 STUDENT数据库记录。
*DO WHIL循环 -play518.prg *SCAN循环 -Play519.prg
SET TALK OFF SET TALK OFF
USE STUDENT USE STUDENT
DO WHILE,NOT.EOF() SCAN
DISP DISP
SKIP ENDSCAN
ENDDO USE
USE SET TALK ON
SET TALK ON RETU
RETU
FoxPro For Windows http://cc.synu.edu.cn 32
FoxPro程序设计
【 例 5.29】 显示所有女学生的信息
SET TALK OFF
USE STUDENT
CLEAR
SCAN FOR SEX='女 '
"姓 名,",NAME
"学 号,",SNO
"奖学金,",SCHOSHIP
ENDSCAN
USE
SET TALK ON
FoxPro For Windows http://cc.synu.edu.cn 33
FoxPro程序设计
FOR <memvar>=<expN1> TO <expN2> [STEP <expN3>]
<statements>
[EXIT]
[LOOP]
ENDFOR |NEXT
用计数器 <memvar>控制循环体 <statements>重复执行的次数;
<memvar>应是一数值型的内存变量或数组元素;
<expN1>为循环初值,< expN2>为循环终值,<expN3>为递增的步长。
如果缺省 STEP子句,<expN3>的默认值为 1。
<memvar>=<expN1>
<memvar>><expN2>
<statements>
<memvar>= <memvar>+ <expN3>
ENDFOR之后的命令
Y
N
---FOR 循环语句基本形式及其执行过程
FoxPro For Windows http://cc.synu.edu.cn 34
FoxPro程序设计
【 例 5.26】 求数 1-10的累加和,用 FOR-ENDFOR循环实现。
SET TALK OFF SET TALK OFF SET TALK OFF
CLEA CLEAR CLEAR
H=0 H =0 H =0
i=1 FOR i=1 TO 10 FOR i=10 TO 1 STEP -1
DO WHIL i<=10 H = H +i H = H +i
H= H +i ENDFOR ENDFOR
i=i+1? H? H
ENDDO
H
试编写求任意数列的累加和的程序?
i=i+1 i=i-1
FoxPro For Windows http://cc.synu.edu.cn 35
FoxPro程序设计
【 例 】 求数 1-100间的偶数和,奇数和。
用 FOR-ENDFOR循环实现。
SET TALK OFF SET TALK OFF
CLEAR CLEAR
H =0 H =0
FOR i=2 TO 100 STEP 2 FOR i=1 TO 100 STEP 2
H = H +i H = H +i
ENDFOR ENDFOR
H? H
FoxPro For Windows http://cc.synu.edu.cn 36
FoxPro程序设计
编程练习:
1.用 FOR循环实现 1+2+3+…+N 的和。
2.用 FOR循环实现 1到 100之间奇数和与偶数和,
3.用 FOR循环求 10!。 (10!=1*2*3*4*......*10)
4.用 FOR循环求 N!。 (N!=1*2*3*4*......*N)
**求 10!
SET TALK OFF
CLEA
S=1
I=1
DO WHIL I <=10
S=S*I &&s=1*1*2*3*4……*10
I=I+1
ENDDO
S &&注意与 ‘ S=?,S显示形式不同。
SET TALK ON