通过上述学习和讲解,相信大家已对选择结构程序的使用及功能有了一个初步的了解,并能利用其功能解决一些实际问题。但在实际运用中,经常要完成一些多次相同的重复操作。如要计算某个单位所有纳税人的纳税金额、计算多组数的平均值及标准差等,为解决这类问题常采用循环结构的处理方法。VFP中提供了三种形式的循环结构语句。即DO WHILE…ENDDO(当型)、FOR ……ENDFOR□NEXT、SCAN……ENDSCAN。
1.DO WHILE 循环结构
【格式】DO WHILE<条件表达式>
【功能】执行时,系统首先判断条件表达式的值是否为真,若为真,则执行循环体中的所有语句序列,直到条件为假时,跳出循环,接续执行ENDDO的后续语句;反之,不执行循环体中的任何语句序列,跳出循环直接执行ENDDO的后续语句。循环结构流程图如图6-16所示。
图6-16 循环结构
【说明】(1)格式中的DO WHILE <条件表达式>称为循环体的开始语句,ENDDO称为循环结束语句,中间部分为循环体,是循环的主体部分。DO WHILE和ENDDO必须成对出现。
(2)DO WHILE语句作为循环结构的开始语句其作用是:通过对条件表达式值的判定决定是否执行循环体中的各语句序列。
(3)循环体是被多次执行的语句序列,既可用于一般意义上的循环次数固定的重复操作,也可用于完成某种特定操作。它常常由内嵌的选择结构语句和循环结构语句序列等组成。
(4)LOOP语句和EXIT语句作为可选语句用于决定特殊的控制。当系统执行到LOOP语句时,不管程序执行到何步,系统都会将控制转向循环结构的开始语句。而执行EXIT语句时,系统会将控制无条件转向循环结构的结束语句的后续语句。此时,DO WHILE语句中的条件表达式的值可能仍然为真,在程序设计中DO WHILE<条件表达式>…ENDDO结构主要用于有条件限定的循环处理操作。LOOP语句也称短路语句、EXIT语句也称断路语句。
(5)在循环结构中,为了避免<条件表达式>的值永远为真,造成程序“死循环”情况的发生,应在循环体中存在修改条件表达式值的语句操作,这是因为DO WHILE语句和ENDDO语句都不会影响<条件表达式>的值。
【例6-6】计算表达式12+22+32+42+…+1002的值。作为循环结构程序的第一个应用实例,本例计算前100个自然数的平方的和。并将结果存放到变量NUM1中,程序流程图如图6-17所示。
【例6-7】修改D盘VF文件夹下学生表文件中助学金字段,将计算机和经济贸易专业学生的助学金分别增加15元和5元。
图6-17 [例6-6]程序流程图
【例6-8】显示D:\VF文件夹下“教师”表文件中前6个记录的姓名、性别和工作时间各字段的数据,但姓崔者除外
【例6-9】循环输入教师姓名,查找并显示该教师的情况,直到停止输入。
本例中,由于条件表达式的值为.T.(永真),因此为避免造成死循环,在循环体语句序列中必须要有特殊的结束循环的出口语句,即EXIT语句。而控制该语句操作的是本例中的变量Ans,若Ans=”Y”或Ans=”y”的话,系统将执行EXIT语句退出循环操作,否则,当Ans=”N”或Ans=”n”时重复循环体的操作。
2.FOR循环结构
【格式】FOR<循环控制变量>=<变量初值> TO <变量终值> [STEP<步长>]
【功能】按照设置好的循环变量,执行固定次数的循环操作。循环变量的值为数值型内存变量。
【说明】(1)FOR循环也称步长型循环,主要适用于重复次数已知的循环操作。FOR语句和ENDFOR│NEXT语句必须成对出现在程序中。
(2)命令中<步长>的作用是改变初值变量每次循环的当前值。即初值当前值=初值前值+步长值。当步长的值为1时可省略。
(3)执行时,系统首先判断当前循环控制变量初值的绝对值是否小于循环控制变量终值的绝对值,若小于则执行循环体中的内容,否则退出循环执行ENDFOR│NEXT的后续语句。循环变量的初值和终值的当前值可正可负,但必须满足│初值│≤│终值│。重复执行的次数由表达式INT((终值-初值)/步长)+1的值确定。
(4)循环短路语句LOOP和循环断路语句EXIT与DO WHILE循环中的作用相同。
(5)ENDFOR│NEXT语句又称终端语句,它的作用①循环程序的结束语句;②计算循环变量初值的当前值。即自动完成:循环变量初值的当前值=循环变量初值的当前值+步长值的计算处理。
【例6-10】对于任意输入的一个自然数,判断是否为素数,若为素数则输出。
【例6-11】对于任意输入的一个自然数,计算其平方根(仅限于平方根的值为整数的情形)。
3.SCAN循环结构
【格式】SCAN [<范围>][FOR <条件表达式>]
【功能】在当前表的指定范围内自动的逐条移动记录指针,直到条件为假或到达文件尾。
【说明】(1)此循环结构只适用于表文件的重复操作。SCAN语句和ENDSCAN语句必须成对出现在程序中。作为循环终端语句,ENDSCAN语句既可表明循环程序段的终点,又可使记录指针移向下一条记录。
(2)作为对表文件的扫描语句,SCAN结构具有自动移向下一条记录的逐行扫描作用,因此,在循环体中不必再使用SKIP语句,(这一特性同DO WHILE语句截然不同)。如有需要则视SKIP <±表达式>不同的当前值采用隔行扫描操作。
(3)一般情况下,当利用SCAN循环结构进行表文件记录扫描时,系统默认的扫描范围为ALL(即全部表文件内容);若希望对表文件中的部分记录扫描时可通过范围子句确定。如:NEXT n子句、REST 子句等。
(4)循环短路语句LOOP和循环断路语句EXIT与DO WHILE循环中的作用相同。执行机理:当VFP系统执行到程序中的SCAN语句时,若SCAN语句中无范围和条件表达式子句时,将对整个表文件的所有记录按照循环体中语句的功能进行处理;反之,若含有范围和条件表达式子句时,若条件表达式的当前值为真时,则只对指定范围内满足条件的那些记录按照循环体中语句的功能进行处理。
【例6-12】用SCAN循环统计“教师”表文件中的男党员人数及女党员的人数。统计结果分别存放在变量MS和WS中。
【例6-13】利用SCAN循环显示“教师”表文件中第3条到第8条记录中工龄小于等于15年且大于4年的那些记录,并将统计结果存放在变量M1中。
(www.xing528.com)
满足条件的记录有3条
4.多重循环结构
前已述及,在VFP系统中选择结构中允许使用嵌套以解决较复杂的实际问题。同理,在循环结构中也可以嵌套,即允许循环语句结构的自身嵌套以及与选择语句结构之间合理嵌套使用,以满足各种不同实际问题的需求。嵌套层数可以达到多层,要求熟练掌握循环结构的双层嵌套。循环结构嵌套示意图如下:
【说明】(1)在循环处理中,不仅DO WHILE <条件表达式>结构可以使用嵌套,而且FOR语句、SCAN 语句都可以采用嵌套结构。
(2)作为嵌套结构的内循环结构的所有语句必须完全嵌套在外层循环之内,否则会出现循环的内外交叉造成逻辑错误。
(3)作为外循环的循环体既可以由一个完整的内循环结构组成,还可以由多个互不嵌套的内循环结构形成。每个内循环结构可由选择结构或顺序结构组成。
【例6-14】利用双重循环结构输出九九表
程序执行结果:
5.应用实例分析
以下结合前面所学的程序的三个基本结构给出在不同方面应用的几个实例,供大家阅读以便进一步掌握程序的设计方法。
(1)系统控制方面。
【例6-15】设计进入VFP系统的密码程序,如果输入的密码为系统的当前日期的前两位和系统当前时间的前两位之和,则在主窗口显示字符串“欢迎使用本系统”,否则重新输入密码,若三次输入的密码皆不正确,则显示字符串“您无法进入本系统”后退出。
(2)绘制平面图形方面
【例6-16】打印杨辉三角形
程序执行结果:
【例6-17】利用FOR双重循环结构输出如结果所示的三角形
程序执行结果:这里为了给出执行结果,输出图形的行数为5。利用本程序可以输出行数任意的图形。
【例6-18】打印正弦函数
程序执行结果:
(3)数据计算处理方面
【例6-19】我国古代数学家张丘建在《算经》中提出的“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一的百钱买百鸡问题”试编写程序计算出“公鸡”、“母鸡”、“鸡雏”各多少只。
程序执行结果:
【例6-20】任意输入10个数,并将它们按照由小到大的顺序升序排列并显示输出。
这里假定输入的原始数据是如下10个数:
程序执行结果是:
排序后的10个数为
通过对[例6-16]~[例6-18]三个例题的讲解和分析不难得出如下结论:即在利用循环嵌套程序输出这类问题的结果时,往往利用外循环决定字符输出的行数,内层循环用于处理结果并决定字符在每行显示的起始位置。
而[例6-19]~[例6-20]各题主要讲解和分析VFP程序在不定方程的求解计算及数据排序等方面的典型应用,相信大家通过这些内容的学习已对循环结构的程序设计乃至整个程序设计的思想已有了一个较深刻的认识,要想真正彻底掌握其设计思想和编写技巧还需平时多看、多练、巧练方可掌握其精髓。以下对循环结构的三种语句的使用及适用环境作一比较,见表6-4。
表6-4 DOWHILE、FOR、SCAN三种语句的比较
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。