Arkanium77

Triangle

Sep 18th, 2019
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 23.12 KB | None | 0 0
  1. package trianglemain;
  2.  
  3. import java.util.logging.Level;
  4. import java.util.logging.Logger;
  5.  
  6. interface ArithmeticOperations {
  7.  
  8.     Object add(Object o);
  9.  
  10.     Object sub(Object o);
  11.  
  12.     Object mul(Object o);
  13.  
  14.     Object div(Object o);
  15.  
  16. }
  17.  
  18. interface Visualization {
  19.  
  20.     void prn();
  21. }
  22.  
  23. /**
  24.  *
  25.  * <h3>Класс "Треугольники"</h3>
  26.  * {@link Triangle#versionLog() см. список версий}
  27.  *
  28.  * @author Никита "Arkanium77" Гржибовский
  29.  * @version 1.8
  30.  *
  31.  */
  32. class Triangle implements ArithmeticOperations, Visualization {
  33.     /**
  34.      * Лог версий.
  35.      * <h4>v1.8</h4> ► Введено поле <code>name</code> и соответствующие конструкторы. Полная совместимость с предыдущими версиями.<br>
  36.      * ► Добавлены методы: {@link Triangle#getName() getName()}, {@link Triangle#nameIt(java.lang.String) nameIt()}<br>
  37.      * ► Изменены методы: {@link Triangle#toString() toString()}, {@link Triangle#get() get()}<br>
  38.      *
  39.      * <h4>v1.7</h4> Появление документации
  40.      * <h4>v1.6</h4> Исключения {@link trianglemain.NegativeException NegativeException}, {@link trianglemain.SidesException SidesException}
  41.      */
  42.     private void versionLog(){}
  43.  
  44.     /**
  45.      * <b>Поля класса - стороны треугольника.</b>
  46.      */
  47.     private double a, b, c;
  48.     private String name="";
  49.  
  50.     /**
  51.      * <u>Конструктор класса {@link Triangle Triangle}.</u><br>
  52.      *
  53.      * @param a 1 сторона
  54.      * @param b 2 сторона
  55.      * @param c 3 сторона
  56.      * @throws SidesException если введённые параметры не соответствуют правилу.
  57.      * По правилу сумма двух сторон треугольника всегда больше третьей.
  58.      * @throws NegativeException если длина стороны треугольника равна
  59.      * нулю(данный класс не рассматривает вырожденные треугольники) или
  60.      * отрицательная.
  61.      */
  62.     Triangle(double a, double b, double c) throws SidesException, NegativeException {
  63.         if (a <= 0 || b <= 0 || c <= 0) {
  64.             throw new NegativeException();
  65.         }
  66.         if (test(a, b, c)) {
  67.             throw new SidesException();
  68.         }
  69.         this.a = a;
  70.         this.b = b;
  71.         this.c = c;
  72.     }
  73.  
  74.     /**
  75.      * <u>Конструктор класса {@link Triangle Triangle}.</u><br>
  76.      *
  77.      * @param a 1 сторона
  78.      * @param b 2 сторона
  79.      * @param c 3 сторона
  80.      * @param name имя треугольника
  81.      * @throws SidesException если введённые параметры не соответствуют правилу.
  82.      * По правилу сумма двух сторон треугольника всегда больше третьей.
  83.      * @throws NegativeException если длина стороны треугольника равна
  84.      * нулю(данный класс не рассматривает вырожденные треугольники) или
  85.      * отрицательная.
  86.      */
  87.     Triangle(double a, double b, double c, String name) throws SidesException, NegativeException {
  88.         this(a, b, c);
  89.         this.name = name;
  90.     }
  91.  
  92.     /**
  93.      * <u>Конструктор класса {@link Triangle Triangle}.</u><br>
  94.      * Для равнобедренного треугольника.
  95.      *
  96.      * @param ab две равные стороны треугольника
  97.      * @param c третья сторона
  98.      * @throws SidesException если введённые параметры не соответствуют правилу.
  99.      * По правилу сумма двух сторон треугольника всегда больше третьей.
  100.      * @throws NegativeException если длина стороны треугольника равна
  101.      * нулю(данный класс не рассматривает вырожденные треугольники) или
  102.      * отрицательная.
  103.      */
  104.     Triangle(double ab, double c) throws SidesException, NegativeException {
  105.         if (ab <= 0 || c <= 0) {
  106.             throw new NegativeException();
  107.         }
  108.         if (test(ab, ab, c)) {
  109.             throw new SidesException();
  110.         }
  111.         this.a = ab;
  112.         this.b = ab;
  113.         this.c = c;
  114.     }
  115.  
  116.     /**
  117.      * <u>Конструктор класса {@link Triangle Triangle}.</u><br>
  118.      * Для равнобедренного треугольника.
  119.      *
  120.      * @param ab две равные стороны треугольника
  121.      * @param c третья сторона
  122.      * @param name имя треугольника
  123.      * @throws SidesException если введённые параметры не соответствуют правилу.
  124.      * По правилу сумма двух сторон треугольника всегда больше третьей.
  125.      * @throws NegativeException если длина стороны треугольника равна
  126.      * нулю(данный класс не рассматривает вырожденные треугольники) или
  127.      * отрицательная.
  128.      */
  129.     Triangle(double ab, double c, String name) throws SidesException, NegativeException {
  130.         this(ab, c);
  131.         this.name = name;
  132.     }
  133.  
  134.     /**
  135.      * <u>Конструктор класса {@link Triangle Triangle}.</u><br>
  136.      * Для равностороннего треугольника.
  137.      *
  138.      * @param a все три стороны будут равны этому числу.
  139.      * @throws SidesException если введённые параметры не соответствуют правилу.
  140.      * По правилу сумма двух сторон треугольника всегда больше третьей.
  141.      * @throws NegativeException если длина стороны треугольника равна
  142.      * нулю(данный класс не рассматривает вырожденные треугольники) или
  143.      * отрицательная.
  144.      */
  145.     Triangle(double a) throws SidesException, NegativeException {
  146.         if (a <= 0) {
  147.             throw new NegativeException();
  148.         }
  149.         if (test(a, a, a)) {
  150.             throw new SidesException();
  151.         }
  152.         this.a = a;
  153.         this.b = a;
  154.         this.c = a;
  155.  
  156.     }
  157.    
  158.    
  159.     /**
  160.      * <u>Конструктор класса {@link Triangle Triangle}.</u><br>
  161.      * Для равностороннего треугольника.
  162.      *
  163.      * @param a все три стороны будут равны этому числу.
  164.      * @param name имя треугольника
  165.      * @throws SidesException если введённые параметры не соответствуют правилу.
  166.      * По правилу сумма двух сторон треугольника всегда больше третьей.
  167.      * @throws NegativeException если длина стороны треугольника равна
  168.      * нулю(данный класс не рассматривает вырожденные треугольники) или
  169.      * отрицательная.
  170.      */
  171.     Triangle(double a, String name) throws SidesException, NegativeException {
  172.         this(a);
  173.         this.name = name;
  174.     }
  175.  
  176.     /**
  177.      * <u>Копирующий конструктор класса {@link Triangle Triangle}.</u><br>
  178.      *
  179.      * @param t объект, параметры которого будут скопированы
  180.      */
  181.     Triangle(Triangle t) {
  182.         /*А вот здесь исключения не нужны. Если уж человек умудрится
  183.         создать объект с вырождеными значениями, значит оно ему надо*/
  184.         this.a = t.a;
  185.         this.b = t.b;
  186.         this.c = t.c;
  187.         this.name = t.name;
  188.  
  189.     }
  190.  
  191.     /**
  192.      * <u>Конструктор класса {@link Triangle Triangle} по умолчанию.</u><br>
  193.      * Будет создан треугольник со сторонами равными 1
  194.      *
  195.      * @throws SidesException если введённые параметры не соответствуют правилу.
  196.      * По правилу сумма двух сторон треугольника всегда больше третьей.
  197.      * @throws NegativeException если длина стороны треугольника равна
  198.      * нулю(данный класс не рассматривает вырожденные треугольники) или
  199.      * отрицательная.
  200.      */
  201.     Triangle() throws SidesException, NegativeException {
  202.         this(1);
  203.         this.name = "";
  204.     }
  205.  
  206.     /**
  207.      * <u>Первый же метод, но пользователь его в жизни не увидит.</u><br>
  208.      * Проверяем правило. По правилу сумма двух сторон треугольника всегда
  209.      * больше третьей.
  210.      *
  211.      * @param a 1 сторона
  212.      * @param b 2 сторона
  213.      * @param c 3 сторона
  214.      * @return True, если правило не выполняется и надо выбросить исключение
  215.      * {@link trianglemain.SidesException SidesException}
  216.      */
  217.     protected static boolean test(double a, double b, double c) {
  218.         if (a + b > c && a + c > b && c + b > a) {
  219.             return false;
  220.         }
  221.         return true;
  222.     }
  223.  
  224.     /**
  225.      * <u>Получить стороны</u><br>
  226.      * Возвращает стороны треугольника по порядку.<br>
  227.      * <small>       Необходим, скорее, разработчику наследника, чем
  228.      * пользователю</small>
  229.      *
  230.      * @return Одномерный массив типа double содержащий стороны по порядку
  231.      * <code>[a,b,c]</code>
  232.      */
  233.     protected double[] getSides() {
  234.         double[] m = {this.a, this.b, this.c};
  235.         return m;
  236.     }
  237.  
  238.     /**
  239.      * <u>Периметр</u><br>
  240.      *
  241.      * @return Периметр треугольника. Сумму всех его сторон.
  242.      */
  243.     public double p() {
  244.         return a + b + c;
  245.     }
  246.  
  247.     /**
  248.      * <u>Площадь</u><br>
  249.      * по формуле Герона
  250.      *
  251.      * @return Площадь треугольника
  252.      */
  253.     public double s() {
  254.         double P = p() / 2;
  255.         return Math.sqrt(P * (P - a) * (P - b) * (P - c));
  256.     }
  257.  
  258.     /**
  259.      * <u>Радиус <b>описанной</b> окружности</u><br>
  260.      *
  261.      * @return Радиус описанной окружности
  262.      */
  263.     public double rr() {
  264.         return (a * b * c) / (4 * s());
  265.     }
  266.  
  267.     /**
  268.      * <u>Радиус <b>вписанной</b> окружности</u><br>
  269.      *
  270.      * @return Радиус вписанной окружности
  271.      */
  272.     public double r() {
  273.         return ((2 * s()) / (a + b + c));
  274.     }
  275.  
  276.     /**
  277.      * <u>Сравнение двух треугольников</u><br>
  278.      *
  279.      * @deprecated Смотрите <b>НЕ</b> статический
  280.      * {@link trianglemain.Triangle#equals(trianglemain.Triangle) equals}
  281.      * @param one первый треугольник.
  282.      * @param two второй треугольник.
  283.      * @return <code>true</code> - если треугольники равны.<br>Во всех остальных
  284.      * случаях - <code>false</code>
  285.      */
  286.     public static boolean equals(Triangle one, Triangle two) { //Сравнить треугольники
  287.         if (one.a == two.a) {
  288.             if (one.b == two.b) {
  289.                 if (one.c == two.c) {
  290.                     return true;
  291.                 }
  292.             }
  293.             if (one.b == two.c) {
  294.                 if (one.c == two.b) {
  295.                     return true;
  296.                 }
  297.             }
  298.         }
  299.         if (one.b == two.a) {
  300.             if (one.c == two.b) {
  301.                 if (one.a == two.c) {
  302.                     return true;
  303.                 }
  304.             }
  305.             if (one.c == two.c) {
  306.                 if (one.a == two.b) {
  307.                     return true;
  308.                 }
  309.             }
  310.         }
  311.         if (one.c == two.a) {
  312.             if (one.a == two.b) {
  313.                 if (one.b == two.c) {
  314.                     return true;
  315.                 }
  316.             }
  317.             if (one.a == two.c) {
  318.                 if (one.b == two.b) {
  319.                     return true;
  320.                 }
  321.             }
  322.         }
  323.         return false;
  324.     }
  325.  
  326.     /**
  327.      * <u>Сравнение двух треугольников</u><br>
  328.      *
  329.      * @param two второй треугольник для сравнения.
  330.      * @return <code>true</code> - если треугольники равны.<br>Во всех остальных
  331.      * случаях - <code>false</code>
  332.      */
  333.     public boolean equals(Triangle two) { //Сравнить треугольники
  334.         if (this.a == two.a) {
  335.             if (this.b == two.b) {
  336.                 if (this.c == two.c) {
  337.                     return true;
  338.                 }
  339.             }
  340.             if (this.b == two.c) {
  341.                 if (this.c == two.b) {
  342.                     return true;
  343.                 }
  344.             }
  345.         }
  346.         if (this.b == two.a) {
  347.             if (this.c == two.b) {
  348.                 if (this.a == two.c) {
  349.                     return true;
  350.                 }
  351.             }
  352.             if (this.c == two.c) {
  353.                 if (this.a == two.b) {
  354.                     return true;
  355.                 }
  356.             }
  357.         }
  358.         if (this.c == two.a) {
  359.             if (this.a == two.b) {
  360.                 if (this.b == two.c) {
  361.                     return true;
  362.                 }
  363.             }
  364.             if (this.a == two.c) {
  365.                 if (this.b == two.b) {
  366.                     return true;
  367.                 }
  368.             }
  369.         }
  370.         return false;
  371.     }
  372.  
  373.     /**
  374.      * <u>Копирование</u><br>
  375.      *
  376.      * @deprecated Смотрите
  377.      * {@link trianglemain.Triangle#Triangle(trianglemain.Triangle) копирующий конструктор.}
  378.      * @return новый объект класса {@link Triangle Triangle} с такими
  379.      * же параметрами как у исходного.
  380.      * @throws SidesException если введённые параметры не соответствуют правилу.
  381.      * По правилу сумма двух сторон треугольника всегда больше третьей.
  382.      * @throws NegativeException если длина стороны треугольника равна
  383.      * нулю(данный класс не рассматривает вырожденные треугольники) или
  384.      * отрицательная.
  385.      */
  386.     public Triangle copy() throws SidesException, NegativeException {
  387.         return new Triangle(a, b, c, name);
  388.     }
  389.  
  390.     /**
  391.      * <u>Вычитание треугольников</u><br>
  392.      * Реализация {@link trianglemain.ArithmeticOperations#sub(Object) sub}
  393.      *
  394.      * @deprecated
  395.      * @param r второй треугольник.
  396.      * @return <small>На данный момент - ничего стоящего.</small>
  397.      */
  398.     @Override
  399.     public Object sub(Object r) {
  400.         return new Object();
  401.     }
  402.  
  403.     /**
  404.      * <u>Умножение треугольников</u><br>
  405.      * Реализация {@link trianglemain.ArithmeticOperations#mul(Object) mul}
  406.      *
  407.      * @deprecated
  408.      * @param r второй треугольник.
  409.      * @return <small>На данный момент - ничего стоящего.</small>
  410.      */
  411.     @Override
  412.     public Object mul(Object r) {
  413.         return new Object();
  414.     }
  415.  
  416.     /**
  417.      * <u>Деление треугольников</u><br>
  418.      * Реализация {@link trianglemain.ArithmeticOperations#div(Object) div}
  419.      *
  420.      * @deprecated
  421.      * @param r второй треугольник.
  422.      * @return <small>На данный момент - ничего стоящего.</small>
  423.      */
  424.     @Override
  425.     public Object div(Object r) {
  426.         return new Object();
  427.     }
  428.  
  429.     /**
  430.      * <u>Сложение треугольников</u><br>
  431.      * Реализация {@link trianglemain.ArithmeticOperations#sub(Object) sub}
  432.      *
  433.      * @param r второй треугольник.
  434.      * @return Равносторонний треугольник, площадь которого равна сумме площадей
  435.      * исходных.
  436.      */
  437.     @Override
  438.     public Object add(Object o) /*throws SidesException, NegativeException*/ { //Если раскомментировать - всё ломается. Потому, чо интерфейс не содержит исключений
  439.         //Создаём два объекта Triangle
  440.         Triangle t = (Triangle) this;
  441.         Triangle t1 = (Triangle) o;
  442.  
  443.         //Находим сумму площадей. Вы сказали, что мы должны делать это.
  444.         double s = t.s() + t1.s();
  445.  
  446.         //▼Это - собственно я решал уравнение. Исходное - поиск площади из метода s
  447.         /*  s=Math.sqrt(P * (P - a) * (P - b) * (P - c)) //А. Точно P - ПОЛУпериметр.
  448.             Math.pow(s,2)=((3*a)/2)*(((3*a)/2)-a)*(((3*a)/2)-a)*(((3*a)/2)-a);
  449.             Math.pow(s,2)=(3*Math.pow(a,4))
  450.             3*Math.pow(a,4)=Math.pow(s,2)*16
  451.             Math.pow(a,4)=
  452.             a=Math.pow(((Math.pow(s,2)*16)/3),(1/((double)4.0));
  453.          */
  454.         //Посчитали выражение полученное уравнением
  455.         double side = Math.pow(((Math.pow(s, 2) * 16) / 3), (1 / ((double) 4.0)));
  456.  
  457.         //инициализируем новый объект. На самом деле наверное стоит перезаписать один из старых.
  458.         Triangle tf = null;
  459.         try {
  460.             //пробуем создать объект
  461.             tf = new Triangle(side);
  462.             //логи. Можем просто вывести что-то System.out'ом. Но NetBeans предложил этот вариант.
  463.         } catch (SidesException ex) {
  464.             //Logger.getLogger(Triangle.class.getName()).log(Level.SEVERE, null, ex);
  465.             System.out.println("Треугольника со сторонами " + side + " не существует!");
  466.             //tf=new Triangle(); - А вот создать нормальный объект мы при всём желании не можем. Опять нужен блок try-catch, который ни к чему не приведёт.
  467.         } catch (NegativeException ex) {
  468.             //Logger.getLogger(Triangle.class.getName()).log(Level.SEVERE, null, ex);
  469.             System.out.println("Треугольника с такой площадью должна быть отрицательная сторона\n Его не существует!");
  470.         }
  471.         return tf;
  472.     }
  473.  
  474.     /**
  475.      * <u>Получить строку с указанием значений сторон</u><br>
  476.      *
  477.      * @return Строку вида "name: a=x b=y c=z", где x,y,z - длины сторон данного
  478.      * треугольника, а name его имя. Если поле имени пустое, то Строку вида "a=x
  479.      * b=y c=z"
  480.      *
  481.      */
  482.     public String get() {
  483.         if (!name.equals("")) {
  484.             return name + ": a=" + a + " b=" + b + " c=" + c;
  485.         }
  486.         return "a=" + a + " b=" + b + " c=" + c;
  487.     }
  488.  
  489.     /**
  490.      * <u>Вывод на печать</u><br>
  491.      * Реализация {@link trianglemain.Visualization#prn() prn}<br>
  492.      * <small>Выведет строку, получаемую методом
  493.      * {@link trianglemain.Triangle#get() get}</small>
  494.      */
  495.     @Override
  496.     public void prn() {
  497.         System.out.println(this.get());
  498.     }
  499.  
  500.     /**
  501.      * <u>Треугольник как строка</u><br>
  502.      * Перезапись стандартного метода {@link Object#toString() toString}
  503.      *
  504.      * @return Cтроку вида
  505.      * <br><code>name+" - треугольник со сторонами a=" + a + ", b=" + b + ", c=" + c</code>, если поле имени не пустое. В противном случае
  506.      * <br><code>"треугольник со сторонами a=" + a + ", b=" + b + ", c=" + c</code><br>
  507.      * <small><u>Обращаю внимание, что "треугольник" - с маленькой
  508.      * буквы. В любом случае.</u></small>
  509.      */
  510.     @Override
  511.     public String toString() {
  512.         if (name!="") return name+" - треугольник со сторонами a=" + a + ", b=" + b + ", c=" + c;
  513.         return "треугольник со сторонами a=" + a + ", b=" + b + ", c=" + c;
  514.     }
  515.     /**
  516.      * <u>Переименовать треугольник</u><br>
  517.      * Переименовать или задать новое имя треугольнику.
  518.      * @param name новое имя треугольника
  519.      */
  520.     void nameIt(String name){
  521.         this.name=name;
  522.     }
  523.     /**
  524.      * <u>Получить имя треугольника</u><br>
  525.      * @return Строку содержащую значение поля name
  526.      */
  527.     String getName(){
  528.         return name;
  529.     }
  530. }
  531.  
  532. /*-------------------------------------------*/
  533. /**
  534.  * <u>Класс-исключение NegativeException</u><br>
  535.  * Длина стороны треугольника не может быть отрицательной.
  536.  *
  537.  * @autor Никита "Arkanium77" Гржибовский
  538.  */
  539. class NegativeException extends Exception {
  540.  
  541.     @Override
  542.     public String toString() {
  543.         return "Длина стороны треугольника не может быть отрицательной!";
  544.     }
  545. }
  546.  
  547. /**
  548.  * <u>Класс-исключение SidesException</u><br>
  549.  * В невырожденном треугольнике сумма длин двух его сторон всегда должна быть
  550.  * больше длины третьей стороны.
  551.  *
  552.  * @autor Никита "Arkanium77" Гржибовский
  553.  */
  554. class SidesException extends Exception {
  555.  
  556.     @Override
  557.     public String toString() {
  558.         return "В невырожденном треугольнике сумма длин двух его сторон больше длины третьей стороны";
  559.     }
  560.  
  561. }
Advertisement
Add Comment
Please, Sign In to add comment