
АНАЛИЗ ТЕКСТОВЫХ ПАЛИНДРОМОВ
Методические указания для практического занятия
по курсу
"Языки программирования высокого уровня"
Цель занятия
Целью занятия является практическое изучение применения библиотечных функций системы программирования C для оперативной обработки символьной информации при анализе текстовых палиндромов.
Формулировка задания
Требуется разработать программу PALINDROME, предназначенную для проверки наличия свойства быть алфавитно-цифровым палиндромом у произвольной последовательности символов. Исследуемая последовательность символов должна передаваться программе через набор аргументов командной строки ее вызова. При анализе заданной последовательности необходимо учитывать только символы, которые являются цифрами или буквами, игнорируя различие строчных и заглавных букв. Результаты проверки должен идентифицировать целочисленный код возврата программы PALINDROME, который передается в операционную среду ее вызова. При этом последовательности символов, которая образует палиндром, должен соответствовать код возврата, равный нулю. Если заданная последовательность не является палиндромом, то код возврата программы PALINDROME должен быть отличен от нуля. По умолчанию пустая последовательность считается палиндромом.
Программа должна быть разработана в системе программирования C, с учетом требований современных стандартов ANSI/ISO C, на основе концепций структурного и функционально-ориентированного программирования. Исходный код программы PALINDROME должен допускать трансляцию в любой реализации компилирующей системы программирования C. Выполняемый код программы PALINDROME должен быть ориентирован на эксплуатацию в среде OS UNIX.
Понятие палиндрома
Палиндромом называется симметричная символьная последовательность, которая одинаково читается слева направо и справа налево. Например, слово "radar" является текстовым палиндромом, потому что его составляет симметричная последовательность букв. Символическая запись целого числа 121 образует числовой палиндром, который составлен из расположенных симметрично десятичных цифр.
В более общем случае свойством палиндрома может обладать произвольный текстовый фрагмент, состоящий из нескольких слов и/или чисел, если исключить из него все разделители между словами и числами. Например, текстовый палиндром, который состоит из нескольких слов, образует фраза "Madam, I'm Adam.", если в ней исключить все символы кроме букв и игнорировать различие регистров букв.
Метод проверки палиндрома
Метод проверки палиндрома основан на анализе совпадения симметрично расположенных символов, которые находятся на одинаковом расстоянии от концов или середины заданной последовательности. Если все симметрично расположенные символы заданной последовательности попарно совпадают, то она является палиндромом. Систематичный метод организации этой проверки состоит в том, чтобы сравнить первую половину последовательности с ее второй половиной, где символы перечислены в порядке, обратном исходному. Если обе половины таким образом модифицированной последовательности совпадают, то исходная последовательность образует палиндром. Например, последовательность "deed", преобразуется в последовательность "dede", обе половины которой совпадают, поэтому исходная последовательность "deed" является палиндромом.
Следует отметить, что в общем случае количество символов сравниваемых фрагментов заданной последовательности может отличаться на единицу, если ее длина равна нечетному числу. Поэтому сравнение обеих половин последовательности необходимо производить в диапазоне символов более короткой из них. Например, последовательность "rotor" из пяти символов представляется в виде последовательности "rorot", диапазон сравнения половин которой равен 2, а последний символ t из второй, более длинной половины, не должен учитываться при сравнении. Сравниваемые фрагменты "ro" и "rot" модифицированной последовательности совпадают по первым двум символам, поэтому исходная последовательность образует палиндром.
Для ревесирования последовательностей обычно применяется циклический сдвиг ее элементов. В данном случае, исходя из соображений удобства программной реализации, целесообразно организовать циклический сдвиг влево всех символов реверсируемой половины заданной последовательности. Циклический сдвиг влево это итерационный процесс, на каждой итерации которого все элементы сдвигаемой части перемещаются на 1 позицию влево, а начальный элемент становится последним в текущем диапазоне сдвига. При этом диапазон сдвига на каждой итерации сокращается на единицу, а количество итераций ограничено длиной реверсируемой последовательности. Например, циклический сдвиг влево полупоследовательности символов "vel" при обработке палиндрома "level" выполняется за две итерации, порождая символьные цепочки "elv" и "lev".
В общем случае исходная последовательность может состоять из нескольких алфавитно-цифровых фрагментов, которые разделяют символы, не являющиеся буквами и цифрами. Поэтому для практической реализации рассмотренного метода проверки палиндрома необходимо предусмотреть предварительную обработку заданной последовательности, чтобы получить строку символов, которая состоит только из строчных букв и/или цифр. Например, исходную последовательность "Madam, I'm Adam" следует предварительно превратить в символьную строку "madamimadam" для последующей проверки палиндрома рассмотренным методом.