如何在COBOL中对X pic子句执行算术

如何在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.

我想用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-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
的字符。