可写出程序: PROGRAM sum(input,output); VAR x,xx,s:real; m,n:integer; BEGIN read(x,m); s:=0.0; xx:=1.0; FOR n:=1 TO m DO BEGIN xx:=xx*x; s:=s+xx; END; write(‘sum=’,s); END. 此程序一开始读入x及项数m,并对变量s及xx赋初值,然后用FOR语句逐项求和。 有两种形式FOR语句: FOR<变量>:=<表达式1>TO<表达式2>DO<语句> FOR<变量>:=<表达式1>DOWNTO<表达式2>DO<语句>; 其中保留字FOR后面的变量称为控制变量,必须是有序类型。表达式1是控制变量的初值。表达式2是控制变量的终值。这两表达式的类型必须类型赋值相容。DO后面的语句可以是任何一种语句,是循环的执行部分,称为循环体。下面我们用流程图来描述这两种FOR语句的语义。由图4-1和图4-2可知FOR语句的执行步骤为: (1)将表达式1的值赋给控制变量。 (2)判别控制变量的值是否小于等于(TO形式)或大于等于(DOWNTO形式)表达式2的值,若是则执行(3),否则执行FOR语句的后继语句。 (3)执行DO后面的语句,并将控制变量的值自动改成它的后继值(To形式)或前趋值(DOWNTO形式),返回到(2)。
执行FOR语句时应注意如下问题: (1)由语义图知,一个FOR语句可能一次也不执行DO后面的语句。例如: FOR i:=9 TO –5 DO <语句>; FOR i:=’A’ DOWNTO ‘G’ DO<语句> 这两个FOR语句的语法是正确的,但它们一次也不执行循环体。 (2)在循环体中不能改变控制变量的值。如计算 s=1+3+5+7+9 若用如下方法是错误的: s:=0; FOR n:=1 TO 9 DO BEGIN s:=s+n; n:=n+1; END; 正确的方法是: s:=0; FOR n:=1 TO 9 DO s:=s+2*n-1; (3)FOR语句执行结束后,控制变量无定义。此时不能认为控制变量的值是表达式2的后继值或前趋值。 (4)由于控制变量必须是有序类型的,故它可以是整型、字符型、布尔型、枚举型或子界型,但不能是实型。 下面我们举一些例子来说明FOR语句的用法。 例4-1级数eπ的前m+1项之和的计算公式为:
现在可写出完整程序如下: PROGRAM series (input,output); VAR M,n:integer; X,term,exl,ex2:real; BEGIN read(x,m); ex1:=1.0; term:=1.0; FOR n:=1 TO mDO BEGIN term:=term*x/n; ex1:=ex1+term; END; ex2:=term; FOR n:=m DOWNTO 1 DO BEGIN term:=term*n/x; ex2:=ex2+term; END; writeln(‘exforword=’,ex1,’’:10,’ex’ backward=’,ex2); END.
由于实数运算中的误差,此程序输出的二个结果是eπ的二个不相等的近似值。
例4-2 写一个程序,按顺序和倒序二种形式打印英文字母。 PROGRAM alphabets(output); VAR letter:char; BEGIN FOR letter:=’a’ TO ‘z’ DO write(letter);writeln; FOR letter:=’z’ TO ‘a’ DO write(letter) END.
例4-3写一个程序计算正整数1到n中的奇数之和及偶数之和。 PROGRAM oddeven(input,ouput); VAR M,n,oddsum,evensum:integer; BEGIN Read(n); oddsum:=0; evensum:=0; FOR m:=1 TO n DO IF m MOD 2=0 THEN evensum:evensum+m ELSE oddsum:=oddsum+m; Writeln(‘oddsum=’,oddsum,’ ’:5,’evensum=’,evensum); END.
程序中FOR语句的循环体是一个IF语句。布尔表达式m MOD 2=0为true时m为偶数,否则m为奇数。
PROGRAM s1(input,output); VAR i,j,n:integer; sum,t:real; BEGIN read(n); sum:=0.0; FOR I:=1 TO n DO BEGIN t:=1.0; FOR j:=1 TO I DO t:=t*i; sum:=sum+t END; write(‘s=’,sum) END. 此例中FOR循环体是一个复合语句,此复合语句中又包含一个FOR语句,请读者自行分析这两个FOR语句的执行情况及程序在执行时可能发生的问题。 FOR语句是一种很有用的语句,在学习第六章后,将会看到它与数组和其它有序类型的变量相联系时有更广泛的用途。
PROGRAM s2(input,output); LABEL 10,20,30; CONST limit=1E38; VAR I,j,n:integer; sum,t:real; BEGIN read(n); sum:=0.0; FOR i:=1 TO n DO BEGIN t:=1.0; FOR I:=1 TO i DO IF i<=limit/t THEN t:=t*I ELSE GOTO 10; sum:=sum+1; GOTO 20; 10: writeln(‘calculation terminated’, ’ ’ :5,’I=’,I:4,’ ’:5,’part of sum=’,sum); GOTO 30; 20: END; write(‘s=’,sum); 30: END.