我有一份需要在明天上交的家庭作业,我似乎无法将这一部分弄清楚。看到我被给了一个带有一堆名字的输入文件,其中一些我需要跳过,每个都有额外的信息。我正在尝试使用AND和OR来跳过我不需要的名字,我想出了这个。
IF DL-CLASS-STANDING = 'First Yr' OR 'Second Yr' AND
GRAD-STAT-IN = ' ' OR 'X'
它除了一个人之外什么都没有,但是当我试图添加另一组AND和OR时,程序开始表现得像那些甚至没有的规定。
我是否让编译器过于复杂?有没有更容易的方法来跳过事情?
答案 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。
除此之外,还有两个实际问题:
我是否让编译器过于复杂?
是否有更简单的方法可以跳过某些事情[是否有更清晰的方式来编写条件]?
首先,答案是否,编译器的难度非常大。编译器确切地知道如何处理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 ... .