63  程序三种基本结构

631 顺序结构

顺序结构是在程序执行时,根据程序中语句的书写顺序依次执行的命令序列。WITNESS系统中的大多数命令都可以作为顺序结构中的语句。

632 分支结构

分支结构是在程序执行时,根据不同的条件,选择执行不同的程序语句,用来解决有选择、有转移的诸多问题。

分支结构有单向分支和多向分支语法结构,分别如下:

(1) 单向分支,也叫简单分支结构

IF <条件表达式>

    <命令行序列>

ENDIF

该语句首先计算<条件表达式>的值,当<条件表达式>的值为真(T)时,执行<命令行序列>;否则,则执行ENDIF后面的命令。

(2) 多向分支,也叫复杂分支结构

     IF <条件表达式1>

           <命令行序列1>

ELSE

           <命令行序列2>

ENDIF

该语句首先计算〈条件表达式1〉的值,当〈条件表达式1〉的值为真时,执行〈命令行序列1〉中的命令;否则,执行〈命令行序列2〉中的命令;执行完〈命令行序列1〉或〈命令行序列2〉后都将执行ENDIF后面的第一条命令。

3)使用分支语句应注意的几点:

l  IF… … ENDIF必须配对使用;

l  〈条件表达式〉可以是各种表达式或函数的组合,其值必须是逻辑值;

l  〈命令行序列〉可以由一个或多个命令组成,也可以是条件控制语句组成的嵌套结构。

4)示例

IF  (water_level >= 0) AND (water_level <= 5)

       PRINT "The level in the water tank is low"

ELSEIF  (water_level > 5) AND (water_level <= 10)

       PRINT "The level in the water tank is normal"

ELSE

       PRINT "The level in the water tank is high"

ENDIF

这段程序是用来检测容器中的水位的。变量water_level记录容器的水位,当水位在[05]之间时,在交互窗口(interact box window)中打印出“The level in the water tank is low”语句,提醒水位较低;如果第一个条件不满足,判断第二个条件表达式,看水位是否在(510]之间,若表达式为真,在交互窗口中打印出“The level in the water tank is normal”语句,提醒水位正常;当条件二也不满足时,唯一的一种情况就是水位高于10了,此时在交互窗口中打印出“The level in the water tank is high”语句,提醒水位超高了。

633 循环结构   

允许有限次重复执行某一特定的程序。

1)计数型循环

基本语法如下:

FOR〈循环变量〉=〈循环变量初值〉TO〈循环变量终值〉 STEP〈循环变量步长〉]

           〈命令行序列〉

NEXT

参数说明:

循环变量:一般情况下为整型变量,并且其数量为一,即不是数组;

循环变量初值、循环变量终值:数值型常量、变量或表达式;

循环变量步长:每次步进的长度,可以为整数,也可以为负数;缺省时为1

 

语句功能:

该语句用〈循环变量〉来控制〈命令行序列〉的执行次数。执行语句时,首先将〈循环变量初值〉赋给〈循环变量〉,然后判断〈循环变量〉是否大于或小于〈循环变量终值〉,若结果为,则结束循环,执行ENDFOR 后面的第一条命令;否则,执行〈命令行序列〉,〈循环变量〉自动按〈循环变量步长〉增加或减少,再重新判断〈循环变量〉当前的值是否大于或小于〈循环变量终值〉,直到其结果为真。

示例

NUMBER_FOUND = 0

FOR BUFFER_INDEX  = 1 to NPARTS(STORE(1))

       IF STORE(1) at BUFFER_INDEX:color=red

              NUMBER_FOUND = NUMBER_FOUND + 1

       ENDIF

NEXT

    这段程序用来统计缓冲区store(1)中,颜色为红色的部件的数量。变量NUMBER_FOUND用来统计红色部件的数量,开始时被置零;BUFFER_INDEX是循环变量;NPARTS(STORE(1))函数计算出缓冲区STORE(1)中的部件数量;IF分支用来判断STORE(1)中排于第BUFFER_INDEX位置的部件的属性color是否等于“red”,如果为真,统计变量NUMBER_FOUND自动加1,如果为假,则执行ENDIF后面的语句;执行完成一次IF……ENDIF语句后,则循环变量自动增加1,然后判断循环变量是否大于循环变量终值,如果为假,再执行IF语句,如果为真,结束循环,执行NEXT后面的程序,循环结束。

2)“当”型循环

语法结构:

WHILE <条件表达式>

    <命令行序列>

ENDWHILE

注:ENDWHILE可以缩写为END

语句功能:

<条件表达式>为真时,一直执行<命令行序列>,直到<条件表达式>为假时,循环结束。

示例:

WHILE NPARTS(STOCK) > 90

PRINT "Warning! The STOCK buffer is nearly full."

ENDWHILE

该段程序实现当缓冲区STOCK中的部件数量大于90时,在交互窗口发出提醒信息“Warning! The STOCK buffer is nearly full.”。

 

 

3)使用循环语句时应注意的几点

l  WHILEENDWHILEFORNEXT必须配对使用。

l  〈命令行序列〉可以是任何WITNESS的命令或语句,也可以是循环语句,即可以嵌套为多重循环。