资源描述
PL/1 For Entry Level Training,By Raymond,内容,简介 PLI 练习 IMS 练习和复习,概论,PLI VS COBOL IMS DC VS CICS IMS DB,编程基础-规则(1),PL/I(Programming Language No.1)的特征 通用性 适用于科学计算,事务处理等等各方面 容易理解性,使用日常生活相近的语言(英语) (例) IF GRADE = 60 THEN RESULT = “PASS”; ELSE RESULT = “FAIL”; 书写简单性 形式自由 记述的位置没有限定,编程基础-规则(2),程序构成,Program Name: PROC OPTIONS (MAIN);,文件及变量定义,程序逻辑处理,END Program Name;,编程基础-规则(3),程序的构成(例) REI01: PROC OPTIONS (MAIN); DCL BAR_CODE CHAR( 5), NAME CHAR(10), PRICE FIXED DEC( 5), AMOUNT FIXED DEC( 7), TOTAL FIXED DEC(11); /* GET INPUT DATA */ GET EDIT(BAR_CODE,NAME,PRICE,AMOUNT) (A(5),A(10),F(5),F(6); /* COMPUTE */ TOTAL = PRICE * AMOUNT; /* OUTPUT */ PUT EDIT(BAR_CODE,NAME,TOTAL) (A(5),X(3),A(10),X(2),F(11); END REI01;,编程基础-规则(4),程序名 英文字母或者数字 以英文字母开头 7文字以内 与其它的程序不能同名 记述的位置,编程基础-规则(5),语句的形式 变量,保留字,符号等之间用一个或以上的空格分隔 以分号结束一条语句 PL/I里可以使用的文字 数字 英文字母 特殊记号= + - * / ( ) ; : . & | _ % ? HEX(5F) 空格 注释用/* */,编程基础-变量定义(1),变量的定义(DECLARE语句) DCL DECLARE的省略 变量名31个文字以内;英文字母,数字或者下划线组成;以字母开头 属性变量的类型及长度 如果几个变量具有相同的属性,可以用类似下面的方式定义: DCL (A,B,C,D) CHAR(5);,编程基础-变量定义(2),属性: CHARACTER (文字) CHAR(n): n列的文字 (3)TOM 等于TOMTOMTOM FIXED DECIMAL (固定10进制数) FIXED DEC(p,q),总长度为p的数字, q位小数 数值 精度 最小值 最大值 3.1416 (5,4) FIXED DEC (5,4) -9.9999 9.9999 425 (3,0) FIXED DEC (3,0) -999 999 5908.3 (5,1) FIXED DEC (5,1) -9999.9 9999.9 007 (3,0) FIXED DEC (3,0) -999 999 -3510 (4,0) FIXED DEC (4,0) -9999 9999 .0048 (4,4) FIXED DEC (4,4) -0.9999 0.9999 255. 最大精度FIXED DEC(15),编程基础-变量定义(3),属性: FIXED BINARY (固定2进制数) FIXED BIN(p,q),总长度为2p的数字, 2q位小数 数值 精度 最小值 最大值 10110B (5,0) FIXED BIN (5) -32 31 11111B (5,0) FIXED BIN (5) -32 31 -101B (3,0) FIXED BIN (3) -8 8 1011.111B (7,3) FIXED BIN (7,3) -16 15 最大精度FIXED BIN(31) - 2 p 2 p-1 其它数据类型 BIT bit data GRAPHIC 双字节 FLOAT DECIMAL 浮点10进制数 FLOAT BINARY 浮点2进制数,编程基础-变量定义(4),属性: PICTURE for Character Picture Characters 说明 X 任意一个字符(二进制0-256). A 任意一个字母, #, , $, blank. 9 任意一个数字或blank.,编程基础-变量定义(5),属性: PICTURE for Numeric Character Data Picture Characters 说明 备注 9 V 数字和小数点字符 V并不指明小数点符号 Z * 去前导零字符用空或*代替 Z和*不可同时出现 , . / B 嵌入字符 S + - $ 符号和货币字符 S:=0时为+,否则为- + - :=0时为+或-,否则 为空 CR DR T I R Y 贷(0), 借, 重定义和零置换字符 Y:无论前导零或非零,用 空替换。 T I R:附加穿孔记号用。 K E 指数 F 比例因数,编程基础-变量定义(6),属性: PICTURE(编辑用文字) PICZZZ9 要编辑的数 PIC 指定 结果 01111 99999 01111 01111 ZZZZZ 1111 01111 ZZ,ZZ9 1,111 00222 999B99 002_22 00222 ZZBBZZ 2_ _22 0 ZZZ9 0 0 ZZZZ 01111 $,$9 $1,111,编程基础-变量定义(7),结构定义: DCL 1 结构名 层次 变量名1 属性, 层次 变量名2 属性, . . , 层次 变量名n 属性; 层次: 2-255之间的整数(最大15层) (例) DCL 1 A1, 3 A11 CHAR(3), 3 A12 FIXED DEC(9), 3 A13 CHAR(4); 定义时不要多重定义和不唯一定义.,编程基础-变量定义(8),指针定义: DCL 变量名PTR; PTR是POINTER的省略 DCL P PTR; DCL A CHAR(10) INIT(ABCDEFGHIJ); DCL 1 B BASED(P), 3 B1 CHAR(7), 3 B2 CHAR(3); DCL ADDR BUILTIN; P = ADDR(A);,编程基础-文件定义(1),文件的定义: DCL 文件名FILE STREAM|RECORD INPUT|OUTPUT|UPDATE PRINT ; 1) DCL DECLARE的省略 2) 文件名以字母开头,7位以下的字母与数字组合 3) FILE 表示定义的是文件 4) 数据传送类型默认为STREAM(具体见下页) 5) 输入输出类型指定文件的输入输出种类 6) 印刷属性印刷输出时指定 (例) DCL FTOUR FILE RECORD ; DCL FOUT FILE STREAM PRINT OUTPUT; (注1) SYSIN 和SYSPRINT等的定义可以省略 (注2)上记4,5,6的选项可以在文件打开时指定,编程基础-文件定义(2),文件的定义: 数据传送的种类 RECORD方式 文件是由记录(RECORD)组成的; 用READ,WRITE命令进行处理 STREAM方式 文件是连续的数据组成; 用GET,PUT命令进行处理 变量的默认值 PL/I里如果没有对变量进行定义,则有以下的规则: 字母IN开头的变量默认为FIXED BIN(15) IN以外字母开头的变量默认为FLOAT DEC(6),编程基础-运算符,算术运算符(+,-,*,/,*) 逻辑运算符(&,|,) 比较符(,=) 连接运算符(|) 如果两个运算对象都是位串型,不需转换,结果是位串型.在所有其他情形, 在完成连接运算之前运算对象要转换为字符串型,结果是字符串型.若 运算对象中有一个是变长或调用了SUBSTR函数,则结果是变长字符串, 否则是定长的.,编程基础-基本命令(1),a) OPEN b) CLOSE c) PUT d) GET e) DO (1)DO GROUP (2)DO WHILE f) END g) 赋值语句 h) ON STATEMENT i) READ j) WRITE k) IF l) SELECT,编程基础-基本命令(2),OPEN FILE(文件名) STREAM|RECORD SEQUENTIAL|DIRECT INPUT|OUTPUT|UPDATE PRINT LINESIZE(nn) PAGESIZE(nn); i. FILE(文件名) 文件名:程序中使用的必须与JCL中的DD名一致 ii. 数据传送类型默认为STREAM iii. RECORD方式传送数据时使用的读取属性,默认为SEQUENTIAL iv. 输入输出类型 v. 印刷属性 STREAM,OUTPUT时有效 LINESIZE: 一行的长度,默认为120 PAGESIZE: 一页的行数,默认为60 (例) OPEN FILE(FOUTPUT) RECORD OUTPUT; OPEN FILE(SYSPRINT) OUTPUT PRINT LINESIZE(132) PAGESIZE(55);,编程基础-基本命令(3),CLOSE FILE(文件名); FILE(文件名) 文件名:与OPEN的文件名一致 (例) CLOSE FILE(FOUTPUT); CLOSE FILE(SYSPRINT);,编程基础-基本命令(4),PUT FILE(文件名) SKIP EDIT(变量1,变量2.)(格式1,格式2.); PUT FILE(文件名) SKIP EDIT(常量1,常量2.)(格式1,格式2.); PUT FILE(文件名) SKIP EDIT(变量1,常量2.)(格式1,格式2.); PUT EDIT: 编辑输出 SKIP: 换行输出 格式: A(n) n位的文字输出可省略 F(n) n位的数字输出 X(n) n位空格输出 P 数字的编辑输出 (例) DCL A1 FIXED DEC(3) INIT( 123 ), A2 FIXED DEC(5) INIT( 45678 ); PUT FILE( FOUT ) EDIT ( A1, ABC, A2 ) (F(3),X(3),A(5),PZZZ,ZZ9); - 123 _ _ _ABC_ _ _45,678,编程基础-基本命令(5),GET FILE(文件名) SKIP EDIT(变量1,变量2.)(格式1,格式2.); GET EDIT: 编辑输入 SKIP: 换行输入 格式: A(n) n位的文字输出可省略 F(n) n位的数字输出 X(n) n位空格输出 (例) DCL H1 FIXED DEC(5) , H2 CHAR(5), H3 FIXED DEC(7); GET FILE( FIN ) EDIT ( H1, H2, H3 ) (F(3),X(3),A(3),F(5); 输入123 _ _ _ABC45,678 H1=123,H2=ABC,H3=45678,编程基础-基本命令(6),(1) DO GROUP (DO与END之间的语句作为一个STEP执行) (例)IF A 20 THEN DO; B = X * 1.25; C = Y * 1.10; END; ELSE DO; B = X * 0.90; C = Y * 0.75; END; (2) DO WHILE (循环处理) DO WHILE(条件); 循环处理; END; (3) DO 变量= 初期值TO 终了值BY 增减值,编程基础-基本命令(7),BLOCK或者GROUP的终止标志 END LABEL (例) LBLX: DO WHILE ( EOF = 0 ); OUT_AREA.XX = IN_AREA.AA; PUT EDIT ( OUT_AREA.XX) ( A(80); GET EDIT ( IN_AREA.AA) ( A(80); END LBLX;,编程基础-基本命令(8),(1) 变量名1 = 变量名2 | 常量 (例) X = Y; EOF = 0; (2) 变量名n = 变量名1 | 常量1 操作符 变量名2 | 常量2 ; 操作符: + - * / * (例) X = Y * ( Z + 10); TOTAL = TOTAL * 0.95; SUM = SUM + TOTAL; (3)变量名1 = 变量名2 , BY NAME; (例) DCL 1 AA, 3 YY CHAR(2) INIT(04), 3 MM CHAR(2) INIT(02), 3 DD CHAR(2) INIT(11); DCL 1 BB, 3 YY CHAR(2) , 3 F CHAR(1) INIT(/), 3 MM CHAR(2) , 3 G CHAR(1) INIT(/), 3 DD CHAR(2) ; BB = AA, BY NAME;,编程基础-基本命令(9),ON 条件处理逻辑; 条件: ERROR ENDFILE ENDPAGE CONVERSION(CONV) ZERODIVIDE(ZDIV) FIXEDOVERFLOW(FOFL) (例) ON ENDFILE(FIN) EOF = 1 ; ON ENDPAGE (SYSPRINT) DO; PUT PAGE EDIT ( OUT_AREA.XX) ( A(80); PUT SKIP EDIT ( OUT_AREA.YY) ( A(80); END ;,编程基础-基本命令(10),READ READ FILE(文件名) INTO (变量名); (例) READ FILE(FINPUT) INTO (IN_AREA) ; WRITE WRITE FILE(文件名) FROM (变量名); (例) WRITE FILE(FOUTPUT) FROM (OUT_AREA) ;,编程基础-基本命令(11),IF 条件 THEN 满足条件的处理; ELSE 不满足条件的处理; 比较种类: 1. 代数比较: 比较以代数形势的带符号数字.要进行数字域转换. 2. 字符比较: 根据对照序列从左到右一对一字符进行比较,若运算对象长度不同则将短的右边补 空格. 3. 位比较: 从左到右对二进制数字进行比较,不足补零. 注意: 若比较的对象类型不同,低类的对象将被转为高类的对象. 类型的优先数是(1)算术行(最高)、(2)字符串型、(3)位串,编程基础-基本命令(12),SELECT多重分支 SELECT (变量名); WHEN (条件1的值) 处理1; WHEN (条件2的值) 处理2; WHEN (条件3的值) 处理3; WHEN (条件4的值) 处理4; WHEN (条件n值) 处理n; OTHERWISE 处理n+1; END;,运行和调试,JCL/PRC/PRM PDSRXCB.COMMON.JCL(PLIC) PDSRXCB.COMMON.JCL(PLICL) PDSRXCB.COMMON.PRC(IEL1C) PDSRXCB.COMMON.PRC(IEL1CL),运行和调试,编译错误LEVEL,运行和调试,编译返回代码,运行和调试,编译时的CHECK LIST 编译的选项是否正确,是否有足够的编译信息 程序是否写在272列之间 变量是否有重名 所有的保留字是否正确 有没有忘记分号 引号是否匹配 括号是否匹配 注释是否用了正确的范围 END的使用是否正确 对输入输出文件的READ/WRITE 是否正确 使用RECORD方式存取数据时,RECORD长度是否与物理长度一致 计算时使用的变量是否都是数字 变量等是否正确的初始化 没有明确定义的变量的属性是否满足处理的需要,运行和调试,PUT SKIP LIST(变量1,变量2.); PUT SKIP EDIT(变量1,变量2.)(格式1,格式2.); 以上是2种常用的output语句,主要运用于输出运行中的变量内容用于调试程序 DCL A FIXED BIN(15); DCL B FIXED BIN(15); DCL C FIXED BIN(31); A = 1; DO WHILE(A 11); B = A + 1; C = A*B; PUT SKIP LIST(A | * | B | = | C); PUT SKIP EDIT(A,*,B,=,C)(F(4),A(1),F(4),A(1),PZ,ZZZ); A= A +!: END;,过程与函数, DCL 过程名ENTRY ; 过程名: PROC ( 参数1, 参数2, ) ; END 过程名;,过程与函数(内联),PROG1A : PROC OPTIONS(MAIN); DCL ROUND BUILITIN, NAMAE CHAR(10), KOKUGO FIXED DEC( 3), SANSUH FIXED DEC( 3), SHAKAI FIXED DEC( 3), RIKA FIXED DEC( 3), EIGO FIXED DEC( 3), GOHKEI FIXED DEC( 3), HEIKIN FIXED DEC( 5,1), EOF FIXED DEC( 1) INIT(0); ON ENDFILE( SYSIN ) EOF = 1; GET SKIP EDIT ( NAMAE, KOKUGO, SANSUH, SHAKAI, RIKA, EIGO ) ( A(10), 5 F(5) ); DO WHILE ( EOF = 0 ); CALL KEISAN; PUT SKIP EDIT( NAMAE, GOHKEI, HEIKIN) ( A(10), X(2), F(3), F(5,1) ); GET SKIP EDIT ( NAMAE, KOKUGO, SANSUH, SHAKAI, RIKA, EIGO ) ( A(10), 5 F(5) ); END; KEISAN : PROC ; GOHKEI = KOKUGO + SANSUH + SHAKAI + RIKA + EIGO; HEIKIN = ROUND( GOHKEI/5, 1 ); END KEISAN; END PROG1A ;,过程与函数(外部),PROG2A : PROC OPTIONS(MAIN); DCL DEGCONV ENTRY, CONVKEY CHAR( 4), IN_DEG FIXED DEC( 5), OUT_DEG FIXED DEC( 5), EOF FIXED DEC( 1) INIT(0); ON ENDFILE( SYSIN ) EOF = 1; GET SKIP EDIT ( CONVKEY, IN_DEG ) ( A( 4), F(5) ); DO WHILE ( EOF = 0 ); CALL DEGCONV( CONVKEY, IN_DEG, OUT_DEG); PUT LIST( CONVKEY, IN_DEG, , OUT_DEG); GET SKIP EDIT ( CONVKEY, IN_DEG ) ( A( 4), F(5) ); END; END PROG2A ; * DEGCONV : PROC(P1,P2,P3) ; DCL P1 CHAR(4), (P2, P3) FIXED DEC( 5); IF P1 = FTOC THEN P3 = ( 5 * ( P2 32 ) )/ 9; ELSE P3 = 9 * (P2 / 5) + 32; END DEGCONV;,过程与函数, DCL 函数名ENTRY RETURNS (返回值属性); 函数名: PROC ( 参数1, 参数2, ) RETURNS (返回值属性); RETURN (值); END 函数名;,过程与函数,PROG1B : PROC OPTIONS(MAIN); DCL TEIHEN FIXED DEC( 5), TAKASA FIXED DEC( 5), MENSEKI FIXED DEC( 9); GET LIST ( TEIHEN, TAKASA ); MENSEKI = TRIAREA( TEIHEN, TAKASA ); PUT LIST ( MENSEKI ); TRIAREA : PROC(P1, P2) RETURNS( FIXED DEC(9); DCL (P1, P2) FIXED DEC( 5); RETURN ( (P1 * P2) / 2); END TRIAREA; END PROG1B ;,过程与函数,PROG2B : PROC OPTIONS(MAIN); DCL ONSOKU ENTRY(FIXED DEC(3) ) EXTERNAL RETURNS FIXED DEC( 5,1), DEGREEC FIXED DEC( 3); GET LIST ( DEGREEC ); PUT LIST ( DEGREEC, ONSOKU( DEGREEC ) ); END PROG2B ; * ONSOKU : PROC(P1) RETURNS( FIXED DEC(5,1); DCL P1 FIXED DEC( 3); RETURN ( 331.5 + 0.6 * P1); END ONSOKU;,过程与函数-系统函数,系统函数的属性定义为BUILTIN,使用方法和自定义函数一样. SUBSTR ( X, Y, Z ) DATE -返回yymmdd格式的6位字符串.yy为年的后两位,mm为月,dd为日 LENGTH ( X )返回X的长度. SUM ( X ) MAX ( X1, X2,Xn ) - MIN MOD ( X, Y ),TIP,一个PROC尽可能控制在一页之内, PROC字符数的最大限制为64K。 使用缩进格式 属性定义格式的对齐 INITIAL部分如果长的话另起一行书写 语句的范围使用END来明确 文件名,数据名,LABEL,过程名等使用表示内容的名字,PLI练习,要求: 调用外部函数 外部函数内容如下: 顺序读取文件中的所有内容 输出文件 报表输出总行数,
展开阅读全文