登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: 四、      流程控制语句(II)     [回主站]     [分站链接]
标题
四、      流程控制语句(II)
clq
浏览(2) + 2005-03-06 21:33:43 发表 编辑

关键字:

四、      流程控制语句(II)

上一章所讨论的REPEAT语句和WHILE语句都是条件循环语句,即根据某一条件的成立或不成立来判断是否重复执行一段计算过程,故重复的次数是不确定的。本章将给出一种重复次数确定的循环语句:FOR语句。上一章讨论的IF语句是只有二条路径分支控制语句,本章将讨论有更多路径分支控制语句:CASE语句。还将介绍固定转向的GOTO语句及与它连用的标号说明。

4.1 FOR语句
  
在执行循环次数确定的重复操作时,往往用FOR语句。例如计算

clq
2005-3-6 21:35:03 发表 编辑

[图片]
如图公式

clq
2005-3-6 21:35:44 发表 编辑

可写出程序:
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)。

clq
2005-3-6 21:37:12 发表 编辑

[图片]
图4-1 TO形式FOR语句语义       图4-2DOWNTO形式FOR语句语义

clq
2005-3-6 21:38:19 发表 编辑

执行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项之和的计算公式为:

clq
2005-3-6 21:40:35 发表 编辑

[图片]
例4-1级数eπ的前m+1项之和的计算公式为:

clq
2005-3-6 21:41:14 发表 编辑

要求自左至右至左二种方法来计算此和式,并比较它们的结果。
由算式可知,当自左至右计算时,和式中的每一项可由前一项算得。如

clq
2005-3-6 21:43:07 发表 编辑

[图片]
[这些公式好难打啊 [s:7] ]

clq
2005-3-6 21:43:54 发表 编辑

现在可写出完整程序如下:
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.

由于此程序不需要从标准文件input中读入任何数据,故在程序首部中不必列出input,程序中两个FOR语句的控制变量,初值和终值都是字符型。最后输出如下2结果:
abcdefghijklmnopqrstuvwsyz
zyswvutsrqponmlkjihgfedcba

例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为奇数。

clq
2005-3-6 21:45:05 发表 编辑

[图片]
例4-4写一程序计算和式

clq
2005-3-6 21:45:50 发表 编辑

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语句是一种很有用的语句,在学习第六章后,将会看到它与数组和其它有序类型的变量相联系时有更广泛的用途。


4.2 GOTO语句和标号说明

GOTO语句的作用是在某些限制条件下控制程序流程。以4.1节中的例4-4为例,当n足够大时,计算到和式的某一项ii时,其值可能已超过计算机所能允许的实数范围(如在PDP-11PASCAL中实数不能超过1038),此时运行时将发生溢出错误,计算被迫中止。为了使程序能测试这种情况并报告I为何值时终止执行的信息,我们对程序s1作某些修改,得到如下程序。

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.

将程序s2与s1比较,我们发现在说明部分增加了一个标号说明(LABEL 10,20,30),在语句部分增加了一个用来测试和式的某一项是否会溢出的IP语句,一个打印终止计算信息的writeln语句,二个GOTO语句和二个空语句。同时我们还发现在某些语句前增加了用冒号隔开的标号(如10,20,30)。从此例中可知,GOTO语句的一般形式为
GOTO<标号>
其中标号是一个无符号整数,它们必须出现在程序说明部分的标号说明中。GOTO语句将控制转向具有该标号的语句。如上例中GOTO10,转向具有标号10的writeln语句去执行。
在上例中,我们还发现在20和30后面没有实际执行的语句。此时我们把这些标号后的语句看成是空语句,即当控制转到标号为20的空语句时,意味着关于控制变量I的FOR语句的一次循环结束,接着执行该FOR语句的下一次循环。当控制转到标号为30的空语句时,意味着程序s2的执行结束。因此,空语句是不执行任何操作的语句。
标号说明的一般形式为:
LABEL<标号>,<标号>,…<标号>;


总数:15 页次:1/2 首页 下一页  >>  尾页  
总数:15 页次:1/2 首页 下一页  >>  尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1