AND和OR的问题(COBOL)

Kim*_*235 37 cobol logical-operators

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

IF DL-CLASS-STANDING = 'First Yr' OR 'Second Yr' AND
GRAD-STAT-IN = ' ' OR 'X'
Run Code Online (Sandbox Code Playgroud)

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

我是否为编译器过于复杂?是否有更简单的方法来跳过事物?

Joe*_*sky 135

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

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


pax*_*blo 29

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

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

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

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'.
Run Code Online (Sandbox Code Playgroud)

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

IF (FIRST-YEAR OR SECOND-YEAR) AND (GS-UNKNOWN OR GS-NO) ...
Run Code Online (Sandbox Code Playgroud)

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

  • @Asaph,为所有非COBOL人员添加(可读)代码位,所有99.99999999999%:-) (3认同)
  • @Paul:COBOL 88级与C枚举并不完全相同。88级可以有多个值,例如''X''Y''Z'`或'90 THRU 100'。一个更准确的模型是一个布尔值返回函数,如果有任何值匹配,则返回true。这就是我在COBOL-to-C ++声明转换器中编写它的方式(如果可能,还提供了一个枚举)。 (2认同)

Bil*_*ger 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'
Run Code Online (Sandbox Code Playgroud)

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

IF (DL-CLASS-STANDING = 'First Yr' OR 'Second Yr') 
AND (GRAD-STAT-IN = ' ' OR 'X')
Run Code Online (Sandbox Code Playgroud)

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

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

原始代码有效,但当需要更复杂时,车轮开始脱落.

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

这是怎么回事?

一个简单的条件:

IF A EQUAL TO "B"
Run Code Online (Sandbox Code Playgroud)

一个稍微复杂的条件:

IF A EQUAL TO "B" OR "C"
Run Code Online (Sandbox Code Playgroud)

简化但不完整的简化:

IF (A EQUAL TO "B" OR "C")
Run Code Online (Sandbox Code Playgroud)

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

IF (A EQUAL TO "B" OR "C")
AND (E EQUAL TO "F")
Run Code Online (Sandbox Code Playgroud)

但是这个呢?

IF (A EQUAL TO "B" OR "C" AND E EQUAL TO "F")
Run Code Online (Sandbox Code Playgroud)

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

答案是这样的:

IF (A EQUAL TO ("B" OR "C") AND E EQUAL TO "F")
Run Code Online (Sandbox Code Playgroud)

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

所以:

IF A EQUAL TO "B"
OR A EQUAL TO "C" 
Run Code Online (Sandbox Code Playgroud)

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

IF (A EQUAL TO "B")
OR (A EQUAL TO "C")
Run Code Online (Sandbox Code Playgroud)

导致:

IF ((A EQUAL TO "B")
OR (A EQUAL TO "C"))
Run Code Online (Sandbox Code Playgroud)

和:

IF ((A EQUAL TO "B")
 OR (A EQUAL TO C))
Run Code Online (Sandbox Code Playgroud)

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

IF (((A EQUAL TO "B")
  AND (E EQUAL TO "F"))
 OR (A EQUAL TO "C"))
Run Code Online (Sandbox Code Playgroud)

要么

IF (((A EQUAL TO "B")
 OR (A EQUAL TO "C"))
AND (E EQUAL TO "F"))
Run Code Online (Sandbox Code Playgroud)

如果有人想在括号内插入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".
Run Code Online (Sandbox Code Playgroud)

条件变为:

IF PARCEL-IS-OUTSIZED
AND POSTAGE-IS-SUFFICIENT
Run Code Online (Sandbox Code Playgroud)

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

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

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

COBOL根据编码条件的结果进行操作.

If condition
Run Code Online (Sandbox Code Playgroud)

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

If condition = If (condition) = If ((condition1) operator (condition2))...
Run Code Online (Sandbox Code Playgroud)

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

人类只需处理他们想要达到目的的条件.对于一般逻辑流程,请查看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
Run Code Online (Sandbox Code Playgroud)

如果它变得简单,那就不要吓人.

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

所以:

IF ( ( ( condition1 )
    OR ( condition2 ) )
AND 
     ( ( condition3 )
    OR ( condition4 ) ) )
Run Code Online (Sandbox Code Playgroud)

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

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