WITNESS变量类型

witness提供了四种类型的变量,用来进行数据处理。它们是整型、实型、名型、字符型。

整型(integer)

整型变量用来存储不包含小数点部分的数字。在witness中,可以是-2147483648到+2147483647之间的整数。

使用整数变量能够比较精确的存储数据,并且处理速度比比实数要快。但是由于整数的“循环”性,可能会使得它们过大或过小。例如:

2147483647+1=-2147483648

-2147483647-2=2147483647

实型(real)

实型变量可以存储由数字(0~9)、小数点和正负号组成的数据。范围为(3.4E-38,3.4E38);

名型(name)

名型(name)变量用来存储witness仿真系统组成元素的名称。例如:

widget

miller(3)

注:函数、数值型变量、数值型属性不能够存储为名型数据。

字符型(string)

字符型变量用来存储不具有计算能力的字符型数据。字符型数据是由汉字和ASCII字符集中可打印字符(英文字符、数字字符、空格以及其他专用字符)组成,长度范围是0~4095个字符。

字符运算符

=比较前后两个字符串是否相同;

+连接两个字符串

=对字符型数据赋值

如果连接操作得出的字符型数据长度超出长度范围,witness显示出错信息。

特殊用途字符串

字符型数据可以存储任何键盘上的字符。反斜线字符()却是一个特殊的字符。

"向字符串中引入一个引号(“)。引号标识字符的结束。

\向字符串中引入一个反斜线()。

\n向字符串中引入换行符。

\r向字符串中引入回车。

\t向字符串中引入8个空格(TAB)字符。

\f向字符串中引入走纸字符。如果是打印(PRINT)操作,交互窗口被清空;如果是写(write)操作,将另起一页进行写入。

运算符及表达式

算术运算符

通过算术运算符可以构成算术表达式,进行数值型数据的处理。算术运算符和表达式实例见表6.1。

运算符 功能 表达式 表达式值
** 乘方 28,52 256,25
*,/ 乘,除 36*4/9 16
+,- 加,减 5+6-7 4

在进行算术表达式计算时,要遵循以下优先顺序:先括号,在同一括号内,按照先乘方,在乘除,后加减。

关系运算符

关系运算符用来构成关系表达式,关系运算是运算符两边同类元素的比较,关系成立结果为真(T);反之,结果为假(F),参看表6.2。

运算符 功能 表达式 表达式值
<> 不等于 15<>20 T
> 大于 5>8 F
< 小于 8+4>10 T
<= 小于等于 12<=3*4 T
>= 大于等于 16>=20 F

逻辑运算符

逻辑运算符用来构成逻辑表达式。逻辑表达式可与关系表达式一起组成满足IF,WHILE语句的判断条件,参看表6.3。

运算符 功能 表达式 表达式值
NOT 逻辑非 NOT3+5>6 F
AND 逻辑与 3+5>6AND4*5=20 T
OR 逻辑或 6*9<45OR7<>8 T

转换运算符

转换运算符主要有两种:

(1)&将整数转换为英文字母。

如果变量值为1,则返回“A”;如果变量值为2,则返回“B”;如此类推,当变量值为26时,则返回“Z”。如果变量值大于26,将进行循环,如:变量值为28,则返回“B”。

如果变量值为-1,则返回“a”;如果变量值为-2,则返回“b”;如此类推,当变量值为-26时,则返回“z”。如果变量值小于-26,将进行循环,如:变量值为-28,则返回“b”。

(2)@将数值型数据转换为字符型数据。

例如:DESC=”P”+@VAR1(此时数值型变量VAR1=56),则DESC=P56。

程序三种基本结构

顺序结构

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

分支结构

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

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

单向分支,也叫简单分支结构

1
2
3
IF<条件表达式>
<命令行序列>
ENDIF

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

多向分支,也叫复杂分支结构

1
2
3
4
5
IF<条件表达式1>
<命令行序列1>
ELSE
<命令行序列2>
ENDIF

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

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

lIF……ENDIF必须配对使用;

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

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

示例

1
2
3
4
5
6
7
IF(water_level>=0)AND(water_level<=5)
PRINT"Thelevelinthewatertankislow"
ELSEIF(water_level>5)AND(water_level<=10)
PRINT"Thelevelinthewatertankisnormal"
ELSE
PRINT"Thelevelinthewatertankishigh"
ENDIF

这段程序是用来检测容器中的水位的。变量water_level记录容器的水位,当水位在[0,5]之间时,在交互窗口(interactboxwindow)中打印出“Thelevelinthewatertankislow”语句,提醒水位较低;如果第一个条件不满足,判断第二个条件表达式,看水位是否在(5,10]之间,若表达式为真,在交互窗口中打印出“Thelevelinthewatertankisnormal”语句,提醒水位正常;当条件二也不满足时,唯一的一种情况就是水位高于10了,此时在交互窗口中打印出“Thelevelinthewatertankishigh”语句,提醒水位超高了。

循环结构

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

计数型循环

基本语法如下:

1
2
3
FOR〈循环变量〉=〈循环变量初值〉TO〈循环变量终值〉[STEP〈循环变量步长〉]
〈命令行序列〉
NEXT

参数说明:

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

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

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

语句功能:

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

示例

1
2
3
4
5
6
NUMBER_FOUND=0
FORBUFFER_INDEX=1toNPARTS(STORE(1))
IFSTORE(1)atBUFFER_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后面的程序,循环结束。

“当”型循环

语法结构:

WHILE<条件表达式>

<命令行序列>

ENDWHILE

注:ENDWHILE可以缩写为END。

语句功能:

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

示例:

1
2
3
WHILENPARTS(STOCK)>90
PRINT"Warning!TheSTOCKbufferisnearlyfull."
ENDWHILE

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

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

lWHILE和ENDWHILE、FOR和NEXT必须配对使用。

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