句点是否算作数字(COBOL)
我正在家里编写一段代码,假设查找和识别错误是一个输入文件。我做得很对,但有两个小错误在打击我。但主要问题是这一点。我必须编写一个代码,将“3077.B22”标识为错误,因为前5列假定为数字,但我当前的代码允许它通过。但是它会影响到其他任何东西,所以我不得不相信它把周期看作一个小数点。以下是我对这一部分的关注句点是否算作数字(COBOL),cobol,Cobol,我正在家里编写一段代码,假设查找和识别错误是一个输入文件。我做得很对,但有两个小错误在打击我。但主要问题是这一点。我必须编写一个代码,将“3077.B22”标识为错误,因为前5列假定为数字,但我当前的代码允许它通过。但是它会影响到其他任何东西,所以我不得不相信它把周期看作一个小数点。以下是我对这一部分的关注 01 PART-NUMBER-CHECK. 05 P-N-NUM-1 PIC X(5). 05 P-N-LETTER
01 PART-NUMBER-CHECK.
05 P-N-NUM-1 PIC X(5).
05 P-N-LETTER PIC X.
05 P-N-NUM-2 PIC XX.
300-VALIDATE-PART-NUMBER.
MOVE 'NO' TO FIELD-ERROR-SWITCH
MOVE PART-NUMBER TO PART-NUMBER-CHECK
EVALUATE P-N-NUM-1
WHEN 00001 THRU 99999 CONTINUE
WHEN OTHER MOVE 'YES' TO FIELD-ERROR-SWITCH
END-EVALUATE
IF P-N-LETTER IS NUMERIC
MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF
IF P-N-LETTER IS ALPHABETIC-LOWER
MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF
IF P-N-NUM-2 IS ALPHABETIC
MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF
IF (P-N-NUM-2 > 00 AND < 69)
OR (P-N-NUM-2 >77 AND < 100)
CONTINUE
ELSE
MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF
IF FIELD-ERROR-SWITCH = 'YES'
MOVE 'YES' TO RECORD-ERROR-SWITCH
MOVE 'Part Number' TO FIELD-NAME
MOVE PART-NUMBER TO FIELD-VALUE
PERFORM 400-WRITE-DETAIL-LINE
END-IF.
请帮帮我,我一克服路上的这个小障碍就完成了。自从我上次编写COBOL以来已经很久了,而且我手头没有编译器,所以希望代码中有一些sintax检查,但你会明白的
01 PART-NUMBER-CHECK.
05 P-N-NUM-1 .
07 p-x-occ occurs 5 pic X.
05 P-N-NUM-1-N redefines P-N-NUM-1. .
07 p-n-occ occurs 5 pic 9.
05 P-N-LETTER PIC X.
05 P-N-NUM-2 PIC XX.
01 FIELD-ERROR-SWITCH pic x(3).
88 no-error value 'NO'.
300-VALIDATE-PART-NUMBER.
MOVE 'NO' TO FIELD-ERROR-SWITCH
MOVE PART-NUMBER TO PART-NUMBER-CHECK.
perform validate-p-n-occurs varying I from 1 to 5.
if no-error
IF ( P-N-LETTER IS NUMERIC or P-N-LETTER IS ALPHABETIC-LOWER or
P-N-NUM-2 IS ALPHABETIC)
MOVE 'YES' TO FIELD-ERROR-SWITCH
ELSE
IF (P-N-NUM-2 < 0) OR (P-N-NUM-20 > 68 AND < 79) OR (P-N-NUM-2 >99)
MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF
END-IF
END-IF
IF FIELD-ERROR-SWITCH = 'YES'
MOVE 'YES' TO RECORD-ERROR-SWITCH
MOVE 'Part Number' TO FIELD-NAME
MOVE PART-NUMBER TO FIELD-VALUE
PERFORM 400-WRITE-DETAIL-LINE
END-IF.
validate-p-n-occurs.
IF p-x-occ(I) is not NUMERIC or (p-n-occ(I) < 0 or > 10)
MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF.
01零件号检查。
05 P-N-NUM-1。
07 p-x-occ发生在图5 x。
05 P-N-NUM-1-N重新定义了P-N-NUM-1。
07 p-n-occ发生在图5和图9中。
05 P-N-字母图X。
05 P-N-NUM-2图XX。
01现场错误开关pic x(3)。
88无错误值“否”。
300-验证-零件号。
将“否”移动到字段错误开关
将零件号移动到零件号检查。
执行validate-p-n-I从1到5的变化。
如果没有错误
如果(P-N-字母为数字或P-N-字母为字母或更低)
P-N-NUM-2按字母顺序排列)
将“是”移动到字段错误开关
其他的
如果(P-N-NUM-2<0)或(P-N-NUM-20>68和<79)或(P-N-NUM-2>99)
将“是”移动到字段错误开关
端到端IF
端到端IF
端到端IF
如果FIELD-ERROR-SWITCH='YES'
将“是”移动到记录错误开关
将“零件号”移动到字段名
将零件号移动到字段值
执行400-WRITE-DETAIL-LINE
结束-如果。
验证-p-n-发生。
如果p-x-occ(I)不是数字或(p-n-occ(I)<0或>10)
将“是”移动到字段错误开关
结束-如果。
自从我上次编写COBOL以来,已经有很长一段时间了,而且我手头没有编译器,所以希望代码中有一些sintax检查,但你会明白
01 PART-NUMBER-CHECK.
05 P-N-NUM-1 .
07 p-x-occ occurs 5 pic X.
05 P-N-NUM-1-N redefines P-N-NUM-1. .
07 p-n-occ occurs 5 pic 9.
05 P-N-LETTER PIC X.
05 P-N-NUM-2 PIC XX.
01 FIELD-ERROR-SWITCH pic x(3).
88 no-error value 'NO'.
300-VALIDATE-PART-NUMBER.
MOVE 'NO' TO FIELD-ERROR-SWITCH
MOVE PART-NUMBER TO PART-NUMBER-CHECK.
perform validate-p-n-occurs varying I from 1 to 5.
if no-error
IF ( P-N-LETTER IS NUMERIC or P-N-LETTER IS ALPHABETIC-LOWER or
P-N-NUM-2 IS ALPHABETIC)
MOVE 'YES' TO FIELD-ERROR-SWITCH
ELSE
IF (P-N-NUM-2 < 0) OR (P-N-NUM-20 > 68 AND < 79) OR (P-N-NUM-2 >99)
MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF
END-IF
END-IF
IF FIELD-ERROR-SWITCH = 'YES'
MOVE 'YES' TO RECORD-ERROR-SWITCH
MOVE 'Part Number' TO FIELD-NAME
MOVE PART-NUMBER TO FIELD-VALUE
PERFORM 400-WRITE-DETAIL-LINE
END-IF.
validate-p-n-occurs.
IF p-x-occ(I) is not NUMERIC or (p-n-occ(I) < 0 or > 10)
MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF.
01零件号检查。
05 P-N-NUM-1。
07 p-x-occ发生在图5 x。
05 P-N-NUM-1-N重新定义了P-N-NUM-1。
07 p-n-occ发生在图5和图9中。
05 P-N-字母图X。
05 P-N-NUM-2图XX。
01现场错误开关pic x(3)。
88无错误值“否”。
300-验证-零件号。
将“否”移动到字段错误开关
将零件号移动到零件号检查。
执行validate-p-n-I从1到5的变化。
如果没有错误
如果(P-N-字母为数字或P-N-字母为字母或更低)
P-N-NUM-2按字母顺序排列)
将“是”移动到字段错误开关
其他的
如果(P-N-NUM-2<0)或(P-N-NUM-20>68和<79)或(P-N-NUM-2>99)
将“是”移动到字段错误开关
端到端IF
端到端IF
端到端IF
如果FIELD-ERROR-SWITCH='YES'
将“是”移动到记录错误开关
将“零件号”移动到字段名
将零件号移动到字段值
执行400-WRITE-DETAIL-LINE
结束-如果。
验证-p-n-发生。
如果p-x-occ(I)不是数字或(p-n-occ(I)<0或>10)
将“是”移动到字段错误开关
结束-如果。
您的思路是正确的,但是您的编译器支持NumVal函数吗?您可以这样做:
01零件编号9(5)。9(2)
计算零件号=函数NumVal(零件号输入)
例外
将Part Num设置为true无效
End Compute您的思路正确,但是您的编译器是否支持NumVal函数?您可以这样做: 01零件编号9(5)。9(2) 计算零件号=函数NumVal(零件号输入) 例外 将Part Num设置为true无效
结束计算给出以下声明:
01 PART-NUMBER-CHECK.
05 P-N-NUM-1 PIC X(5).
05 P-N-LETTER PIC X.
05 P-N-NUM-2 PIC XX.
比如:
MOVE 'NO' TO FIELD-ERROR-SWITCH
MOVE '3077.B22' TO PART-NUMBER-CHECK
EVALUATE P-N-NUM-1
WHEN 00001 THRU 99999 CONTINUE
WHEN OTHER MOVE 'YES' TO FIELD-ERROR-SWITCH
END-EVALUATE
为什么FIELD-ERROR-SWITCH
没有设置为“是”?COBOL铸型
在应用之前,将00001和99999转换为其PIC X
等效项
这里的射程测试(施法规则)相当复杂,所以我不打算
进入它)。COBOL在这里执行的实际测试
大致相当于以下内容:
IF '00001' <= '3077.' AND '99999' >= '3077.'
然后编码如下:
MOVE SOME-CHAR TO TEST-CHAR
EVALUATE TRUE
WHEN IS-DIGIT
DISPLAY 'IS A DIGIT'
WHEN IS-LOWER-LETTER OR IS-UPPER-LETTER
DISPLAY 'IS ALPHA'
WHEN IS-SPACE
DISPLAY 'IS A SPACE'
WHEN OTHER
DISPLAY 'IS A SOMETHING ELSE'
END-EVALUATE
它几乎是防弹的。
为什么我要把字母表分成不同的组?查看EBCDIC
整理序列,你会发现一些非字母字符潜入
在‘i’和‘j’之间,然后再在‘r’和‘s’之间!哦,我多么喜欢EBCDIC
如何解决你的问题?简单到:
IF P-N-NUM-1 IS NUMERIC
IF P-N-NUM-1 = ZERO
MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF
ELSE
MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF
我会成功的。NUMERIC
测试确保组成P-N-NUM-1
只有数字。ZERO
测试确保它不是零。在这种情况下是负数
在数值测试中排除。当
正在测试的项目声明为PIC X
或PIC 9
。如果将基本项声明为PIC S9(5)压缩十进制
,则前导符号将通过数字
测试。COBOLNUMERIC
类测试需要一点学习才能完全理解
大提示:确保存储本应为数字的内容
在声明为数字的基本项中。我会尝试声明P-N-NUM-1
和
P-N-NUM-2
使用pic9
。将未验证的数据移动到零件号检查中
,默认情况下
是picx
,因此不会发生错误,然后使用
如果是数字
测试。一旦你知道你有数字数据,然后你的范围测试(例如00001到99999
,
大于/小于)不会让你误入歧途-就像这里发生的那样
为什么“*”会在你的第二段代码中偷偷出现?您从未在非字母字符上设置错误,
只在数字上。为什么?
IF P-N-NUM-1 IS NUMERIC
IF P-N-NUM-1 = ZERO
MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF
ELSE
MOVE 'YES' TO FIELD-ERROR-SWITCH
END-IF