Автор: RussoTuristo 11.11.2009 13:21
Задание: Написать программу подсчета количества атомов в заданном интервале уровней для заданного списка.
Код
(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 12.11.2009 13:40
Немного сам не понял задачу, для заданных уровней - означает вложенность списков друг в друга (Например: (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...