2012-01-26 72 views
4

我在大学的第二季度参加了“高级COBOL”,我们刚刚收到一份任务,要求我们在一些验证程序中编写不同数据的代码。除了小型验证程序外,我已完成所有工作。大写字母的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

去年有人遇到了同样的问题,但并没有达到你所做的那样 - [数据验证(COBOL)](http://stackoverflow.com/questions/4719008/data-validation-cobol) - 但答案很好。 – sarnold

+0

是的,我发现之前我发布了我的问题,但我根本不理解它。我认为这远远超出了我们迄今为止所教的内容。 – Shane

回答

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同时适用于你的编辑标准和做什么,如果这两个通(续),否则 错误报告(ELSE部分)。除了使用IF而不是EVALUATE之外,上面的代码与您的代码 的功能基本相同。

我给你满分的测试ALPHABETIC和大写字母 使用88级别的范围(THRU)。许多程序员只会使用88级别,使得隐含假设'A'THRU'Z'只覆盖字母字符 - 在某些环境中(特别是EBCDIC字符集),这是错误的 。

P.S.我看到你们必须有和Kimmy一样的老师!

1

你应该关心的一件事是“价值'A'通过'Z'”。它只能在ASCII机器上工作。

如果您实际编码值'A','B','C',...'Z'。它将在所有平台上运行。

+0

问题中提供的代码将在我能想到的所有平台 上正常工作。只有在字符 中设置了在同一个值范围内编码混合的大写/小写字母才会失败。 这不会发生在ASCII,EBCDIC或Unicode字符集,所以我认为采取的方法 是非常防弹的。然而,没有'ALPHABETIC' 测试的'A'THRU'Z'会在EBCDIC中失败,因为非字母字符出现在'A'到'Z'值范围内。 – NealB

+0

“A”到“Z”将允许非字符有效...在EBCDIC上。 –

+0

...但ALPHABETIC不会 - 将两个测试放在一起解决此问题 – NealB

0

对于EBCDIC,跌落字母测试,只是使用了88:

88 CAPITAL-LETTER  VALUE 'A' THRU 'I' 
           'J' THRU 'R' 
           'S' THRU 'Z'. 

指定单个字母的作品,但产生26个比较!以上产生三个。字母加'A'直通'Z'只有两个,但确实带有一些内置的混淆(空格是字母,THRU包括X'C1'到X'E9'范围内的非打印数字)。

1

为大写字母,你可以测试ALPHABETIC-UPPER条件:

IF PART-LETTER-DL NOT EQUAL SPACE AND PART-LETTER-DL IS ALPHABETIC-UPPER 
... 
END-IF. 

ALPHABETIC-LOWER可太习惯,但请记住,空间被视为字母,所以测试领域是必要的,如果你只是想资本字母。