Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [LISP] Задание по комнатам общежития


Автор: RUSLANWM 15.3.2009, 10:18
Не стал создавать новую тему
Необходима помощь в написании еще одной функции на LISP
Необходимо составить функции, используя функционалы  или циклы , например с помощью (MAPCAR   #’функциональный аргумент   список) или других

Вот само задание:

Комната общежития  описывается списком (номер-этажа номер-комнаты  кол-во-проживающих):    ( (1 1 4 )  (1  2  3  ) …)
- подсчитать количество комнат на этаже; 
- число студентов на этаже; 
- студентов и студенток, учитывая, что студентки занимают четные номера, студенты – нечетные; 

Автор: VH_ 17.3.2009, 12:13
количество комнат на этаже:
Код

(defun F (explication floor)
 (apply '+
  (mapcar
  '(lambda (record)
    (if (= (car record) floor) 1 0))
   explication)))

число студентов на этаже:
Код

(defun F (explication floor)
 (apply '+
  (mapcar
  '(lambda (record)
    (if (= (car record) floor) (caddr record) 0))
   explication)))

<общее число> студентов и студенток:
Код

(defun F (explication)
 (apply 'mapcar
  (cons '+
   (mapcar
   '(lambda (record)
     (if (oddp (cadr record))
      (list (caddr record) 0)
      (list 0 (caddr record))))
    explication))))

Автор: VH_ 18.3.2009, 20:08
(defun F (explication floor) ...
ПЕРВЫЙ аргумент - экспликация, ВТОРОЙ - номер этажа.

Автор: RUSLANWM 18.3.2009, 21:12
VH_
 Конкретнее напишите пожалуйста - вызов этой функции в LISP(приведите пожалуйста пример как в самой среде после того как функция определена- ввести в нее числа чтоб получить ответ)

Автор: VH_ 18.3.2009, 21:30
Код
(F '((1 1 4) (1 2 3)) 1)


Автор: RUSLANWM 19.3.2009, 08:12
VH_
Ввел как вы написали но все равно выдает ошибку, в чем может быть дело?
Код
CL-USER 1 > (defun F (explication floor)
 (apply '+
  (mapcar
  '(lambda (record)
    (if (= (car record) floor) 1 0))
   explication)))
F

CL-USER 2 > (F '((1 1 4) (1 2 3)) 1)

Error: Argument to apply/funcall is not a function: (LAMBDA (RECORD) (IF (= (CAR RECORD) FLOOR) 1 0)).
  1 (abort) Return to level 0.
  2 Return to top loop level 0.

Type :b for backtrace, :c <option number> to proceed,  or :? for other options


И во вторую вводил такая же ошибка(LISP который я использую LISPWORKS v 4.4)

Автор: VH_ 19.3.2009, 09:29
Попробуйте (в этом своем LISPWORKS) вычислить выражение
Код
(apply '+ '(1 2 3))

Автор: RUSLANWM 19.3.2009, 10:20
VH_
вычисляет-складывает 3 числа
CL-USER 1 > (apply '+ '(1 2 3))
6
проблема исчезла после того как убрал апостроф перед выражением 
Код
(lambda (record)


Автор: VH_ 19.3.2009, 13:33
Это глюк (или фича) диалекта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)