PL/1基础入门教程

时间:2021-07-16 17:03:21

 

 

一、PL/1的字符集及书写

1、PL/1的字符集

PL/1的字符集一般分为48个字符与60个字符两种,目前采用60个字符的字符集。

1.1 29个字母字符    

A,B,…….,Z,$,@,#

1.2 10个数字

0,1,2,3,4,5,6,7,8,9

1.3 21个专用字符(如下所示)

空格

%

百分号

=

等号

;

分号

+

加号

:

冒号

-

减号

<

小于

星号(乘号)

>

大于

/

斜线(除号)

|

(

左括号

&

)

右括号

,

逗号

_

短划号

.

小数点

?

问号

引号

 

 

 

 

2、L/I源程序的书写

2.1源程序从第2列开始写至第72列为止

2.2每个语句(Statement)以“;”结束

2.3注释(Comment)以“/*”开始,以“*/”结束,其间可出现任何字符。

2.4第1列上的字符用作打印时的控制字符

1

:

换新页

:

换一行

0

:

换二行(空一行,现换一行)

-

:

换三行(空二行,再换一行)

 

二、数据和表达式(DATA  and  Expression)

数据类型分两类:

n 运算型数据

A、 算术数据

a:定点十进数(Fixed decimal  data)

b: 定点二进数(Fixed  binary  data)

B、 数值字符数据(numeric  character  data)

C、 字符串数据(String  data)

n 控制型数据

A、 文件数据(file  data)

B、 标号数据(label  data)

C、 入口数据(entry data)

D、 定位数据(locator  data)

1、运算型数据

1.1算术数据有下列4个特性

进位制(Base):   十进位、二进位;

记数法(scale): 定点、浮点

精确度(precision):(P:表示有效数位;q:表示有效小数位)

型(mode):  实型、复型等。

1.1.1定点十进数

例:

定点十进数

3.1416

732

003

0.0012

-528

精确度

(5.4)

(3.0)

(3.0)

(4.4)

(4.0)

存储形式

(十六进制)

31,41,60

73,20

00,30

0,01,20

528,0

 

 

注:  对定点十进数(p,q)

² 占用存贮的字符数==[p/2]+1

² P最大值是15,占8个字符

² (p,q)未指明时,系统约定为(5,0)

1.1.2定点二进数

例:  定点二进数   0001 0110         11111111

十六进制表示    16               F F

十进制表示      22               - 1

注:

² 最大有效数位31,占4字符

² 未指明时系统约定值为FIXED  BIN(15), 占2字符.

² 位数低于15位的也占2字符

² 位数高于15位的,则占4字符

² 变量名以I,J,K,L,M,N开始,若未指明时,约定为FIXED  BIN(15);以其它

字母开始约定为FIXED  DEC(6)

1.2 数值字符数据

它是介于算术数据与字符串数据间的数据

 

123

 

732.10

 

98.7

书写

 

PIC ‘999’

 

PIC ‘999V.99’

 

PIC 99V9

存贮形式

 

F1

F2

F3

 

F7

F3

F2

4B

F1

F0

 

F9

F8

F7

 

其中:  V表明在数据域中该位置出现一个隐含的十进位或二进位小数点.

若V后面还有“.”,表明相应数据域位置包含一个小数点

注:

u 数值字符数据主要是构成定点十进数,定点二进数可打印的形式;

u 在PIC后面引号(”)中的数字字符个数最多15个;

u 数值字符数据可进行算术运算,但须经转换;

u 如果一个数字字符定义为PIC ‘ZZZV.’,则不管此字符是否有值,都显示为“ .”。

1.2.1定点十进数(FD)、定点二进数(FB)和PIC间的转换

例: DCL    A     PIC‘99’

DCL    B     PIC‘99’

DCL    C     PIC‘99’

C==A+B

则为欲求得C,须经:

A FIXED  DEC,

B       FIXED  DEC

A_FD + B_FD

FIXED  DEC         PIC   赋予C

在算术运算时,必须转为FIXED  DEC 才能进行

转换表

R        C

FB

FD

PIC

FB

——

C       FB

C       FD  FD      FB

FD

R      FB

——

C       FD

PIC

R      FD

FD     FB

R      FD

C       FD   R      FD

 

注:一般金额采用  FIXED  DEC

整数采用  FIXED  BIN

PIC用于   输入/输出 它是字符与算术数据间的桥梁。

 

1.3 串数据(String  data)

1.3.1 字符串数据(Character  String  data)

值           PL/1写法         存贮形式

ABC CHAR(6)        C1,C2,C3,40,40,40

A102 CHAR(4)        C1,F1,F0,F2

A CHAR(4)        C1,40,40,40

² 字符串数据通常在程序内赋值时用.

例:  X==‘THIS  REPORT IS ’

² 赋值时,字符串数据括于单引号内

² 赋值时,在字符串右边不足部分,系统自动以“空白 ”符补足

例: DCL  X  CHAR(5)

X =‘A’;  X值会是   A后跟随4个空格

² 字符串内出现单引号时,必须以两个单引号(称为Null  String)表示,否则会引起

混淆。

例:  设赋值给X,其值为:JOHN’S  CAP

则必须写为   X==‘JOHN’’S  CAP’

(注:若写为X==‘JOHN’S  CAP’,则S  CAP’被略)

² 重复的字符串数据可用重复因子表示

例: X==(N)’BCC  ‘表示X有值为 BCC ,BCC ,…….(N个)

1) 重复因子必须放在括号内;

2) 重复因子只对紧接的一个字符生效

例:  PIC’(4)AB’ 乃表示PIC’AAAAB’

² CHARACTER  PICTURE  SPECIFICATION

PIC’9’表示数字0~9

PIC’A’表示字母A~z

PIC’X’表示任何字符

1.3.2 (二进)位串数据(BIT  String  data)

值                PL/I写法          存贮形式

‘1’B              BIT(1)            占1字符

‘1111’B           BIT(4)            占1字符

(64)’0’B          BIT(64)           占8字符

² 位串数据赋给变量是从左到右进行,若串数据长度,超过变量说明的长度,则以变量

长度为准,截去串数据右端的位;若串数据长度短于变量说明的长度,也以变量长度

为准,右边自动以0补足.

² 位串数据通常用于检查 真/假 条件

真    TRUE_______’1’B

假   FALSE_______’0’B

例:  DCL  EOF  BIT(1)

——–

__在检查“真”时可写:IF   EOF=‘1’B 或   IF  EOF

—在检查“假”时可写:IF  EOF=‘0’B 或   IF  ﹁EOF

2、控制型数据

2.1文件数据(File  data):它表示PL/I文件的信息

l 它是PL/1的输入/输出文件名字

l 即JCL的输入/输出DD名字,File name和DDname互相对应

例:  DCL    INFILE  INPUT  RECCRD   FILE

DCL    OUTFILE  OUTPUT  STREAM  FILE

2.2标号数据(label  data)

l 作为语句标号引用

例:  LOOP:——-

——-

——-

GO TO LOOP;

l 作为语句标号变量

例: DCL  CIRCLE  LABEL

LOOP1:———

——–

———

LOOP2:——–

——–

——–

CIRCLE==LOOP1;

GO  TO  CIRCLE; ——–>  等价于  GO  TO  LOOP1

2.3 入口数据(ENTRY  Data)

——用作过程(Procedure)的入口点(entry  point)

例:A:PROC   OPTIONS(MAIN)

B:PROC;

A,B即为入口点,称为入口数据,可由CALL语句来调用   CALL B;

——用作入口变量(entry  variable)

例:DCL  A  ENTRY  VARIABLE;

DCL(A1,A2)ENTRY;

IF  X   THEN   A=A1;

ELSE   A=A2;

CALL  A;

等价于:

IF   X   THEN  CALL A1;

ELSE  CALL A2;

 

2.4 定位数据(Locator  data)

根据POINTER变量所取的值作为指定的地址

例:    DCL  P   POINTER

DCL  A   CHAR(8)

DCL  X   CHAR(8)

l 基于POINTER

DCL  B  FIXED  DEC(15)  BASED(P);

P=ADDR(A)

此时B不占空间,根据P描述,也即为B 描述为FIXED  DEC(15)

若P=ADDR(X)

则B又随P描述X了,于是B是活动的,随P变化.

l 基于ADDRess

DCL  B  FIXED  DEC(7)  BASED (ADDR(A))

此时,B 是固定的,它由A的地址唯一确定

001500 DCL CIC1               FIXED BIN(15);

001600 DCL CIC2               FIXED BIN(15);

001700  DCL CIC3               FIXED BIN(15);

001800  DCL CIC4               FIXED BIN(15);

001900 DCL CI1PTR             POINTER;

002000 DCL CI1PTRF            FIXED BIN(31) BASED(ADDR(CI1PTR));

002100 DCL CI2PTR             POINTER;

002200 DCL CI2PTRF            FIXED BIN(31) BASED(ADDR(CI2PTR));

002300  DCL UTSCIFC            CHAR(4089) VAR;

002400  DCL 1 CIF1             BASED(ADDR(UTSCIFC)),

002500        2 CITOTL         FIXED BIN(15),  /* TOTAL RECORD LENGTH       */

002600        2 UTSCIFC_BEG_DMY

002800        2 CIIDQTY        FIXED BIN(15),  /* ID QUANTITY               */

009800        2 CIMTCAC        FIXED DEC(15),     RELATIVE MTC SAVING AC NO.*/

009810        2 CIHKDAC        FIXED DEC(15),  /* RELATIVE HKD SAVING AC NO.*/

009820        2 CIFCYAC        FIXED DEC(15),  /* RELATIVE FCY SAVING AC NO.*/

009830        2 CIPBCINT       CHAR(1),        /* PBC INT INDICATOR         */

009900        2 CIPCLASS       FIXED DEC(1),   /* PRIVILEGE CLASS           */

009910        2 CINAT          CHAR(9),        /* NATIONNALITY              */

009920        2 CICDTDAT(10)   CHAR(6),        /* TAX RATE FOR BRANCH       */

010000        2 CIHKDPVC       FIXED DEC(15,2),/* STAFF HKD PRIV.CERT TOT P */

010100        2 CIHKDP         FIXED DEC(15,2),/* HKD CERT TOTAL PRINCIPAL  */

010200        2 CIUSDP         FIXED DEC(15,2),/* USD CERT TOTAL PRINCIPAL  */

011300        2 CIIDNO(CIC1 REFER(CIIDQTY))

011410                         CHAR(19),       /* ID NUMBER                 */

011500        2 CIIDNO_END_DMY CHAR(0),

011600        2 CISIGNO(CIC2 REFER(CISIGQTY))

011700                         CHAR(8),        /* SIGNATURE NO              */

011800        2 CISIGNO_END_DMY

011900                         CHAR(0),

012000        2 CINAME         CHAR(CIC3 REFER(CINAMEL)),

012100                                         /* CUSTOMER NAME             */

012200        2 CINAME_END_DMY CHAR(0),

012300        2 CITRAILER      CHAR(1);        /* OFF SET                   */

012400  DCL 1 CIF12            BASED(CI1PTR),

012500        2 CIADDUM        CHAR(1),        /* ADDRESS                   */

012620        2 CIADDR(3)      CHAR(32);       /* ADDRESS        040717 ADD */

012700  DCL 1 CIF13            BASED(CI2PTR),

012800        2 CIACCTQ        FIXED BIN(15),  /* RELATED ACCOUNT QUANTITY  */

012900        2 CIACCT(CIC4 REFER(CIACCTQ))

013000                         FIXED DEC(15);  /* ACCOUNT NUMBER            */

013080                                         /* ’ ’ GET TAX RATE FROM CIN */

****** **************************** Bottom of Data ***************************

有关指针CI1PTR和指针CI2PTR的使用如下:

CI1PTR  = ADDR(CITRAILER);

CI2PTRF = CI1PTRF + 97;

3、数据组织(data  cyganigation)

3.1数组(array)

l 一组同属性(attribute)的数据元素

l 一个数组只有一个名字

l 数组内的各项由其在数组内的相应位置表明

一维数组

例: DCL   A(8)  FIXED  DEC(3);

表示数组A有8个元素,每个都是FIXED的三位数字,分别称A(1),A(2),A(3),……,A(8).

二维数组

例: DCL  B(4,2)  FIXED  DEC(3);

PL/I中元素排序以“行”为主

B(1,1),B(1,2),B(2,1),B(2,2),

B(3,1),B(3,2),B(4,1),B(4,2)

界(bound)         下界        上界

数组A 1            8

数组B 1            4

数组B 1           2

范围(extent)

数组A:   8

数组B:   4,2

l 数组维数最大为15维

l 下界不为1时,上、下界必须明确写

一维数组   DCL  C(4:11) 下界为4,上界为11,范围是8。

二维数组   DCL  D(-4:3,4:11)

第一维下界为-4,上界为3

第二维下界为4, 上界为11

范围是8,8

l A(I)其中A表示数组名称(array name),I表示下标(Subscript)

下标值若非定点二进整数,则一定转为FIXED  BINARY(15)

3.2结构(Structure)

l 有逻辑性的数据成分(data  element)的组合

l 各数据成分的属性(attribute)可以不同

l 组成形式是层次结构(hierarchy)

例:  DCL  1  PAYROLL,

2  NAME,

3  FNAME   CHAR,

3  LNAME   CHAR,

2  HOURS,

3  REGULAR  FIXED  DEC,

3  OVERTIME  FIXED  DEC

2  RATE,

3   REGULAR  FIXED  DEC,

3   OVERTIME  FIXED  DEC;

注:PAYROLL是主结构(major  structure),NAME、HOURS、RATE是次结构(minor  structure),FNAME、LNAME、REGULAR、OVETTIME等是基本名字(elementary  name)

l 结构名字必须是单义唯一的,为免混淆采用限定名(qualified name)

如    HOURS.REGULAR

RATE. EGULAR

l 结构数组(array  of  structure)

结构内是以数组出现如:

一维结构数组:DCL  1  A(8),

2  B  CHAR(3),

2  C  FIXED  DEC(4);

二维结构数组:DCL  1  A(6,6),

2  B (4),

3  C   FIXED  BIN(4)

3   D  FIXED  BIN(4)

2  E…….

指称元素采用限定名如  A(1,2),B(3),C

3.3其它属性(attribute)

3.3.1  DEFINE

变量数组元素的存储位置可被其它变量(或数组元素)所定义,并可指定位置(position)

例1.      DCL  A(10,10);

DCL  B(10,10)  DEF  A;

例2.      DCL  A   CHAR(50);

DCL  B   CHAR(10)  DEF  A;

DCL  C   CHAR(15)  DEF  A  POS(11);

DCL  D   CHAR(25)  DEF  A  POS(26);

3.3.2  LIKE

结构与结构间其结构形式、名字、属性等,可在说明语句(DECLARE)中用LIKE这个属性照抄。

例:   DCL    1 A

2 B

2 C

3 D

3 E

当有说明语句:

DCL  1  X  LIKE  A;

即为:DCL    1 X

2 B

2 C

3 D

3 E

可以有:

² 主结构与主结构间用LIKE属性

² 主结构与次结构间用LIKE属性

² 次结构与主结构间用LIKE属性

² 次结构与次结构间用LIKE属性

3.3.3  INIT   赋初值(可为常数、字符串、表达式等)

² 赋常数为初值

DCL  A  FIXED  DEC(5,4)  INIT(3.1416);

² 赋字符串为初值

DCL  NAME  CHAR(B)  INIT(‘BANK  OF  CHINA’)

² 用表达式作为赋初值

DCL  B  INIT(M*N);

² 用内部函数来赋初值

DCL  DATE  BUILTIN;

DCL  YMD  PIC’99/99/99’  INIT(DATE);

² 对数组赋初值

整个数组元素: DCL  A(10)  FIXED  BIN(15)  INIT((10)0)

部分数组元素: DCL  A(15)  CHAR(10)

INIT(‘ASM’,’COBOL’,*,’PL/I’)

则仅对A(1),A(2),A(4)分别赋初值为:ASM  COBOL  PL/I

² 对几个变量同时赋初值

DCL   (A,B,C)  FIXED  BIN(15)  INIT(0);

即同时对A,B,C赋以0

² 对一个内存进行初始化:

如:

0DCL TEST_RECORD CHAR(31);

DCL 1 TEST_REC BASED(ADDR(TEST_RECORD)),

2 TEST_BKNO          FIXED DEC(3),

2 TEST_BK2C          FIXED DEC(3),

2 TEST_CUR           CHAR(3),

TEST_REC = ‘’

这样可以对TEST_BKNO、TEST_BK2C、TEST_CUR按它们对应的类型进行初始化。

² 动态初始化:

DCL W                 FIXED BIN(15) INIT(REMQTY);

注:REMQTY是一个带返回值的程序。有REMQTY在编译前处理,因此REMQTY程序内用的变量最好是局部变量,特别读的COPY BOOK一定要定义为局部变量。

 

 

4、表达式(expression

4.1运算符

算术运算    +,-,*,/,**

逻辑运算    ┑,|,&

比较运算 <,=,>,<=,>=,┑<,┑=,┑>

连接运算    ‖

4.2算术运算的优先级

 

**

*

+

/

-

 

若要更改运算的优先顺序,可采用括号或前缀符作人为规定

4.3逻辑运算

A

B

 

┑A

┑B

A & B

A | B

1

1

0

0

1

0

1

0

 

0

0

1

1

0

1

0

1

1

0

0

0

1

1

1

0

4.4比较运算

4.4.1算术比较

当运算对进行比较时,若进位制、精确度、型等不同则先进行数据转换

4.4.2字符比较

从左到右逐个字符相比

4.4.3位(二进位)的比较

从左到右逐位进行比较

注:1. 不同长的串进行比较时,把短者延长与长者相等后再作比较,

字符,延长部分是以空格补足

二进位,延长部分是以“0B补足

2. 优先顺序

属性相同时:代数的、字符的、二进位的

属性不同时:二进位的、字符的、代数的

例:BIT与 FIXED  DEC  作比较

则BIT –> FIXED  BIN和FIXED DEC –>  FIXED BIN再相比

3. 比较结果以BIT的一位表示

真——-’1’B        假——-’0’B

4.5 连接运算

把串(字符串、二进位字符串)进行合并的运算,

但若BIT与CHAR进行此运算,BIT一定要转换成CHAR再作合并。

4.6运算符的优先顺序

**,prefix+, prefix-,┑

*,/

infix+, infix-

<,┑<,<=,=,┑=,>=,>,┑>

&

|

4.7数组表达式(Harray  Expression)

4.7.1数组是由一组数据元素组成,而IF语句是只试验单一条件,所以数组不能用于IF语句里.

例:  设A为数组

则只能有IF  A(I)……THEN 其中A(I)为A的某一元素,

不能写IF  A…… THEN…….

4.7.2数组的运算

例:设数组A(3,2)

则 A*3的结果是:A(1,1)*3, A(1,2)*3,

A(2,1)*3,A(2,2)*3,

A(3,1)*3,A(3,2)*3

若B=A*3 则B必须与A有相同的界和范围

² A+-B  对应元素相加、减

² A*/B  对应元素相乘、除

4.8结构表达式(Structure  expression)

4.8.1 结构与变量的运算,即是结构中基本名字与变量进行相应运算

例: DCL  1 A

2 B

3 C

3 D

2 E

3 F

设A * X即  A.C * X

A.D * X

A.F * X

4.8.2 结构与结构的运算,两结构的组成形式应一样,结果是:两结构的相应基本名字作所规定的运算.

例: DCL  1   A

2 B

3 C

3 D

2 E

3 F

DCL  1   X

2 Y

3 V

3 W

2 Z

3 P

求A*X  结果是:  C*V

D*W

F*P

4.8.3结构和结构的赋值

将一个结构的某些元素的数据赋给另一结构内,同名的元素(用BY NAME 的赋值语句)

例: DCL      1   A

2  B

2  C

3 D

3 E

2  F

2  G

DCL  1   X

2 C

3 D

3 W

2  F

2 Z

3 P

 

若  X=A   BY  NAME;

则  X.C.D=A.C.D

X.F=A.F

4.8.4数组与结构的表达式

例:  DCL  1 A

2B

2C

DCL  X(2)

DCL  Y(2)  LIKE  A

为求   Y=X+A

计算结果是:   Y(1).B=X(1)+A.B

Y(2).B=X(2)+A.B

Y(1).C=X(1)+A.C

Y(2).C=X(2)+A.C