对不起,如果这个问题已经得到解答,我已经尝试在整个网站上搜索,但我找不到任何内容。
我创建了一个计算器,它接收来自Mainframe Replies的值和选项,然后进行算术运算。
我的主要问题是,如果我声明了图片9(3)并且值为2,那么它将以这种方式显示: 200而不是2。
我如何格式化以避免此问题?
谢谢!
答案 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!