Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Liubo4ka
0 / 0 / 0
Регистрация: 12.10.2016
Сообщений: 5
#1

Работа со списками

14.10.2016, 21:00. Просмотров 836. Ответов 4
Метки нет (Все метки)

Здравствуйте! Выполняю лабораторную по Lisp'у. Задание следующее:

Добавлено через 10 минут
Дан глобальный список ORDINE_ATOMI, который фиксирует порядок атомов.
1. Объявить функцию из 2х переменных (ORDINE atom1 atom2), где она истинна только тогда, когда атом1 следует перед атомом2 в списке ORDINE_ATOMI.
2. Объявить функцию 1 переменной (ORD_LISTA L), которая упорядочивает элементы из списка L согласно порядку в списке ORDINE_ATOMI.

Добавлено через 6 минут
По первому пункту написала следующее:

Lisp
1
2
3
4
5
6
7
8
9
10
11
(setq *ORDINE_ATOMI* '(1 2 3 4 5 6 7 8 9))
 
(defun pos_num (x lst &optional (pos 0))
       (cond
         ((eql x (car lst)) pos)
         (t (pos_num x (cdr lst) (1+  pos)))))
 
(defun ORDINE (x y)
       (cond
         ((> (pos_num x ORDINE_ATOMI) (pos_num y ORDINE_ATOMI)) "FALSE")
         (t "TRUE")))
Т.е. Нахожу позицию одного элемента, другого элемента, сравниваю эти позиции.

Синтаксис учу только 2ую неделю, в основном, есть догадки, каким образом можно было бы реализовать программу, но знаний синтаксиса не хватает, приходится выкручиваться...
Если есть другие идеи, поделитесь пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2016, 21:00
Ответы с готовыми решениями:

Работа со списками
Нужна помощь с задачей: написать функцию, которая принимает целое число и...

Работа со списками
Всем привет! Помогите пожалуйста решить задачи. Никак не могу со списками...

Работа со списками
описать работу функции определяющую, атомом или списком является...

Работа со списками
Организовать список, который будет содержать подсписки: имена столбцов и все...

Работа со списками
( 1 2 3 4 5 6 7 (A A A B (8 9 10) A ) 11 12) вывод:найти среднее...

4
Catstail
Модератор
23579 / 11679 / 2044
Регистрация: 12.02.2012
Сообщений: 19,057
15.10.2016, 08:04 #2
Лучший ответ Сообщение было отмечено Liubo4ka как решение

Решение

Для проверки порядка не нужно считать позицию. Можно проще:

Lisp
1
2
3
4
5
6
7
8
9
10
11
(setq *atoms* '(a b c d e f))
 
(defun ordin (a1 a2 alst &optional (p1 nil) (p2 nil))
  (cond ((null alst) nil)
        ((eq (car alst) a1) (if p2 nil (ordin a1 a2 (cdr alst) t p2)))
        ((eq (car alst) a2) (if p1 t nil))
        (t (ordin a1 a2 (cdr alst) p1 p2))))
        
(princ (ordin 'b 'e *atoms*))
(terpri)
(princ (ordin 'e 'c *atoms*))

http://ideone.com/zKW612
1
Liubo4ka
0 / 0 / 0
Регистрация: 12.10.2016
Сообщений: 5
16.10.2016, 13:30  [ТС] #3
Т.е. получается позиции у нас - булевые переменные. И если первый элемент встретится в списке раньше второго - выводим true, так?
Интересно... Спасибо!
А как же упорядочить введенный пользователем список согласно списку *atoms* ? У меня в голове только такая идея: формируем новый список, вносим 1ый элемент, затем отсекая голову списка, который нужно упорядочить, проверяем с каждым элементом, который внесем в новый список, если он стоит в списке *atoms* раньше остальных. Если true - заносим элемент на эту позицию, если со всеми элементами false - заносим в конец. Но как это реализовать, не знаю...
0
Catstail
Модератор
23579 / 11679 / 2044
Регистрация: 12.02.2012
Сообщений: 19,057
16.10.2016, 15:10 #4
Лучший ответ Сообщение было отмечено Liubo4ka как решение

Решение

А сортировать, к примеру, можно быстрой сортировкой:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(setq *ordlist* '(a b c d e f))
 
==> (A B C D E F)
;; Создана глобальная переменная *ordlist*
 
(defun ordin (a1 a2 alst &optional (p1 nil) (p2 nil))
  (cond ((null alst) nil)
        ((eq (car alst) a1) (if p2 nil (ordin a1 a2 (cdr alst) t p2)))
        ((eq (car alst) a2) (if p1 t nil))
        (t (ordin a1 a2 (cdr alst) p1 p2))))
 
==> ORDIN
 
(defun asort (lst)
  (cond ((null lst) nil)
        (t (let ((z (car lst)))
             (append (asort (remove-if-not (lambda (x) (ordin x z *ordlist*)) (cdr lst)))
                     (list z)
                     (asort (remove-if (lambda (x) (ordin x z *ordlist*)) (cdr lst))))))))
 
==> ASORT
 
(asort '(a f b c c c a a b f f a))
 
==> (A A A A B B C C C F F F)
1
Liubo4ka
0 / 0 / 0
Регистрация: 12.10.2016
Сообщений: 5
16.10.2016, 15:16  [ТС] #5
Огромное спасибо!
0
16.10.2016, 15:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2016, 15:16

Работа со списками
Здравствуйте. У меня возникли проблемы со следующим заданием: Выделите с...

Работа со списками
Добавить обработку вложенных подсписков (defun delmn (sp m n) (cond ...

Работа со списками
Помогите пожалуйста! Написать программу, которая формирует базу данных на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru