41

我似乎无法正确理解这一部分。我得到了一个包含一堆名称的输入文件,其中一些我需要跳过,每个文件都有额外的信息。我正在尝试使用 AND 和 OR 来跳过我不需要的名称,我想出了这个。

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

它摆脱了除一个人之外的所有人,但是当我尝试添加另一组 AND 和 OR 时,程序开始表现得像甚至不存在的规定一样。

我是否让它对编译器来说太复杂了?有没有更简单的方法来跳过事情?

4

4 回答 4

142

尝试添加一些括号以对事物进行逻辑分组:

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

于 2010-12-03T03:41:38.190 回答
31

可能需要考虑完全扩展该缩写表达式,因为当有很多子句时,扩展可能不是您所想的那样 - 明确表达通常要好得多。


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

换句话说,把这样的东西放在你的数据部门:

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是看起来像可读的英语,毕竟。

于 2010-12-03T03:37:59.060 回答
9

首先要注意的是,显示的代码是正在运行的代码,而没有给出预期结果的修改后的代码从未显示过。作为附录,如果只剩下一个人,为什么还需要更多的选择?总而言之,除了说“我不知道如何在 COBOL 中使用 OR。我不知道如何在 COBOL 中使用 AND”之外,实际问题并不清楚。

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

  1. 我是否让它对编译器来说太复杂了?

  2. 有没有更简单的方法来跳过事情[有没有更清晰的方法来编写条件]?

首先,答案是否定的。对于编译器来说,这远非难事。编译器确切地知道如何处理 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

所以 NOT 并不可怕,如果它变得简单的话。

在整个过程中,我一直在编辑空间。因为括号在那里,我喜欢把它们放在你的脸上。我喜欢对条件进行结构化和缩进,以强调我赋予它们的含义。

所以:

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

(并且比这更雕刻)。通过结构化,我希望a)我少搞砸,b)当/如果我搞砸了,有人更有机会注意到它。

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

于 2013-12-31T00:30:44.713 回答
2

作为一项规则,我尽可能避免使用 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 ...  .
于 2017-11-21T15:37:35.950 回答