Шаг 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)))) )
      )
   ))
Текст этой библиотеки можно взять здесь.

   

Задачи для самостоятельного решения

Первый уровень сложности

Модификаторы

  1. Составьте алгоритм, записывающий слово X в обратном порядке.
  2. Составьте алгоритм замены всех сочетаний "ку" в слове X на сочетание "аа".
  3. Запишите алгоритм, удваивающий каждую букву слова Х.
  4. Выделите в слове Х каждую букву "о" с помощью тире слева и справа.
  5. Замените в слове Х все буквы "а" на сочетание "ку", а сочетание "ку" на букву "б".
  6. В слове Х перед каждой буквой "к", которой предшествует буква "с", вставьте букву "н".
  7. Составьте программу циклической перестановки букв в слове X так, что i-я буква слова становится i+1-ой, а последняя - первой.
  8. Выделите в слове X сочетание "ку", используя тире слева и справа.
  9. В слове X замените "а" на букву "е", если "а" стоит на четном месте, и замените букву "б" на сочетание "ак", если "б" стоит на нечетном месте.
  10. Замените в слове X все буквы "а" и "я" на сочетание "йа".
  11. Замените в слове X сочетание "ро" на букву "а".
  12. Замените каждую встреченную в слове X букву "к" сочетанием букв "ken".
  13. Утройте каждую букву заданного слова.
  14. Написать программу, исправляющую ошибку в математическом тексте tg(x)=cos(x)/sin(x).
  15. Заменить окончание ING каждого слова, встречающегося в заданном предложении на ED.
  16. Гжатск получил новое название - город Гагарин. А в рязанской областной типографии еще не просохли гранки небольшой книги о родине первого космонавта. Конечно, книгу нужно было переделать...

        Написать программу, осуществляющую в тексте замену слова "Гжатск" словом "Гагарин".

  17. Реализуйте двухместную операцию, называемую вращение в языке программирование APL, которая берет первые К символов слова X и помещает их в конец этого слова. Что произойдет, если K<0? Ваше мнение?
  18. Дана последовательность слов; между соседними словами - не менее одного пробела. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему правилу:
    1. перенести каждую букву в конец слова;
    2. перенести последнюю букву в начало слова;
    3. удалить из слова первую букву;
    4. удалить из слова последнюю букву;
    5. удалить из слова все последующие вхождения первой буквы;
    6. оставить в слове только первые вхождения каждой буквы;
    7. если слово нечетной длины, то удалить его среднюю букву.
  19. Отредактировать заданное предложение, удаляя из него все слова с нечетными номерами и переворачивая слова с четными номерами. Например, HOW DO YOU DO --> OD OD
  20. Написать программу, которая в заданном тексте меняет все вхождения символа "а" на "б" и "б" на "а" ("шайба" -->"шбйаб").
  21. Изменить предыдущую программу так, чтобы она заменяла по указанному правилу любые два различные символа.
  22. Для запоминания числа п часто используют "магические" фразы, например: "это я знаю и помню прекрасно пи многие знаки мне лишни напрасны" или "кто и шутя и скоро пожелаетъ п узнать число ужъ знаетъ". Число букв в каждом слове любой из данных фраз представляет собою некоторую цифру числа п: "это"-3, "я"-1, "знаю"-4 и т.д.

        Вывести на печать число п, используя любую из указанных фраз.

   

Вычеркивание

  1. Записать алгоритм вычеркивания всех букв "о", стоящих в слове X на четных местах.
  2. Составьте алгоритм вычеркивания из слова X всех букв "K" и "G".
  3. Составьте алгоритм вычеркивания в слове X всех букв, стоящих на нечетных местах после буквы "а".
  4. Составьте алгоритм вычеркивания из слова X каждой третьей буквы.
  5. Запишите алгоритм вычеркивания из слова X всех букв "р", перед которыми стоит буква "o".
  6. Составьте алгоритм вычеркивания из слова X каждой четвертой буквы.
  7. Вычеркните из слова Х все буквы "с" и "л", стоящие на нечетных местах.
  8. Вычеркните из слова Х все буквы "б".
  9. Вычеркните из слова Х буквы, стоящие на четных местах.
  10. Вычеркните из слова Х все буквы "ш" и "л", стоящие на четных местах.
  11. Вычеркните из слова X те буквы, что встречаются трижды.
  12. Вычеркните из слова X те буквы, что используются при написании слова Y.
  13. Вычеркните i-ю букву заданного слова.
  14. Если в слове X есть буква "а", вычеркните из этого слова все буквы, стоящие на четных местах.
  15. Вычеркните из слова Y все буквы, стоящие на нечетных местах.
  16. Вычеркните из слова повторяющиеся буквы.
  17. Написать программу, которая удаляет в данном тексте все лишние пробелы.

   

Поиск

  1. Найти в заданном тексте слово максимальной длины.
  2. Перечислить все слова заданного предложения, которые состоят из тех же букв, что и первое слово предложения (последнее слово предложения).
  3. В заданном предложении найти пару слов, из которых одно является обращением другого.
  4. Из данного предложения выбрать слова, имеющие заданное число букв.

   

Подсчет

  1. Запишите алгоритм подсчета числа букв "о", стоящих в слове X на четных местах.
  2. Запишите алгоритм подсчета числа сочетаний "ку" в слове X.
  3. Запишите алгоритм подсчета суммы мест, на которых в слове X стоит буква "б".
  4. Запишите алгоритм подсчета в слове X всех сочетаний "нн". Считать, что в последовательности "ннн" "нн" встречается один раз.
  5. Запишите алгоритм, выясняющий, сколько раз в слове X встречается сочетание из первых двух букв слова Y.
  6. Составьте алгоритм, выясняющий сколько раз в слове X начиная с нечетного места встречается сочетание "ро".
  7. Напишите алгоритм, выясняющий, какая из букв (первая или последняя) встречается в слове X чаще.
  8. Составьте алгоритм подсчета числа букв "а" в слове X, стоящих на местах, номер которых кратен трем.
  9. Запишите алгоритм подсчета числа букв "о", стоящих в слове X на местах, номер которых кратен 4.
  10. Составьте алгоритм подсчета числа букв "у" в слове Х, стоящих на нечетных местах.
  11. Составьте алгоритм подсчета суммарного количества букв "м" и "н" в слове Y.
  12. Составьте алгоритм, проверяющий сколько раз первая буква слова X встречается в слове Y.
  13. Запишите алгоритм, выясняющий сколько раз вторая буква слова X встречается в слове Y на четных местах.
  14. Запишите алгоритм подсчета числа букв "о", стоящих после буквы "л" в слове X.
  15. Подсчитайте, сколько различных символов слова Х употребляется в написании Х более одного раза.
  16. Подсчитайте, сколько раз последняя буква слова Y встречается в слове Х.
  17. Определите символ, чаще всего встречающийся в слове Х.
  18. Подсчитайте, сколько раз встречается в слове Х утроенное сочетание какой-либо одной буквы. (Считать, что в слове "ннннн" сочетание "ннн" встречается один раз).
  19. Подсчитайте, сколько раз слово Y встречается в слове Х в качестве его части.
  20. Подсчитайте, сколько букв надо исправить в слове Х, чтобы получилось слово Y (Х,Y - слова одинаковой длины).
  21. Подсчитайте, сколько раз встречается в слове Х удвоенное сочетание буквы "н". (Считать, что в слове "ннннн" сочетание "нн" встречается два раза).
  22. Подсчитайте, сколько раз последняя буква слова Y встречается на четных местах в слове X.
  23. Подсчитайте число различных букв в слове X.
  24. Подсчитайте, сколько раз в слове X встречается буква "а", за которой следует буква "б".
  25. Какое минимальное число букв необходимо заменить в слове X с тем, чтобы оно стало перевертышем.
  26. Подсчитайте, сколько различных букв слова X используются при написании слова Y.
  27. Составьте алгоритм подсчета числа одинаковых букв в словах X и Y равной длины, стоящих на одних и тех же местах.
  28. Выясните, какая из букв "а" или "б" встречается в слове X чаще.
  29. Подсчитать количество гласных букв в данном слове.
  30. Подсчитайте, сколько раз первая буква слова встречается в этом слове.
  31. В данной последовательности символов найти число повторений символов слова "луна".
  32. Составить список слов данного предложения, начинающихся с буквы "А", с указанием числа повторений каждого слова.
  33. Написать программу, которая считает число слов в предложении, начинающихся на заданную букву.
  34. Составить программу, подсчитывающую число предложений в тексте (предложение оканчивается символами ".","?","!" ).
  35. Написать программу, которая считает число слов в предложении.
  36. Подсчитать количество слов текста, начинающихся с гласной.
  37. Подсчитать количество гласных и согласных букв, содержащихся в произвольном фрагменте текста.
  38. Для каждого из слов данного предложения указать, сколько раз оно встречается в предложении.
  39. Для каждого символа заданного текста указать, сколько раз он встречается в тексте.

   

Предикаты

  1. Выяснить, является ли данное слово "перевертышем", т.е. таким словом, которое одинаково читается как слева направо, так и справа налево (например, КАЗАК, ШАЛАШ).
  2. Запишите алгоритм, проверяющий, есть ли в слове X две одинаковые буквы.
  3. Запишите алгоритм, выясняющий, есть ли в слове X буква "a", стоящая на нечетном месте после буквы "к".
  4. Составьте алгоритм, проверяющий, есть ли в слове X буква "к", стоящая на четных местах перед буквой "и".
  5. Составьте алгоритм, проверяющий, все ли буквы слова X одинаковы.
  6. Запишите алгоритм, выясняющий, можно ли из букв слова X составить слово Y.
  7. Запишите алгоритм проверки, есть ли в слове X буквы "в". Если есть, то найдите номер первой из них.
  8. Запишите алгоритм, выясняющий, есть ли в слове X буква "к", и, если есть, то замените все буквы "а" в этом слове на "с".
  9. Запишите алгоритм, проверяющий, все ли буквы слова Х, стоящие на четных местах, одинаковы.
  10. Даны два слова Х и Y (длин(х)>=длин(y)). Проверьте, можно ли из букв, входящих в Х, составить Y. Каждую букву слова Х можно использовать только один раз.
  11. Определите, есть ли в словах Х и Y одинаковые символы.
  12. Выясните, есть ли в слове Х буква "в", стоящая на нечетном месте.
  13. Определите, имеются ли в слове Х две одинаковые буквы, идущие подряд.
  14. Выясните, есть ли в слове Х хотя бы одна из букв "о" или "а".
  15. Проверьте, есть ли в слове Х буква "б". Если есть, замените последнюю из них на букву "а".
  16. Выясните, все ли буквы слова Х, стоящие на нечетных местах различны.
  17. Проверьте, есть ли в слове Х буква "а". Если есть, найдите номер последней из них.
  18. Определите, встречается ли в слове Х первая буква слова Y.
  19. Выясните, есть ли в слове Х буква "в", стоящая на нечетном месте.
  20. Определите, все ли буквы слова X различны.
  21. Выясните, есть ли в слове X буква "я".
  22. Описать назначение следующей функции языка LISP:
      (DEFUN LETTERP4 (LAMBDA (X)
         (COND ( (AND (ATOM X) (EQ (LENGTH (UNPACK X)) 4)) T )
               (  T  NIL )
         )
      ))
    
  23. Написать программу, которая проверяет, можно ли из букв, входящих в слово А, составить слово В.

   

Второй уровень сложности

  1. Заданы слова А и В, причем длина А больше длины В. Определить, содержится ли в слове А слово В.
  2. Составить программы для перевода арабских чисел в римские и для обратной операции. Например, 255 = CCLV = сто + сто + пятьдесят + пять
  3. Составить программу, проверяющую правильность расстановки скобок в математической формуле (см. "Квант", 1980, N11). Другими словами, надо проверить, имеется ли в заданном тексте баланс открывающих и закрывающих круглых скобок со следующими свойствами:
    • открывающая скобка всегда предшествует соответствующей закрывающей;
    • первый и последний символы текста - пара соответствующих друг другу скобок.
  4. Для заданного текста определить длину содержащейся в нем максимальной серии символов, отличных от букв.
  5. Даны два слова А и В. Проверьте, можно ли из букв, входящих в А, составить В. Буквы можно переставлять, но каждую букву можно использовать не более одного раза.
  6. Лексикографически упорядочить данный набор слов.
  7. Написать все предложения, которые можно составить из слов: "ваши прекрасные глаза", "прекрасная маркиза", "от любви", "сулят", "мне", "смерть" путем их всевозможных перестановок (данная ситуация обыгрывается в пьесе Мольера "Мещанин во дворянстве").
  8. Образовать все возможные переносы данного слова. Перенос почти всегда будет выполняться правильно, если пользоваться такими правилами:
    • две идущие подряд гласные можно разделить, если первой из них предшествует согласная, а за второй идет хотя бы одна буква (буква й при этом рассматривается с предшествующей гласной как единое целое);
    • две идущие подряд согласные можно разделить, если первой из них предшествует гласная, а в той части слова, которая идет за второй согласной, имеется хотя бы одна гласная (буквы ь, ъ при этом рассматриваются с предшествующей согласной как единое целое);
    • если правила, указанные в предыдущих пунктах, применить невозможно, то следует попытаться разбить слово так, чтобы первая часть содержала более чем одну букву и оканчивалась на гласную, а вторая содержала хотя бы одну гласную.
  9. Вывести на экран текст без переносов, вставляя, если это нужно, дополнительные пробелы и разбивая текст на отдельные строки (задача о выравнивании по правому краю).
  10. Разбить данное слово на слоги.
  11. Из заданного словаря выбрать все слова, имеющие рифмы (рифма определяется по принципу, придуманному Незнайкой - два слова рифмуются, если последние слоги у них совпадают, например, "палка - селедка").

    На следующем шаге мы приведем задачи на обработку A-списков.




Предыдущий шаг Содержание Следующий шаг