PL/1基础入门教程

2009年03月26日  |  7:43 下午分类:大型机|Mainframe  |  标签:  |  84 views

一、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.’,则不管此字符是否有值,都显示为“ .”。
(文章来源:http://www.newcoin.info
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补足.
² 位串数据通常用于检查 真/假 条件
(文章来源:http://www.newcoin.info
真    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的地址唯一确定
(文章来源:http://www.newcoin.info
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; 
(文章来源:http://www.newcoin.info
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一定要定义为局部变量。
(文章来源:http://www.newcoin.info


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
(文章来源:http://www.newcoin.info
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




喜欢本文,那就收藏到: Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网

发表您的评论