大写字母的COBOL数据验证?
我在大学的第二个季度学习“高级COBOL”,我们刚刚收到一份作业,要求我们为不同的数据编写一些验证程序。除了小的验证程序,我什么都做了 有一个名为“零件号”的字段,长度为8字节。前5列必须是数字。第6列必须是大写字母,最后2列必须在01-68或78-99范围内。我唯一的问题是如何验证第6列是否为大写 以下是我正在使用的代码: 从工作存储:大写字母的COBOL数据验证?,cobol,validation,Cobol,Validation,我在大学的第二个季度学习“高级COBOL”,我们刚刚收到一份作业,要求我们为不同的数据编写一些验证程序。除了小的验证程序,我什么都做了 有一个名为“零件号”的字段,长度为8字节。前5列必须是数字。第6列必须是大写字母,最后2列必须在01-68或78-99范围内。我唯一的问题是如何验证第6列是否为大写 以下是我正在使用的代码: 从工作存储: 01 DETAIL-LINE. 05 PART-NUMBER.
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
我知道我做这件事可能不是很有效率,但现在我只需要让它发挥作用。我已经阅读了书中关于数据验证的整个章节,这是最后一分钟的错误(程序明天到期),所以老师不在。我将非常感谢在这方面能得到的任何帮助。我真的不知道如何验证大写字母。如果零件号的第6列中没有A或Z,我现在使用的方法会报告错误 我看不出你的代码有什么根本性的错误。我把它放进一个盒子里 驱动程序,编译并运行它。我得到了预期的结果:只报告了错误 当零件号的第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
而不是EVALUATE
之外,该示例不进行其他操作
我给你满分测试字母和大写字母
使用88级范围(through
)。很多程序员只会使用88级,使
隐式假设“A”到“Z”只包含字母字符-这是完全错误的
在某些环境中(特别是EBCDIC字符集)
另外,我知道你们一定有和Kimmy一样的老师 您应该关心的一件事是“值'A'到'Z'”。它只能在ASCII机器上工作
如果您实际对值“A”、“B”、“C”进行编码,…'Z’。它可以在所有平台上工作。对于EBCDIC,放弃字母测试,只需使用88:
88 CAPITAL-LETTER VALUE 'A' THRU 'I'
'J' THRU 'R'
'S' THRU 'Z'.
指定单个字母有效,但会生成26个比较!以上产生了三个问题。字母加上“A”到“Z”只有两个,但会带来一些内在的混淆(空格是字母,而“THRU”包括X'C1'到X'E9'范围内的不可打印数字)。对于大写字母,您可以测试字母上限条件:
IF PART-LETTER-DL NOT EQUAL SPACE AND PART-LETTER-DL IS ALPHABETIC-UPPER
...
END-IF.
字母-LOWER也可以使用,但请记住空格被视为字母,因此如果您只需要大写字母,测试空格是必要的。去年有人遇到了同样的问题,但没有达到您的程度----但答案很好。是的,事实上,我在发布问题之前就发现了这一点,但我一点也不明白。我认为这远远超出了我们目前所学的内容。问题中给出的代码将在我能想到的所有平台上正常工作。如果一个字符集在相同的值范围内编码混合的大写/小写字母,那么它只会失败。这在ASCII、EBCDIC或Unicode字符集中不会发生,因此我认为所采取的方法几乎是防弹的。但是,
'A'THRU'Z'
如果没有字母
测试,则在EBCDIC中会失败,因为非字母字符出现在'A'到'Z'的值范围内。“A'THRU'Z”将允许非字符在EBCDIC上有效。。。。但是字母顺序并不能解决这个问题——将这两个测试放在一起可以解决这个问题,对于编写的代码来说也是如此。但该数据项仍然为被误解敞开了大门。