与ANDs和ORs(COBOL)相关的问题

与ANDs和ORs(COBOL)相关的问题,cobol,logical-operators,Cobol,Logical Operators,我似乎不能把这一部分弄对。我得到了一个输入文件,其中有很多名字,其中一些我需要跳过,每个名字都有额外的信息。我试着用ANDs和ORs跳过我不需要的名字,我想到了这个 IF DL-CLASS-STANDING = 'First Yr' OR 'Second Yr' AND GRAD-STAT-IN = ' ' OR 'X' 它除掉了除一个人以外的所有人,但当我试图添加另一组and和OR时,程序开始像规定一样运行,甚至没有 我是不是让它对编译器来说太复杂了?有没有更简单的方法跳过这些内容?您可能需

我似乎不能把这一部分弄对。我得到了一个输入文件,其中有很多名字,其中一些我需要跳过,每个名字都有额外的信息。我试着用ANDs和ORs跳过我不需要的名字,我想到了这个

IF DL-CLASS-STANDING = 'First Yr' OR 'Second Yr' AND
GRAD-STAT-IN = ' ' OR 'X'
它除掉了除一个人以外的所有人,但当我试图添加另一组and和OR时,程序开始像规定一样运行,甚至没有

我是不是让它对编译器来说太复杂了?有没有更简单的方法跳过这些内容?

您可能需要研究完全扩展这个缩写表达式,因为当有很多子句时,扩展可能不是您所想的-通常最好是显式的


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

换句话说,在您的数据部门中放置类似的内容:

03  DL-CLASS-STANDING  PIC X(20).
    88 FIRST-YEAR          VALUE 'First Yr'.
    88 SECOND-YEAR         VALUE 'Second Yr'.
03  GRAD-STAT-IN       PIC X.
    88 GS-UNKNOWN          VALUE ' '.
    88 GS-NO               VALUE 'X'.
然后可以在表达式中使用
88
级别变量:

IF (FIRST-YEAR OR SECOND-YEAR) AND (GS-UNKNOWN OR GS-NO) ...

在我看来,这更具可读性,毕竟,
COBOL
的整个要点就是看起来像是可读的英语。

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

IF(DL-CLASS-STANDING=‘第一年’或‘第二年’)和

(GRAD-STAT-IN=''或'X')

首先要注意的是,显示的代码是正在工作的代码,而未给出所需结果的修订代码从未显示。作为补充,如果只剩下一个人,为什么还需要更多的选择?总而言之,除了说“我不知道如何使用或在COBOL中使用,我不知道如何使用和在COBOL中使用”之外,实际问题还不清楚

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

  • 我是不是让它对编译器来说太复杂了

  • 有没有更简单的方法跳过这些内容[有没有更清晰的方法编写条件]

  • 对于第一个问题,答案是否定的。这对编译器来说并不难。编译器确切地知道如何处理OR、AND(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 condition = If (condition) = If ((condition1) operator (condition2))...
    
    稍微复杂一点的情况:

    IF A EQUAL TO "B"
    
    IF A EQUAL TO "B" OR "C"
    
    If condition = If (condition) = If ((condition1) operator (condition2))...
    
    这是一个轻微但不完全的简化:

    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")
    
    也许更清楚,但不是每个人都清楚,而且最初的问题仍然存在,在未成年人中

    因此:

    第一部分简化了,但小调中仍然存在该问题(只需添加和…),因此:

    导致:

    IF ((A EQUAL TO "B")
    OR (A EQUAL TO "C"))
    
    以及:

    现在,如果有人想增加和,这是很容易和明确的。如果在与其中一个条件部件相同的级别上完成,则仅将其连接到该条件部件。如果在最外层完成,它将同时连接到两个(全部)

    如果有人想在括号内插入和怎么办?好吧,因为在括号内它是简单的,人们不倾向于这样做。如果括号内的内容已经很复杂,那么它确实倾向于添加。看起来,通过独立存在而简单的事物往往不会变得复杂,而已经复杂的事物(不止一件事物,不是独立存在的事物)往往会在没有太多进一步思考的情况下变得更复杂

    COBOL是一种古老的语言。许多用COBOL编写的旧程序仍在运行。许多COBOL程序都需要修改,或者只是为了理解某些东西而阅读,而且在它们的生命周期中需要多次修改

    在更改代码时,通过向条件添加某些内容,最好不需要“干扰”条件的原始部分。如果将复杂性放在括号内,则更可能需要干扰代码,这会增加理解(更复杂)和更改(需要更多的注意,因为代码受到干扰,所以需要更多的测试)的时间

    许多旧程序将成为不良实践的例子。对此没有什么可做的,除了小心处理它们

    没有任何理由可以编写新代码,因为它在将来需要比绝对必要的更多的维护和维护

    现在,,
    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"))
    
    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
    
    If condition
    
    If condition = If (condition) = If ((condition1) operator (condition2))...
    
    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 ) ) )
    
    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 ...  .