Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Контрольная по LISP


Автор: Roy73 17.11.2011, 18:26
Помогите пожалуйста с решением контрольной по Лиспу:


1. Записать определение функции F1 на языке программирования Common Lisp, которая выполняла бы следующие действия:
    Выводила сообщение, в котором пользователю предлагалось ввести 4 числа xi;
    Записывала введенные числа в список (x1 x2 x3 x4);
    Вычисляла значения функций Y1 Y2 Y3 Y4 для каждого xi;
    Записывала значения этих функций в свойства каждой пере-менной  xi.
Результатом работы этой функции является список (x1 x2 x3 x4) у каждого элемента списка будет соответственно 4 свойства: Y1 Y2 Y3 Y4, со значениями соответственно Y1(xi), Y2(xi), Y3(xi), Y4(xi). Функции Yj выбираются в соответствии с последними номерами студенческого билета (см. приложение). 





2. Записать определение функции F2 на языке программирования Common Lisp, которая анализировала бы свойства элементов списка созданного функцией F1 и выводила на экран элемент и его свойства, удовлетворяющие определенному правилу. Правило выбирается в соответствии с номером студенческого билета. Формат вывода:
(xi соответствует свойство Yj равное Yj (xi)) 
Где xi, Yj (xi) – соответственно числовые значения xi и Yj (xi).

Условие для первой задачи в прикрепленном файле.

Условие для второй задачи:
Вывести те элементы, у которых средние значения функций  Y1(xk), Y2(xk), Y3(xk), Y4(xk) отличаются не более чем на 1.

Задание выполнять в среде Lisp Works. При определении функции F1 использовать PROG-механизм (для организации циклов) и условное предложение COND. При определении функции F2 использовать циклическое предложение DO и условное предложение IF. При выделении элемента из списка пользоваться только комбинациями функций CAR и  CDR (NTH не использовать).

Автор: k0rvin 24.11.2011, 10:36
1) выкладывать *.doc -- дурной тон, у читателей может и не быть MS Word =)
2) в первом задании для y2 ты не указал условия
3) во втором задании вообще непонятно, что за средние значения

Код

(defvar x1 0)
(defvar x2 0)
(defvar x3 0)
(defvar x4 0)

(defvar xs '(x1 x2 x3 x4))

(defun y1 (x)
  (cond ((> x 3)
         (+ (* x (sin x))
            (/ (expt (cos x) 2)
               (expt x 2))))
        ((and (<= 0 x)
              (<  x 1))
         (+ (sqrt (+ (expt x 3) 3))
            (/ 1 (expt (* 3 (tan (1+ (* 0.3 x))))
                       1/3))))
        (t
         (+ 2 (- x) (* 6 (expt x 4))))))

(defun y2 (x)
  (cond (:foo
         (+ (tanh (expt x 3))
            (* 3 (expt (sinh x) 4))))
        (:bar
         (+ (log (/ (expt x 3)
                    (+ x 4))
                 7)
            (/ 2 x)))
        (t
         (expt x (1+ (sin x))))))

(defun y3 (x)
  (cond ((> x 1.5)
         (+ (expt x 2)
            (* 6 x)
            20))
        ((and (<  0.5 x)
              (<=  x  1))
         (+ (/ 1 (sqrt (* 3 x)))
            (/ 1 (acos (+ (* 0.6 (expt x 2))
                          0.5)))))
        (t
         (* (expt x -1.5)
            (log (- 2 x))))))

(defun y4 (x)
  (cond ((and (<= -2 x)
              (<   x 2))
         (+ (expt x -3)
            (* 3 (sin (/ x 3)))))
        ((> x 3)
         (log (- (expt x 6)
                 (sqrt x))
              8))
        (t
         (/ (+ (expt 2 x)
               (expt 3 (1+ x))
               (- (* 6 x)))
            (log 2)))))

(defvar ys '(y1 y2 y3 y4))

(defun get-elem (list index)
  (if (< index 0)
      (error "index must be >= 0")
      (do ((l list  (cdr l))
           (i index (1-  i)))
          ((null l) (error "index too large"))
        (if (= i 0) (return-from get-elem (car l))))))

(defun f1 ()
  (prog ((i   0)
         (xi  nil)
         (num nil))
    (princ "Type four numbers: ")
    loop (setf num (read))
         (cond ((not (numberp num)) (go loop)))
         (setf xi (get-elem xs i))
         (set  xi num)
         (incf i)
         (prog ((j  0)
                (yj nil))
           calc (setf yj (get-elem ys j))
                (setf (get xi yj) (funcall yj (symbol-value xi)))
                (incf j)
                (cond ((< j 4) (go calc))))
         
         (cond ((< i 4) (go loop)))))

(defun f2 ()
  (do ((xs xs (cdr xs)))
      ((null xs) nil)
    (do ((ys ys (cdr ys)))
        ((null ys) nil)
      (format t "~a(~a) = ~a~%"
              (car ys)
              (car xs)
              (get (car xs) (car ys))))
    (terpri)))

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