Форум программистов, компьютерный форум, киберфорум
Языки JVM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 13.10.2013
Сообщений: 42
1

Clojure Создать класс Табуретка со свойствами

07.05.2015, 22:27. Показов 1867. Ответов 5
Метки нет (Все метки)

Создать класс Табуретка со свойствами: Высота (h, в см), Качествоизделия (низкое, среднее, высокое). Определить два виртуальных метода: «количество древесины», которое требует табуретка, по формуле4•h+12, если качество низкое, и 5•h+14, если качество среднее иливысокое, а также «стоимость», равная d•2, для низкого качест-ва, d•3, длясреднего качества, d•4, для высокого качества, где d — количество древесины, которое требует данный объект. Определить также метод «Информация», который возвращает строку, содержащую информацию обобъекте: Высоту, качество материала, количество древесины и стоимость.
Создать также класс наследник Стул с дополнительным свойством:высота спинки (hb, в см), и переопределить метод «количество древесины», по формуле d+2•hb+5, где d — количество древесины, которые требует табуретка с такими же параметра-ми (Метод «стоимость» непереопределять).
В главной программе (либо по нажатию на кнопку) создать экземплярыклассов Та-буретка и Стул, и напечатать информацию в таком виде:«табуретка» + информация о табуретке и «стул» + информация о стуле.
(Для реализации использовать классы и наследование.)
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2015, 22:27
Ответы с готовыми решениями:

Создать свой класс с методами и свойствами
Разработать структуру объекта "Газовая колонка". Объект должен иметь не менее пяти методов и не...

Создать класс monster со свойствами здоровье, сила
Помогите пожалуйста решить задачу: Создать класс monster со свойствами здоровье, сила. Суммарное...

Создать класс Ring, описываемое координатами, радиусами и свойствами
Такое вот задание: создать класс Ring (кольцо), описываемое координатами центра, внешним и...

Создать класс Person со свойствами name, gender, age, married и методами чтения/установки этих свойств
Задание: Код: Person.h #include <string> #ifndef PERSON_H #define PERSON_H class Person {...

5
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
08.05.2015, 05:51 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

вот тебе до наследника )
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
; SLIME 2015-04-19
INSOMNIA> (defclass tabouret ()
            ((h :initarg :h
                :accessor h
                :initform (error "Высота обязательна - h")
                :type fixnum
                :documentation "Это высота")
             (quality :initarg :quality
                      :accessor quality
                      :initform (error "Качество обязательно - quality")
                      :type string
                      :documentation "Это качество")))
#<STANDARD-CLASS TABOURET>
INSOMNIA> (defmethod amount-of-wood ((tabouret tabouret))
            (cond ((equal (quality tabouret) "low")
                   (+ 12 (* 4 (h tabouret))))
                  ((+ 14 (* 5 (h tabouret))))))
#<STANDARD-METHOD AMOUNT-OF-WOOD (TABOURET) {100454DC63}>
INSOMNIA> (defmethod cost ((tabouret tabouret))
            (let ((amount-of-wood (amount-of-wood tabouret)))
              (cond ((equal (quality tabouret) "low")
                     (* amount-of-wood 2))
                    ((equal (quality tabouret) "medium")
                     (* amount-of-wood 3))
                    ((equal (quality tabouret) "high")
                     (* amount-of-wood 4)))))
#<STANDARD-METHOD COST (TABOURET) {1004609893}>
INSOMNIA> (defmethod info ((tabouret tabouret))
            (format 
             t 
             "Высота: ~A~%Качество материала: ~A~%Количество древесины: ~A~%Стоимость: ~A~%"
             (h tabouret)
             (quality tabouret)
             (amount-of-wood tabouret)
             (cost tabouret)))
#<STANDARD-METHOD INFO (TABOURET) {10046C04A3}>
INSOMNIA> (defparameter tabouret 
             (make-instance 'tabouret :h 70 :quality "medium"))
TABOURET
INSOMNIA> (amount-of-wood tabouret)
364
INSOMNIA> (cost tabouret)
1092
INSOMNIA> (info tabouret)
Высота: 70
Качество материала: medium
Количество древесины: 364
Стоимость: 1092
NIL
INSOMNIA>
Добавлено через 1 час 56 минут
а если сделать так:
Lisp
1
2
3
4
5
6
7
8
(defmacro case-pred (keyform (&key (pred #'equal)) &body cases)
  (once-only (keyform pred)
    `(cond
       ,@(loop
            for case in cases
            collect `((funcall ,pred ,keyform ,(first case))
                      ()
                      ,(second case))))))
то cost можно переписать так:
Lisp
1
2
3
4
5
6
(defmethod cost ((tabouret tabouret))
            (let ((amount-of-wood (amount-of-wood tabouret)))
              (case-pred (quality tabouret) ()
                ("low" (* amount-of-wood 2))
                ("medium" (* amount-of-wood 3))
                ("high" (* amount-of-wood 4)))))
Добавлено через 1 час 3 минуты
остаток
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(defclass chair (tabouret)
  ((hb :initarg :hb
       :accessor hb
       :initform (error "высота спинки стула обязательна - hb")
       :type fixnum
       :documentation "Высота спинки стула")))
 
(defmethod amount-of-wood ((chair chair))
  (cond ((equal (quality chair) "low")
         (+ (hb chair) 5 (* 2 (hb chair))))
        ((+ (hb chair) 7 (* 3 (hb chair))))))
 
(defmethod info ((chair chair))
  (format 
   t 
   "Высота: ~A~%Качество материала: ~A~%Количество древесины: ~A~%Стоимость: ~A~%Высота спинки: ~A~%"
   (h chair)
   (quality chair)
   (amount-of-wood chair)
   (cost chair)
   (hb chair)))
Lisp
1
2
3
4
5
6
INSOMNIA> (defparameter tabouret
           (make-instance 'tabouret :quality "high" :h 80))
TABOURET
INSOMNIA> (defparameter chair
           (make-instance 'chair :quality "high" :h 80 :hb 60))
CHAIR
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
INSOMNIA> (info tabouret)
Высота: 80
Качество материала: high
Количество древесины: 414
Стоимость: 1656
NIL
INSOMNIA> (info chair)
Высота: 80
Качество материала: high
Количество древесины: 247
Стоимость: 988
Высота спинки: 60
NIL
4
defun
603 / 617 / 44
Регистрация: 30.04.2011
Сообщений: 702
20.05.2015, 16:09 3
Цитата Сообщение от transformator.t Посмотреть сообщение
а если сделать так
улучшил case-pred
вот теперь стало прикольно)

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
28
29
30
31
32
33
(defmacro case-pred (keyform (&key (pred #'equal)) &body cases)
  (once-only (keyform pred)
    `(cond
       ,@(loop
            for case in cases
            for otherwise-p = (first case)
            collect
              (cond ((eql otherwise-p 'otherwise) `(,(second case)))
                    ((listp otherwise-p)
                     (let ((caro (car otherwise-p)))
                       (cond ((and (symbolp caro) (not (keywordp caro)))
                              `((funcall
                                 ,pred ,keyform
                                 (aif (find ,keyform
                                            (aif ,otherwise-p
                                                 (typecase it
                                                   (string (list it))
                                                   (number (list it))
                                                   (keyword (list it))
                                                   (otherwise it)))
                                            :test ,pred)
                                      it (if (eql ,pred #'=) 0)))
                                ()
                                ,(second case)))
                             (`((funcall
                                 ,pred ,keyform
                                 (aif (find ,keyform (the list ',otherwise-p) :test ,pred)
                                      it (if (eql ,pred #'=) 0)))
                                ()
                                ,(second case))))))
                    (`((funcall ,pred ,keyform ,otherwise-p)
                       ()
                       ,(second case))))))))
2
4489 / 2106 / 265
Регистрация: 01.03.2013
Сообщений: 5,590
Записей в блоге: 22
21.05.2015, 00:17 4
Никогда не сталкивался с ООП, классами и наследованием, но на коленке нарисовал вот такую кустарщину - костыли на костылях, но работает - в таком варианте переопределение количества по любой формуле, но не пересчитывается при изменении высоты и качества:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(defn make-tab (h qual)
    (def amount (cond (eq? qual low) (+ 12 (* 4 h)) (+ 14 (* 5 h)))) -- переопределяемое поле
    (defn dispatch (p)
    (cond (eq? getamount p) amount
          (eq? getprice  p) (* (cond (eq? qual low) 2 (eq? qual mid) 3 4) (dispatch getamount))
          (eq? getinfo   p) (str height: h , quality: qual
                             , amount: (dispatch getamount) , price: (dispatch getprice))
          (eq? setamount (car p)) (set! amount (car (cdr p)))
          (print (str Неизвестное_имя_метода: p))))
    dispatch)
 
(defn make-chear (h hb qual)
    (def tab (make-tab h qual)) -- родительский объект
    (tab (cons setamount (+ (tab getamount) (* 2 hb) 5))) -- переопределение значения поля
    tab)
а в таком - не любая формула а только аддитивная добавка, но работает при изменении высоты и качества:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(defn make-tab (h qual)
    (def addamount 0) -- переопределяемое поле - добавка к количеству при расчете
    (defn dispatch (p)
    (cond (eq? getamount p) (+ addamount (cond (eq? qual low) (+ 12 (* 4 h)) (+ 14 (* 5 h))))
          (eq? getprice  p) (* (cond (eq? qual low) 2 (eq? qual mid) 3 4) (dispatch getamount))
          (eq? getinfo   p) (str height: h , quality: qual
                             , amount: (dispatch getamount) , price: (dispatch getprice))
          (eq? seth         (car p)) (set! h         (car (cdr p)))
          (eq? setaddamount (car p)) (set! addamount (car (cdr p)))
          (print (str Неизвестное_имя_метода: p))))
    dispatch)
 
(defn make-chear (h hb qual)
    (def tab (make-tab _ qual)) -- родительский объект (с неопределенной высотой)
    (tab (cons seth h)) -- переопределение высоты
    (tab (cons setaddamount (+ (* 2 hb) 5))) -- переопределение значения внутреннего поля
    tab)
Lisp
1
2
(printLn (str табуретка (20, mid): ((make-tab 20 mid) getinfo)))
(str стул (10, 2, low): ((make-chear 10 2 low) getinfo))
Код
(табуретка (20, mid): (height: 20 , quality: mid , amount: 114 , price: 342))
(стул (10, 2, low): (height: 10 , quality: low , amount: 61 , price: 122))
2
505 / 511 / 42
Регистрация: 12.12.2013
Сообщений: 484
21.05.2015, 09:54 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
(ns aeon.core)
 
(defprotocol Virtual
  (amount [this])
  (cost [this])
  (info [this]))
 
(defrecord Tabouret [h quality])
(defrecord Chair [tabouret hb])
 
(extend-type Tabouret
  Virtual
  (amount [t]
    (case (:quality t)
      "low" (+ 12 (* 4 (:h t)))
      (+ 14 (* 5 (:h t)))))
  (cost [t]
    (let [d (amount t)]
      (case (:quality t)
        "low" (* d 2)
        "mid" (* d 3)
        (* d 4))))
  (info [t]
    (printf "Height: %s%nQuality: %s%nAmount: %s%nCost: %s%n"
            (:h t)
            (:quality t)
            (amount t)
            (cost t))))
 
(extend Chair
  Virtual
  (merge (get-in Virtual [:impls Tabouret])
         {:amount (fn [c]
                    (case (comp :quality :tabouret)
                      "low" (+ (:hb c) 5 (* 2 (:hb c)))
                      (+ (:hb c) 7 (* 3 (:hb c)))))}
         {:info (fn [c]
                  (printf
                   "Height: %s%nQuality: %s%nAmount: %s%nCost: %s%nHeight of backrest: %s%n"
                   ((comp :h :tabouret) c)
                   ((comp :quality :tabouret) c)
                   (amount c)
                   (cost c)
                   (:hb c)))}))
 
(info (->Tabouret 80 "high"))
;; Height: 80
;; Quality: high
;; Amount: 414
;; Cost: 1656
;; => nil
(info (->Chair (->Tabouret 80 "high") 60))
;; Height: 80
;; Quality: high
;; Amount: 247
;; Cost: 988
;; Height of backrest: 60
;; => nil

P.S. С ответами transformator.t вроде сходится

Возможно можно было это написать с помощью мультиметодов, но я в них не вникал, также есть еще какие-то иерархии, связанные с темой мультиметодов.

Также прилагаю небольшой копипаст из книги:
Цитата Сообщение от Кусок текста из книги
Типы могут только реализовать протоколы или интерфейсы - в Clojure невозможно организовать наследование типов, как во многих других языках, где допускается определять новые типы, являющиеся подклассами других конкретных типов, и тем самым наследующие реализации методов. Для повторного использования конкретных реализаций методов в Clojure предоставляется функция extend, являющаяся основой макросов extend-type и extend-protocol.
extend - принимает в первом аргументе расширяемый тип, а в последующих - череду протоколов и карт реализаций (implementations maps), которые отображают имена (как ключевые слова) в функции, реализующие методы с этими именами для указанного типа.
Т.к. extend - это функция, то карта реализаций интерпретируется как значение, которое можно передавать, изменять и комбинировать с другими картами реализаций. Благодаря этому, можно моделировать любые варианты повторного использования, от простого наследования до более сложных понятий, таких как трейты и миксины.
2
Эксперт Java
3851 / 2471 / 445
Регистрация: 28.04.2012
Сообщений: 8,132
24.05.2015, 11:48 6
Некропостеры. =)

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
(defun positivep (x)
  (> x 0))
 
(deftype height ()
  `(and number (satisfies positivep)))
 
(defclass quality () ())
(defclass      low-quality (quality) ())
(defclass standard-quality (quality) ())
(defclass     high-quality (quality) ())
 
(defconstant      +low-quality+ (make-instance      'low-quality))
(defconstant +standard-quality+ (make-instance 'standard-quality))
(defconstant     +high-quality+ (make-instance     'high-quality))
 
(defclass tabouret ()
  ((h
    :initarg  :h
    :reader    height
    :initform (error "Высота обязательна - h")
    :type      height)
   (q
    :initarg  :q
    :reader    quality
    :initform +standard+
    :type      quality)))
 
(defclass chair (tabouret)
  ((hb
    :initarg  :hb
    :reader    back-height
    :initform (error "Высота спинки стула обязательна - hb")
    :type      height)))
 
(defgeneric amount-of-wood (x))
(defgeneric amount-of-wood-for-quality (x q))
 
(defmethod amount-of-wood ((x tabouret))
  (amount-of-wood-for-quality x (quality x)))
 
(defmethod amount-of-wood-for-quality ((x tabouret) (q low-quality))
  (+ (* 4 (height x)) 12))
 
(defmethod amount-of-wood-for-quality ((x tabouret) (q standard-quality))
  (+ (* 4 (height x)) 12))
 
(defmethod amount-of-wood-for-quality ((x tabouret) (q high-quality))
  (+ (* 5 (height x)) 12))
 
(defmethod amount-of-wood ((x chair))
  (+ (call-next-method)
     (* 2 (back-height x))
     5))
 
 
 
(defgeneric cost (x))
(defgeneric cost-for-quality (x q))
 
(defmethod cost ((x tabouret))
  (cost-for-quality x (quality x)))
 
(defmethod cost-for-quality ((x tabouret) (q low-quality))
  (* 2 (amount-of-wood x)))
 
(defmethod cost-for-quality ((x tabouret) (q standard-quality))
  (* 3 (amount-of-wood x)))
 
(defmethod cost-for-quality ((x tabouret) (q high-quality))
  (* 4 (amount-of-wood x)))
 
 
 
(defgeneric information (x))
(defgeneric information-title (x))
(defgeneric information-params (x))
 
(defmethod information ((x tabouret))
  (with-output-to-string (s)
    (format s "~&~a:~%" (information-title x))
    (loop :for (title . value) :in (information-params x)
          :do (format s "  ~20a: ~a~%" title value))))
 
(defmethod information-title ((x tabouret))
  "Табуретка")
 
(defmethod information-title ((x chair))
  "Стул")
 
(defmethod information-params ((x tabouret))
  `(("высота"           . ,(height x))
    ("качество"         . ,(information (quality x)))
    ("кол-во древесины" . ,(amount-of-wood x))
    ("стоимость"        . ,(cost x))))
 
(defmethod information-params ((x chair))
  (cons (cons "высота спинки" (back-height x))
        (call-next-method)))
 
(defmethod information ((x low-quality))
  "низкое")
 
(defmethod information ((x standard-quality))
  "среднее")
 
(defmethod information ((x high-quality))
  "высокое")
 
 
 
(defun main ()
  (dolist (q (list +low-quality+ +standard-quality+ +high-quality+))
    (dolist (x (list (make-instance 'tabouret :h 0.5 :q q)
                     (make-instance 'chair    :h 0.5 :q q :hb 0.6)))
      (princ (information x)))))
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
28
29
30
31
32
33
34
> (main)
Табуретка:
  высота              : 0.5
  качество            : низкое
  кол-во древесины    : 14.0
  стоимость           : 28.0
Стул:
  высота спинки       : 0.6
  высота              : 0.5
  качество            : низкое
  кол-во древесины    : 20.2
  стоимость           : 40.4
Табуретка:
  высота              : 0.5
  качество            : среднее
  кол-во древесины    : 14.0
  стоимость           : 42.0
Стул:
  высота спинки       : 0.6
  высота              : 0.5
  качество            : среднее
  кол-во древесины    : 20.2
  стоимость           : 60.600003
Табуретка:
  высота              : 0.5
  качество            : высокое
  кол-во древесины    : 14.5
  стоимость           : 58.0
Стул:
  высота спинки       : 0.6
  высота              : 0.5
  качество            : высокое
  кол-во древесины    : 20.7
  стоимость           : 82.8
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2015, 11:48

Создать класс, описывающий магазин с 6-ю закрытыми / открытыми полями и 6-ю закрытыми / открытыми свойствами
Всем доброго времени суток. Такая вот задача. 2. Создать класс, описывающий магазин с 6-ю...

Класс с двумя свойствами массивами
Нужна реализация следующего условия: Нужно создать класс, у которого два свойства w и b каждое...

Базовый класс Airplane (самолет) со свойствами
Описать базовый класс AIRPLANE (самолет) со свойствами: • название пункта назначения рейса; •...

Описать класс со свойствами и реализовать методы
Помогите описать класс &quot;Пластина&quot; (wafer). Свойства класса: - радиус мм(100,150,200,300) -...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.