Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package trianglemain;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- interface ArithmeticOperations {
- Object add(Object o);
- Object sub(Object o);
- Object mul(Object o);
- Object div(Object o);
- }
- interface Visualization {
- void prn();
- }
- /**
- *
- * <h3>Класс "Треугольники"</h3>
- * {@link Triangle#versionLog() см. список версий}
- *
- * @author Никита "Arkanium77" Гржибовский
- * @version 1.8
- *
- */
- class Triangle implements ArithmeticOperations, Visualization {
- /**
- * Лог версий.
- * <h4>v1.8</h4> ► Введено поле <code>name</code> и соответствующие конструкторы. Полная совместимость с предыдущими версиями.<br>
- * ► Добавлены методы: {@link Triangle#getName() getName()}, {@link Triangle#nameIt(java.lang.String) nameIt()}<br>
- * ► Изменены методы: {@link Triangle#toString() toString()}, {@link Triangle#get() get()}<br>
- *
- * <h4>v1.7</h4> Появление документации
- * <h4>v1.6</h4> Исключения {@link trianglemain.NegativeException NegativeException}, {@link trianglemain.SidesException SidesException}
- */
- private void versionLog(){}
- /**
- * <b>Поля класса - стороны треугольника.</b>
- */
- private double a, b, c;
- private String name="";
- /**
- * <u>Конструктор класса {@link Triangle Triangle}.</u><br>
- *
- * @param a 1 сторона
- * @param b 2 сторона
- * @param c 3 сторона
- * @throws SidesException если введённые параметры не соответствуют правилу.
- * По правилу сумма двух сторон треугольника всегда больше третьей.
- * @throws NegativeException если длина стороны треугольника равна
- * нулю(данный класс не рассматривает вырожденные треугольники) или
- * отрицательная.
- */
- Triangle(double a, double b, double c) throws SidesException, NegativeException {
- if (a <= 0 || b <= 0 || c <= 0) {
- throw new NegativeException();
- }
- if (test(a, b, c)) {
- throw new SidesException();
- }
- this.a = a;
- this.b = b;
- this.c = c;
- }
- /**
- * <u>Конструктор класса {@link Triangle Triangle}.</u><br>
- *
- * @param a 1 сторона
- * @param b 2 сторона
- * @param c 3 сторона
- * @param name имя треугольника
- * @throws SidesException если введённые параметры не соответствуют правилу.
- * По правилу сумма двух сторон треугольника всегда больше третьей.
- * @throws NegativeException если длина стороны треугольника равна
- * нулю(данный класс не рассматривает вырожденные треугольники) или
- * отрицательная.
- */
- Triangle(double a, double b, double c, String name) throws SidesException, NegativeException {
- this(a, b, c);
- this.name = name;
- }
- /**
- * <u>Конструктор класса {@link Triangle Triangle}.</u><br>
- * Для равнобедренного треугольника.
- *
- * @param ab две равные стороны треугольника
- * @param c третья сторона
- * @throws SidesException если введённые параметры не соответствуют правилу.
- * По правилу сумма двух сторон треугольника всегда больше третьей.
- * @throws NegativeException если длина стороны треугольника равна
- * нулю(данный класс не рассматривает вырожденные треугольники) или
- * отрицательная.
- */
- Triangle(double ab, double c) throws SidesException, NegativeException {
- if (ab <= 0 || c <= 0) {
- throw new NegativeException();
- }
- if (test(ab, ab, c)) {
- throw new SidesException();
- }
- this.a = ab;
- this.b = ab;
- this.c = c;
- }
- /**
- * <u>Конструктор класса {@link Triangle Triangle}.</u><br>
- * Для равнобедренного треугольника.
- *
- * @param ab две равные стороны треугольника
- * @param c третья сторона
- * @param name имя треугольника
- * @throws SidesException если введённые параметры не соответствуют правилу.
- * По правилу сумма двух сторон треугольника всегда больше третьей.
- * @throws NegativeException если длина стороны треугольника равна
- * нулю(данный класс не рассматривает вырожденные треугольники) или
- * отрицательная.
- */
- Triangle(double ab, double c, String name) throws SidesException, NegativeException {
- this(ab, c);
- this.name = name;
- }
- /**
- * <u>Конструктор класса {@link Triangle Triangle}.</u><br>
- * Для равностороннего треугольника.
- *
- * @param a все три стороны будут равны этому числу.
- * @throws SidesException если введённые параметры не соответствуют правилу.
- * По правилу сумма двух сторон треугольника всегда больше третьей.
- * @throws NegativeException если длина стороны треугольника равна
- * нулю(данный класс не рассматривает вырожденные треугольники) или
- * отрицательная.
- */
- Triangle(double a) throws SidesException, NegativeException {
- if (a <= 0) {
- throw new NegativeException();
- }
- if (test(a, a, a)) {
- throw new SidesException();
- }
- this.a = a;
- this.b = a;
- this.c = a;
- }
- /**
- * <u>Конструктор класса {@link Triangle Triangle}.</u><br>
- * Для равностороннего треугольника.
- *
- * @param a все три стороны будут равны этому числу.
- * @param name имя треугольника
- * @throws SidesException если введённые параметры не соответствуют правилу.
- * По правилу сумма двух сторон треугольника всегда больше третьей.
- * @throws NegativeException если длина стороны треугольника равна
- * нулю(данный класс не рассматривает вырожденные треугольники) или
- * отрицательная.
- */
- Triangle(double a, String name) throws SidesException, NegativeException {
- this(a);
- this.name = name;
- }
- /**
- * <u>Копирующий конструктор класса {@link Triangle Triangle}.</u><br>
- *
- * @param t объект, параметры которого будут скопированы
- */
- Triangle(Triangle t) {
- /*А вот здесь исключения не нужны. Если уж человек умудрится
- создать объект с вырождеными значениями, значит оно ему надо*/
- this.a = t.a;
- this.b = t.b;
- this.c = t.c;
- this.name = t.name;
- }
- /**
- * <u>Конструктор класса {@link Triangle Triangle} по умолчанию.</u><br>
- * Будет создан треугольник со сторонами равными 1
- *
- * @throws SidesException если введённые параметры не соответствуют правилу.
- * По правилу сумма двух сторон треугольника всегда больше третьей.
- * @throws NegativeException если длина стороны треугольника равна
- * нулю(данный класс не рассматривает вырожденные треугольники) или
- * отрицательная.
- */
- Triangle() throws SidesException, NegativeException {
- this(1);
- this.name = "";
- }
- /**
- * <u>Первый же метод, но пользователь его в жизни не увидит.</u><br>
- * Проверяем правило. По правилу сумма двух сторон треугольника всегда
- * больше третьей.
- *
- * @param a 1 сторона
- * @param b 2 сторона
- * @param c 3 сторона
- * @return True, если правило не выполняется и надо выбросить исключение
- * {@link trianglemain.SidesException SidesException}
- */
- protected static boolean test(double a, double b, double c) {
- if (a + b > c && a + c > b && c + b > a) {
- return false;
- }
- return true;
- }
- /**
- * <u>Получить стороны</u><br>
- * Возвращает стороны треугольника по порядку.<br>
- * <small> Необходим, скорее, разработчику наследника, чем
- * пользователю</small>
- *
- * @return Одномерный массив типа double содержащий стороны по порядку
- * <code>[a,b,c]</code>
- */
- protected double[] getSides() {
- double[] m = {this.a, this.b, this.c};
- return m;
- }
- /**
- * <u>Периметр</u><br>
- *
- * @return Периметр треугольника. Сумму всех его сторон.
- */
- public double p() {
- return a + b + c;
- }
- /**
- * <u>Площадь</u><br>
- * по формуле Герона
- *
- * @return Площадь треугольника
- */
- public double s() {
- double P = p() / 2;
- return Math.sqrt(P * (P - a) * (P - b) * (P - c));
- }
- /**
- * <u>Радиус <b>описанной</b> окружности</u><br>
- *
- * @return Радиус описанной окружности
- */
- public double rr() {
- return (a * b * c) / (4 * s());
- }
- /**
- * <u>Радиус <b>вписанной</b> окружности</u><br>
- *
- * @return Радиус вписанной окружности
- */
- public double r() {
- return ((2 * s()) / (a + b + c));
- }
- /**
- * <u>Сравнение двух треугольников</u><br>
- *
- * @deprecated Смотрите <b>НЕ</b> статический
- * {@link trianglemain.Triangle#equals(trianglemain.Triangle) equals}
- * @param one первый треугольник.
- * @param two второй треугольник.
- * @return <code>true</code> - если треугольники равны.<br>Во всех остальных
- * случаях - <code>false</code>
- */
- public static boolean equals(Triangle one, Triangle two) { //Сравнить треугольники
- if (one.a == two.a) {
- if (one.b == two.b) {
- if (one.c == two.c) {
- return true;
- }
- }
- if (one.b == two.c) {
- if (one.c == two.b) {
- return true;
- }
- }
- }
- if (one.b == two.a) {
- if (one.c == two.b) {
- if (one.a == two.c) {
- return true;
- }
- }
- if (one.c == two.c) {
- if (one.a == two.b) {
- return true;
- }
- }
- }
- if (one.c == two.a) {
- if (one.a == two.b) {
- if (one.b == two.c) {
- return true;
- }
- }
- if (one.a == two.c) {
- if (one.b == two.b) {
- return true;
- }
- }
- }
- return false;
- }
- /**
- * <u>Сравнение двух треугольников</u><br>
- *
- * @param two второй треугольник для сравнения.
- * @return <code>true</code> - если треугольники равны.<br>Во всех остальных
- * случаях - <code>false</code>
- */
- public boolean equals(Triangle two) { //Сравнить треугольники
- if (this.a == two.a) {
- if (this.b == two.b) {
- if (this.c == two.c) {
- return true;
- }
- }
- if (this.b == two.c) {
- if (this.c == two.b) {
- return true;
- }
- }
- }
- if (this.b == two.a) {
- if (this.c == two.b) {
- if (this.a == two.c) {
- return true;
- }
- }
- if (this.c == two.c) {
- if (this.a == two.b) {
- return true;
- }
- }
- }
- if (this.c == two.a) {
- if (this.a == two.b) {
- if (this.b == two.c) {
- return true;
- }
- }
- if (this.a == two.c) {
- if (this.b == two.b) {
- return true;
- }
- }
- }
- return false;
- }
- /**
- * <u>Копирование</u><br>
- *
- * @deprecated Смотрите
- * {@link trianglemain.Triangle#Triangle(trianglemain.Triangle) копирующий конструктор.}
- * @return новый объект класса {@link Triangle Triangle} с такими
- * же параметрами как у исходного.
- * @throws SidesException если введённые параметры не соответствуют правилу.
- * По правилу сумма двух сторон треугольника всегда больше третьей.
- * @throws NegativeException если длина стороны треугольника равна
- * нулю(данный класс не рассматривает вырожденные треугольники) или
- * отрицательная.
- */
- public Triangle copy() throws SidesException, NegativeException {
- return new Triangle(a, b, c, name);
- }
- /**
- * <u>Вычитание треугольников</u><br>
- * Реализация {@link trianglemain.ArithmeticOperations#sub(Object) sub}
- *
- * @deprecated
- * @param r второй треугольник.
- * @return <small>На данный момент - ничего стоящего.</small>
- */
- @Override
- public Object sub(Object r) {
- return new Object();
- }
- /**
- * <u>Умножение треугольников</u><br>
- * Реализация {@link trianglemain.ArithmeticOperations#mul(Object) mul}
- *
- * @deprecated
- * @param r второй треугольник.
- * @return <small>На данный момент - ничего стоящего.</small>
- */
- @Override
- public Object mul(Object r) {
- return new Object();
- }
- /**
- * <u>Деление треугольников</u><br>
- * Реализация {@link trianglemain.ArithmeticOperations#div(Object) div}
- *
- * @deprecated
- * @param r второй треугольник.
- * @return <small>На данный момент - ничего стоящего.</small>
- */
- @Override
- public Object div(Object r) {
- return new Object();
- }
- /**
- * <u>Сложение треугольников</u><br>
- * Реализация {@link trianglemain.ArithmeticOperations#sub(Object) sub}
- *
- * @param r второй треугольник.
- * @return Равносторонний треугольник, площадь которого равна сумме площадей
- * исходных.
- */
- @Override
- public Object add(Object o) /*throws SidesException, NegativeException*/ { //Если раскомментировать - всё ломается. Потому, чо интерфейс не содержит исключений
- //Создаём два объекта Triangle
- Triangle t = (Triangle) this;
- Triangle t1 = (Triangle) o;
- //Находим сумму площадей. Вы сказали, что мы должны делать это.
- double s = t.s() + t1.s();
- //▼Это - собственно я решал уравнение. Исходное - поиск площади из метода s
- /* s=Math.sqrt(P * (P - a) * (P - b) * (P - c)) //А. Точно P - ПОЛУпериметр.
- Math.pow(s,2)=((3*a)/2)*(((3*a)/2)-a)*(((3*a)/2)-a)*(((3*a)/2)-a);
- Math.pow(s,2)=(3*Math.pow(a,4))
- 3*Math.pow(a,4)=Math.pow(s,2)*16
- Math.pow(a,4)=
- a=Math.pow(((Math.pow(s,2)*16)/3),(1/((double)4.0));
- */
- //Посчитали выражение полученное уравнением
- double side = Math.pow(((Math.pow(s, 2) * 16) / 3), (1 / ((double) 4.0)));
- //инициализируем новый объект. На самом деле наверное стоит перезаписать один из старых.
- Triangle tf = null;
- try {
- //пробуем создать объект
- tf = new Triangle(side);
- //логи. Можем просто вывести что-то System.out'ом. Но NetBeans предложил этот вариант.
- } catch (SidesException ex) {
- //Logger.getLogger(Triangle.class.getName()).log(Level.SEVERE, null, ex);
- System.out.println("Треугольника со сторонами " + side + " не существует!");
- //tf=new Triangle(); - А вот создать нормальный объект мы при всём желании не можем. Опять нужен блок try-catch, который ни к чему не приведёт.
- } catch (NegativeException ex) {
- //Logger.getLogger(Triangle.class.getName()).log(Level.SEVERE, null, ex);
- System.out.println("Треугольника с такой площадью должна быть отрицательная сторона\n Его не существует!");
- }
- return tf;
- }
- /**
- * <u>Получить строку с указанием значений сторон</u><br>
- *
- * @return Строку вида "name: a=x b=y c=z", где x,y,z - длины сторон данного
- * треугольника, а name его имя. Если поле имени пустое, то Строку вида "a=x
- * b=y c=z"
- *
- */
- public String get() {
- if (!name.equals("")) {
- return name + ": a=" + a + " b=" + b + " c=" + c;
- }
- return "a=" + a + " b=" + b + " c=" + c;
- }
- /**
- * <u>Вывод на печать</u><br>
- * Реализация {@link trianglemain.Visualization#prn() prn}<br>
- * <small>Выведет строку, получаемую методом
- * {@link trianglemain.Triangle#get() get}</small>
- */
- @Override
- public void prn() {
- System.out.println(this.get());
- }
- /**
- * <u>Треугольник как строка</u><br>
- * Перезапись стандартного метода {@link Object#toString() toString}
- *
- * @return Cтроку вида
- * <br><code>name+" - треугольник со сторонами a=" + a + ", b=" + b + ", c=" + c</code>, если поле имени не пустое. В противном случае
- * <br><code>"треугольник со сторонами a=" + a + ", b=" + b + ", c=" + c</code><br>
- * <small><u>Обращаю внимание, что "треугольник" - с маленькой
- * буквы. В любом случае.</u></small>
- */
- @Override
- public String toString() {
- if (name!="") return name+" - треугольник со сторонами a=" + a + ", b=" + b + ", c=" + c;
- return "треугольник со сторонами a=" + a + ", b=" + b + ", c=" + c;
- }
- /**
- * <u>Переименовать треугольник</u><br>
- * Переименовать или задать новое имя треугольнику.
- * @param name новое имя треугольника
- */
- void nameIt(String name){
- this.name=name;
- }
- /**
- * <u>Получить имя треугольника</u><br>
- * @return Строку содержащую значение поля name
- */
- String getName(){
- return name;
- }
- }
- /*-------------------------------------------*/
- /**
- * <u>Класс-исключение NegativeException</u><br>
- * Длина стороны треугольника не может быть отрицательной.
- *
- * @autor Никита "Arkanium77" Гржибовский
- */
- class NegativeException extends Exception {
- @Override
- public String toString() {
- return "Длина стороны треугольника не может быть отрицательной!";
- }
- }
- /**
- * <u>Класс-исключение SidesException</u><br>
- * В невырожденном треугольнике сумма длин двух его сторон всегда должна быть
- * больше длины третьей стороны.
- *
- * @autor Никита "Arkanium77" Гржибовский
- */
- class SidesException extends Exception {
- @Override
- public String toString() {
- return "В невырожденном треугольнике сумма длин двух его сторон больше длины третьей стороны";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment