在COBOL中声明变量

时间:2014-02-13 14:17:45

标签: variables cobol

对不起,如果这个问题已经得到解答,我已经尝试在整个网站上搜索,但我找不到任何内容。

我创建了一个计算器,它接收来自Mainframe Replies的值和选项,然后进行算术运算。

我的主要问题是,如果我声明了图片9(3)并且值为2,那么它将以这种方式显示: 200而不是2。

我如何格式化以避免此问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

由于几个原因,我建议沿着这些路线而不是已经建议的东西:你的输入字段很短,因此处理三个字段的个别名称没有真正的问题;你需要在计算之前验证输入;它会给你一些COBOL字段定义的练习;这是我为这种情况做的方式(简短,简单格式,数据,需要验证)。

程序代码很简单,可以采用多种方式构建。

您的数据可能是:4个字符(无效),零个字符(无效),三个字符,两个字符,一个字符,并且必须是数字(您没有提到它是十六进制计算器) ,否则无效。

使程序代码反映出来。

为了简单起见,首先处理主要的无效数据(太长,太短),并且不要让它接近剩余的处理。

有了这些,很容易识别一个字符(两个尾随空格)的输入,然后是两个字符(现在是第三个位置的空间时唯一剩下的可能性),那么剩下的必须是三个字符。

给每个字段一个单独的名称后,可以在他们自己的代码中测试NUMERIC(我喜欢使用PERFORM去杂乱IF / EVALUATE,但很多人没有)并且只是MOVEd到PIC 999 / 9(3)字段如果有效。

PIC 999/9(3)字段可以定义为COMP-3 / PACKED-DECIMAL。字母数字(PIC X ...)字段可以直接移动到该字段。您可能想要这样做的原因是因为我们确定它正在进行计算,这意味着编译器无论如何都必须将其转换为压缩十进制,因此您可以预先考虑转换。如果计算中的所有其他字段都是二进制,则可以在第一个MOVE之后,再次移动到COMP / COMP-4 / BINARY / COMP-5字段(不能直接将PIC X ...移动到二进制字段)。

01  INPUT-LINE.
    05  INPUT-VALUE.
        88  IV-NO-VALUE          VALUE SPACE.
        10  IV-THREE-DIGITS.
            15  IV-TWO-DIGITS.
                20  IV-ONE-DIGIT PIC X.
                20  FILLER       PIC X.
            15  FILLER           PIC X.
                88  IV-ONE-TRAILING-BLANK 
                                 VALUE SPACE.
    05  FILLER REDEFINES INPUT-VALUE.
        10  FILLER               PIC X.
        10  FILLER               PIC XX.
            88  IV-TWO-TRAILING-BLANKS 
                                 VALUE SPACE.
    05  FILLER                   PIC X(77).
        88  IV-NO-EXTRA-DATA     VALUE SPACE.

01  INPUT-VALUE-FOR-CALCULATION  PIC 9(3).

PERFORM VALIDATE-INPUT
VALIDATE-INPUT.
    IF IV-NO-EXTRA-DATA
        EVALUATE TRUE
          WHEN IV-NO-VALUE
            set some unique error
          WHEN IV-TWO-TRAILING-BLANKS
            PERFORM ONE-INPUT-CHARACTER
          WHEN IV-ONE-TRAILING-BLANK
            PERFORM TWO-INPUT-CHARACTERS
          WHEN OTHER
            PERFORM THREE-INPUT-CHARACTERS
        END-EVALUATE
    ELSE
        set some unique error
    END-IF
ONE-INPUT-CHARACTER.
    IF IV-ONE-DIGIT NUMERIC
        MOVE IV-ONE-DIGITS TO INPUT-VALUE-FOR-CALCULATION
    ELSE
        set some unique error
    END-IF
TWO-INPUT-CHARACTERS.
    IF IV-TWO-DIGITS NUMERIC
        MOVE IV-TWO-DIGITS TO INPUT-VALUE-FOR-CALCULATION
    ELSE
        set some unique error
    END-IF
THREE-INPUT-CHARACTERS.
    IF IV-THREE-DIGITS NUMERIC
        MOVE IV-THREE-DIGITS TO INPUT-VALUE-FOR-CALCULATION
    ELSE
        set some unique error
    END-IF

你是初学者,所以你不知道为什么你最终得到了200。

大型机上的ACCEPT不进行数字对齐,因为ACCEPT实际上正在获取所有可用的数据,将其打到您的字段中,并截断任何多余的数据。

这样就会得到2(这是两个尾随空白)。您的字段是PIC 999/9(3),因此它是未签名的。因为它是无符号的,所以当编译器用作VERB的源时,它将确保它是如此。这将给你2 0,因为第三个字节的左手部分(在大型机上)将从4设置为F. X'40'是一个空间,它最初是。 X'F0'为零,这是当4变为F时所得到的。

你还有中间的空间。但是,当您使用该字段进行计算时,每个字节的所有左侧部分(最后一个字节中的符号除外)将被剥离以“打包”该字段,并将结果放回PIC中999/9(3)Fs将作为“解包”的一部分插入。罗,你的两个跟着两个空白现在是200!