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


[图片]
图4-3程序s2的流程图

clq
2005-3-6 21:51:57 发表 编辑

了解了上述关于GOTO语句,空语句,标号及标号说明的定义后,现在我们可以解释程序s2的执行情况。为简洁直观起见,我们用流程图来说明。
结合流程图再阅读程序s2可知:GOTO语句可中断FOR语句的执行,将控制直接转到循环体外(如GOTO10将控制从关于j的循环体中跳出去;GOTO30将控制从关于I的循环体中跳出去)。将GOTO语句与空语句连用,可在循环体内跳过某些语句到达循环体的末尾(如GOTO20)。
一般而言,利用IF语句和GOTO语句联合完成的某些计算过程可由REPEAT语句或WHILE语句来代替,故GOTO语句在PASCAL中不是一种必要的语句,因此在某些实现方案中不包括GOTO语句。读者可试行在程序s2中去掉GOTO语句,用REPEAT语句或WHILE语句来实现。
在本节一开始,我们曾指出GOTO语句是在某些限制条件下控制程序转移的,这些限制是:
(1)只能用GOTO语句从一个语句结构中转出来,而不能从外部转入到一个语句结构的内部。如以下用法都是错误的的。
FOR I:=1 TO N DO
  BEGIN
  …
  99:<语句>
   …
  END;
  …
  GOTO 99;
  …
  WHILE q DO
    BEGIN
    …
    4:<语句>
    …
    END;
    …
    GOTO 4;
    IF <布尔表达式> THEN s1
      …
      ELSE 3: s2;
      …
    GOTO 3;
      …
(2)可以用GOTO语句从一个过程中转出,但不能从一个过程的外面转入过程内部,关于过程的定义将在第五章中叙述。这里我们先住这个规定。


4.3 CASE语句

CASE语句是一种多路径分支控制语句。它根据一个有序类型的表达式的值来选择执行若干语句中的一个语句。故在执行多分支控制时用CASE语句写出的程序比用IF语句写的程序更简洁、清晰,且不易出错。如:已知实型量a,b,c,x.。计算分段函数
    a+bx+cx2       0.5≤x<1.5
    (asin(bx))2       1.5≤x<2.5
y=   √a+bx2       2.5≤x<3.5
    aln|b+c/x|       3.5≤x<4.5
首先我们用IF语句来完成该分段函数的计算(设0.5≤x<4.5);
IF(0.5<=x)AND(x<1.5)
THEN y:=a+b*x+c*sqr(x)
ELSE IF (1.5<=x) AND (x<2.5)
  THEN y:=sqr(a*sin(x))
  ELSE IF (2.5<=x)AND(x<3.5)
  THEN y:=sqrt(a+b*x*x)
  ELSE IF(3.5<=x) AND (x<4.5)
    THEN y:=a*ln(abs(b+c/x));
尽管用IF语句可以写出此分段函数的计算,但显得繁琐且不易阅读。下面我们改用CASE语句来写:
CASE trunc(x+0.5) OF
1:y:=a+b*x+c*sqr(x);
2:y:=sqr(a*sin(x));
3:y:=sqrt(a+b*x*x);
4:y:=a*ln(abs(b+c/x))
END;
函数trunc(x+0.5)将根据x落在[0.5,1.5][2.5,3.5]及[3.5,4.5]4个区间中相应地取整数值1,2,3,4。此CASE语句根据函数trunc(x+0.5)的值,选择执行OF后面列出的4个语句中具有相应常数值的那个语句。如trunc函数的值为8,则执行语句y:=sqrt(a+b*x*x),其它3个语句不执行。由此例可见,CASE语句的一般形式为:
CASE<表达式> OF
<常数表1>:<语句1>
<常数表2>:<语句2>
   .
    .
<常数表n>:<语句n>
END;
其中表达式必须取有序型的值,因此它可以是整型、字符型、布尔型或我们以后将炒学到的枚举型和子界型。此表达式称为选择器。常数表是一串用逗号隔开的与表达式同类型的常数。语句可以是任何一种语句,包括复合语句和空语句。最后一个语句与END之间不可出现分号。
CASE语句的语义是执行与表达式的值相同的常数后面的那个语句,然后再执行此CASE语句的后继语句。若表达式的值与所有常数表中的任一常数不相等时,标准PASCAL未定义这种情况。在有些实现方案中把这种情况定义为执行一个空语句,也有一些实现方案中定义为出错。为解决这个问题,有些实现方案中除上述CASE语句的形式外,还增加一种带保留字OTHERWISE的形式,即:
CASE<表达式> OF
<常数表1>:<语句1>;
<常数表2>:<语句2>;
      .
      .
<常数表n>:<语句n>;
OTHERWISE<语句>;
END;
此种形式的CASE语句在前一种CASE语句的基础上扩充语义为:若表达式的值与所有常数表中的任一常数不相等时,执行OTHERWISE后面的那个语句。利用这种形式的CASE语句,有时可更完美地解决问题。在前述的分段函数计算中,若由输入数据或前面计算的差错,x的值没有落在所定义的4个区间中,为使程序员在运行时能了解这一情况,我们可用带OTHERWISE的CASE语句来实现:
CASE trunc(x) OF
1:y:=a+b*x+c*sqr(x);
2:y:=sqr(a*sin(x));
3:y:=sqrt(a+b*x*x);
4:y:=a*ln(abs(b+d/x));
OTHERWISE writeln(‘ x is not in the expected intervals’,’’:5,’x=’,x)
END;
执行此语句时,当x不在所定义的区间时,将输出提示信息和x的值。
下面举两个程序例来进一步说明CASE语句的用途。

例4-5 编一个程序,计算某年某月有几天,假设年号能被4整除为闰年,即此年中的二月份有29天。
PROGRAM monthday(input,output);
VAR
  yy,mm,len:integer;
BEGIN
  read(yy,mm);
  CASE mm OF
  1,3,5,7,8.10,12: len:=31;
  4,6,9,11     : len:=30
2      :IF(yy MOD 4=0)AND (yy MOD 100<>0)
            OR (yy MOD 400=0)
            THEN len:=2) ELSE len:=28
END;
writeln(The lenth of’,yy:5,mm:3,’is’len:3)
END.
程序中CASE语句的选择器是整型变量mm,根据mm的值将执行三个语句中的一个,其中常数2后面的是一个IF语句,用来判别二月份该是28天还是29天。

例4-6 编一个程序,模拟袖珍计算器的加、减、乘、除四则运算。该程序能读入数据,并按算式计算出结果。如当你在终端键盘上打
      10.8+0.13*10=
后,程序将计算出结果109.3。

PROGRAM pocketcalculator(input,output);
LABEL 10;
VAR
x,y:real;
operator:char;
BEGIN
readln(x); readln(operator);
WHILE operator<>’=’ DO
;
BEGIN
  readln(y);
  CASE operator OF
  ‘+’:x:=x+y;
  ‘-’:x:=x-y;
  ‘*’:x=x*y;
  ‘/’:IF y<>0 THEN x:=x/y
        ELSE BEGIN
          Writeln(‘Divisor is zero’);
          GOTO 10
          END;
  OTHERWISE BEGIN
          Writeln(‘Illegal operator’);
          GOTO 10
          END
  END;
  readln(operator);
  END;
  writelm(x:12:4);
10:
END.

程序中四则运算是在一个WHILE语句中执行的。该语句连续执行算式的知项运算,直到你打入一个等号为止。在循环体中一个CASE语句,按选择器operator的值,分别执行加、减、乘、除操作。执行除法时,若除数为零,则输出提示信息并停止计算。CASE语句中的OTHERWISE子句是一个复合语句,当操作员打入非法运算符时,将报错并停止计算。
使用CASE语句时必须注意的是:各子句前的常数不是语句标号,它不能当作为GOTO语句的转向目标。在一个CASE语句中的各个常数只能出现一次。

     习 题 四

1.      利用循环语句计算sin(x),cos(x),tg(x)每隔10的函数值(区间为00-1800)。
2.      编制一个程序找出3到100之间的全部素数。
3.      编制程序将20个数读入计算机,并统计出其中正负数的个数。
4.      某工厂1980年的产值为200万元,计划年增长率为5%计算并输出1985年,1990年,1995年,2000年的产值。
5.      写出一程序,它能读并计算如下表达式
+15-4+3+169;
6.      写一个程序,计算调和级数
h(n)=1+1/2+1/3+…+1/n
的值,并输出结果。

clq
2005-3-6 21:53:23 发表 编辑

[图片]
...

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

8.编写一程序能读入50个学生的考试成绩。输入数据为学号和成绩,该程序能输出学号、成绩。并能根据考试成绩(100分制)按下表格打印出每一个学生的成绩评语。
成绩Mark      80-100      60-79      50-59      40-49      0-39
评语      Very good      Good      Fair      Poor      Fail

9.编写一程序能读入算术表达式,并对该表达式中圆括号是否配对进行检查。假设表达式中不出现空格,而整个表达式以空格‘└┘’结束,该程序能分别情况进行打印出左圆括号多于右括号或者右括号多于左括号等信息。
10.编写一程序能自动形成并输出打印杨辉三角形(亦称PASCAL三角形),其格式如图所示。
[code]
  1
  1 1
1 2 1
1 3 3 1
1 4 6 4 1
[/code]

11.例4-6中运算符+,-,*,/是没有优先性差别的。改编程序Pocketcalculator,使它能实现先乘除后加减的运算。即算式
      10.8+0.3 *10=
的结果不是109.3,而应得到12.1
(提示,在程序中增加一个存贮中间结果的变量z,当运算符为+,-时,把z与x累加;当运算符为*,/时,z与y运算。)

clq
2005-3-6 22:03:58 发表 编辑

[CLQ注释:好了,总算这第4部分也完成了。当年我写杨辉三角还挣过同桌的5元钱 :) 我个人觉得这部分的例子给得太难了,适合于课堂,不太适合于网络这样快餐式的学习,要理解这些概念其实可以用很简单的几个例子就OK了。好,以后再说吧。]

总数:15 页次:2/2 首页 << 上一页 尾页  
总数:15 页次:2/2 首页 << 上一页 尾页  


所在合集/目录



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


附件:



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

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