我在大学二年级并且参加了“高级COBOL”,我们刚收到一份作业,要求我们为不同的数据编写一些验证程序。除了小验证程序外,我已经完成了所有工作。
有一个名为“PART-NUMBER”的字段,长度为8个字节。前5列必须是数字。第6列必须是大写字母,最后2列必须在01-68或78-99范围内。我唯一的问题是弄清楚如何验证第6列是否为资本。
以下是我使用的代码: 从工作存储:
01 DETAIL-LINE.
05 PART-NUMBER.
10 PART-FIRST-FIVE-DL PIC X(5).
10 PART-LETTER-DL PIC X.
88 CAPITAL-LETTER VALUE 'A' THRU 'Z'.
10 PART-LAST-TWO-DL PIC XX.
来自300-VALIDATE-PART-NUMBER
EVALUATE PART-LETTER-DL ALPHABETIC
WHEN TRUE EVALUATE CAPITAL-LETTER
WHEN FALSE MOVE 'YES' TO RECORD-ERROR-SWITCH
MOVE 'PART NUMBER' TO FIELD-NAME
MOVE PART-NO-IN TO FIELD-VALUE
MOVE 'YES' TO PART-NO-ERROR
END-EVALUATE
WHEN FALSE MOVE 'YES' TO RECORD-ERROR-SWITCH
MOVE 'PART NUMBER' TO FIELD-NAME
MOVE PART-NO-IN TO FIELD-VALUE
MOVE 'YES' TO PART-NO-ERROR
END-EVALUATE
我知道我可能不会以非常有效的方式做到这一点但是现在我只需要让它发挥作用。我已经阅读了本书中关于数据验证的整章,这是最后一分钟的错误(程序明天到期)所以老师不在。我非常感谢能从中得到任何帮助。我真的迷失了我应该如何验证大写字母。如果A或Z以外的任何内容都在零件号的第6列中,我现在使用的方法会报告错误。
答案 0 :(得分:4)
我认为您的代码没有任何根本性的错误。我把它放进去了 驱动程序,编译并运行它。我得到了预期的结果:仅报告错误 当PART-NUMBER的第6个字符不是大写字母时。
你的COBOL编码风格与我以前看到的非常不同(没错,只是 不同)。
大多数经验丰富的COBOL程序员都会编写如下代码:
IF PART-LETTER-DL IS ALPHABETIC AND
CAPITAL-LETTER
CONTINUE
ELSE
MOVE 'PART NUMBER' TO FIELD-NAME
MOVE PART-NO-IN TO FIELD-VALUE
MOVE 'YES' TO PART-NO-ERROR
END-IF
IF
适用于您的两个编辑条件,如果两者都通过(CONTINUE)则不执行任何操作,否则无效
报告错误(ELSE部分)。以上内容与您的代码基本相同
示例包括使用IF
而不是EVALUATE
。
我为测试ALPHABETIC
和大写字母给你满分
使用88级别范围(THRU
)。许多程序员只会使用88级别,而不是
隐含的假设'A'THRU'Z'仅涵盖字母字符 - 这是错误的
在某些环境中(特别是EBCDIC字符集)。
P.S。我看到你们必须和Kimmy一样有老师!
答案 1 :(得分:1)
你应该关注的一件事是“价值'A'通过'Z'”。它只适用于ASCII机器。
如果您实际编码值'A','B','C',...'Z'。它适用于所有平台。
答案 2 :(得分:1)
对于大写字母,您可以测试ALPHABETIC-UPPER条件:
IF PART-LETTER-DL NOT EQUAL SPACE AND PART-LETTER-DL IS ALPHABETIC-UPPER
...
END-IF.
ALPHABETIC-LOWER也可以使用,但请记住,SPACE被认为是ALPHABETIC,因此如果您只想要大写字母,则需要测试SPACE。
答案 3 :(得分:0)
对于EBCDIC,请删除ALPHABETIC测试并使用88:
88 CAPITAL-LETTER VALUE 'A' THRU 'I'
'J' THRU 'R'
'S' THRU 'Z'.
指定单个字母有效,但会生成26个比较!以上生成三个。 ALPHABETIC加'A'THRU'Z'只有两个,但确实带有一些内置混淆(空格是字母,THRU包括X'C1'到X'E9'范围内的不可打印数字)。