Шаг 114.
Практическое занятие №4. Фундаментальные типы данных. Строки
На этом шаге мы рассмотрим примеры задач на обработку строк.
Пример 1.
(DEFUN ATOMCAR (LAMBDA (X)
; Функция возвращает первый символ имени атома X ;
(CAR (UNPACK X))
))
; ---------------------- ;
(DEFUN ATOMCDR (LAMBDA (X)
; Функция возвращает имя атома X без его первого символа ;
(PACK (CDR (UNPACK X))
)))
Текст этой библиотеки можно взять
здесь.
Пример 2.
(DEFUN DELETE_LAST_LETTER (LAMBDA (WORD)
; Функция удаляет последнюю букву данного слова WORD ;
(PACK (REVERSE (CDR (REVERSE (UNPACK WORD)))))
))
Текст этой библиотеки можно взять
здесь.
Пример 3.
(DEFUN PRIMER (LAMBDA (X N WORD)
; Функция возвращает N-ю букву слова WORD ;
(PRINT (NTH N (UNPACK WORD)))
; Функция вставляет букву X на N-ю позицию слова WORD ;
(PRINT (INSERT X N (UNPACK WORD)))
; Функция удаляет N-ю букву слова WORD ;
(PRINT (DELETE N (UNPACK WORD)))
))
; ---------------------- ;
(DEFUN NTH (LAMBDA (N LST)
; Функция возвращает N-й элемент списка LST ;
(COND ( (EQ N 1) (CAR LST) )
( T (NTH (- N 1) (CDR LST)) )
)
))
; --------------------------- ;
(DEFUN INSERT (LAMBDA (X N LST)
; Функция вставляет элемент X на N-ю позицию ;
; в список LST ;
(COND ( (NULL LST) (CONS X LST) )
( (EQ N 1) (CONS X LST) )
( T (CONS (CAR LST)
(INSERT X (- N 1) (CDR LST))) )
)
))
; ------------------------- ;
(DEFUN DELETE (LAMBDA (N LST)
; Функция удаляет N-й элемент из списка LST ;
(COND ( (EQ N 1) (CDR LST) )
( T (CONS (CAR LST)
(DELETE (- N 1) (CDR LST))) )
)
))
Текст этой библиотеки можно взять
здесь.
Пример 4. Функции для вычеркивания из слова
X всех букв
"c" и
"l".
Решение:
(DEFUN V (LAMBDA (WORD)
(PACK (REMOVE l (REMOVE c
(REMOVE C (REMOVE L (UNPACK WORD))))))
))
; --------------------------- ;
(DEFUN REMOVE (LAMBDA (ATM LST)
; Возвращает список, в котором удалены все ;
; вхождения ATM в список LST ;
(COND ( (NULL LST) NIL )
( (EQ ATM (CAR LST)) (REMOVE ATM (CDR LST)) )
( T (CONS (CAR LST) (REMOVE ATM (CDR LST))) )
)
))
Текст этой библиотеки можно взять
здесь.
Пример 5. Функция, позволяющая вычеркнуть из слова
X все буквы, стоящие на четных местах после буквы "
O".
Решение:
(DEFUN PACDEL (LAMBDA ()
(PACK (DELAP_O (UNPACK (READ))))
))
; ------------------------
(DEFUN DELAP_O (LAMBDA (X)
(COND ( (NULL X) NIL )
( (NULL (CDR X)) (LIST (CAR X)) )
( (EQ (CAR X) O)
(CONS (CAR X) (DELAP_O (CDDR X))) )
( T (CONS (CAR X)
(CONS (CADR X) (DELAP_O (CDDR X)))) )
)
))
Текст этой библиотеки можно взять
здесь.
Задачи для самостоятельного решения
Первый уровень сложности
Модификаторы
- Составьте алгоритм, записывающий слово X в обратном порядке.
- Составьте алгоритм замены всех сочетаний "ку" в слове X на сочетание "аа".
- Запишите алгоритм, удваивающий каждую букву слова Х.
- Выделите в слове Х каждую букву "о" с помощью тире слева и справа.
- Замените в слове Х все буквы "а" на сочетание "ку", а сочетание "ку" на букву "б".
- В слове Х перед каждой буквой "к", которой предшествует буква "с", вставьте букву "н".
- Составьте программу циклической перестановки букв в слове X так, что i-я буква слова становится i+1-ой, а последняя - первой.
- Выделите в слове X сочетание "ку", используя тире слева и справа.
- В слове X замените "а" на букву "е", если "а" стоит на четном месте, и замените букву "б" на сочетание "ак", если "б" стоит на нечетном месте.
- Замените в слове X все буквы "а" и "я" на сочетание "йа".
- Замените в слове X сочетание "ро" на букву "а".
- Замените каждую встреченную в слове X букву "к" сочетанием букв "ken".
- Утройте каждую букву заданного слова.
- Написать программу, исправляющую ошибку в математическом тексте tg(x)=cos(x)/sin(x).
- Заменить окончание ING каждого слова, встречающегося в заданном предложении на ED.
- Гжатск получил новое название - город Гагарин. А в рязанской областной типографии еще не просохли гранки небольшой книги о родине первого космонавта.
Конечно, книгу нужно было переделать...
Написать программу, осуществляющую в тексте замену слова "Гжатск" словом "Гагарин".
- Реализуйте двухместную операцию, называемую вращение в
языке программирование APL, которая берет первые К символов
слова X и помещает их в конец этого слова. Что произойдет, если K<0? Ваше мнение?
- Дана последовательность слов; между соседними словами
- не менее одного пробела. Напечатать все слова, отличные от
последнего слова, предварительно преобразовав каждое из них
по следующему правилу:
- перенести каждую букву в конец слова;
- перенести последнюю букву в начало слова;
- удалить из слова первую букву;
- удалить из слова последнюю букву;
- удалить из слова все последующие вхождения первой буквы;
- оставить в слове только первые вхождения каждой буквы;
- если слово нечетной длины, то удалить его среднюю букву.
- Отредактировать заданное предложение, удаляя из него все слова с нечетными номерами и переворачивая слова с четными номерами.
Например, HOW DO YOU DO --> OD OD
- Написать программу, которая в заданном тексте меняет все вхождения символа "а" на "б" и "б" на "а" ("шайба" -->"шбйаб").
- Изменить предыдущую программу так, чтобы она заменяла по указанному правилу любые два различные символа.
- Для запоминания числа п часто используют "магические"
фразы, например: "это я знаю и помню прекрасно пи многие знаки мне лишни напрасны" или
"кто и шутя и скоро пожелаетъ п узнать число ужъ знаетъ". Число букв в каждом слове любой
из данных фраз представляет собою некоторую цифру числа п: "это"-3, "я"-1, "знаю"-4 и т.д.
Вывести на печать число п, используя любую из указанных фраз.
Вычеркивание
- Записать алгоритм вычеркивания всех букв "о", стоящих в слове X на четных местах.
- Составьте алгоритм вычеркивания из слова X всех букв "K" и "G".
- Составьте алгоритм вычеркивания в слове X всех букв, стоящих на нечетных местах после буквы "а".
- Составьте алгоритм вычеркивания из слова X каждой третьей буквы.
- Запишите алгоритм вычеркивания из слова X всех букв "р", перед которыми стоит буква "o".
- Составьте алгоритм вычеркивания из слова X каждой четвертой буквы.
- Вычеркните из слова Х все буквы "с" и "л", стоящие на нечетных местах.
- Вычеркните из слова Х все буквы "б".
- Вычеркните из слова Х буквы, стоящие на четных местах.
- Вычеркните из слова Х все буквы "ш" и "л", стоящие на четных местах.
- Вычеркните из слова X те буквы, что встречаются трижды.
- Вычеркните из слова X те буквы, что используются при написании слова Y.
- Вычеркните i-ю букву заданного слова.
- Если в слове X есть буква "а", вычеркните из этого слова все буквы, стоящие на четных местах.
- Вычеркните из слова Y все буквы, стоящие на нечетных местах.
- Вычеркните из слова повторяющиеся буквы.
- Написать программу, которая удаляет в данном тексте все лишние пробелы.
Поиск
- Найти в заданном тексте слово максимальной длины.
- Перечислить все слова заданного предложения, которые состоят из тех же букв, что и первое слово предложения (последнее слово предложения).
- В заданном предложении найти пару слов, из которых одно является обращением другого.
- Из данного предложения выбрать слова, имеющие заданное число букв.
Подсчет
- Запишите алгоритм подсчета числа букв "о", стоящих в слове X на четных местах.
- Запишите алгоритм подсчета числа сочетаний "ку" в слове X.
- Запишите алгоритм подсчета суммы мест, на которых в слове X стоит буква "б".
- Запишите алгоритм подсчета в слове X всех сочетаний "нн". Считать, что в последовательности "ннн" "нн" встречается один раз.
- Запишите алгоритм, выясняющий, сколько раз в слове X встречается сочетание из первых двух букв слова Y.
- Составьте алгоритм, выясняющий сколько раз в слове X начиная с нечетного места встречается сочетание "ро".
- Напишите алгоритм, выясняющий, какая из букв (первая или последняя) встречается в слове X чаще.
- Составьте алгоритм подсчета числа букв "а" в слове X, стоящих на местах, номер которых кратен трем.
- Запишите алгоритм подсчета числа букв "о", стоящих в слове X на местах, номер которых кратен 4.
- Составьте алгоритм подсчета числа букв "у" в слове Х, стоящих на нечетных местах.
- Составьте алгоритм подсчета суммарного количества букв "м" и "н" в слове Y.
- Составьте алгоритм, проверяющий сколько раз первая буква слова X встречается в слове Y.
- Запишите алгоритм, выясняющий сколько раз вторая буква слова X встречается в слове Y на четных местах.
- Запишите алгоритм подсчета числа букв "о", стоящих после буквы "л" в слове X.
- Подсчитайте, сколько различных символов слова Х употребляется в написании Х более одного раза.
- Подсчитайте, сколько раз последняя буква слова Y встречается в слове Х.
- Определите символ, чаще всего встречающийся в слове Х.
- Подсчитайте, сколько раз встречается в слове Х утроенное сочетание какой-либо одной буквы. (Считать, что в слове "ннннн" сочетание "ннн" встречается один раз).
- Подсчитайте, сколько раз слово Y встречается в слове Х в качестве его части.
- Подсчитайте, сколько букв надо исправить в слове Х, чтобы получилось слово Y (Х,Y - слова одинаковой длины).
- Подсчитайте, сколько раз встречается в слове Х удвоенное сочетание буквы "н". (Считать, что в слове "ннннн" сочетание "нн" встречается два раза).
- Подсчитайте, сколько раз последняя буква слова Y встречается на четных местах в слове X.
- Подсчитайте число различных букв в слове X.
- Подсчитайте, сколько раз в слове X встречается буква "а", за которой следует буква "б".
- Какое минимальное число букв необходимо заменить в слове X с тем, чтобы оно стало перевертышем.
- Подсчитайте, сколько различных букв слова X используются при написании слова Y.
- Составьте алгоритм подсчета числа одинаковых букв в словах X и Y равной длины, стоящих на одних и тех же местах.
- Выясните, какая из букв "а" или "б" встречается в слове X чаще.
- Подсчитать количество гласных букв в данном слове.
- Подсчитайте, сколько раз первая буква слова встречается в этом слове.
- В данной последовательности символов найти число повторений символов слова "луна".
- Составить список слов данного предложения, начинающихся с буквы "А", с указанием числа повторений каждого слова.
- Написать программу, которая считает число слов в предложении, начинающихся на заданную букву.
- Составить программу, подсчитывающую число предложений в тексте (предложение оканчивается символами ".","?","!" ).
- Написать программу, которая считает число слов в предложении.
- Подсчитать количество слов текста, начинающихся с гласной.
- Подсчитать количество гласных и согласных букв, содержащихся в произвольном фрагменте текста.
- Для каждого из слов данного предложения указать, сколько раз оно встречается в предложении.
- Для каждого символа заданного текста указать, сколько раз он встречается в тексте.
Предикаты
- Выяснить, является ли данное слово "перевертышем", т.е. таким словом, которое одинаково читается как слева направо, так и справа налево (например, КАЗАК, ШАЛАШ).
- Запишите алгоритм, проверяющий, есть ли в слове X две одинаковые буквы.
- Запишите алгоритм, выясняющий, есть ли в слове X буква "a", стоящая на нечетном месте после буквы "к".
- Составьте алгоритм, проверяющий, есть ли в слове X буква "к", стоящая на четных местах перед буквой "и".
- Составьте алгоритм, проверяющий, все ли буквы слова X одинаковы.
- Запишите алгоритм, выясняющий, можно ли из букв слова X составить слово Y.
- Запишите алгоритм проверки, есть ли в слове X буквы "в". Если есть, то найдите номер первой из них.
- Запишите алгоритм, выясняющий, есть ли в слове X буква "к", и, если есть, то замените все буквы "а" в этом слове на "с".
- Запишите алгоритм, проверяющий, все ли буквы слова Х, стоящие на четных местах, одинаковы.
- Даны два слова Х и Y (длин(х)>=длин(y)). Проверьте, можно ли из букв, входящих в Х, составить Y. Каждую букву слова Х можно использовать только один раз.
- Определите, есть ли в словах Х и Y одинаковые символы.
- Выясните, есть ли в слове Х буква "в", стоящая на нечетном месте.
- Определите, имеются ли в слове Х две одинаковые буквы, идущие подряд.
- Выясните, есть ли в слове Х хотя бы одна из букв "о" или "а".
- Проверьте, есть ли в слове Х буква "б". Если есть, замените последнюю из них на букву "а".
- Выясните, все ли буквы слова Х, стоящие на нечетных местах различны.
- Проверьте, есть ли в слове Х буква "а". Если есть, найдите номер последней из них.
- Определите, встречается ли в слове Х первая буква слова Y.
- Выясните, есть ли в слове Х буква "в", стоящая на нечетном месте.
- Определите, все ли буквы слова X различны.
- Выясните, есть ли в слове X буква "я".
- Описать назначение следующей функции языка LISP:
(DEFUN LETTERP4 (LAMBDA (X)
(COND ( (AND (ATOM X) (EQ (LENGTH (UNPACK X)) 4)) T )
( T NIL )
)
))
- Написать программу, которая проверяет, можно ли из букв, входящих в слово А, составить слово В.
Второй уровень сложности
- Заданы слова А и В, причем длина А больше длины В. Определить, содержится ли в слове А слово В.
- Составить программы для перевода арабских чисел в римские и для обратной операции.
Например, 255 = CCLV = сто + сто + пятьдесят + пять
- Составить программу, проверяющую правильность расстановки скобок в математической формуле (см. "Квант", 1980, N11). Другими словами, надо проверить, имеется ли в заданном
тексте баланс открывающих и закрывающих круглых скобок со следующими свойствами:
- открывающая скобка всегда предшествует соответствующей закрывающей;
- первый и последний символы текста - пара соответствующих друг другу скобок.
- Для заданного текста определить длину содержащейся в нем максимальной серии символов, отличных от букв.
- Даны два слова А и В. Проверьте, можно ли из букв, входящих в А, составить В. Буквы можно переставлять, но каждую букву можно использовать не более одного раза.
- Лексикографически упорядочить данный набор слов.
- Написать все предложения, которые можно составить из слов: "ваши прекрасные глаза", "прекрасная маркиза", "от любви", "сулят", "мне", "смерть" путем их всевозможных перестановок (данная ситуация обыгрывается в пьесе Мольера "Мещанин во дворянстве").
- Образовать все возможные переносы данного слова. Перенос почти всегда будет выполняться правильно, если пользоваться такими правилами:
- две идущие подряд гласные можно разделить, если первой из них предшествует согласная, а за второй идет хотя бы одна буква (буква й при этом рассматривается с предшествующей гласной как единое целое);
- две идущие подряд согласные можно разделить, если первой из них предшествует гласная, а в той части слова, которая идет за второй согласной, имеется хотя бы одна гласная (буквы ь, ъ при этом рассматриваются с предшествующей согласной как единое целое);
- если правила, указанные в предыдущих пунктах, применить невозможно, то следует попытаться разбить слово так, чтобы первая часть содержала более чем одну букву и оканчивалась на гласную, а вторая содержала хотя бы одну гласную.
- Вывести на экран текст без переносов, вставляя, если это нужно, дополнительные пробелы и разбивая текст на отдельные строки (задача о выравнивании по правому краю).
- Разбить данное слово на слоги.
- Из заданного словаря выбрать все слова, имеющие рифмы (рифма определяется по принципу, придуманному Незнайкой - два слова рифмуются, если последние слоги у них совпадают, например, "палка - селедка").
На следующем шаге мы приведем задачи на обработку A-списков.
Предыдущий шаг
Содержание
Следующий шаг