Подтвердить что ты не робот

Проблемы с AND и OR (COBOL)

У меня есть домашнее задание, которое нужно включить в завтрашний день, и я не могу получить эту часть права. См. Мне предоставлен входной файл с кучей имен, некоторые из которых мне нужно пропустить, с дополнительной информацией по каждому из них. Я пытался использовать ANDs и ORs, чтобы пропустить имена, которые мне не нужны, и я придумал это.

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

Он избавился от всех, кроме одного человека, но когда я попытался добавить еще один набор AND и OR, программа начала действовать, как условия, где даже нет.

Я сделал это слишком сложным для компилятора? Есть ли более простой способ пропустить что-то?

4b9b3361

Ответ 1

Попробуйте добавить некоторые круглые скобки для логической группировки:

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

Ответ 2

Ничего себе, это было так долго, что я даже не могу вспомнить, действительно ли этот синтаксис верен или нет:-) Возможно, вы захотите изучить полное расширение этого сокращенного выражения, поскольку расширение может быть не таким, как вы думаете, когда много статьи. Намного лучше быть явным.

Однако я бы использовал переменные уровня 88, чтобы сделать это более читаемым - 88 были специальными уровнями, чтобы условия были заданы непосредственно в разделе данных, а не с использованием явных условий в коде.

Другими словами, поставьте что-то подобное в своем делении данных (это из памяти, так как мой единственный компилятор 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 должна была выглядеть как читаемый английский.

Ответ 3

Первое, что нужно отметить, это то, что представленный код - это код, который работал, измененный код, который не дал желаемого результата, никогда не показывался. В качестве дополнения, почему, если бы был оставлен только один человек, нужен был бы больше выбора? Подводя итог этому, фактический вопрос неясен, говоря "Я не знаю, как использовать OR в COBOL. Я не знаю, как использовать AND в COBOL".

Помимо этого, были два актуальных вопроса:

  • Я сделал это слишком сложным для компилятора?

  • Есть ли более простой способ пропустить вещи [есть ли более четкий способ записи условий]?

Во-первых, ответ "Нет", это очень сложно для компилятора. Компилятор точно знает, как обрабатывать любые комбинации 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")

Размещение И внутри скобок позволило воспроизвести оригинальную проблему для людей. Что это значит, как это работает?

Один ответ таков:

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"))

Что делать, если кто-то хочет вставить И внутри скобок? Ну, потому что внутри скобок просто, люди не склонны это делать. Если то, что находится внутри скобок, уже сложно, оно, как правило, добавляется. Кажется, что что-то простое, будучи само по себе, не должно усложняться, тогда как нечто, что уже сложно (более одного, а не само по себе), как правило, становится более сложным, не задумываясь. p >

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 добавлено больше категорий, добавляется предложение VALUE на уровне 88.

Если другое условие должно быть объединено, гораздо проще сделать это.

Это все верно? Ну да. Посмотрите на это таким образом.

COBOL работает с результатами условия, в котором закодировано.

If condition

Простые условия могут быть усугублены с помощью скобок, чтобы сделать условие:

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

И так далее, до пределов компилятора.

Человек просто должен иметь дело с условием, которое они хотят для этой цели. Для общего логического потока посмотрите на условие If, для проверки посмотрите на самую низкую деталь, для подмножества, посмотрите на часть условия, относящегося к подмножеству.

Используйте простые условия. Сделайте условия простыми через скобки/круглые скобки. При необходимости создавайте сложные условия, комбинируя простые условия. Используйте имена условий для сравнения с буквальными значениями.

OR и AND были обработаны до сих пор. НЕТ часто рассматривается как что-то, чтобы лечить осторожно:

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 ) ) )

(и более скульптурно, чем это). По структурированию я надеюсь, что а) я испортил меньше и б) когда/если я все испортил, у кого-то есть больше шансов заметить это.

Если условия не упрощаются, то понимание кода сложнее. Смена кода сложнее. Для людей, изучающих COBOL, сохранение простых вещей является долговременной выгодой для всех.

Ответ 4

Как правило, я избегаю использования И, если это вообще возможно. Вложенные 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 ...  .