所以我进入了学院的第二学期,他们让我做了一门名为Advanced COBOL的课程。作为我的任务之一,我必须制作一个程序来测试文件中的某些内容,以确保输入没有错误。我得到了一般性的想法,但只有一些我不理解的事情,我的老师就是那些会给你一项任务的人之一,让你自己很少或根本没有帮助。所以我需要帮助。
我有一个字段,前5列必须是数字,第6列是大写字母,最后2个数字是01-68或78-99。
我的一个字段必须是一串数字,其中包含短划线,如00000-000,但有些字符有多个短划线。如何计算破折号以确定存在问题。
答案 0 :(得分:2)
以下是一些提示......
使用hieratical记录结构以不同方式查看数据。例如:
01 ITEM-REC.
05 ITEM-CODE.
10 ITEM-NUM-CODE PIC 9(3).
10 ITEM-CHAR-CODE PIC A(3).
88 ITEM-TYPE-A VALUE 'AAA' THRU 'AZZ'.
88 ITEM-TYPE-B VALUE 'BAA' THRU 'BZZ'.
05 QUANTITY PIC 9(4).
ITEM-CODE
是一个6个字符的组字段,第一部分是数字(ITEM-NUM-CODE),最后一部分
是字母(ITEM-CHAR-CODE)。您可以在程序中引用这三个变量中的任何一个。当你
请参阅ITEM-CODE
或任何其他组项COBOL
将变量视为声明为PIC X
。这意味着你可以
MOVE
几乎没有任何错误。例如:
MOVE 'ABCdef' TO ITEM-CODE
或
MOVE 'ABCdef0005' TO ITEM-REC
即使基本数据项ITEM-NUM-CODE
绝对不是数字,也不会导致错误。
验证有效性
组移动后的数据应分别验证每个基本数据项(除非
你知道肯定没有发生数据类型错误)。有很多种方法可以做到这一点。对于
例如,如果数据项必须是数字,则以下方法可以起作用:
IF ITEM-NUM-CODE IS NUMERIC
CONTINUE
ELSE
DISPLAY 'ITEM-NUM-CODE IS NOT NUMERIC'
PERFORM BIG-BAD-ERROR
END-IF
COBOL提供了可以对数据项应用的各种类测试。对于 例如:常用NUMERIC,ALPHABETIC和ALPHANUMERIC。
测试值范围的另一种常用方法是定义各种88级 - 但是练习
警告。在上面
示例ITEM-TYPE-A
是一个88级别,它定义了基于的“AAA”到“AZZ”的数据范围
整理顺序目前有效。验证ITEM-CHAR-CODE
仅包含字母
字符和第一个字母是'A'或'B',您可以执行以下操作:
IF ITEM-CHAR-CODE ALPHABETIC
DISPLAY 'ITEM-CHAR-CODE is alphabetic.'
EVALUATE TRUE
WHEN ITEM-TYPE-A
DISPLAY 'ITEM-CHAR-CODE is in range AAA through AZZ'
WHEN ITEM-TYPE-B
DISPLAY 'ITEM-CHAR-CODE is in range BAA through BZZ'
WHEN OTHER
DISPLAY 'ITEM-CHAR-CODE is in some other range'
END-EVALUATE
ELSE
DISPLAY 'ITEM-CHAR-CODE is not alphabetic'
END-IF
请注意上面ALPHABETIC
的单独测试。为什么在88级测试时呢
本来可以做的吗?实际上88是不够的,因为他们
根据当前的整理顺序,涵盖从AAA
到AZZ
的整个范围
有效。在
这是一个基于EBCDIC的环境(大量的COBOL商店使用EBCDIC)
A}\
等值。 close-brace和反斜杠字符是非alpha的但是
落入中间
范围'A'到'Z'(#* @!是什么?)。还要注意这样的值
因为'aaa'不满足ITEM-TYPE-A
条件,因为小写字母落在外面
定义的范围。也许是时候看看EBCDIC角色表了。
最后,您可以计算字符或字符串的出现次数
带有INSPECT
动词的变量如下:
INSPECT ITEM-CODE TALLING DASH-COUNT FOR ALL '-'
DASH-COUNT
必须是一个数字项,并且会包含ITEM-CODE
中的短划线字符数。 INSPECT
如果要计算位数,动词就不那么有用了。为此,每个数字都需要一个语句。
对循环进行编码可能更容易:
PERFORM VARYING I FROM 1 BY 1
UNTIL I > LENGTH OF ITEM-CODE
EVALUATE ITEM-CODE(I:1)
WHEN '-'
COMPUTE DASH-COUNT = DASH-COUNT + 1
WHEN '0' THRU '9'
COMPUTE DIGIT-COUNT = DIGIT-COUNT + 1
WHEN OTHER
COMPUTE OTHER-COUNT = OTHER-COUNT + 1
END-EVALUATE
END-PERFORM
现在问问自己为什么我很乐意使用0到9范围检查?提示:查看整理顺序。
希望这会有所帮助。