Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
maximka1093
0 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 8
1

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

25.06.2014, 13:32. Просмотров 668. Ответов 8
Метки нет (Все метки)

очень нужна помощь в решении данной задачи:

Даны 3 списка. На их снове создается четвёртый список по следующему правилу:

- берутся первые элементы из каждого списка
- если среди этих 3х элементов 3эл меньше 0 то записываем самое отрицательное
- если среди этих 3х элементов 3эл больше 0 то записываем самое большое
- если среди этих 3х элементов 2эл больше 0 то записываем меньшее из них
- если среди этих 3х элементов 2эл меньле 0 то записываем то которое ближе к нулю
- затем эти действия повторяются для вторых, третьих и т.д. элементов, до тех пор, пока исходные списки не исчерпаются.

Затем для получившегося списка выводим количество положительных и количество отрицательных элементов и отдельно сумму положительных и сумму отрицательных элементов.

Пример:

(1 -3 0 2)
(-1 -1 1 1)
(-2 -2 -2 3)

Должно получиться:

(-1 -3 0 3)

positive 2
negative 2
сумма + =3
сумма - =-4
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2014, 13:32
Ответы с готовыми решениями:

Работа со списками
Здравствуйте уважаемые участники форума. Требуется небольшая помощь. Нам преподают язык Scheme (он...

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

работа со списками
задание такое: Cформировать список, состоящий из элементов, которые встречаются в обоих исходных...

Работа со списками
Здравствуйте! Выполняю лабораторную по Lisp'у. Задание следующее: Добавлено через 10 минут Дан...

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

8
Dastin
23 / 23 / 3
Регистрация: 21.06.2014
Сообщений: 36
25.06.2014, 14:36 2
Нужно составить список из первых элементов тех трёх списков.
Lisp
1
(list (car l1) (car l2) (car l3))
Вот функции для нахождения количества отрицательных и положительных элементов списка.

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
(defun kol_min(sp)  (if (equal sp nil)
      0
      (if (< (car sp) 0)
          (+ 1 (kol_min (cdr sp)))
          (kol_min (cdr sp))))
   )
 
(defun kol_max(sp)  (if (equal sp nil)
      0
      (if (> (car sp) 0)
          (+ 1 (kol_min (cdr sp)))
          (kol_min (cdr sp))))
   )
Для повторения используй рекурсию и бери хвост списков.
2
Catstail
Модератор
24406 / 12342 / 2244
Регистрация: 12.02.2012
Сообщений: 20,058
25.06.2014, 14:40 3
Уже лучше... Хотя условия все равно неполны. И ты не понимаешь разницы между понятием "положительный" и "неотрицательный". Но, Бог с тобой...

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
26
(defun task (l1 l2 l3)
  (let ((res (mapcar #'(lambda (x y z)
                 (cond ((and (>= x 0) (>= y 0) (>= z 0)) (max x y z))
                       ((and (minusp x) (minusp y) (minusp z)) (min x y z)) 
                       ((and (>= x 0) (>= y 0)) (min x y))
                       ((and (>= x 0) (>= z 0)) (min x z))
                       ((and (>= y 0) (>= z 0)) (min y z)) 
                       ((and (minusp x) (minusp y)) (max x y))
                       ((and (minusp x) (minusp z)) (max x z))
                       ((and (minusp y) (minusp z)) (max y z)))) l1 l2 l3)))
       (values res
               (length (remove-if-not #'(lambda (x) (>= x 0)) res))
               (length (remove-if-not 'minusp res))
               (apply '+ (remove-if-not #'(lambda (x) (>= x 0)) res))
               (apply '+ (remove-if-not 'minusp res))))) 
 
==> task
 
(task '(1 -3 0 2) '(-1 -1 1 1) '(-2 -2 -2 3))
 
==> (-1 -3 0 3)
 
2
2
3
-4
2
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
25.06.2014, 14:47 4
разберите пример. Он содержит ошибки. Постановка задачи некорректна. В общем дословно реализовал, за некорректность работы на других списках не отвечаю.
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
26
27
28
29
30
;; racket lang [url]http://racket-lang.org[/url]
(define (pprint pos neg sum+ sum-)
  (printf ";positive: ~a~n" pos)
  (printf ";negative: ~a~n" neg)
  (printf ";sum +:    ~a~n" sum+)
  (printf ";sum -:    ~a~n" sum-))
 
(define (task l1 l2 l3)
  (define (seek-null a b c)
    (let ((m (min (min (abs a) (abs b)) (min (abs b) (abs c)))))
      (if (= (abs a) m) a (if (= (abs b) b) b c))))
  (let ((res (for/list ([i l1] [j l2] [k l3])
               (cond [(< k 0) (min (min i j) (min j k))]
                     [(> k 0) (max (max i j) (max j k))]
                     [(> j 0) (min (min i j) (min j k))]
                     [(< j 0) (seek-null i j k)]
                     [#f]))))
    (let loop ((lst res)(pos 0) (neg 0) (sum+ 0) (sum- 0))
      (cond [(null? lst) (begin (printf ";~a~n" res)
                                (pprint pos neg sum+ sum-))]
            [(< (first lst) 0) 
             (loop (rest lst) pos (add1 neg) sum+ (+ sum- (first lst)))]
            [(loop (rest lst) (add1 pos) neg (+ sum+ (first lst)) sum-)]))))
 
(task '(1 -3 0 2) '(-1 -1 1 1) '(-2 -2 -2 3))
;(-2 -3 -2 3)
;positive: 1
;negative: 3
;sum +:    3
;sum -:    -7
Добавлено через 3 минуты
Цитата Сообщение от maximka1093 Посмотреть сообщение
(1 -3 0 2)
(-1 -1 1 1)
(-2 -2 -2 3)
Должно получиться:
(-1 -3 0 3)
почему первый элемент результирующего списка -1, а третий 0? не соответствует условию
Цитата Сообщение от maximka1093 Посмотреть сообщение
если среди этих 3х элементов 3эл меньше 0 то записываем самое отрицательное
что такое самое отрицательное число? -1 "отрицательней" чем -2? 0 "отрицательней" чем -2
1
25.06.2014, 14:47
Catstail
Модератор
24406 / 12342 / 2244
Регистрация: 12.02.2012
Сообщений: 20,058
25.06.2014, 15:13 5
Цитата Сообщение от castorsky Посмотреть сообщение
почему первый элемент результирующего списка -1, а третий 0? не соответствует условию
- я тоже это отметил...
1
maximka1093
0 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 8
25.06.2014, 20:08  [ТС] 6
первый элемент -1 т.к. первые 3элемента 1 -1 -2
применяем правило 2эл меньше 0 т.к. у нас 2 элемента меньше ноля и из них мы соответственно выбираем то что ближе к 0, то есть большее

подскажите еще пожалуйста на какой версии лиспа делали
и огромное спасибо за помощь!
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
25.06.2014, 20:15 7
Цитата Сообщение от maximka1093 Посмотреть сообщение
первый элемент -1 т.к. первые 3элемента 1 -1 -2
но сначала выполняется условие:
Цитата Сообщение от maximka1093 Посмотреть сообщение
- если среди этих 3х элементов 3эл меньше 0 то записываем самое отрицательное
Вы сформулировали условия именно в таком порядке, следовательно до проверки второго эл-та мы не доходим.
Цитата Сообщение от maximka1093 Посмотреть сообщение
применяем правило 2эл меньше 0 т.к. у нас 2 элемента меньше ноля и из них мы соответственно выбираем то что ближе к 0, то есть большее
тут тоже срабатывает предыдущее условие раньше чем будет проверка. В общем постановка задачи неверна, размыта и с ошибками.
Цитата Сообщение от maximka1093 Посмотреть сообщение
подскажите еще пожалуйста на какой версии лиспа делали
Читайте комментарий, там все написано
0
Catstail
Модератор
24406 / 12342 / 2244
Регистрация: 12.02.2012
Сообщений: 20,058
25.06.2014, 20:55 8
А мое решение будет работать в Common Lisp (любой реализации) или в HomeLisp.
0
maximka1093
0 / 0 / 0
Регистрация: 23.06.2014
Сообщений: 8
25.06.2014, 21:16  [ТС] 9
понял все, спасибо.
0
25.06.2014, 21:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2014, 21:16

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

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

Работа со списками
Доброго времени суток, очень нужна ваша помощь. Необходимо решить несколько задач: 1) Добавить в...


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

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

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