Форум программистов, компьютерный форум, киберфорум
Другие языки программирования
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 11.01.2020
Сообщений: 11
1

Описать класс "Треугольник", который определяет эту геометрическую фигуру посредством задания длин трех его сторон

18.04.2020, 12:20. Просмотров 1340. Ответов 19
Метки нет (Все метки)

Описать класс «Треугольник», который определяет эту геометрическую фигуру посредством задания длин трех его сторон. Класс должен содержать конструктор с параметрами по умолчанию, а также следующие методы: вывод информации о длинах сторон треугольника; изменение длин сторон; определение углов, высот и площади треугольника. Предусмотреть проверку существования треугольника с заданными сторонами (при задании в конструкторе и при изменении сторон посредством соответствующего метода).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2020, 12:20
Ответы с готовыми решениями:

Описать класс «Треугольник», который определяет эту геометрическую фигуру посредством задания длин трех его сторон. Клас
Описать класс «Треугольник», который определяет эту геометрическую фигуру посредством задания длин...

Класс "Треугольник", хранящий вершины и производящий вычисление длин его сторон
Класс, хранящий вершины треугольника (x1, y1; x2, y2 и x3, y3) и производящий вычисление...

Создать класс треугольник, члены класса - длины трех сторон
Создать класс треугольник, члены класса - длины 3-х сторон. Описать в классе конструкторы,...

Класс, хранящий вершины треугольника (x1, y1; x2, y2 и x3, y3) и производящий вычисление длин его сторон, определяющий угол!
Дорогое программисты!!! Помогите пожалуйста написать программу! Класс, хранящий вершины...

19
Модератор
Эксперт HTML/CSS
1409 / 925 / 444
Регистрация: 13.03.2010
Сообщений: 3,433
18.04.2020, 12:49 2
Уточните язык программирования, на котором нужно выполнить задание.
0
4297 / 3296 / 339
Регистрация: 12.03.2013
Сообщений: 5,805
18.04.2020, 16:27 3
Почему-то кажется, что Common Lisp.
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
(defun valid-triangle-sides-p (a b c)
  (and (< 0 a (+ b c))
       (< 0 b (+ a c))
       (< 0 c (+ a b))))
 
(defclass triangle ()
  ((side-a :accessor side-a :initarg :side-a :initform 1)
   (side-b :accessor side-b :initarg :side-b :initform 1)
   (side-c :accessor side-c :initarg :side-c :initform 1)))
 
(defmethod shared-initialize :after ((triangle triangle) slot-names &rest initargs &key &allow-other-keys)
  (declare (ignore slot-names initargs))
  (with-slots (side-a side-b side-c) triangle
    (unless (valid-triangle-sides-p side-a side-b side-c)
      (error "Не существует треугольник со сторонами ~A, ~A, ~A" side-a side-b side-c))))
 
(macrolet ((define-side-validator (side)
             (let* ((sides '(side-a side-b side-c))
                    (side-forms (loop for s in sides collect `(,s triangle)))
                    (new-values (substitute 'value side side-forms :key #'first)))
               `(defmethod (setf ,side) :before (value (triangle triangle))
                  (unless (valid-triangle-sides-p ,@new-values)
                    (error "Не существует треугольник со сторонами ~A, ~A, ~A" ,@new-values)))))
           (define-side-validators ()
             `(progn
                ,@(loop for side in '(side-a side-b side-c)
                        collect `(define-side-validator ,side)))))
  (define-side-validators))
 
(defgeneric area (figure))
 
(defmethod area ((figure triangle))
  (let ((a (side-a figure))
        (b (side-b figure))
        (c (side-c figure)))
    (let ((p (/ (+ a b c) 2)))
      (sqrt (* p (- p a) (- p b) (- p c))))))
Примеры:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(let ((tr (make-instance 'triangle)))
  (format t "Стороны: ~A, ~A, ~A~%" (side-a tr) (side-b tr) (side-c tr))
  (format t "Площадь: ~A~%" (area tr)))
Стороны: 1, 1, 1
Площадь: 0.4330127
 
(let ((tr (make-instance 'triangle :side-a 3 :side-b 4 :side-c 5)))
  (format t "Стороны: ~A, ~A, ~A~%" (side-a tr) (side-b tr) (side-c tr))
  (format t "Изменение стороны~%")
  (setf (side-a tr) 4)
  (format t "Стороны: ~A, ~A, ~A~%" (side-a tr) (side-b tr) (side-c tr))
  (format t "Некорректное изменение стороны~%")
  (setf (side-a tr) 100) ; ошибка
  )
Стороны: 3, 4, 5
Изменение стороны
Стороны: 4, 4, 5
Некорректное изменение стороны
Не существует треугольник со сторонами 100, 4, 5
   [Condition of type SIMPLE-ERROR]
 
(make-instance 'triangle :side-a 100 :side-b 1 :side-c 2) ; ошибка
А углы и высоты - упражнение. Можете в макросы завернуть, чтобы код не повторять.
2
Модератор
62552 / 46721 / 32203
Регистрация: 18.05.2008
Сообщений: 113,077
18.04.2020, 16:58 4
Цитата Сообщение от helter Посмотреть сообщение
Почему-то кажется, что Common Lisp.
Вообще то 5 предыдущих тем в разделе С++.
0
4297 / 3296 / 339
Регистрация: 12.03.2013
Сообщений: 5,805
18.04.2020, 17:05 5

Не по теме:

Наверно, человеку прискучил message passing и он решил окунуться в ООП на генеричных функциях.

1
19 / 21 / 1
Регистрация: 09.04.2020
Сообщений: 125
23.04.2020, 21:24 6
Цитата Сообщение от helter Посмотреть сообщение
Наверно, человеку прискучил message passing
Скорее всего это тонкая ирония, ибо обмена сообщения в c++ нет, если речь не идет о потоках конечно. А вот message passing:
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
#lang racket
 
 
(define triangle%
  (class object%
    ;; поля со значениями по умолчанию
    (init-field (a 1))
    (init-field (b 1))
    (init-field (c 1))
 
    (define/public (valid-triangle-sides?)
      (let ((a (get-field a this))
            (b (get-field b this))
            (c (get-field c this)))
        (and (< 0 a (+ b c))
             (< 0 b (+ a c))
             (< 0 c (+ a b)))))
 
    ;; печать длин сторон
    (define/public (display-sides)
      (printf
       "a: ~a, b: ~a, c: ~a~n"
       (get-field a this)
       (get-field b this)
       (get-field c this)))
 
    ;; изменить длину стороны
    (define/public (field-set name value)
      (when (with-handlers ((exn:fail? (lambda (exn) #f)))
              (dynamic-get-field name this))
        (let ((tmp (new triangle%
                        (a (get-field a this))
                        (b (get-field b this))
                        (c (get-field c this)))))
          (dynamic-set-field! name tmp value)
          (if (send tmp valid-triangle-sides?)
              (dynamic-set-field! name this value)
              (printf "Не существует треугольник со сторонами ~a, ~a, ~a~n"
                      (get-field a tmp)
                      (get-field b tmp)
                      (get-field c tmp))))))
 
    ;; площадь треугольника
    (define/public (area)
      (let* ((a (get-field a this))
             (b (get-field b this))
             (c (get-field c this))
             (p (/ (+ a b c) 2)))
        (expt (* p (- p a) (- p b) (- p c)) .5)))
    
    ;; инициализация
    (super-new)))
 
(define (main)
  (let ((foo (make-object triangle% 2 3 4))) ; создаем объект
    (printf "Печать сторон треугольника:~n")
    (send foo display-sides)
    (printf "Некорректное изменение стороны: ~n")
    (send foo field-set 'b 30)
    (printf "Печать сторон треугольника:~n")
    (send foo display-sides)
    (printf "Корректное изменение стороны: ~n")
    (send foo field-set 'a 5)
    (printf "Печать сторон треугольника:~n")
    (send foo display-sides)
    (printf "Площадь треугольника:~n")
    (send foo area)))
 
> (main)
 
;Печать сторон треугольника:
;a: 2, b: 3, c: 4
;Некорректное изменение стороны: 
;Не существует треугольник со сторонами 2, 30, 4
;Печать сторон треугольника:
;a: 2, b: 3, c: 4
;Корректное изменение стороны: 
;Печать сторон треугольника:
;a: 5, b: 3, c: 4
;Площадь треугольника:
;6.0
1
4297 / 3296 / 339
Регистрация: 12.03.2013
Сообщений: 5,805
23.04.2020, 21:56 7
Цитата Сообщение от freevoyajer Посмотреть сообщение
Скорее всего это тонкая ирония, ибо обмена сообщения в c++ нет, если речь не идет о потоках конечно.
Я имел в виду "обычное ООП через точку": foo.bar(baz) можно интерпретировать, как отправка объекту foo сообщения bar с параметром baz. Это метафора: не имеется в виду, что в действительности что-то отправляется. С точки зрения CLOS это диспетчеризация по одному аргументу.
0
19 / 21 / 1
Регистрация: 09.04.2020
Сообщений: 125
23.04.2020, 22:05 8
Цитата Сообщение от helter Посмотреть сообщение
Я имел в виду
Значит вы неосознанно ввели публику в заблуждение, проказник =) Термин message passing имеет однозначную интерпретацию в компьютерных науках.

Добавлено через 2 минуты
Цитата Сообщение от helter Посмотреть сообщение
С точки зрения CLOS это диспетчеризация по одному аргументу
А вообще по-моему ООП в lisp - ненужное ненужно, /ящетаю
0
4297 / 3296 / 339
Регистрация: 12.03.2013
Сообщений: 5,805
23.04.2020, 22:20 9
Цитата Сообщение от freevoyajer Посмотреть сообщение
Значит вы неосознанно ввели публику в заблуждение, проказник =) Термин message passing имеет однозначную интерпретацию в компьютерных науках.
Ну не знаю, не сам же я это придумал, сразу по-английски-то. Значит, вычитал. А раз вычитал, значит, где-то было написано. А раз где-то было написано, значит, кто-то в таком смысле употребляет.

А где я вычитал-то? Наверно, в PCL. http://www.gigamonkeys.com/boo... tions.html

Добавлено через 1 минуту
Цитата Сообщение от freevoyajer Посмотреть сообщение
А вообще по-моему ООП в lisp - ненужное ненужно, /ящетаю
Ну, не знаю. Например, trivial-gray-streams - полезная вещь.
0
19 / 21 / 1
Регистрация: 09.04.2020
Сообщений: 125
23.04.2020, 22:34 10
Цитата Сообщение от helter Посмотреть сообщение
Например, trivial-gray-streams - полезная вещь
Да много чего полезного. Я о том что во-первых, сам CLOS в коде это уже оверхед и потеря произодительности, и во-вторых, всё это полезное может быть реализовано императивно, в стиле common lisp. CLOS - красивая и ненужная игрушка, как-то так.
Цитата Сообщение от helter Посмотреть сообщение
PCL
устарел лет 20 назад =))
0
4297 / 3296 / 339
Регистрация: 12.03.2013
Сообщений: 5,805
23.04.2020, 22:58 11
Цитата Сообщение от freevoyajer Посмотреть сообщение
CLOS в коде это уже оверхед и потеря произодительности
А совет про предварительную оптимизацию сколько лет назад устарел? Кроме того, не всякому коду суждено побывать в рантайме. Может, мне CLOS для макрописания вздумается использовать.
0
freevoyajer
23.04.2020, 23:07
  #12

Не по теме:

helter, я вас услышал. Принял =)

0
helter
24.04.2020, 00:15
  #13

Не по теме:

Хорошее дело - про CL флудить.

0
19 / 21 / 1
Регистрация: 09.04.2020
Сообщений: 125
24.04.2020, 01:28 14

Не по теме:

Я бы даже сказал - неблагодарное, или даже антиблагодарное. Ниасиляторы даже минусуют. Надеюсь еще кто-то здесь объекты покажет.



Добавлено через 34 минуты
Ruby
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
class Triangle
  attr_accessor :a, :b, :c
 
  def initialize(a = 1.0, b = 1.0, c = 1.0)
    @a = a
    @b = b
    @c = c
  end
  
  def dump_sides ()
    sides = [["a:", @a], ["b:", @b], ["c:", @c]]
    sides.each { |name, value| puts name.ljust(3) + value.to_s }
  end
  
  def set_side (a, b, c)
    if a + b > c and a + c > b and b + c > a
      @a = a
      @b = b
      @c = c
      self.dump_sides
    else
      puts "Треульник не существует"
    end
  end
  
  def area ()
    p = (@a + @b + @c) / 2
    (p * (p - a) * (p - b) * (p - c)) ** 0.5
  end
  
end
 
t = Triangle.new
t.area
# 0.4330127018922193
0
3252 / 2315 / 421
Регистрация: 28.04.2012
Сообщений: 7,717
24.04.2020, 17:12 15
freevoyajer, ты забыл в конструкторе инвариант проверить.
0
19 / 21 / 1
Регистрация: 09.04.2020
Сообщений: 125
24.04.2020, 17:49 16
korvin_, не нужно, валидация данных - задача отдающего, а не принимающего. Иначе оверхед везде и во всем. А вот в set_side нужно, но он частично косвенно есть.
0
3252 / 2315 / 421
Регистрация: 28.04.2012
Сообщений: 7,717
24.04.2020, 17:56 17
Цитата Сообщение от freevoyajer Посмотреть сообщение
не нужно
Ещё как нужно, иначе инвариант класса нарушается.

Цитата Сообщение от freevoyajer Посмотреть сообщение
А вот в set_side нужно
А тут типа оверхеда нет, в чём логика?

Либо у класса есть инвариант (тогда его нужно проверять в кострукторах и мутаторах), либо нет (тогда его не нужно проверять вообще).
0
19 / 21 / 1
Регистрация: 09.04.2020
Сообщений: 125
24.04.2020, 18:03 18
Цитата Сообщение от korvin_ Посмотреть сообщение
Ещё как нужно
напиши как нужно
Цитата Сообщение от korvin_ Посмотреть сообщение
А тут типа оверхеда нет, в чём логика?
Есть, но он обязательный. Иначе треугольник, которого быть не может не есть треугольник. Мы позаботились о том чтобы сторона принявшая треугольник получила треугольник, а не ломаную кривую.
Цитата Сообщение от korvin_ Посмотреть сообщение
Либо у класса есть инвариант, либо нет
У меня нет. Давай уже свой с инвариантом.
0
3252 / 2315 / 421
Регистрация: 28.04.2012
Сообщений: 7,717
24.04.2020, 18:07 19
Цитата Сообщение от freevoyajer Посмотреть сообщение
Есть, но он обязательный. Иначе треугольник, которого быть не может не есть треугольник.
И что же мне помешает создать треугольник, которого не может быть, с помощью конструктора?

Цитата Сообщение от freevoyajer Посмотреть сообщение
напиши как нужно
Достаточно сделать ту же проверку в конструкторе

F#
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
open Printf
 
class triangle ?a:(_a=1.) ?b:(_b=1.) ?c:(_c=1.) () =
  let validate a b c = if a +. b > c && a +. c > b && b +. c > a
    then ()
    else raise (Failure "Invalid triangle sides") in
  let _ = validate _a _b _c in
  object
    val mutable a = _a
    val mutable b = _b
    val mutable c = _c
    method to_string = sprintf "T{a=%.2f; b=%.2f; c=%.2f}" _a _b _c
    method change_sides ~a:_a ~b:_b ~c:_c =
      validate _a _b _c ;
      a <- _a ;
      b <- _b ;
      c <- _c
    method area =
      let p = (a +. b +. c) /. 2. in
      (p *. (p -. a) *. (p -. b) *. (p -. c)) ** 0.5
  end
 
let _ =
  let t = new triangle () in
  printf "%s\n" t#to_string ;
  printf "%f\n" t#area
0
19 / 21 / 1
Регистрация: 09.04.2020
Сообщений: 125
24.04.2020, 18:14 20
Цитата Сообщение от korvin_ Посмотреть сообщение
И что же мне помешает создать треугольник, которого не может быть, с помощью конструктора?
не в бровь а в глаз
Цитата Сообщение от korvin_ Посмотреть сообщение
Достаточно сделать ту же проверку в конструкторе
Другое дело. Я с ruby только вчера познакомился.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2020, 18:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Организовать класс треугольник, определенный по длинам трех сторон. Сделать ввод значений объектов
Здравствуйте. Лабораторную сдавал, практические сдал, но преподаватель дал задание, выполнение...

В программе определить массив записей Каждая запись определяет геометрическую фигуру: окружность
Лабораторная работа №7. Тема – работа с записями с вари-антами, графикой. В программе определить...

Описать класс треугольник через координаты трех точек
class Triangle { // поля double Ax; double Ay; double...

Описать класс "треугольник" с тремя полями — длинами сторон
Описать класс &quot;треугольник&quot; с тремя полями — длинами сторон. Добавить конструктор по умолчанию,...

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


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

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

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