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

时间:2011-04-19 18:58:16

标签: cobol

我想在COBOL中编写一个函数,将PIC X(60)数据类型的字符转换为大写。虽然我知道这样做的一种方法,但我希望能够手动浏览字母并添加一个常量从小写到大写,但我似乎无法对PIC X数据类型执行任何算术除非我把它们重新定义为其他东西,但是我似乎破坏了原来的X字符。

有人可以给我一个例子,说明如果给定PIC X变量,你可以将它增加1个字母(即a - > b,d - > e ...等)。换句话说,我希望能够为此变量添加1:

     01 char-temp pic x.

谢谢,

伊万

4 个答案:

答案 0 :(得分:3)

以这种方式进行大小写折叠通常是一个非常糟糕的主意,它实际上只适用于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字节的二进制数。

答案 1 :(得分:1)

你可能很顽皮,并使用重新定义,例如:

      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

我相信他们也是其他方法......

答案 2 :(得分:1)

单个字符通常占用一个字节的内存。标准COBOL没有一个字节的二进制数值数据类型(注意:PIC 9 USAGE DISPLAY是数字的字符表示,而不是数字的二进制表示)。因此,对COBOL中的单个字符进行二进制arithemetic并不适合你。

即使您可以对字符执行arithementic,您可能会对字符的二进制表示做出错误的假设 - 字母'b'不一定等于'a'的二进制表示加1(它可能适用于ASCII但不适用于EBCDIC)。

最后,如果要将一个字符替换为另一个字符,则应调查COBOL INSPECT语句。与bit twiddling不同,INSPECT完全可移植。

答案 3 :(得分:0)

  

有人可以给我一个例子,给出一个PIC X变量,你可以   将它增加1个字母(即a - > b,d - > e ...等)。换一种说法,   我希望能够为此变量添加1:

 01 char-temp pic x.

对于COBOL 85,可以使用内在函数CHARORD

   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