COBOL 知识点集锦(下)

COBOL <wbr> <wbr>知识点集锦(下) cobol子程序调用
内部子程序
IDENTIFICATION DIVISION.
PROGRAM-ID. PROC-A.
ENVIRONMENT DIVISION.
...
DATA DIVISION.
...
PROCEDURE DIVISION.
...
IDENTIFICATION DIVISION.
PROGRAM-ID. PROC-B.
ENVIRONMENT DIVISION.
...
DATA DIVISION.
...
PROCEDURE DIVISION.
...
END PROGRAM PROC-B.
IDENTIFICATION DIVISION.
PROGRAM-ID. PROC-C.
ENVIRONMENT DIVISION.
...
DATA DIVISION.
...
PROCEDURE DIVISION.
...
IDENTIFICATION DIVISION.
PROGRAM-ID. PROC-D.
ENVIRONMENT DIVISION.
...
DATA DIVISION.
...
PROCEDURE DIVISION.
...
END PROGRAM PROC-D.
END PROGRAM PROC-C.
END PROGRAM PROC-A.
程序A包含B,C两个子程序,其中C又包含子程序D。
A能调用B,C。C能调用D。B不能调用C,A不能调用D。
如果C声明为公用的,则B可以调用C,语法为:
PROGRAM-ID. PROC-C IS COMMON PROGRAM.

当前函数中定义的变量都只是对当前函数有效。可以用GLOBAL声明为对所有函数有效。
01 DATA-NAME IS GOLBAL ...
文件也有此声明:FD FILE-NAME IS GOLBAL ...

如果调用的不是本程序中的文件或变量,则可以用EXTERNAL声明。
FD FILE-NAME IS EXTERNAL.../01 DATA-NAME IS EXTERNAL...

CALL PROC VAR1 [ON EXCEPTION CODE1] [NOT ON EXCEPTION CODE2] END-CALL.
如果找不到PROC程序名,执行CODE1(如果有此声明),找到将参数VAR1传递给PROC,并执行。PROC返回时执行CODE2(如果有此声明)。
参数应该在文件,工作存储或连接节中定义,应为01层数据项,77层数据项或基本数据项。
子程序要返回调用程序,执行EXIT PROGRAM

传递参数有3步:
首先在调用程序的CALL语句列出要传递的参数。
CALL PROC VAR1 .
然后在被调用程序的过程部标题,使用USING短语列出相应的参数。
PROCEDURE DIVISION USING VAR1.
最后在被调用程序的连接节(LINKAGE SECTION)提供参数的存储空间。
LINKAGE SECTION.
01 VAR1 PIC XX.

参数传递有2中方式:
BY CONTENT 传递的参数值只在被调用函数中被改变,调用函数中的值不变。
BY REFERENCE. 传递的参数值在被调用函数中被改变,调用函数中的值也改变。
CALL PROC VAR1 BY CONTENT/REFERENCE.

再次调用子程序,子程序处于上次退出的状态(除了连接节中的数据),打开的文件依然打开。
可以用INITIAL声明函数被调用时处于初始状态。
PROGRAM-ID. PROC-C IS INITIAL PROGRAM.

如果不想每次执行都初始化,只在需要的时候初始化,可以用CANCEL PROC.初始化PROC程序,但不执行PROC。

cobol 知识点集锦
COBOL <wbr> <wbr>知识点集锦(下) COBOL数据类型
计息是银行的一项重要业务,包括日常代理客户收、付计算客户利息和年度计息等。目前,这些工作大多数是在IBM ES9000主机的SAFE应用系统平台上进行,该系统联机程序和联机计息程序是用IBM 370汇编语言实现的。为方便汇编语言读写,在VSAM文件存储的数据中,数据存放格式进行了特殊的定义。如日期存放采用X(3)型,01年03月15日,存入EBCD码为X‘010315’。在进行年度计息时,为了实现各种复杂的运算工作,一般采用COBOL语言来实现各种运算。而采用COBOL语言读取X(3)型数据时,读出的是字符型数据,不能直接进行运算,必须转换为COBOL数据类型的数据后才能进行相应处理。如刚才的X‘010315’,需要转换为内部十进制数据X‘0010315C’。本文介绍一种用COBOL语言实现字符型X(3)与内部十进制数据相互转换的方法。
由X(3)型转换为内部十进制
由于日期数据总是大于零,在COBOL语言的工作单元节定义变量DATE-FIRST后,再追加定义COBOL语言的最小数据单元X‘000C’,即十进制12。由于重定义DATE-CASE为DATE-CHANGE后,DATE-CHANGE是原日期数据的1000倍,于是要在过程部将DATE-CHANGE除以1000。
首先,在COBOL程序WORKING-STORAGE SECTION. 中定义如下内容:
WORKING-STORAGE SECTION.
01 DATE-CASE.
02 DATE-FIRST PIC X(3).
02 DATE-SIGN PIC 9(4) COMP VALUE 12.;定点二进制数
01 DATE-CHANGE REDEFINES DATE-CASE PIC 9(9) COMP-3. ;内部十进制数据
01 DATE-HEX PIC X(3). ; 转换前数据
01 DATE-DEC PIC S9(7)COMP-3 . ; 转换后数据
然后,在过程部PROCEDURE DEVISION.中加入如下语句:
PROCEDURE DEVISION.
MOVE DATE-HEX TO DATE-FIRST .
COMPUTE DATE-CHANGE = DATE-
CHANGE / 1000.
MOVE DATE-CHANGE TO DATE-DEC.
由内部十进制转换为X(3)型
在进行相反的转换时,要消除因COBOL语言数据类型标志“C”引起的原日期数据前多加的一个0,所以需要将转换数据乘以10,再取出前6位数据即可。
首先,在COBOL程序WORKING-STORAGE SECTION. 中定义如下内容:
WORKING-STORAGE SECTION.
01 WORK-DATE PIC S9(7) COMP-3.
01 AA REDEFINES WORK-DATE.
02 A1 PIC X(3).
02 A2 PIC X(1).
01 DATE-HEX PIC X(3). ;转换后数据
01 DATE-DEC PIC S9(7) COMP-3.
;转换前数据
然后,在过程部PROCEDURE DEVISION.中加入如下语句即可:
PROCEDURE DIVISION.
MOVE DATE-DEC TO WORK-DATE。
COMPUTE WORK-DATE=WORK-DATE*10.
MOVE A1 TO DATE-HEX .

COBOL <wbr> <wbr>知识点集锦(下) cobol语法
REDEFINES
可以用不同的变量描述同一内存。
01 PART_RECODE USAGE DISPLAY
03 PART-TYPE PICTURE...
03 PART_TYPE_A.
05 PART_NUMBER PICTURE...
05 PART_COST PICTURE...
03 PART_TYPE_B REDEFINES PART_TYPE_A.
05 UPC_CODE PICTURE...
03 PART_TYPE_C REDEFINES PART_TYPE_A.
05 ISBN PICTURE...
根据PART_TYPE决定用PART_TYPE_A还是PART_TYPE_B还是PART_TYPE_C。
规则:
PART_TYPE_B和PART_TYPE_C长度不能大于PART_TYPE_A。
数据项不能有VALUE。
01层不能用REDEFINES.
PART_TYPE_B和PART_TYPE_C中不能有OCCURS.

PICTURE
定义基本项目的具体长度,格式,数据类型。可以简写成PIC.
格式字符串最多30个字符,可以包含下列字符:
A 字母A-Z,a-z,空格
B 插入空格
P 标量字符,代表字段中不显示的小数点位置
S 代数符号,实际显示取决于项目的USAGE
V 小数点位置
X 任何字符
Z 抑制前头的0并转换成空字符
0 插入0
9 数字0~9
/ 插入/
, 插入,(逗号不能作为字符串的最后一位,最后时逗号是分隔符)
. 插入.
* 抑制前头的0并转换成*
+ 正值插入+,负值插入-
- 正值插入空格,负值插入-
$ 插入美元号
CR 正值插入两个空格,负值插入CR
DB 正值插入两个空格,负值插入DB
例子:
03 VAR PIC AAAAA. VAR变量长度为5个字符,不能有数字,等价于03 STATE PIC A(5)。
输入ASDFG ,显示ASDFG
03 VAR PIC XXXXX. VAR变量长度为5个任意字符。等价于03 FILLER PIC X(5)。
输入123AS , 显示123AS
03 VAR PIC 99/XXX/9999 长度11,输入05may2004,显示05/may/2004
03 VAR PIC 0ABXXX/9999 长度11,输入05may2004,显示05 may/2004
03 VAR PIC 9(3) 长度3,0~999之间。
03 VAR PIC 9(4)V99 长度6,0.00~9999.99之间。
03 VAR PIC S9(5)V99 长度7,-99999.99~99999.99之间。
03 VAR PIC 9(6)PPP 长度6,可以是1000,2000,...,999999000。输入1234,显示1000。
03 VAR PIC PPP999 长度3,0.000001~0.000999之间。输入123,显示0.000123。
03 VAR PIC ZZZ.99,输入100.50,显示100.50;输入-51.50,显示51.50;
输入0,显示.00.
03 VAR PIC $ZZZ.ZZ-,输入100.50,显示$100.50;输入-51.50,显示$51.50-;
输入0,显示
03 VAR PIC $***,***.99CR,输入1000,显示$**1000.00;输入-1000,显示$**1000.00CR;
输入0,显示$***,***.00;输入51.5,显示$***,*51.50
03 VAR PIC $$$,$$$.99,输入100.50,显示$100.50;输入-100.50,显示$100.50;
输入0.777,显示$.77;输入0,显示$.00
03 VAR PIC $.$$$,输入1.00,显示$.00;输入0.65,显示$.65;
输入0,显示$.00;
03 VAR PIC $--,输入17.7,显示$17;输入-17.7,显示$-17;
输入-5,显示$-5
03 VAR PIC $999.99+,输入100.50,显示$100.50+;输入-100.50,显示$100.50-;
03 VAR PIC 9(3)B9(3)&
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值