Помощь - Поиск - Пользователи - Календарь
Полная версия: Программа на Lisp
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
RussoTuristo
Задание: Написать программу подсчета количества атомов в заданном интервале уровней для заданного списка.

Код
(setq m nil);количество атомов
(setq A '( 11 12 13 14 15 16 ( 11 12 13 14) 18));список
(setq a1 2);левая граница
(setq a2 6);правая граница
//(setq a1 (getint "element1:"))
//(setq a2 (getint "element2:"))
(setq p (- a2 a1)); количество элементов в "нужной части"
(setq n a1)
(while (> n 0);отрезаю "голову" списка, чтобы оставить только нужную для анализа часть
    (progn
        (cdr A)
        (- n 1))
)
(setq z 0)
(while (> p 0)     ; Проверяю является ли текущий элемент списка атомом
    (progn
        (if (= Atom(nth z 'A) T)
            (+ 1 m) ; Если да, то увеличиваю m
        )
    (+ z 1)); наращиваю z, чтобы посмотреть след. элемент списка
      (setq p (- p 1)); Пока не просмотрю все элементы из нужной части
)
(print m); Вывод m


Вроде всё нормально, не уверен с проверкой на то, является ли элемент атомом, просто не очень удобный Компилятор, не понимаю, что не так...
RussoTuristo
Немного сам не понял задачу, для заданных уровней - означает вложенность списков друг в друга (Например: (1 2 3(4 5 (6 (7)))) У 7 - уровень вложенности 4).
Прогу вроде переписал и теперь в принципе думаю она должна работать, но препод у нас долбанутый, даже Lisp нам еще не показывал (есть куча всяких прог на лиспе, но не знаю как их запускать, набираешь например My() прога что-то делает, а дальше не ввода данных, ничего ... может делаю что не то ... проги все 100% рабочие)
Но проблема в другом, раньше вроде все работало, а теперь пишет неверное сформированный список на входе ... Я его задаю неправильно?

Код
(Defun Find()
      (Setq A '(1 2 3 4 5 6 7 8 9))
      (Setq a1 2); Искать атомы начиная с уровня а1
      (Setq a2 5); И до уровня а2
      (Setq k (length A))
    (Setq Scobka1 (vl-string-elt "(" 0)); Если встретили "(" Ниже к count1 прибавится 1
      (Setq Scobka2 (vl-string-elt ")" 0)); Если встретили ")" Ниже count1 уменьшится на 1
      (Setq Probel (vl-string-elt " " 0)); Если встретили пробел
      (Setq i 0)
      (Setq count 0);
      (Setq count1 0);
      (While (< i k)
      (if (= Scobka1 (nth i A))
         (Setq count1 (+ count1 1)))
      (if (= Scobka2 (nth i A))
         (Setq count1 (- count1 1)))
      (if (= Probel (nth i A))
        (if (>= count1 a1)
          (if (<= count1 a2)
             (Setq count (+ count 1))
      (Setq i (+ i 1))))
    )
    (print count)
)


По количеству открывающих/закрывающих скобок ищем уровень вложенности, и сравниваем с заданным, если то, что надо - увеличиваем count на 1...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.