如何在COBOL中对X pic子句执行算术
我想用COBOL编写一个函数,将PICX(60)数据类型的字符转换为大写。虽然我知道这样做的一种方法,但我希望能够手动遍历字母并添加一个常量,从小写到大写,但我似乎无法对PICX数据类型执行任何算术,除非我将它们重新定义为其他类型,但我似乎破坏了原始的X字符 有人能给我举个例子,在给定一个PICX变量的情况下,你可以将它增加1个字母(即a->b,d->e…等等)。换句话说,我希望能够将1添加到此变量:如何在COBOL中对X pic子句执行算术,cobol,Cobol,我想用COBOL编写一个函数,将PICX(60)数据类型的字符转换为大写。虽然我知道这样做的一种方法,但我希望能够手动遍历字母并添加一个常量,从小写到大写,但我似乎无法对PICX数据类型执行任何算术,除非我将它们重新定义为其他类型,但我似乎破坏了原始的X字符 有人能给我举个例子,在给定一个PICX变量的情况下,你可以将它增加1个字母(即a->b,d->e…等等)。换句话说,我希望能够将1添加到此变量: 01 char-temp pic x. 01 char-temp pic x.
01 char-temp pic x.
01 char-temp pic x.
谢谢
伊万你可能很淘气,并使用重新定义,例如:
01 char-temp pic x.
01 char-temp9 pic 99 comp-x redefines char-temp.
move 65 to char-temp9
display char-temp
或使用参考修改:
01 char-temp pic x.
01 char-temp9 pic 99 comp-x.
move 65 to char-temp9
move char-temp9(1:length of char-temp9) to char-temp
display char-temp
我确信它们也是其他的方法…你可以调皮,使用重新定义,例如:
01 char-temp pic x.
01 char-temp9 pic 99 comp-x redefines char-temp.
move 65 to char-temp9
display char-temp
或使用参考修改:
01 char-temp pic x.
01 char-temp9 pic 99 comp-x.
move 65 to char-temp9
move char-temp9(1:length of char-temp9) to char-temp
display char-temp
而且我确信它们也是其他的方法…一个字符通常占用一个字节的内存。标准COBOL没有一个字节的二进制数字数据类型(注意:
PIC9用法显示
是数字的字符表示,而不是数字的二进制表示)。所以,在COBOL中对单个字符进行二进制算术运算并不适合您
即使可以对字符执行算术匹配,也可能对字符的二进制表示形式做出了错误的假设-字母“b”不一定等于二进制表示形式“a”加1(它可能适用于ASCII,但不适用于EBCDIC)
最后,如果您想用另一个字符替换一个字符,您应该研究COBOL
INSPECT
语句。与比特旋转不同,INSPECT
是完全可移植的。单个字符通常占用一个字节的内存。标准COBOL没有一个字节的二进制数字数据类型(注意:PIC9用法显示
是数字的字符表示,而不是数字的二进制表示)。所以,在COBOL中对单个字符进行二进制算术运算并不适合您
即使可以对字符执行算术匹配,也可能对字符的二进制表示形式做出了错误的假设-字母“b”不一定等于二进制表示形式“a”加1(它可能适用于ASCII,但不适用于EBCDIC)
最后,如果您想用另一个字符替换一个字符,您应该研究COBOL
INSPECT
语句。与位旋转不同,INSPECT
是完全可移植的。以这种方式进行大小写折叠通常是一个非常糟糕的主意,它实际上只适用于7位ASCII。您所要求的是可能的,甚至很容易做到,但我将首先介绍一些将数据大写的其他方法
最简单的方法:
Move function upper-case(my-src-field) To my-tgt-field
非常简单的方法:
Inspect my-field
converting 'abc...z' to 'ABC...Z'
End-Inspect
很难将一个添加到01 char temp pic x:
01 my-working-storage.
02 char-temp-area.
03 filler pic x.
03 char-temp pic x.
02 char-temp-9 redefines char-temp-area pic s9(4) comp
然后你可以:
Move 'A' to char-temp
Add +1 to char-temp-9
和char temp将包含一个“B”。正如其他人所提到的,Cobol对单字节二进制数学不太好,因此您必须使您的字符适合二进制数的低字节,在本例中为2字节二进制数。以这种方式进行大小写折叠通常是一个非常糟糕的主意,它实际上只适用于7位ASCII。您所要求的是可能的,甚至很容易做到,但我将首先介绍一些将数据大写的其他方法 最简单的方法:
Move function upper-case(my-src-field) To my-tgt-field
非常简单的方法:
Inspect my-field
converting 'abc...z' to 'ABC...Z'
End-Inspect
很难将一个添加到01 char temp pic x:
01 my-working-storage.
02 char-temp-area.
03 filler pic x.
03 char-temp pic x.
02 char-temp-9 redefines char-temp-area pic s9(4) comp
然后你可以:
Move 'A' to char-temp
Add +1 to char-temp-9
和char temp将包含一个“B”。正如其他人所提到的,Cobol对单字节二进制数学不太好,因此您必须使您的字符适合二进制数的低字节,在本例中是2字节二进制数
有人能给我举个例子,在给定PICX变量的情况下,你可以
增加1个字母(即a->b,d->e…等)。换句话说,,
我希望能够将1添加到此变量:
01 char-temp pic x.
01 char-temp pic x.
对于COBOL 85,可以使用内部函数CHAR
和ORD
program-id. add1.
data division.
working-storage section.
1 char-temp pic x.
procedure division.
begin.
move "a" to char-temp
display char-temp "->" with no advancing
perform add-1-to-char
display char-temp
stop run
.
add-1-to-char.
move function char (function ord (char-temp) + 1)
to char-temp
.
end program add1.
结果:
a->b
有人能给我举个例子,在给定PICX变量的情况下,你可以
增加1个字母(即a->b,d->e…等)。换句话说,,
我希望能够将1添加到此变量:
01 char-temp pic x.
01 char-temp pic x.
对于COBOL 85,可以使用内部函数CHAR
和ORD
program-id. add1.
data division.
working-storage section.
1 char-temp pic x.
procedure division.
begin.
move "a" to char-temp
display char-temp "->" with no advancing
perform add-1-to-char
display char-temp
stop run
.
add-1-to-char.
move function char (function ord (char-temp) + 1)
to char-temp
.
end program add1.
结果:
a->b
我强烈建议您学习COBOL并停止尝试用它来做“C”类的事情。COBOL不是这样工作的。为什么您会假设
PIC
类型被编码成这样,添加一个常量就足以大写一个字符?即使它是一个简单的字符串,没有通过实现添加任何头或尾,您仍然可以处理编码为UTF-16
或EBCDIC
的字符。我强烈建议您学习COBOL并停止尝试用它来做“C”的事情。COBOL不是这样工作的。为什么您会假设PIC
类型被编码成这样,添加一个常量就足以大写一个字符?即使它是一个简单的字符串,没有通过实现添加任何头或尾,您仍然可以处理编码为UTF-16
或EBCDIC
的字符。