Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лисп - лаб.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
373.76 Кб
Скачать

Лабораторная работа №2 Обработка строк, работа со списками

 

При выполнении заданий студенты должны приобрести навыки работы со строками, сложно организованными списками, арифметическими операциями и различными естественно-языковыми конструкциями.

Пример. Заданный список атомов рассортировать на четыре списка по следующему правилу: в первый войдут гласные буквы, во второй – согласные, в третий – цифры и в четвертый – любые другие символы.

Реализация в Mulisp

Описание пользовательских функций:

member(atom list)проверяет принадлежит ли атом заданному списку, в случае принадлежности выдает t, в противном случае nil;

revers (list1 list2)переписывает заданный список в обратном порядке, первый параметр – исходный список, второй – результирующий;

sort_list(list list_gl list_sgl list_num list_ohter)головная функция, атомы списка list распределяет по четырем спискам, указанным в условии.

 

(defun member (atom list)

((null list) nil)

((eql atom (car list)) t)

(member atom (cdr list)))

(defun revers (list1 list2)

((null list1) list2)

(revers (cdr list1) (cons (car list1) list2)))

(defun sort_list (list list_gl list_sgl list_num list_ohter)

((null list)

(progn

         (print "Rezaut–>")

         (print (revers list_gl))

         (print (revers list_sgl))

         (print (revers list_num))

         (print (revers list_ohter))))

((member (car list) '(a i e y o u))

(sort_list (cdr list) (push (car list) list_gl) list_sgl list_num list_ohter))

((member (car list)'(q w r t p s d f g h j k l z x c v b n m))

(sort_list (cdr list) list_gl (push (car list) list_sgl)

list_num list_ohter))

((member (car list) '(1 2 3 4 5 6 7 8 9))

(sort_list (cdr list) list_gl list_sgl (push (car list)

list_num) list_ohter))

(sort_list (cdr list) list_gl list_sgl list_num (push (car list) list_ohter))

)

Реализация на Common Lisp для LispWorks Вариант 1

При реализации головной функции sort_list используется рекурсия. Ключевое слово &optional определяет необязательные параметры.

(defun member-list (element lst)

(cond

((null lst) nil)

((equalp element (car lst)) t)

((member-list element (cdr lst)))))

(defun sort-list (w &optional v c n m

&aux (a (car w)) (d (cdr w)))

(cond

((null w)

(list (sort v #'string<) (sort c #'string<) (sort n #'<) m))

((member-list a '(a e i o y u))

(sort-list d (pushnew a v) c n m))

((member-list a '(b c d f g h j k l m n p q r s t v w x z))

(sort-list d v (pushnew a c) n m))

((member-list a '(0 1 2 3 4 5 6 7 8 9))

(sort-list d v c (pushnew a n) m))

(t (sort-list d v c n (push a m)))))

CL-USER > (sort-list '(r w 3 - 9 6 a 1 5 ! = ))

((A) (R W) (1 3 5 6 9) (= ! -))

Вариант 2

При реализации функции formation-list, которая формирует из исходного списка списки гласных, согласных и цифр, используются циклы совместно с расширенным макросом loop. Головная функция sort_list определяет список прочих символов путем удаления рассортированных элементов из исходного списка и выдает общий результат.

Помимо этого используются ключевые слова в описании параметров: &aux – обозначение локальных переменных с их значениями, &optional – необязательные параметры.

(defconstant vowels '(a e i o y u))

(defconstant consonants '(b c d f g h j k l m n p q r s t v w x z))

(defconstant digits '(0 1 2 3 4 5 6 7 8 9))

(defun flat-list (w &optional acc)

(cond

((null w) acc)

((atom w) (cons w acc))

((flat-list (car w) (flat-list (cdr w) acc)))))

(defun formation-list(w)

(list

(loop for v in vowels when (member-list v w) collect v)

(loop for c in consonants when (member-list c w) collect c)

(loop for d in digits when (member-list d w) collect d)))

(defun sort-list (w &aux( u w) (v (formation-list u)))

(nconc v (list (remove-if #'

(lambda (a) (member-list a(flat-list v))) u))))

(defun member-list (element lst)

(cond ((null lst) nil)

((equalp element (car lst)) t)

((member-list element (cdr lst)))))

CL-USER > (sort-list '(r w 3 - 9 6 a 1 5 ! = ))

((A) (R W) (1 3 5 6 9) (= ! -))

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

1.     Задан список символов произвольного уровня вложенности, следует сформировать из него новый список, состоящий только из гласных букв. Вычислить число удаленных символов.

2.     Задан список символов произвольного уровня вложенности, следует сформировать из него новый список, в который войдут только символы, встречающиеся не более одного раза. По каждому удаленному символу выдать число повторений.

3.     Задан список произвольного уровня вложенности, сформировать из него новый список, в который войдут только символы, отличные от гласных и согласных букв. Вычислить число встретившихся гласных и согласных.

4.     Задан список произвольного уровня вложенности, состоящий из букв и цифр. Следует сформировать из него новый список, элементами которого будут два списка: один из букв, другой из цифр. В этих списках не должно быть повторяющихся объектов.

5.     Для списка произвольного уровня вложенности, состоящего из букв, цифр и строк вычислить число объектов каждого вида и их процентное соотношение. Сам список превратить в список из объектов, в котором нет повторов.

6.     Для списка произвольного уровня вложенности выполнить анализ частоты появления каждого символа. Все встречающиеся символы и их число повторов объединить в списки, из которых сформировать список результатов.

7.     Заданный список произвольного уровня вложенности разбить на четыре списка: в первом – гласные, во втором – согласные, в третьем – цифры, в четвертом – все остальное. Первые три списка должны быть упорядочены и в них не должно быть повторов. Списки результатов объединить в один список списков.

8.     Два списка произвольного уровня вложенности объединить в один, удалив из него все повторяющиеся символы, а результат упорядочить. Выдать процентное соотношение оставшихся символов от исходных списков.

9.     Задан список произвольного уровня вложенности. Следует превратить его в два списка, в первый из которых войдут все гласные буквы, а во второй - все согласные, если число тех и других четное, в противном случае превратить его в список атомов, упорядоченных в алфавитном порядке.

10. Создать программу «переводчик», которая для заданного списка английских слов произвольного уровня вложенности будет формировать список соответствующих русских слов. Список результата не должен содержать вложений. Перевод осуществляется на основе заранее сформированного словаря, словарный запас должен составлять не менее пятнадцати слов.

11. Задан список чисел произвольного уровня вложенности, превратить его в список двух списков. В первый войдут четные числа, во второй нечетные. Четные числа упорядочить по возрастанию, нечетные по убыванию.

12. Задан список произвольного уровня вложенности, превратить его в список атомов, который будет состоять только из букв, если сумма их кодов превышает сумму цифр исходного. В противном случае список будет состоять только из цифр. В результирующем списке не должно быть повторов.

13. Задан список произвольного уровня вложенности. Из него следует сформировать новый список, элементами которого будут слова исходного, кроме тех, которые начинаются с гласных, и тех, которые встречаются более одного раза. Результирующий список упорядочить в алфавитном порядке.

14. Задан список произвольного уровня вложенности. Сформировать из него список двоичных деревьев, которые будут образовывать слова, начинающиеся с согласных, и длины этих слов. Списки деревьев упорядочить по длинам слов.

15. Задан список произвольного уровня вложенности. Сформировать список двоичных деревьев, которые будут образовывать слова, начинающиеся с гласных, и длины этих слов. Список упорядочить в порядке обратном алфавитному.

16. Задан список произвольного уровня вложенности, состоящий из букв, цифр и символов операций. Превратить его в список атомов, который следует преобразовать в список трех списков. Каждый из списков результата строится по правилу: в первый войдут цифры; во второй – двоичные деревья, где элементы дерева состоят из букв и соответствующих им кодов; третий строится аналогично второму, но из символов операций и их кодов.

17. Задан список слов произвольного уровня вложенности. Из списка удалить все слова, у которых одинаковая сумма кодов гласных и согласных букв. В результате сформировать список двоичных деревьев, которые будут состоять из слов и чисел букв в нем. Слова в списке должны быть упорядочены по убыванию числа символов.

18.  Задан список слов произвольного уровня вложенности. Отсортировать его в список атомов, в который будут входить только гласные буквы, использованные в словах исходного. По каждому символу выдать число повторений и занести это в список двоичных деревьев вида ((a.5)(e.3)).

19.  Задан список символов произвольного уровня вложенности. Сформировать из него список двоичных деревьев, где каждое дерево будет представлять пару из символа и кода. Список деревьев должен быть упорядочен по убыванию значения кода.

20. Задан список слов произвольного уровня вложенности. Сформировать список двоичных деревьев, где каждая пара – это слово и его суммарный код. В список результата не включать слова с нечетным числом гласных символов.

21.  Задан список слов произвольного уровня вложенности. Сформировать из него список точечных пар (conses), где первый элемент в паре – само слово, второй – число гласных букв в нем. В список результата не включать слова с четным числом символов.

22.  Задан список слов произвольного уровня вложенности. Превратить его в список без вложений. Упорядочить элементы в порядке возрастания числа согласных букв. В соответствие ему поставить список двоичных деревьев, где каждому слову из списка без вложений будет поставлена точечная пара, состоящая из числа гласных и согласных букв данного слова.

23. Задан список слов произвольного уровня вложенности. Сформировать из него два списка без вложений: первый будут образовывать используемые в словах гласные, второй – используемые согласные. Гласные упорядочить в алфавитном порядке, согласные в порядке, обратном алфавитному. Определить, какой процент символов алфавита был использован.

24. Задана некоторая строка и список слов произвольного уровня вложенности. Требуется сформировать из исходного списка список строк без вложений, удалив из него все повторяющиеся слова и те, которые содержат заданную строку в качестве подстроки.

25. Задано два списка строк. Первый не содержит вложений, второй – список строк произвольного уровня вложенности. Требуется сформировать из второго списка список без вложений, удалив при этом все строки, которые содержат строки из первого списка в качестве подстрок.

26. Задана некоторая строка и список слов произвольного уровня вложенности. Требуется сформировать из заданного списка строку, представляющую собой объединение всех строк исходного списка, содержащих заданную строку в качестве подстроки. Определить число используемых строк и число вхождений исходной строки в строку результата.

27.  Задан список слов произвольного уровня вложенности. Строки содержат произвольные вложения друг в друга. Следует сформировать список без вложений, в который войдут те строки исходного списка, которые не входят в другие строки и сами не содержат в себе других строк.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]