2014-08-31 1 views
1

Я действительно новичок в COBOL, и я хотел бы задать вопрос. Что делать, если у меня есть 2 ПОС символов, и я хотел бы знать, если они являются теми же струнамиСравнение 2 строк символов PIC X в COBOL

77 name1 PIC x(20). 
    77 name2 PIC x(20). 

    PROCEDURE DIVISION. 
     DISPLAY "Type the first name: " WITH NO ADVANCING 
     ACCEPT name1. 
     DISPLAY "Type the second name: " WITH NO ADVANCING 
     ACCEPT name2. 

Я пытался искать в гугле и нашел метод поиска. Но я не могу это понять, и я думаю, что это не сработает по моему делу, так как я не использую таблицу.

+0

'PIC' не тип, это синтаксическая конструкция, которая предшествует тип (или, вернее, формат) поля, в этом случае' х (20) 'означает« произвольный текст из 20 символов ». – Dai

+0

так что я не могу их сравнить? –

+0

@ Дай Нет, 'PIC X (20)' не означает этого. 'X' называется« буквенно-цифровым », но он может действительно содержать любой из 256 доступных битовых шаблонов. PIC X (20) - 20 байтов данных. То, что он содержит, зависит от контекста, в котором он используется. В этом примере «ACCEPT» представляет собой ввод с клавиатуры, но поля PIC X могут использоваться многими другими способами. –

ответ

2

(Отказ от ответственности: Я не пользователь COBOL)

После некоторого быстрого поиска в Интернете, я нашел OpenCOBOL справочного руководства (http://opencobol.add1tocobol.com/OpenCOBOL%20Programmers%20Guide.pdf), который описывает оператор IS= соотношения (и его синонимы) работает с типами строк (6.1.4.2.5) а именно:.

When comparing strings, the comparison is made based upon the program’s collating sequence (see section 4.1.2). When the two string arguments are of unequal length, the shorter is assumed to be padded (on the right) with a sufficient number of SPACES as to make the two strings of equal length. String comparisons take place on a corresponding character-by-character basis until an unequal pair of characters is found. At that point, the relative position of where each character in the pair falls in the collating sequence will determine which is greater (or less) than the other.

COBOL определяет IS=, IS EQUAL TO и EQUALS в качестве эквивалентных операторов, так что вы хотите что-то вроде этого:

IF name1 EQUALS name2 
    DISPLAY "Names are the same" 
ELSE 
    DISPLAY "Names are not the same" 

В документации состояний, параметры сортировки вашей программы определяют, как выполняется сравнение строк, что означает, что потенциально «Peter», «PETER», и «Péter» может рассматриваться как эквиваленты.

Примечание о разной длине интересно, неявная правая набивка означает, что эти две строки считаются равными: («Foo„и“Foo__„), но не (“Foo„и“__Foo»).

+0

Спасибо, сэр. Я буду читать гида. : D –

+1

Существует также операторы plain =,> = etc, а также –

+2

Вам нужно прекратить ваш IF. Современный путь - с END-IF. В противном случае это будет полный стоп/период. COBOL не имеет «строк» ​​в смысле разделительной строки текстовых данных, он имеет поля фиксированной длины. Таким образом сравнивается относительное положение каждого байта поля, с заполнением, которое вы идентифицировали. Если вы хотите найти, находится ли 'Foo' в поле с пробелом или без него, это непроблематично. Использование последовательности сортировки встречается редко, но да, я думаю, вы могли бы считать, что эти три равны. Это применимо ко всем данным в программе, поэтому используйте с осторожностью :-) –

2

Просто построить на @Dai's answer, я бегу на г/OS и любой другой оператор сравнения listed on Page 6-8 in that reference работал для меня кроме для оператора EQUALS, выраженной в @Dai's answer.

работы

IS EQUAL TO

IF name1 IS EQUAL TO name2 
    DISPLAY "Names are the same" 
ELSE 
    DISPLAY "Names are not the same" 
END-IF. 

работы

IS =

IF name1 IS = name2 
    DISPLAY "Names are the same" 
ELSE 
    DISPLAY "Names are not the same" 
END-IF. 

не работает

EQUALS

IF name1 EQUALS name2 
    DISPLAY "Names are the same" 
ELSE 
    DISPLAY "Names are not the same" 
END-IF. 

результатов в этой ошибке код условия 12 компиляции JCL:

IGYPS2055-S "EQUALS" was not defined as a class-name. The statement was discarded.


и подтвердить @Bruce Martin's comment вы можете уронить IS, который не ссылается на table.

работы

=

IF name1 = name2 
    DISPLAY "Names are the same" 
ELSE 
    DISPLAY "Names are not the same" 
END-IF. 
+1

Похоже, что EQUALS в GnuCOBOL (новое имя для OpenCOBOL) может быть расширением языка. Вероятно, еще один более старый компилятор COBOL разрешил EQUALS, поэтому GnuCOBOL делает это для запуска этого кода. Да, он не будет работать с компилятором IBM COBOL. –