Ах, COBOL, почтенный язык программирования, который существует с момента зарождения компьютеров. Хотя это, возможно, и не самый модный язык в мире, он по-прежнему сохраняет свои позиции в некоторых устаревших системах. Сегодня мы собираемся исследовать увлекательный мир обнаружения палиндромов в COBOL. Так что пристегнитесь и приготовьтесь погрузиться в старый добрый код!
Метод 1: подход обратного и сравнения
Один из самых простых способов проверить, является ли строка палиндромом, — перевернуть ее и сравнить с исходной строкой. Вот как это можно сделать на COBOL:
IDENTIFICATION DIVISION.
PROGRAM-ID. REVERSE-COMPARE-PALINDROME.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 STRING-LENGTH PIC 9(3).
01 STRING-INPUT PIC X(100).
01 STRING-REVERSED PIC X(100).
01 IS-PALINDROME PIC X(3) VALUE 'NO '.
PROCEDURE DIVISION.
MAIN-LOGIC.
DISPLAY "Enter a string: ".
ACCEPT STRING-INPUT.
MOVE FUNCTION LENGTH (STRING-INPUT) TO STRING-LENGTH.
PERFORM REVERSE-STRING.
PERFORM COMPARE-STRINGS.
DISPLAY "Is it a palindrome? " IS-PALINDROME.
STOP RUN.
REVERSE-STRING.
MOVE SPACES TO STRING-REVERSED.
PERFORM VARYING I FROM STRING-LENGTH BY -1 UNTIL I = 0
MOVE STRING-INPUT(I:1) TO STRING-REVERSED(STRING-LENGTH - I + 1:1)
END-PERFORM.
COMPARE-STRINGS.
IF STRING-INPUT = STRING-REVERSED
MOVE 'YES' TO IS-PALINDROME
END-IF.
Метод 2: проверка наполовину
Другой подход заключается в сравнении символов, начиная с начала и конца строки, постепенно продвигаясь к центру. Если в какой-то момент символы не совпадают, мы можем сделать вывод, что строка не является палиндромом. Вот пример:
IDENTIFICATION DIVISION.
PROGRAM-ID. HALFWAY-CHECK-PALINDROME.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 STRING-LENGTH PIC 9(3).
01 STRING-INPUT PIC X(100).
01 IS-PALINDROME PIC X(3) VALUE 'NO '.
PROCEDURE DIVISION.
MAIN-LOGIC.
DISPLAY "Enter a string: ".
ACCEPT STRING-INPUT.
MOVE FUNCTION LENGTH (STRING-INPUT) TO STRING-LENGTH.
PERFORM CHECK-PALINDROME.
DISPLAY "Is it a palindrome? " IS-PALINDROME.
STOP RUN.
CHECK-PALINDROME.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > STRING-LENGTH / 2
IF STRING-INPUT(I:1) NOT = STRING-INPUT(STRING-LENGTH - I + 1:1)
EXIT PERFORM
END-IF
END-PERFORM.
IF I > STRING-LENGTH / 2
MOVE 'YES' TO IS-PALINDROME
END-IF.
Метод 3: игнорирование небуквенно-цифровых символов
В некоторых случаях мы можем захотеть игнорировать небуквенно-цифровые символы (например, пробелы или знаки препинания) при проверке палиндромов. Вот как вы можете изменить предыдущий метод, чтобы добиться этого:
IDENTIFICATION DIVISION.
PROGRAM-ID. IGNORE-NONALPHA-PALINDROME.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 STRING-LENGTH PIC 9(3).
01 STRING-INPUT PIC X(100).
01 IS-PALINDROME PIC X(3) VALUE 'NO '.
PROCEDURE DIVISION.
MAIN-LOGIC.
DISPLAY "Enter a string: ".
ACCEPT STRING-INPUT.
MOVE FUNCTION LENGTH (STRING-INPUT) TO STRING-LENGTH.
PERFORM CHECK-PALINDROME.
DISPLAY "Is it a palindrome? " IS-PALINDROME.
STOP RUN.
CHECK-PALINDROME.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > STRING-LENGTH / 2
IF STRING-INPUT(I:1) IS NOT ALPHANUMERIC
ADD 1 TO I
CONTINUE
END-IF
IF STRING-INPUT(STRING-LENGTH - I + 1:1) IS NOT ALPHANUMERIC
SUBTRACT 1 FROM I
CONTINUE
END-IF
IF STRING-INPUT(I:1) NOT = STRING-INPUT(STRING-LENGTH - I + 1:1)
EXIT PERFORM
END-IF
END-PERFORM.
IF I > STRING-LENGTH / 2
MOVE 'YES' TO IS-PALINDROME
END-IF.
В этой статье мы рассмотрели различные методы обнаружения палиндромов в COBOL. Мы рассмотрели подход обратного и сравнения, полупроверку и вариант, игнорирующий небуквенно-цифровые символы. COBOL, возможно, не самый популярный язык сегодня, но он по-прежнему занимает свое место в устаревших системах, и знание того, как с ним работать, может быть ценным. Так что давайте, попробуйте эти методы в своих проектах на COBOL!