第 8章 循 环
第 8章 循 环
8.1 三条循环语句
8.2 循环常用的三种基本控制方式
8.3 短路循环语句 LOOP
8.4 循环语句与其它分支判断语句的嵌套
8.5 循环语句应用举例
8.6 多重循环
第 8章 循 环
8.1 三条循环语句
8.1.1 循环语句 DO WHILE
1,DO WHILE语句的语句格式
DO WHILE语句的语句格式为,
DO WHILE〈 条件表达式 〉
〈 循环体 〉
ENDDO
循环语句格式中,DO WHILE 为循环起始语句
ENDDO为循环结束语句 循环体是几条语句组成的语句行
序列,执行循环体能完成的功能即为此循环的基本功能 。
第 8章 循 环
2,DO WHILE语句的执行过程
图 8 — 1给出了 DO WHILE语句的执行流程。
图 8 — 1 DO WHILE循环语句流程图
第 8章 循 环
① 系统在执行程序过程中,遇到了循环起始语句
DO WHILE时,首先计算 〈 条件表达式 〉 的值 。
② 执行到循环结束语句 ENDDO时,表示循环体已
结束,系统, 回跳, 到循环起始语句去再一次执行 DO
WHILE语句 。
ENDDO 和 DO WHILE 语句必须成对出现 。 在循
环体内必须有使 〈 条件表达式 〉 逐渐为假的语句 否则,
将进入死循环 。
第 8章 循 环
8.1.2 循环语句 SCAN
1,SCAN语句的语句格式
SCAN语句的语句格式为,
SCAN[ 〈 范围 〉 ] [ FOR〈 条件 1〉 ]
[ WHILE〈 条件 2〉 ] 〈 循环体 〉
ENDSCAN
语句格式中,SCAN为循环起始语句,ENDSCAN为
循环结束语句 。 本语句对范围内满足条件的记录执行
〈 循环体 〉 。 默认范围值为 ALL。
第 8章 循 环
2,SCAN语句的执行过程
在执行程序时,遇到 SCAN语句,系统即在范围内顺
序查找第一条满足条件的记录 (条件项以 WHILE开头时,
情况与以 FOR开头的有差别,见第 3章中命令的一般形
式 )。 找到后,即执行循环体部分,然后再顺次往下查找
下一条满足条件的记录 …… 搜索完范围内最后一条记录
后,SCAN语句执行完毕 。
第 8章 循 环
8.1.3 循环语句 FOR
1,FOR语句的语句格式
FOR语句的语句格式为,
FOR〈 循环变量名 〉 =〈 数字表达式 1〉
TO〈 数字表达式 2〉 [ STEP〈 数字表达式 3〉 ]
〈 循环体 〉
ENDFOR/NEXT
语句格式中,〈 循环变量名 〉 既可是一个内存变量,
也可以是某数组的一个下标变量 。 若不存在,则自动建
立之 。
第 8章 循 环
2,FOR语句的执行过程
图 8 — 2给出了 FOR语句的执行流程 。
图 8 — 2 FOR循环的执行流程
第 8章 循 环
第一步, 系统首先求出 〈 数字表达式 1〉, 〈 数字
表达式 2〉, 〈 数字表达式 3〉 (若缺省,默认为 1)的值,并
分别作为循环初值, 循环界值, 步长,存入内存有关区
域 。
第二步,系统给循环变量赋初值。
第三步,判断循环变量越界否 。 若越界,则 FOR循环
执行完毕,转去执行 ENDFOR(或 NEXT)后的第一条语句
若不越界,则执行循环体 。
第四步,遇到 ENDFOR(或 NEXT)时,循环变量内容增
加步长值 。 然后,转第三步 。
第 8章 循 环
对于 FOR语句的执行流程,再作如下说明:
① 三个表达式的值求出后,即送内存有关区域存储 。
以后,在执行循环体时,若对三个表达式中所含变量内容作
了修改,也不会影响到循环初值, 循环界值, 步长 。
② 给循环变量赋初值后,若初值已经越界,则一次也不
执行循环体,FOR语句就告结束,转 ENDFOR(或 NEXT)后
一语句 。
③ 当步长大于 0时,循环变量值大于循环界值时为越界
当步长小于 0时,循环变量值小于循环界值时为越界 。
④ 执行循环体时,若修改了循环变量值,将会影响到循
环执行次数。
第 8章 循 环
8.2 循环常用的三种基本控制方式
8.2.1 对库文件记录进行操作时的循环控制方式
1,对库文件记录进行逐条操作的循环控制方式
格式 1,SCAN
〈 语句行序列 〉
ENDSCAN
格式 2,DO WHILE,NOT.EOF( )
〈 语句行序列 〉
SKIP
ENDDO
第 8章 循 环
格式 1的循环起始语句 SCAN不带任何范围和条件,
因此,。
格式 2 中,循环起始语句 DO WHILE 的条件
为,NOT.EOF( ),在循环体内有执行一条记录指针下跳
一条记录的 SKIP语句 。 因此,也能实现对所有记录逐
条进行操作的目的 。
第 8章 循 环
2,选择库文件中符合条件的记录进行循环操作
格式 1,SCAN[ 〈 范围 〉 ] [ FOR〈 条件 〉 ]
〈 语句行序列 〉
ENDSCAN
格式 2,LOCATE[ 〈 范围 〉 ] [ FOR〈 条件 〉 ]
DO WHILE FOUND( )
〈 语句行序列 〉
CONTINUE
ENDDO
两格式都对范围内符合条件的记录逐条进行操作 。
执行完后,记录指针都指向范围内最后一记录 。
第 8章 循 环
例 2 修改库文件, 职工,DBF”中职工的工资,对
工资不超过 100元且不低于 50元者加 10元 。
依题意,例 2的流程图如图 8 — 4。
第 8章 循 环
图 8 — 4 例 2的流程图
第 8章 循 环
采用 SCAN语句,程序如下,
SET TALK OFF
CLEAR
SET PRINTER ON
USE 职工
SCAN FOR 工资 <=100.AND.工资 >=50
REPL 工资 WITH工资 +10
ENDSCAN
USE
SET PRINTER OFF
SET TALK ON
请读者采用 DO WHILE的方式自行试验。
第 8章 循 环
8.2.2 有限次循环的控制方式
有限次循环的控制方式用于预置循环次数的场合,
也称作计数器控制方式 。 假设预先限制的循环次数为 a,
则用 FOR循环时,格式为,
格式 1,FOR K=1 TO a
〈 语句行序列 〉
ENDF OR
格式 2,FOR K=a TO 1 STEP -1
〈 语句行序列 〉
ENDF OR
第 8章 循 环
使用 DO WHILE循环时,格式为,
格式 1,K=0
DO WHILE K< a
〈 语句行序列 〉
K=K+1
ENDDO
格式 2,K=a
DO WHILE K> 0
〈 语句行序列 〉
K=K-1
END DO
以上两种循环格式是等效的。
第 8章 循 环
例 对某种报表,要重复打印数张,编程实现之 。
用 FOR实现,程序如下,
SET TALK OFF
CLEAR
A=0
@ 5,10 SAY,请输入打印份数,, GET A
READ
FOR K=1 TO A
<打印报表程序段 >
ENDF OR
SET TALK OFF
请读者自行试验 DO WHILE方式。
第 8章 循 环
8.2.3 无限次循环的控制方式
这种循环控制方式用于对循环次数预先不知道的
情况,一旦进入循环后,希望在满足某种条件的情况下
才跳出循环 。
1,退出循环语句 ——EXIT
语句格式, EXIT
EXIT语句可放在循环体内的任何位置 。 当程序执
行到 EXIT语句时,立即迫使退出循环,转去执行循环后
的语句 。
EXIT语句通常包含在 IF语句或 DO CASE语句中,
当某条件出现时,才被执行。
第 8章 循 环
2,无限次循环控制方式的常用格式
格式 1,DO WHILE,T.
〈 语句行序列 〉
IF 〈 条件表达式 〉
EXIT
ENDIF
ENDDO
格式 2,DO WHILE,T.
〈 语句行序列 〉
DO CASE
CASE 〈 条件表达式 1〉
EXIT
第 8章 循 环
CASE 〈 条件表达式 2〉

ENDCASE
ENDDO
在这里,循环条件永远为真。 仅当 EXIT的控制条
件成立时,才能退出循环。
第 8章 循 环
8.3 短路循环语句 LOOP
实际应用中,还常常会遇到根据某种条件需短路正
在执行的循环体,重新回到循环开始处的要求 。 LOOP
语句提供了这种功能 。
语句格式, LOOP
LOOP语句可出现在循环体内任一位置 。 它的功能
为,强迫结束本次执行循环体的工作,就好像执行循环
体时,遇到了循环结束语句 ENDDO,ENDSCAN或
ENDFOR。
LOOP语句应和条件语句结合使用。
第 8章 循 环
例 假设有一个数据库文件, 工资,DBF”,其中包括
有, 姓名,,, 实发工资, 等字段,共有 20个记录 。 现
在要求显示出此数据库中前 10个记录的, 姓名, 和
,实发工资,,但是,如果遇到, 姓名, 为, 王林, 的
则不显示 。 试编程序实现之 。
依题意绘制本例的流程图如图 8 — 6。
第 8章 循 环
图 8 — 6 本例的流程图
第 8章 循 环
8.4 循环语句与其它分支判断语句的嵌套
在上一章中曾指出,所谓嵌套,即为, 在一个语句的
一个完整的分量中,包含了另一个完整的语句 。 一个循
环语句,有且仅有一个完整的分量,就是循环体 。
在 8.3节的例中,循环语句中嵌套了条件语句和情况
语句 。 下面,以 DO WHILE语句为例,给出它们互相嵌
套的一般形式 。
第 8章 循 环
DO WHILE 〈 条件表达式 〉 IF 〈 条件表达式 〉
IF 〈 条件表达式 〉 DO WHILE 〈 条件表达式 〉
… …
ELSE ENDDO
… …
ENDIF ENDIF
ENDDO
DO WHILE 〈 条件表达式 〉 DO CASE
DO CASE CASE 〈 条件表达式 〉
… CASE 〈 条件表达式 〉 DO WHILE 〈 条件表达式 〉
… ENDDO
CASE 〈 条件表达式 〉 CASE 〈 条件表达式 〉
ENDCASE ENDCASE
ENDDO
第 8章 循 环
8.5 循环语句应用举例
要求编写一个程序, 根据库中录入的各门课成绩,
计算出每个学生的语文和数学两门主课的平均成绩与
五门课的总平均成绩,然后根据学生的成绩来决定学生
是升级, 留级,还是补考 。 如果主课平均成绩及格者,
则升级 主课平均成绩不及格,但总平均成绩及格的,则
给予补考 主课平均成绩不及格,且总平均成绩也不及格
者则留级 。 最后,分别打印出升级学生名单, 留级学
生名单和补考学生名单 。
第 8章 循 环
根据题意要求,绘制流程图如图 8 — 7。
图 8 — 7 循环语句应用举例的流程图
第 8章 循 环
8.6 多重循环
多重循环即循环的嵌套,在一个循环的循环体中,
包含有另一个循环 。 我们称外层循环为外循环,被包含
的循环称为内循环 。
以 DO WHILE为例,多重循环的一般格式如下,
第 8章 循 环
DO WHILE 〈 条件表达式 1〉
〈 语句行序列 11〉
DO WHILE 〈 条件表达式 2〉
〈 语句行序列 21〉
第 第 第
一 二 三 DO WHILE 〈 条件表达式 3〉
层 层 层 〈 语句行序列 3〉
循 循 循 ENDDO 3
环 环 环 〈 语句行序列 22〉
ENDDO 2
〈 语句行序列 12〉
ENDDO 1
第 8章 循 环
例 对上一节循环语句应用举例中一个班学生成
绩的统计问题,将其统计范围扩大到对全校所有学
生 。 假设一个中学有 12个班,试编制程序实现 。 我们按
班级建立数据库文件,一个班级的学生情况存放在一个
数据库文件里 。 这样则有 12个库文件,这些数据库文件
的文件名分别是, XSCJ1,XSCJ2,…,XSCJ12”。
依题意给出流程图如图 8 — 8。
第 8章 循 环
图 8 — 8 本例流程图
第 8章 循 环
这个框图中的内循环部分是我们所熟悉的 。 当打开
某个班的数据库文件,按指针逐条记录对每个学生的成
绩进行统计,直到记录指针指向文件尾,结束内循环 。
外循环的循环控制变量为 X,控制循环的条件为 X<
=12,即在全校 12个班之内对各班的学生成绩进行统计 。
编程的难点是当 X< =12时,如何打开不同班级的数
据库文件 。 我们先给出程序,然后再解释这个问题是如
何解决的 。
第 8章 循 环
SET TALK OFF
FOR X=1 TO 12
IF X< 10
L=STR (X,1)
ELSE
L=STR (X,2)
ENDIF
USE XSCJ & L
SCAN
REPLACE 主平均 WITH (语文 +数学 )/2
REPLACE 总平均 WITH (语文 +数学 +物理 +化学 +英
语 )/5
DO CASE
第 8章 循 环
CASE 主平均> =60
REPLACE 升留判定 WITH,升级,
CASE 主平均< 60.AND.总平均< 60
REPLACE 升留判定 WITH,留级,
CASE 主平均< 60.AND.总平均> =60
REPLACE 升留判定 WITH,补考,
ENDCASE
ENDSCAN
LIST FOR 升留判定 =“升级, TO PRINT
LIST FOR 升留判定 =“留级, TO PRINT
LIST FOR 升留判定 =“补考, TO PRINT
ENDFOR
SET TALK ON
第 8章 循 环
流程图中的, 打开 XSCJ N文件, 部分,由程序中的
第 2~8条语句组成,它们为内循环准备了条件 。
对于不同的 X值,我们希望打开不同的数据库文件。
总括整个程序,不难看出,外循环是由三个部分组成 。
第 8章 循 环