1 / 1 / 0
Регистрация: 09.01.2017
Сообщений: 1
1

Ошибка в программе, некорректный ввод/вывод. Работа со списками

16.04.2019, 02:13. Показов 1165. Ответов 6
Метки lisp (Все метки)

Ошибка в программе, некорректный ввод/вывод. Работа со списками

Задание: прочитать из стандартного потока ввода список, который содержит разные элементы, в том числе списки
нужно пройти по исходному списку и заменить подсписки на сумму входящих в них чисел, если они все нечётные
если после этих действий основной (введённый) список соответствует условию, то его тоже проссумировать:
(1 3 5 (7 9 1) 11) --> (1 3 5 (17) 11) --> 37


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
;;;; your code goes here ;-)
;;ввод
(defparameter entered_list (read))
;; нечётность всех элементов
(defun is-even-list (lst)
    (cond ((null lst) t)
        ((and (numberp (car lst)) (evenp (car lst))) (is-even-list (cdr lst)))      
        (t nil)))
  
;; Суммирование списка 
(defun sum-list (lst)
    (cond ((null lst) 0)
        (t (+ (car lst) (sum-list (cdr lst)))))) 
 
;;основная функция
(defun test (lst)   
    (dotimes (i (list-length lst))      
        (cond           
            ((not (atom (nth i lst))) (setf (nth i lst) (test (nth i lst))))))
        
    (cond       
        ((is-even-list lst) (setf lst (sum-list lst)))
        ((not (is-even-list lst)) (setf lst lst))))
 
; вывод
 
(print (test entered_list))
---------------------------------------------------------------------------------------------------------------------------
Ввод аргументов осуществляется через отдельную панель в интерфейсе ( см вложение)
Lisp
1
(print (test '(0 1 nil (1 3 (1 3) 5) 6)))
Но компилятор выдает тот же список, минуя все функции ( см вложение). Не могу разобраться, почему
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2019, 02:13
Ответы с готовыми решениями:

Некорректный вывод данных в программе
Кророче у меня такая проблема после того как я запускаю программу у меня выскакивает loading....

Некорректный ввод/вывод в консоли
Код: puts("Введите данные для поиска:"); printf("Телефон : "); gets(foundRec.phone);...

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

Ввод нескольких чисел через пробел, некорректный вывод
первое число выводится корректно, а второе нет( .model small .stack 100h .data array dw ?, ?...

6
Модератор
Эксперт функциональных языков программированияЭксперт Python
33119 / 18460 / 3884
Регистрация: 12.02.2012
Сообщений: 31,029
Записей в блоге: 12
16.04.2019, 07:40 2
Цитата Сообщение от yana12340 Посмотреть сообщение
Не могу разобраться, почему
- потому, что программа "не лисповская" по духу...

Lisp
1
 
1
4662 / 4358 / 376
Регистрация: 12.05.2012
Сообщений: 3,075
16.04.2019, 08:52 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
(defun sum-odd-lists
    (&aux (w (let ((*read-eval* nil)) (read))))
  (sum-list (sum-deep w)))
 
(defun sum-deep (w &optional ac &aux (a (car w)))
  (if w (sum-deep (cdr w) (cons (if (listp a) (sum-list a)
                                    a)
                                ac))
      (nreverse ac)))
 
(defun sum-list (w)
  (if (every #'(lambda (a) (and (numberp a) (oddp a)))
             w)
      (reduce #'+ w)
      w))
 
> (sum-odd-lists)
(1 3 5 (7 9 2) 11)
(1 3 5 (7 9 2) 11)
> (sum-odd-lists)
(1 3 5 (7 9 1) 12)
(1 3 5 17 12)
> (sum-odd-lists)
(1 3 5 (7 9 1) 11)
37
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
33119 / 18460 / 3884
Регистрация: 12.02.2012
Сообщений: 31,029
Записей в блоге: 12
16.04.2019, 08:58 4
Лучший ответ Сообщение было отмечено yana12340 как решение

Решение

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defun check-list (list)
  (every (lambda (x) (and (numberp x) (oddp x))) list))
 
(defun task (list)
  (cond ((check-list list) (apply '+ list))
        (t (let ((a (mapcar (lambda (x) (if (atom x) x (task x))) list)))
                (if (check-list a) (apply '+ a) a)))))
 
(task '(1 3 5 (7 9 2) 11))
 
==> (1 3 5 (7 9 2) 11)
 
(task '(1 3 5 (7 9 1) 11))
 
==> 37
2
4662 / 4358 / 376
Регистрация: 12.05.2012
Сообщений: 3,075
16.04.2019, 09:16 5
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
(defun sum-odd-lists
    (&aux (w (let ((*read-eval* nil)) (read)))
     (v (sum-deep w)))
  (sum-list v))
 
(defun sum-deep (w &aux (a (car w)))
  (when w (cons (if (listp a)
                    (sum-list a)
                    a)
                (sum-deep (cdr w)))))
 
(defun sum-list (w)
  (if (and (every #'numberp w) (every #'oddp w))
      (reduce #'+ w)
      w))
 
> (sum-odd-lists)
(1 3 5 (7 9 2) 11)
(1 3 5 (7 9 2) 11)
> (sum-odd-lists)
(1 3 5 (7 9 1) 12)
(1 3 5 17 12)
> (sum-odd-lists)
(1 3 5 (7 9 1) 11)
37
Добавлено через 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
(defun sum-odd-lists
    (&aux (w (let ((*read-eval* nil)) (read))))
  (sum-list (sum-deep w)))
 
(defun sum-deep (w &aux (a (car w)))
  (when w (cons (if (listp a)
                    (sum-list a)
                    a)
                (sum-deep (cdr w)))))
 
(defun sum-list
    (w &aux (z (and (every #'numberp w)
                    (every #'oddp w))))
  (if z (reduce #'+ w) w))
 
> (sum-odd-lists)
(1 3 5 (7 9 2) 11)
(1 3 5 (7 9 2) 11)
> (sum-odd-lists)
(1 3 5 (7 9 1) 12)
(1 3 5 17 12)
> (sum-odd-lists)
(1 3 5 (7 9 1) 11)
37
Добавлено через 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
(defun sum-odd-lists
    (&aux (w (let ((*read-eval* nil)) (read))))
  (sum-list (sum-deep w)))
 
(defun sum-deep (w)
  (loop for a in w collect
        (if (listp a)(sum-list a)
            a)))
 
(defun sum-list
    (w &aux (z (and (every #'numberp w)
                    (every #'oddp w))))
  (if z (reduce #'+ w) w))
 
> (sum-odd-lists)
(1 3 5 (7 9 2) 11)
(1 3 5 (7 9 2) 11)
> (sum-odd-lists)
(1 3 5 (7 9 1) 12)
(1 3 5 17 12)
> (sum-odd-lists)
(1 3 5 (7 9 1) 11)
37
2
4662 / 4358 / 376
Регистрация: 12.05.2012
Сообщений: 3,075
17.04.2019, 11:07 6
как вариант:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(defun sum-odd-lists
    (&aux (w (let ((*read-eval* nil)) (read))))
  (sum-lists w))
 
(defun sum-lists (w)
  (if (odds w) (reduce #'+ w)
      (let ((v (mapcar #'(lambda (a) (if (atom a) a
                                         (sum-lists a)))
                       w)))
        (if (odds v) (reduce #'+ v) v))))
 
(defun odds (w)
  (and (every #'numberp w) (every #'oddp w)))
 
> (sum-odd-lists)
(1 3 5 (7 9 1) 12)
(1 3 5 17 12)
> (sum-odd-lists)
(1 3 5 (7 9 1) 11)
37
Добавлено через 37 секунд
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(defun sum-odd-lists
    (&aux (w (let ((*read-eval* nil)) (read))))
  (sum-lists w))
 
(defun sum-lists (w)
  (if (odds w) (reduce #'+ w)
      (let ((v (loop for a in w collect
                     (if (atom a) a (sum-lists a)))))
        (if (odds v) (reduce #'+ v) v))))
 
(defun odds (w)
  (loop for a in w always
        (and (numberp a) (oddp a))))
 
> (sum-odd-lists)
(1 3 5 (7 9 1) 12)
(1 3 5 17 12)
> (sum-odd-lists)
(1 3 5 (7 9 1) 11)
37
1
4505 / 3499 / 356
Регистрация: 12.03.2013
Сообщений: 6,021
17.04.2019, 15:34 7
Even — это «чётный», то есть ваша функция is-even-list проверяет, что все элементы списка — чётные. Возможно, поэтому результаты не те, какие вы ожидаете.

Основная функция написана плохо, и даже удивительно, что она что-то делает в том виде, как вы её вызываете (вы модифицируете литеральные объекты). Если интересуетесь лиспом, могу разобрать её. (А если не интересуесь, у вас уже много готовых решений.)
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2019, 15:34
Помогаю со студенческими работами здесь

Ввод и работа со списками в SWI Prolog
Задание. Обеспечить ввод и формирование двух вещественных списков с проверкой. Найти объединение...

ввод/вывод в программе
Здравствуйте. Я новичек в джава. Написала програмку. Но вот неувязочка получается. Вот прога ...

Одновременный ввод/вывод в программе
Проблема такая: нужно одновременно и выводить и вводить в программу. Т.е. мне надо, чтобы, даже...

Сделать в программе ввод и вывод(матрицы)
Имеется алгоритм для нахождения определителя матрицы взял из первой же ссылки на курсовую работу в...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru