,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,循环结构也称为重复结构,是指按照一定的条件重复执行具有特定功能的一段程序。循环结构是结构化程序的第三种根本结构,主要用来处理有规律的重复运算。,7.1 概述,【例7.1】计算并输出1+2+3+100的和。,【例7.2】假设某个单位要进行工资调整。现将工资数据库GZ.DBF 中职称为“工人的根本工资增加10元,将职称为“助工的根本工资增加15元,将职称为“工程师的根本工资增加25元,将职称为“高工的根本工资增加30元,并对各类调资人数进行统计。,循环结构是由以下三局部组成的:,设置初值:指对循环操作中使用的一些内存变量赋初值,也称为循环的初始化。循环体:指每次循环要重复执行的操作。,循环控制条件:指决定循环是否执行的条件,可以用一个关系表达式或逻辑表达式来表示。当循环控制条件为“真时,执行循环体,否那么将退出循环。,7.2 循环结构的实现命令,Foxpro提供了三类循环命令,即DO WHILE循环、FOR循环和SCAN循环。,7.2.1 DO WHILE循环,【格式】,DO WHILE ,ENDDO,其中,“DO WHILE和“ENDDO为关键字,表示循环控制条件,可以是关系表达式或逻辑表达式,为DO WHILE循环的重复执行局部,由一条或多条Foxpro命令组成,也可以为三种根本结构。,【功能】当成立时执行循环体,否那么将退出循环。,【说明】,“DO WHILE和“ENDDO分别表示循环结构的入口和出口,二者必须一起使用才能构成循环结构,缺一不可。,假设循环条件一开始就不成立,那么循环体一次也不执行。,在循环体内必须至少有一条命令与循环控制条件发生联系,其执行结果应当改变循环控制条件,使循环执行假设干次后能够正常结束,否那么将产生“死循环永无休止的循环。,编程时,DO WHILE 和 ENDDO应分别各占一行。,【例7.3】用,DO WHILE,循环编写例7.1的程序。,【例7.4】用,DO WHILE,循环编写例7.2的程序。,7.2.2 FOR循环,【格式】,FOR=TO STEP,ENDFORNEXT,其中,FOR和ENDFOR或NEXT为关键字,分别表示循环的开始入口和结束出口。循环变量为一内存变量,在FOR循环中要指定循环变量的初值、终值和增量或步长,、和可以是数值型常量、变量或表达式。为FOR循环的重复执行局部,由一条或多条Foxpro命令组成,也可以为三种根本结构。,【功能】实现指定次数的计数循环。,FOR循环的执行过程如下:,将循环变量赋初值,即循环变量=循环变量初值,并记下终值和增量。,将循环变量的值与终值比较,假设“超过终值,那么退出FOR循环,否那么执行循环体。,执行ENDFOR或NEXT命令,将循环变量增加一个增量,即循环变量=循环变量+循环变量增量。,将增值后的循环变量再与终值比较,即重复、,直到循环变量的值“超过终值为止。,【说明】,FOR和ENDFOR或NEXT必须成对出现,二者缺一不可。,FOR循环中循环变量的增量可以为正,也可以为负。为正时表示递增循环,即循环变,量的初值循环变量的终值。为负时表示递减循环,即循环变量的初值循环变量的终值。,当增量为1时,可以省略STEP。,FOR循环的执行次数为,INT终值-初值/增量+1,ENDFOR或NEXT命令有二个作用:将循环变量增加一个增量;将增值后的循环,变量再次与终值进行比较。,FOR循环的结束条件是循环变量的值“超过终值,而不是等于终值。对于递增循环,,循环结束条件是循环变量的值大于终值;对于递减循环,循环结束条件是循环变量的值小于,终值。,例:求n!(prog7_5.prg),7.2.3,SCAN,循环,【格式】,SCAN NOOPTIMIZE ,FOR ,WHILE,ENDSCAN,其中,,SCAN,和,ENDSCAN,分别表示循环的开始和结束,选项指定,SCAN,命令所要扫描的数据库的范围,可以是,ALL、NEXT n、REST,或,RECORD n,,缺省范围为,ALL,,即整个数据库。带,FOR可扫描指定范围内满足条件的数据,使用,WHILE可决定何时结束,SCAN,循环。,【功能】对当前数据库中指定范围内满足条件的记录进行扫描,并按设置的条件来执行循环体。,【说明】,SCAN和ENDSCAN必须成对出现,二者缺一不可。,SCAN循环主要用于数据库的处理,因此在执行SCAN命令之前,必须首先翻开要处理的数据库。,SCAN循环能够自动将数据库记录指针移到下一条记录并测试是否满足当前的条件,所以在SCAN.ENDSCAN的循环体内,不需要使用记录指针移动命令SKIP。,7.2.4 循环体中的两条专用命令EXITLOOP,在Foxpro的DO WHILE循环、FOR循环和SCAN循环中,可以使用EXIT命令强行退出循环体,也可以使用LOOP命令返回循环起始处重新判断循环条件。,跳出循环命令EXIT,【格式】EXIT,【功能】执行EXIT命令,跳出DO WHILE、FOR和SCAN循环,转向ENDDO、ENDFOR或NEXT、ENDSCAN后面的第一条命令处继续执行。,【说明】,EXIT命令只能出现在某个循环的循环体中,不能单独使用。通常将EXIT与单分支命令IFENDIF联用,作为退出循环的第二个条件,即当单分支命令中的条件成立时,忽略位于EXIT和ENDDO、ENDFOR或NEXT、ENDSCAN之间的所有命令,直接转向ENDDO、ENDFOR 或NEXT、ENDSCAN后面的第一条命令处继续执行。,不管EXIT命令后面是否还有其它命令,也不管当前的循环条件是否成立,都将无条件退出循环体,(例prog7_8.prg),重新判断循环条件命令LOOP,【格式】LOOP,【功能】执行LOOP命令,转向DO WHILE、FOR和SCAN命令的命令行重新判断循环条件。,【说明】,如果循环体中LOOP命令后面还有其它命令,那么这些命令将被忽略。,LOOP命令只能出现在某个循环的循环体中,不能单独使用。通常与单分支命令 IF,ENDIF联用,构成循环短路,忽略位于LOOP和ENDDO、ENDFOR或NEXT、ENDSCAN 之间的所有命令,直接转向DO WHILE、FOR和SCAN命令的命令行重新判断循环条件,以决定下一次循环是否执行。(prog7_9),7.2.5 几种常用的循环模式,例,prog5_4.prg,7.3 循环的嵌套,7.3.1 循环嵌套的概念和执行过程,【例7.10】输出如下的红星图案。,7.3.2 循环嵌套的有关规定,Foxpro的DO WHILE循环、FOR循环和SCAN循环可以相互嵌套,但必须注意DO WHILE与ENDDO、FOR与ENDFOR或NEXT、SCAN与ENDSCAN之间的匹配关系。,内循环必须完全嵌套在外循环的循环体内,不能够互相交叉。,例:求 1!+2!+10!,并列,FOR,循环的循环变量可以同名,嵌套循环的循环变量不能同名,。,FOR I=1 TO 10,FOR J=1 TO 5,.,ENDFOR,FOR J=1 TO 5,.,ENDFOR,ENDFOR,两个内循环属于并列的循环,可以使用相同的循环变量,J,,而下面的用法是错误的。,FOR I=1 TO 10,FOR I=1 TO 10,?*,ENDFOR,?,ENDFOR,当循环结构中出现分支结构时,分支结构必须完全嵌套在该循环的循环体内;反过来,当分支结构中出现循环结构时,该循环结构也必须完全嵌套在所属分支结构中。,例:,USE STUDENT,DO WHILE NOT EOF(),IF MOD(,编号,8)=1,DISPLAY,ENDIF,SKIP,ENDDO,USE,【例7.11】给定库文件GZK.DBF的结构如下:,Field Field Name Type Width Dec,1 工号 Character 6,2 姓名 Character 6,3 性别 Character 2,4 出生年月 Date 8,5 根本工资 Float 7 2,6 附加工资 Float 7 2,7 洗理费 Float 4 2,8 交通费 Float 4 2,9 书报费 Float 4 2,10 工龄 Numeric 2,11 职称 Character 6,要求在程序中首先拷贝数据库文件TEMP.DBF,然后据此库文件对根本工资字段值进行修,改。凡工龄15年及15年以上者增加65元,否那么,根本工资低于200元者增加45元;根本工,资在200299之间含200元和299元者增加30元;其余增加25元。,【例7.12】先在Foxpro下建立数据库文件EXAMPLE.DBF的结构,该数据库有三个字段:,FIELD1C/2、FIELD2C/2、FIELD3C/2,然后编写程序向该数据库中添加50 条记录。其中FIELD1字段各记录的数据从字母AZ依次顺序循环取值,即A、B、C、Z、A、B、C、,FIELD2字段各记录的数据从字母AZ依次隔2顺序循环取值,即A、D、G、Y、B、E、Z、C、F、X,FIELD3字段各记录的数据依次为:1、2、3、50。,【例7.13】给定数据库文件GZK.DBF数据库结构见例7.11,首先建立库文件 ZGGZK.DBF,该库文件只有一个字段:最高工资(F/7.2)。要求编写程序,找出GZK.DBF中“根本工资与“附加工资和最大者,并存入数据库ZGGZK.DBF的“最高工资字段中。,【例7.14】现有结构相同的三个班级学生数据库,CLASS1.DBF、CLASS2.DBF,和,CLASS3.DBF,,其数据库结构如下:,Field Field Name Type Width Dec,1,学号,Character 4,2,姓名,Character 6,3,性别,Character 2,4,出生日期,Date 8,5,民族,Character 6,6,政治面目,Character 4,7,是否委培,Logical 1,8,来源地区,Character 8,9,数学,Numeric 3,10,英语,Numeric 3,11,政治,Numeric 3,12,总分,Numeric 3,其中学号的前两位是学生所在班级号。首先在,Foxpro,下建立一个统计数据库,TJ.DBF,,该库包括七个字段:班级(,C,2)、,男、女、党员、团员、群众、少数民族,后六个均为数值型字段(,F,3.0)。,要求编写程序按班对学生数据进行性别、政治面目和民族统计,并将统计结果存放到,TJ.DBF,中。,【例7.15】在关系数据库系统中,两个关系的差运算是从一个关系中去除与另一个关系中相同的元组。现有结构相同的两个数据库,RDBF1.DBF,和,RDBF2.DBF,,其数据库结构如下:,Field Field Name Type Width Dec,1 MAINKEY Character 2,2 FIELD1 Character 2,3 FIELD2 Character 3,4 FIELD3 Float 5 2,5 FIELD4 Numeric 3,它们的主关键字都是,MAINKEY,字段。要求编写程序,根据主关键字从,RDBF1.DBF,中删除,RDBF2.DBF,中存在的相同记录,并把剩余记录复制到数据库,RDBF3.DBF,中。,