Tivoli 服务台 6.0 开发工具包脚本程序设计指南

第 3 章:条件结构和控制结构

返回目录


简介

本章包括处理测试的条件结构和控制结构以及对测试条件的响应。这些结构也提供按需要改变程序流程和重复操作的方法。

条件结构

开发工具包提供两种条件结构:

控制结构

开发工具包提供几种结构用于改变程序流程:

IF 语句

IF 语句形式

开发工具包 IF 语句的一般形式是:

IF <条件> THEN
<语句列表> 
ELSIF <第二个条件> THEN
<语句列表> 
ELSE 
<语句列表> 
  END; 

如果只测试一个条件,则不需要 ELSIFELSE 语句。

IF 实例

这种结构的使用实例是:

IF (age < 18) OR (age > 90) THEN 
  WRITELN('Improper age, please re-enter'); 
  END; 
IF display = 'CGA' THEN 
  LoadCGADriver; 
ELSIF display = 'MCGA' THEN 
  LoadMCGADriver; 
ELSIF display = 'EGA' THEN 
  LoadEGADriver; 
ELSE 
  LoadVGADriver; 
  END; 
IF processor = '8086' THEN 
  maxMem := 640000; 
  operatingSystem := 'DOS'; 
ELSE 
  maxMem := 16000000; 
  operatingSystem := 'OS/2'; 
(* operatingSystem is a string *)
  END;


真条件

IFELSIF 总是后跟布尔条件。如果条件为 TRUE,执行 IFELSIF 后的语句。

假条件

如果条件求值为 FALSE,出现下列三种情况之一:

短路布尔求值

开发工具包使用短路布尔求值。这意味着:


WHEN 语句

WHEN 语句是 IF 语句的特殊形式,它使用户能根据变量或表达式的值执行操作。

IF 语句实例

考虑下列 IF 语句:

IF i*j = 1 THEN 
  WriteOne; 
ELSIF i*j = 2 THEN 
  WriteTwo; 
ELSIF i*j = 3 THEN 
  WriteThree; 
ELSE 
  WriteOther; 
  END; 

在前面实例中,检查从表达式 i*j 返回的值包括对每个输入值重新计算表达式。如果 i*j 大于 3,三次求值表达式 i*j

此方法有两个负面影响:

一种替代方法是把 i*j 的值赋给一个本地变量,然后在 IF 语句中使用该变量。

WHEN 语句实例

对维护和性能一种更好的解决方法是使用 WHEN 语句,而不使用 IF 语句。

开发工具包 WHEN 语句提供求值条件的更好的方法,如下面所示。

WHEN i*j IS 1 THEN 
  WriteOne; 
ELSWHEN 2 THEN 
  WriteTwo; 
ELSWHEN 3 THEN 
  WriteThree; 
ELSE 
  WriteOther; 
  END; 

WHEN 语句求值表达式一次,然后把它与每个测试值比较。表达式必须是简单数据类型整数或字符串。

注释:当使用字符串时,WHEN 不区分大小写。

用户也可使用此例所示的逗号分隔的格式,指定多个测试值:

WHEN i*j IS 1,2,3 DO 
  WriteOne; 
ELSWHEN 4,5,6 DO 
  WriteTwo; 
ELSWHEN 7,8,9 DO 
  WriteThree; 
ELSE 
  WriteOther; 
  END; 

FOR 循环

FOR 循环结构用来把一个或多个语句执行事先确定的次数。FOR 结构的形式如下:

FOR <循环参数>:=<下界> TO <上界> DO
<语句列表> 
  END; 

此形式的要素如下表所示。

要素 说明
<循环参数> 整数变量,把它赋值为<下界>和<上界>之间的值(包括界值)
<下界> 整型表达式,在循环开始时求值一次,并把它赋值给<循环参数>
<上界> 整型表达式,在循环开始时求值一次,每次执行一次循环把它和<循环参数>值比较
<语句列表> 一个或多个开发工具包语句,对<下界>和<上界>之间(包括界值)的每个<循环参数>执行该语句

FOR 实例

下列实例显示 FOR 语句的最简单使用方法。在此实例中,把字符串写到显示器 10 次。在语句列表内,不使用 i 变量的值。

FOR i:=1 TO 10 DO 
  WinWriteLN(myWindow,'Hello'); 
  END; 

下列实例稍微复杂一些。

FOR i:=j TO k*3 DO 
  WinWriteLN(myWindow,'i = ' & i); 
  END; 

注释:如果下界等于上界,执行语句列表一次。如果下界大于上界,根本不执行语句列表。

使用 DOWNTO

如下例所示,为了从高值到低值循环,可用关键字 DOWNTO 取代 TO:

FOR i:=10 DOWNTO 1 DO 
  WinWriteLN(myWindow,i); 
  END;


在列表中使用 FOR

FOR 语句有另一种形式,用于类型为列表的变量:

FOR <列表参数> DO
<语句列表> 
  END; 

这里,对列表参数中的每个值执行一次语句列表。把列表参数的当前元素指针($Current)初始化为指向列表中的第一个元素。在语句列表执行终止时,元素指针向前移动。这使得对列表中的每个元素执行一个或多个语句。

考虑下列实例:

ListInsert(myList,'One'); 
ListInsert(myList,'Two'); 
ListInsert(myList,'Three'); 
FOR myList DO 
  WinWriteLN(myWindow,myList[$Current]); 
  END; 

REPEAT 循环

REPEAT 循环结构一次执行一组语句,然后继续执行这些语句,直到一定的条件成为真。
REPEAT 循环结构的形式如下:

REPEAT 
<语句列表> 
UNTIL <条件>; 

下列代码把字符串'Hello'写到屏幕 10 次:

i:=1; 
REPEAT 
  WinWriteLN(myWindow,'Hello'); 
  i:=i + 1; 
UNTIL i > 10; 

布尔表达式

在前面的实例中,<条件>是布尔表达式,每执行一次循环对它求值一次。如果它求值为假,再执行<语句列表>中的语句。
布尔表达式可包括由下列项连接的子句:

子句包括两个兼容数据类型的表达式,中间由关系运算符(=、>、<等等)分隔。

WHILE 循环

WHILE 循环结构与 REPEAT 循环结构类似,差别在于它只是在循环开始时测试出口条件,而不是在循环终止时测试。REPEAT 循环结构中的语句保证至少执行一次,而如果初始时循环条件为假,WHILE 循环结构中的语句根本不执行。

WHILE 循环结构的形式如下:

WHILE <条件> DO
<语句列表> 
  END; 

下列程序是把字符串'Hello'写到屏幕 10 次:

i:=1; 
WHILE i <= 10 DO 
  WinWriteLN('Hello'); 
  i:=i + 1; 
  END; 

Exit 和 ExitLoop 语句

Exit

Exit 语句可用来从函数或过程调用中退出。当使用它时,即使把它放在 FORREPEATWHILE 循环中,它使当前例程完全停止。

ExitLoop

如同它的名称所暗示的,在循环终止条件成为真之前,ExitLoop 语句可用来退出循环。

在下列实例中,建立循环以从 EMPLOYEES 数据库表中读取并打印每一行。如果 SQLFetch 语句失败,返回一个小于 1 的值(因此指示出现错误或达到设置的结果终止),ExitLoop 语句使循环停止执行。执行紧跟在循环后的下一个语句。

ExitLoop 实例

下列实例显示 ExitLoop 的使用。

VARIABLES 
  i: Integer; 
  cursor: SQLCursor; 
  employee: EmployeeRecord; 
ACTIONS 
  i:=SQLSelect(cursor,'SELECT * FROM EMPLOYEES'); 
  WHILE i > 0 DO 
    i:=SQLFetch(cursor,employee); 
    IF i < 1 THEN 
      ExitLoop; 
  END; 
    PrintEmployee(employee); 
  END; 
  SQLCloseCursor(cursor);

Tivoli 服务台 6.0 开发工具包脚本程序设计指南

返回目录

版权所有