AND和OR的问题(COBOL)

时间:2010-12-03 03:31:27

标签: cobol logical-operators

我有一份需要在明天上交的家庭作业,我似乎无法将这一部分弄清楚。看到我被给了一个带有一堆名字的输入文件,其中一些我需要跳过,每个都有额外的信息。我正在尝试使用AND和OR来跳过我不需要的名字,我想出了这个。

IF DL-CLASS-STANDING = 'First Yr' OR 'Second Yr' AND
GRAD-STAT-IN = ' ' OR 'X'

它除了一个人之外什么都没有,但是当我试图添加另一组AND和OR时,程序开始表现得像那些甚至没有的规定。

我是否让编译器过于复杂?有没有更容易的方法来跳过事情?

4 个答案:

答案 0 :(得分:134)

尝试添加一些括号以逻辑分组:

IF (DL-CLASS-STANDING = 'First Yr' OR 'Second Yr') AND (GRAD-STAT-IN = ' ' OR 'X')

答案 1 :(得分:27)

哇,已经很久了我甚至不记得那个语法是否有效:-)你可能想要全面扩展这个缩写表达式,因为扩展可能不是你想的那么多条款。明白更好。

但是,我要做的是使用88级别变量使其更具可读性 - 88 s是特殊级别,允许直接在数据部分中指定条件而不是使用显式条件在代码中。

换句话说,在您的数据部门中放置这样的东西(这是来自内存,因为我的唯一COBOL编译器在大型机上工作,我今天已经关闭了。)

03  DL-CLASS-STANDING  PIC X(20).
    88 IS-FIRST-YEAR              VALUE 'First Yr'.
    88 IS-SECOND-YEAR             VALUE 'Second Yr'.
03  GRAD-STAT-IN       PIC X.
    88 GRAD-STAT-UNKNOWN          VALUE ' '.
    88 GRAD-STAT-NO               VALUE 'X'.

然后,您可以在表达式中使用88级变量:

IF (IS-FIRST-YEAR OR IS-SECOND-YEAR) AND (GRAD-STAT-UNKNOWN OR GRAD-STAT-NO) ...

在我看来,这是更具可读性,毕竟COBOL的重点是看起来像英文可读。

答案 2 :(得分:8)

首先要注意的是,显示的代码是正在运行的代码,未提供未提供所需结果的修改代码。作为一个附录,为什么,如果只剩下一个人,是否需要更多选择?总而言之,实际问题不清楚,除了说"我不知道如何在COBOL中使用OR。我不知道如何在COBOL"中使用AND。

除此之外,还有两个实际问题:

  1. 我是否让编译器过于复杂?

  2. 是否有更简单的方法可以跳过某些事情[是否有更清晰的方式来编写条件]?

  3. 首先,答案是否,编译器的难度非常大。编译器确切地知道如何处理OR,AND(和NOT,我们将在后面介绍)的任何组合。问题是,人类编写者/读者能够成功地编码条件,使编译器知道他们想要什么,而不是仅仅按照其规则给出编译器的结果(这不能说明人类对人类的多种解释)。一行代码)?

    第二个问题因此变成:

    如何编写一个复杂的条件,编译器将以与作者的意图相同的方式理解,并以相同的方式编写具有COBOL经验的代码的任何读者?

    首先,快速重新安排问题中的(工作)代码:

    IF DL-CLASS-STANDING = 'First Yr' OR 'Second Yr' 
    AND GRAD-STAT-IN = ' ' OR 'X'
    

    其中一个答案中建议的代码:

    IF (DL-CLASS-STANDING = 'First Yr' OR 'Second Yr') 
    AND (GRAD-STAT-IN = ' ' OR 'X')
    

    第二个版本更清晰,但(或者)它与第一个版本相同。它没有使代码工作,它允许代码继续工作。

    答案正在解决条件问题的解决方案,其复杂性增加了:括号/括号(简单地简化复杂性是另一种可能性,但没有非工作的例子,很难提出建议)。

    原始代码但是当它需要更复杂时,轮子开始脱落。

    建议的代码有效,但是它没有(完全)解决扩展条件复杂性的问题,因为,在次要的情况下,它会在括号内重复扩展条件的复杂性。

    这是怎么回事?

    一个简单的条件:

    IF A EQUAL TO "B"
    

    稍微复杂的条件:

    IF A EQUAL TO "B" OR "C"
    

    略微但不完整的简化:

    IF (A EQUAL TO "B" OR "C")
    

    如果条件必须变得更复杂,使用AND,它对于人类来说可能很简单(编译器不在乎,它不能被愚弄):

    IF (A EQUAL TO "B" OR "C")
    AND (E EQUAL TO "F")
    

    但这是什么?

    IF (A EQUAL TO "B" OR "C" AND E EQUAL TO "F")
    

    将AND置于括号内可以复制人类的原始问题。这是什么意思,它是如何运作的?

    答案是:

    IF (A EQUAL TO ("B" OR "C") AND E EQUAL TO "F")
    

    也许更清楚,但不是每个人,并且原来的问题仍然存在,在未成年人。

    所以:

    IF A EQUAL TO "B"
    OR A EQUAL TO "C" 
    

    简化,对于第一部分,但仍然是次要问题(只需添加AND ...),所以:

    IF (A EQUAL TO "B")
    OR (A EQUAL TO "C")
    

    导致:

    IF ((A EQUAL TO "B")
    OR (A EQUAL TO "C"))
    

    IF ((A EQUAL TO "B")
     OR (A EQUAL TO C))
    

    现在,如果有人想用AND进行扩充,那么它很简单明了。如果在与其中一个条件部分相同的水平上完成,那么它只是附加于此。如果在最外层完成,它会附加到(全部)。

    IF (((A EQUAL TO "B")
      AND (E EQUAL TO "F"))
     OR (A EQUAL TO "C"))
    

    IF (((A EQUAL TO "B")
     OR (A EQUAL TO "C"))
    AND (E EQUAL TO "F"))
    

    如果有人想在括号内插入AND怎么办?好吧,因为在括号内部很简单,人们不倾向于这样做。如果括号内的内容已经很复杂,则往往会添加它。似乎通过独立而变得简单的东西往往不会变得复杂,而已经复杂的东西(不止一件事,而不是单独的东西)往往会变得更加复杂而不需要进一步思考。

    COBOL是一种古老的语言。用COBOL编写的旧程序仍在运行。许多COBOL程序必须进行修改,或者只是在多年的生命周期中阅读以理解某些内容。

    更改代码时,通过向条件添加内容,最好是条件的原始部分不需要被扰乱"。如果复杂性留在括号内,则更有可能需要扰乱代码,这会增加理解时间(更复杂)和更改(需要更多关注,需要更多测试,因为代码受到干扰)

    很多旧程序都会成为不良做法的例子。关于这一点并不多,除非要小心。

    编写新代码没有任何借口,这些代码将来需要更多的维护和保养,而不是绝对必要的。

    现在,上述例子可能被认为是冗长的。它的COBOL,对吧?很多打字?但COBOL在数据定义方面提供了极大的灵活性。作为其中的一部分,COBOL具有88级条件名称。

    以下是部分内容的数据定义:

    01  A PIC X.
        88  PARCEL-IS-OUTSIZED VALUE "B" "C".
    01  F PIC X.
        88  POSTAGE-IS-SUFFICIENT VALUE "F".
    

    条件变为:

    IF PARCEL-IS-OUTSIZED
    AND POSTAGE-IS-SUFFICIENT
    

    所有相关的文字值现在都有一个名称,而不仅仅是字面值,因此编码器可以指出它们的实际含义,以及带有该含义的实际值。如果要将更多类别添加到PARCEL-IS-OUTSIZED,则会扩展88级的VALUE子句。

    如果要组合另一个条件,那么这样做要简单得多。

    这都是真的吗?嗯,是。以这种方式看待它。

    COBOL对编码条件的结果进行操作。

    If condition
    

    通过使用括号可以使简单条件复杂化,从而形成条件:

    If condition = If (condition) = If ((condition1) operator (condition2))...
    

    依此类推,达到了编译器的极限。

    人类只需处理他们想要达到目的的条件。对于一般逻辑流程,请查看If条件,对于验证,查看最低细节,对于子集,查看与子集相关的条件部分。

    使用简单的条件。通过括号/括号简化条件。通过结合简单的条件,在需要时制定复杂的条件。使用条件名称与文字值进行比较。

    到目前为止,OR和AND已得到处理。 NOT经常被视为谨慎对待的东西:

    IF NOT A EQUAL TO B
    IF A NOT EQUAL TO B
    
    IF (NOT (A EQUAL TO B)), remembering that this is just IF condition
    

    如果简单的话,那就不要吓人了。

    在整个过程中,我一直在编辑空格。因为括号在那里,我喜欢把它们放在脸上。我喜欢结构和缩进条件,强调我给他们的意思。

    所以:

    IF ( ( ( condition1 )
        OR ( condition2 ) )
    AND 
         ( ( condition3 )
        OR ( condition4 ) ) )
    

    (还有更多的雕塑)。通过结构化,我希望a)我陷入困境b)当/如果我搞砸了,有人有更好的机会注意到它。

    如果不简化条件,那么理解代码就更困难了。更改代码更加困难。对于学习COBOL的人来说,保持简单是所有人的长期利益。

答案 3 :(得分:1)

作为一项规则,我尽量避免使用AND。嵌套的IF的工作也一样,更容易阅读,并且明智地使用88级,不必非常深入。这似乎更容易阅读,至少根据我的经验:

05  DL-CLASS-STANDING            PIC X(20) VALUE SPACE.
    88  DL-CLASS-STANDING-VALID  VALUE 'First Yr' 'Second Yr'.
05  GRAD-STAT-IN                 PIC X     VALUE SPACE.
    88  GRAD-STAT-IN-VALID       VALUE SPACE 'N'.

然后代码就像这样简单:

IF DL-CLASS-STANDING-VALID
    IF GRAD-STAT-IN-VALID
        ACTION ...  .
相关问题