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 .
===================================================================
⽤法⼦句(USAGE⼦句) 使⽤⽤法(USAGE)⼦句可以使程序设计者⾃由选挥数据杯内存中的存放形式。譬如,数据项A和B是需要多次进⾏运算,如果⽤外部⼗进制形式则来回转换会⼤⼤降低运算速度,这时,可以选择A和B为定点⼆进制形式或内部浮点形式.如果数据项C和D轻加运算次数少,⽽且需要多次打印出C和D的结果,这时⽤外部⼗进制⽐较适合,因为它最适合打印的要求,不必再进⾏转换。 USAGE IS DISPLAY/COMP DISPLAY (标准数据形式。⼀个字节放⼀字符) COMP 定点⼆近制形式 COMP-1:内部短浮点形式 COMP-2:内部长浮点形式COMP-3:内部⼗进制形式如果对组合项描述为
某⼀种存放形式,则表⽰这个组合项的下属各初等项都是这种形式。 USAGE⼦句指定的数据存放形式不应与PIC ⼦句指定的数据类型⽭盾.长、短浮点形式⼰确定了内存的长度,不应再⽤PIC ⼦句.⽤WRITE语句输出时,是直接按内存中存放数据形式输出(不加转换的).这是和⽤DISPLAY语句时不同的.
字符处理
⼀.STRING 语句
77 A PIC X(3)VALUE ‘ABC’。
77 B PIC X(5)VALUE ALL“*”。
PROCEDURE DIVISON.
…
STRING A DELIMITED BY SIZE INTO B.
…
STRING语句执⾏后,B中内容为
ABC**
1.STRING语句经常把多个发送字符串连接成⼀个较成的字符串。
STRING A B C DELIMITED BY SIZE INTO D.
2.发送不仅可以是变量,也可以是常量(不得为象征常量ALL)
STRING PROVINCE SPACE CITY ““ STREET DELIMITED BY SIZE INTI ADDRESS.
SPACE,⼀个空格,同时在城市与街道间插⼊3个空格
DELIMITED 短语
DELIMITED BY (定界)短语,除了使⽤保留字SIZE,表⽰整个发送项参加连接操作外,还可以在BY的后⾯使⽤字符值常量或字符型数据项。BY后⾯的字值常量或数据项内容称作定界符。在执⾏STRING语句时,发送项的内容以定界符为界,定界符左边的内容参加合并操作,定界符本⾝及其右⽅的内容舍去不⽤。如果发送项中没有与定界符相匹配的内容,整个发送项全参加合并操作。定界符可以是单字符,也可以是多字符的字符串。
77 A PIC X(5)VALUE “ABCDE”。
77 B PIC X(5)VALUE “EFGHI”。
77 C PIC X(10)VALUE ALL“*”。
STRING A DELIMITED BY “C”,B DELIMITED BY “F“
INTO C。
则执⾏后,以的内容为
ABE*******。
POINTER短语
POINTER(指针)短语是针对接收项的,因为每个STRING语句只能有⼀个接收项,所以每个STRING语句只能有⼀个POINTER短语。
POINTER短语,⽤于规定接收项开始接收字符的起始位置。这个位置⽤接收项字符位置的相对号来表⽰,接收项左起第1字节的相对号是1,第2字节的相对号是2,。。。。。
77 P PIC 99.
MOVE 2 TO P.
STRING A B DELIMITED BY “C”
INTO C WITH POINTER P.
执⾏后,C的内容为
*ABEFGHI**
P的值变为9(2+7)。
OVERFLOW 短语
产⽣溢出的情况
1.接收项已满,尚有未发送的字符。
2.接收项已满,尚有未经处理的发送项
3.指针短语中的指针变量值不合理,⼩于1或⼤于接收项长度。
STRING A B BY SIZE INTO C WITH POINTER P ON OVERFLOW GOTO ERR-OVER。
⼆.UNSTRING语句
UNSTRING语句与STRING语句作⽤相反,将字符串拆成若⼲字符串
规则:
如果发送项长度⼩于各接收项长度之和。
1.某接收项未装满
2.某接收项刚好装满,其右⽅各接收项没有接收内容。
对于1,系统将未接收项中尚未接收内容的字符位置填充空格,该接收项以右各接收项内容不变。
对于2,凡未已旧换新内容的项均维持原内容不变
UNSTRING A INTO B C。
DELIMITED 语句
定界符可以是单字符,也可以是多字符,但不可⾓STRING语句那样,采⽤保留字SIZE,必须是字符字值常量或字符型数据项。
如果发送项有多个字符或字符串与定界符匹配,则第⼀个匹配定界符以左的全部内容,作为⼀个发送字符串,发送给第⼀接收项,第⼆个匹配定界符以左,第⼀匹配定界符以右的内容,作为⼜⼀发送字符串,发送给第⼆接收项。若2个匹配定界符连在⼀起,相应接收项则接空格或0。
⼀个定界短语可有多个定界符,各定界符之间⽤OR连接,OR表⽰各定界符只要⼀个与发送项匹配成功,就确定发送。
UNSTRING A DELIMITED BY “,“OR ”。“INTO B C。
有时要以连续出现的同样字符作为定界符,在这种情况下,可在字符字值前冠以保留字ALL。
COUNT 短语
COUNT 短语是把发送字符串的长度记录在⼀个⽤户定义的数据项中
如A内容:ABCD//E5
B:PIC XXX
C:PIC XXX
D:PIC XXX
执⾏
UNSTRING A DELIMTED BY ‘/’
INTO B COUNT IN COUNT-B
C
D.
则B:ABC
C: (3个空格)
D:E5 (后有⼀个空格)
COUNT-B值为4。
DELIMITER短语
DELIMITER(定位符存贮)短语
UNSTRING A DELIMITER BY “,” or “;” or ALL “/”
INTO B DELIMITER IN DELIM-B
C DELIMITER IN DELIM-C.
当没有匹配发⽣时,该接收项对应的定界符存贮区被清成空格POINTER短语⽤来指⽰发送项的字符位置
此短语通常在单接收项的情况下与DELIMITER短语联合使⽤。
77 DELIM PIC X.
77 PNTR PIC 99.
77 ACCEPT-AREA PIC X(80).
零基础学java语言01 DATA-RECORD
03 DATA-ITEM PIC 9(6)
OCCURES 10 TIMES
INDEXED BY INDEX.
PROCEDURE DIVISION.
DISPLAY “PLEASE ENTER YOUR DATA.”
ACCEPT ACCEPT-AREA.
MOVE 1 TO PNTR.
MOVE LOW-VALUE TO DELIM.
PERFORM UNSTR-PROCESS
VARYING INDEX FROM 1 BY 1
UNTIL DELIM=”*”
UNSTR-PROCESS.
UNSTRING ACCEPT-AREA DELIMITED BY ALL SPACES or “*”
INTO DATA-ITEM(INDEX)
DELIMITER IN DELIM
WITH PROINTER PNTR.
TALLYING 短语
计算实际接收到了多少数据
MOVE ZERO TO TLY.
UNSTRIGN A DELIMITED BY ALL SPACE or “*”
INTO B C D E F
TRLLYING IN TLY.
假如A只发送了三个字符串,则TLY=3
本短语应在POINTER语句之后,⽽这2个短语⼜必须在DELIMITER和COUNT之后
OVERFLOW短语
溢出情况
1.指针数值项值不合理,⼩于1或⼤于发送项长度。若不合理,不执⾏UNSTRING 语句,控制转向溢出短语规定的命令语句2.当所有接收项已装满,但发送项尚有未和定界符茶杯的数据,或者尚有未被包含在发送字符串中的数据。此时先执⾏UNSTRING语句,⽽后控制转向溢出短语规定的命令语句
三.INSPECT语句
1> INSPECT/TALLYING语句
INSPEC T A TALLYING TLY FOR ALL “A”
对指定字符串的所有出现进⾏计数,即数据项中每出现⼀个指定的字符串,计数器就加1
INSPECT A TALLYING TLY FOR LEADING “*”
对指定字符串作为前缀进⾏计数,计算数据项中从第⼀个字符开始连续出现多少指定的字符串。
INSPECT A TALLYING FLY FOR CHARACTERS
对所有出现的字符进⾏计数
INSPECT A TALLYING T1 FOR “.” AFTER “A”
T2 FOR “;” BEFORE “B”
2>INSPECT/REPLACING语句
INSPECT A REPLACING CHARACTERS BY SPACE BEFORE “*”.
⽤空格替代*前的全部字符
INSPECT A REPLACING ALL “AB” BY “XY”
ALL “CD” BY“AB”
⽤XY替代AB,AB替代CD
INSPECT A REPLACING LEA DING SPACE BY ZERO BEFORE “**”
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论