Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   правильность написания кода (http://forum.oszone.net/showthread.php?t=298896)

nomad____1 24-04-2015 11:28 2500098

правильность написания кода
 
Здравствуйте. Интересует правильно ли я пишу код. Выучил ООП и сейчас перехожу к изучению awt, swing и javaFX. Быстро накидал простенькую прожку. :drug: Хотелось знать мнение по поводу составления кода :read: .
главный класс

Код:

package square;

import square.Triangle;

public class Square {

    public static void main(String[] args) {
        Triangle triangle = new Triangle(3, 4, 5);
        triangle.squareOut();
    }
}


клас с методамы и конструктором

Код:

package square;

public class Triangle {

    private int aSide;
    private int bSide;
    private int cSide;
    private double square;
    private double perimeter;

    public Triangle(int aSide, int bSide, int cSide) {
        this.aSide = aSide;
        this.bSide = bSide;
        this.cSide = cSide;
    }

    private void print(String str) {
        System.out.println(str);
    }

    public void square() {
        perimeter = (aSide + bSide + cSide) / 2;
        square = Math.sqrt(perimeter * (perimeter - aSide) * (perimeter - bSide) * (perimeter - cSide));
    }

    public void squareOut() {
        this.square();
        print("Площадь треугольника равна " + square);
    }
}


lxa85 24-04-2015 13:21 2500162

Код как код. Не обременен комментариями, не выполняет каких-либо сверх задач, содержит ошибку вычисления при реализации прямоугольного треугольника.
На мой взгляд процедура public void squareOut() { ... } лишняя.
Я не люблю, когда за меня думает процедура. Т.е. я сам решу, какой текст следует писать, и нужен ли он мне вообще.
Из более грубых ошибок - отсутствие проверки треугольника. Т.е. нельзя в планиметрии получить треугольник со сторонами 1, 1, 6.
А в этой программе можно. Тоже касается и отрицательных величин.

Iska 24-04-2015 13:32 2500174

Цитата:

Цитата lxa85
Т.е. нельзя в планиметрии получить треугольник со сторонами 1, 1, 6.
А в этой программе можно. Тоже касается и отрицательных величин. »

Неевклидовость. Антивселенная. ;).

nomad____1 24-04-2015 14:04 2500191

Цитата:

Цитата lxa85
Код как код. Не обременен комментариями, не выполняет каких-либо сверх задач, содержит ошибку вычисления при реализации прямоугольного треугольника.
На мой взгляд процедура public void squareOut() { ... } лишняя.
Я не люблю, когда за меня думает процедура. Т.е. я сам решу, какой текст следует писать, и нужен ли он мне вообще.
Из более грубых ошибок - отсутствие проверки треугольника. Т.е. нельзя в планиметрии получить треугольник со сторонами 1, 1, 6.
А в этой программе можно. Тоже касается и отрицательных величин.
»


Благодарю за ответ. Комментарии писать буду, а то я забываю что кроме меня еще кто то будет его читать. Насчет правил планиметрии так сказать "проверку на дурака" я не писал... просто хотел по быстрому накидать прожку. Сегодня допишу с учетом всех ошибок и скину сюда. Интересовало мнение насчет построения класса, методов, конструктора. Благодарю за критику. Если вы не против то по мере изучения я буду сливать сюда коды. Хотелось бы видеть от вас критику по их поводу. Мне кажется просто что так я научусь писать более менее нормальный код.

nomad____1 24-04-2015 16:40 2500255

Еще можно ли использовать геттеры и сеттеры? А то много негативного о них в интернете написано... Или их использование будет дурным тоном?

lxa85 24-04-2015 22:00 2500381

В "интернетах" много что пишут. Если специфика работы объекта подсказывает использования сеттера или геттера - то вполне.
Если сеттер и геттер "поганит" данные и вызывает неявное/непредсказуемое действие - тогда это проблема.
nomad____1, setter и getter - это инструмент. Пользоваться им или нет - решать не мне.
В данном случае в процедуру установки параметров можно прописать процедуру установки флага "валидности" треугольника.
Тогда в процедуре вычисления площади будет проверяться условие планарности треугольника по флагу.
Моветон?
----
nomad____1, как вам сказать. Точность - вежливость королей. По таким мелочам судят о специалисте.
На счет построения конструктора класса и методов - сказать сложно. Ваш пример с одной стороны достаточно каноничен и в нем нет сложности, с другой оторван от реальности и практики.
Те же прямоугольные треугольники здесь не учитываются. Ответ будет дан с определенной погрешностью (кстати вопрос "на засыпку" как специалисту: какая погрешность метода при вычислении площади прямоугольного треугольника?).
Отсутствие условий планиметрии приведет к ошибке - вычислению корня из отрицательного числа (NaN).
----
Iska, а вот интересно. Допустим у нас некая выпуклая фигура, на плоскости которой я могу нарисовать треугольник со сторонами 1:1:6. И ... наверно собственно все. По данным сторонам я не смогу сказать какая это фигура? Допустим шар, сфера.
Наверно нет.
Получится у меня должны (пусть катеты) две стороны лежать на прямых плоскостях, а гипотенуза в 6 ед. должна быть свернута в гармошку.
Так что ли?

----
P.S. Не стоит без особой надобности выделять текст жирным шрифтом.

nomad____1 26-04-2015 15:48 2500957

валидность треугольника УЧТЕНО И ДОРОБОТАНО
Цитата:

Цитата lxa85[I
]В данном случае в процедуру установки параметров можно прописать процедуру установки флага "валидности" треугольника.
Тогда в процедуре вычисления площади будет проверяться условие планарности треугольника по флагу.[/i] »

Сделал. Не знаю так ли как Вы написали.
Код:

//      Проверка планарности треугольника     
            if ((aSide + bSide) > cSide && (aSide + cSide) > bSide && (bSide + cSide) > aSide) {
//                Вычисление площади


точность УЧТЕНО
Цитата:

Цитата lxa85
Точность - вежливость королей. По таким мелочам судят о специалисте. »

Программу буду улучшать по мере изучения :beta:

учтено. программу буду улучшать по мере изучения
Цитата:

Цитата lxa85
Ваш пример с одной стороны достаточно каноничен и в нем нет сложности, с другой оторван от реальности и практики. »


Цитата:

Цитата lxa85
Те же прямоугольные треугольники здесь не учитываются. Ответ будет дан с определенной погрешностью (кстати вопрос "на засыпку" как специалисту: какая погрешность метода при вычислении площади прямоугольного треугольника?).
Отсутствие условий планиметрии приведет к ошибке - вычислению корня из отрицательного числа (NaN).
»

Вы сами дали ответ на свой вопрос) точность! в прямоугольном треугольнике площадь равна (а*b)/2 ... очень высокая точность!) А вот вычисление квадратного корня с числа например 2 или 3....)

Тут уже вопрос как заставить ее работать... У меня выводит 0. Так как не может вычислить целый квадратный корень.

Цитата:

Цитата lxa85
P.S. Не стоит без особой надобности выделять текст жирным шрифтом. »

Это чисто для себя. Так сказать "вопрос-ответ". Выделение своих сообщений (вопросов). Для более простейшей навигации.

Вот код после доработки:
главный класс
package square;
Код:

public class Square {

    public static void main(String[] args) {
        Triangle triangle = new Triangle(2, 5, 6);
        triangle.squareOut();
    }
}


Класс с методами и конструктором
package square;
Код:

public class Triangle {

    private int aSide;
    private int bSide;
    private int cSide;
    private double square;
    private double perimeter;
    private int vuvod;

    public Triangle(int aSide, int bSide, int cSide) {
        this.aSide = aSide;
        this.bSide = bSide;
        this.cSide = cSide;
    }

    private void print(String str) {
        System.out.println(str);
    }

//   
//      Проверка "на дурака" введенных значение и вычисление площади
//       
    public void square() {
//      Проверка нет ли стороны с отрицательным значением или равным нулю
        if (aSide <= 0 || bSide <= 0 || cSide <= 0) {
            vuvod = 1;
        } else {
//      Проверка планарности треугольника     
            if ((aSide + bSide) > cSide && (aSide + cSide) > bSide && (bSide + cSide) > aSide) {
//                Вычисление площади
                perimeter = (aSide + bSide + cSide) / 2;
                square = Math.sqrt(perimeter * (perimeter - aSide) * (perimeter - bSide) * (perimeter - cSide));
                vuvod = 2;
            } else {
//      Когда данные числа не могут соответствовать длине сторон треугольника   
                vuvod = 3;
            }
        }
        if (square == 0) {
            vuvod = 0;
        }
    }

//
// Вывод значения на экран 
//   
    public void squareOut() {
        this.square();
        switch (vuvod) {
            case 1:
                print("Длинна не может быть отрицательным числом");
                break;
            case 2:
                print("Площадь треугольника равна " + square);
                break;
            case 3:
                print("У треугольника не может быть сторон с такими значениями");
                break;
            default:
                print("\tхм... что то не так с программой... Советую заглянуть в метод  square... \n\t Скорее всего программа не может добыть квадратный корень. ");
        }
    }
}



P.S.
Сегодня ночью думаю скину код где будет проверка треугольника на прямоугольность и вычисление площади по отдельной формуле. Думаю использовать сравнение трех сторон. Две самые "мелкие" должны быть катетами. Дальше с помощю теоремы Пифагора проверить будет ли получена гипотенуза равна "нашей" введеной. пока мой извращенный мозг более простого не придумал))) :durak:

P.P.S.
Надеюсь етот смайл пробет стенку головой)

User001 26-04-2015 16:56 2500971

Цитата:

Цитата lxa85
Допустим у нас некая выпуклая фигура, на плоскости которой я могу нарисовать треугольник со сторонами 1:1:6. И ... наверно собственно все. По данным сторонам я не смогу сказать какая это фигура? Допустим шар, сфера. Наверно нет. »

Жуть.
А по теме мои 5 копеек:

Цитата:

Цитата nomad____1
private int vuvod; »

Поменяйте название переменной.
Цитата:

Цитата nomad____1
case 1: »

Цитата:

Цитата nomad____1
case 2: »

Если так и пойдет дело, потом тяжело будет угадывать что это за магические константы.
Цитата:

Цитата nomad____1
public void square() { »

Цитата:

Цитата nomad____1
public void squareOut() »

Лучше это переделать. Как вариант, square возвращает площадь или что-то в этом роде. В вашем случае непонятно зачем square() public.
Цитата:

Цитата nomad____1
vuvod = 0; »

Его в switch нет.
Цитата:

Цитата nomad____1
Длинна не может быть отрицательным числом»

Бросается в глаза.

nomad____1 26-04-2015 17:32 2500985

Цитата:

Цитата User001
vuvod = 0; »
Его в switch нет.
Цитата nomad____1:
Длинна не может быть отрицательным числом»
»

если я правильно понял то 0 это дефолтное значение.
Цитата:

Цитата User001

Цитата nomad____1:
case 1: »
Цитата nomad____1:
case 2: »
Если так и пойдет дело, потом тяжело будет угадывать что это за магические константы.
»

Это да косяк. Забываю. С СИ начинал учить программирование.

Насчет неправильного вывода то разобрался что нужно поменять типы данных переменных в которые записываются длинны сторон на флоаты или даблы.

lxa85 26-04-2015 19:20 2501043

nomad____1, касательно public'ов, static'ов и пр. я не скажу. Но переменная vuvod у меня вызывает подозрения.
Почему используется конструкция public void SquareOut.
Почему не int или не double ?
Я от программы хочу получить ответ. Желательно наиболее простой и пригодный для "дальнейшей эксплуатации".
Мне совершенно не хочется заниматься парсингом строки (притом не возвращаемой в силу void).
Чтобы сигнализировать об ошибке следует возвращать отрицательные значения. -1, -2 и т.д.
Поведение разумеется должно быть описано в сопровождающей документации и в комментариях к процедуре.
----
Цитата:

Цитата nomad____1
Сделал. Не знаю так ли как Вы написали. »

Нет. Я сказал написать проверку в процедуре установки параметров, а не в процедуре вычисления площади.
Напомню, речь шла про сеттеры, гетторы и ввод "флага валидности" треугольника.
----
Цитата:

Цитата nomad____1
Две самые "мелкие" должны быть катетами »

А вдруг нет? Вдруг "мелкие" не катят?!! :o

nomad____1 26-04-2015 20:16 2501070

Цитата:

Цитата lxa85
А вдруг нет? Вдруг "мелкие" не катят?!! »

Если треугольник прямоугольный, то самой длинной стороной будет гипотенуза. Значит две остальные - катеты. То есть хочу сделать проверку и найти самую длинную сторону. Что бы разделить на "воображаемые" катеты и гипотенузу. А дальше по теореме Пифагора. Квадрат гипотенузы равняется суме квадратов катетов. И это только для ПРЯМОУГОЛЬНОГО треугольника! Поднести в квадрат нашу самую большую сторону и получить суму квадратов двух других. И сравнить их. Если совпадут то прямоугольный, а если нет то он не прямоугольный. Такой способ проверки я выбрал потому что на даном этапе моя программа использует теорему Герона (площадь вычисляется по длине сторон). А если треугольник прямоугольный то площадь будет равна половине их произведения (опять же надо две самые короткие стороны потому что между ними прямой угол).
---
Цитата:

Цитата lxa85
Нет. Я сказал написать проверку в процедуре установки параметров, а не в процедуре вычисления площади.
Напомню, речь шла про сеттеры, гетторы и ввод "флага валидности" треугольника. »

Я понял) Простите просто "процедура" это как я понял "Метод". То есть в конструкторе (метод) через который устанавливаются значения, прописать проверку на принадлежность фигуры к треугольникам с точки зрения классической планиметрии. Но это неправильно так как "засорять" особо конструкторы не следует. Или создать отдельный метод с типом boolean, который возвращал значение лож и правда.

P.S.
ПРОГРАММУ ПЕРЕПИШУ И СЕГОДНЯ БУДЕТ НОВЫЙ КОД

Iska 26-04-2015 21:08 2501088

Цитата:

Цитата lxa85
Iska, а вот интересно. Допустим у нас некая выпуклая фигура, на плоскости которой я могу нарисовать треугольник со сторонами 1:1:6. И ... наверно собственно все. По данным сторонам я не смогу сказать какая это фигура? Допустим шар, сфера.
Наверно нет.
Получится у меня должны (пусть катеты) две стороны лежать на прямых плоскостях, а гипотенуза в 6 ед. должна быть свернута в гармошку.
Так что ли? »

В свёрнутом в очень широкий и низкий конус пространстве, полагаю: катеты исходят из вершины конуса, а гипотенуза «обёрнута» вокруг основания, не?

lxa85 26-04-2015 23:54 2501135

nomad____1, разница и игра слов процедура/метод от меня ускользают.
Будете приводить код, выделите пожалуйста, чтобы мы говорили об одном и том же.
----
nomad____1,
Цитата:

Цитата lxa85
А вдруг нет? Вдруг "мелкие" не катят?! »

Это была шутка :) Игра слова катет и катят.
Iska, вообще подходит. Можно будет взять конус в довольно большом промежутке параметров и рассечь наклонной плоскостью. Это даст эллипс в сечении и останется только достроить треугольник до заданного.

User001 27-04-2015 07:04 2501170

Цитата:

Цитата nomad____1
если я правильно понял то 0 это дефолтное значение »

Нет.

nomad____1 27-04-2015 09:21 2501208

Цитата:

Цитата User001
Цитата nomad____1:
если я правильно понял то 0 это дефолтное значение »
Нет
. »

Если ни один параметр не подходит то выбирается дефолтное значение. В даном случае если дорабатывать программу то возможное появление вариантов 4,5.....n , а 0 значение я оставил пустым. То есть 0 не входит в диапазон выбора. Таким способом будет выполнятся дефолт. Потому что в даном случае любое значение переменной больше 3 будет приводить к дефолтному значению. А как по мне это некрасиво. Что где то там есть далеко-далеко дефолт под каким то числом. А при дополнении программы возможно придется число увеличивать. А так под рукою. Нулевое значение = пустое значение = умолчание (дефолт).
P.S.
Благодарю за поправку. Я ничего не доказываю просто объяснил точку зрения "почему я сделать так"... еще вчера после вашего сообщения все операторы выбора были заменены на строковые значения для большей информативности. Параметр "error" не был описан и по нему выполняется дефолтное значение.
P.P.S.
Начал изучать графический интерфейс. Скоро "упакую" эту прожку как конфетку и добавлю немного функционала. А пока надо ее довести до нормального вида.

nomad____1 28-04-2015 14:45 2501797

Цитата:

Цитата lxa85
nomad____1, разница и игра слов процедура/метод от меня ускользают.
Будете приводить код, выделите пожалуйста, чтобы мы говорили об одном и том же.
»

И от меня тоже.... :shot:
Может быть это???

Код:

//   
//      Проверка "на дурака" введенных значений, проверка планарности треугольника, проверка на прямоугольность
// 
    private void triangleTest() {
        //      Проверка нет ли стороны с отрицательным значением или равным нулю
        if (aSide <= 0 || bSide <= 0 || cSide <= 0) {
            otvet = "minusovoe";
        } else {
            //      Проверка планарности треугольника
            if (((aSide + bSide) > cSide && (aSide + cSide) > bSide) && (bSide + cSide) > aSide) {
                testTriangl = true;
            } else {
                //      Данные числа не могут соответствовать длине сторон треугольника 
                otvet = "nesootvetstvie";
                testTriangl = false;
            }
        }
//        Проверка на прямоугольность
        if (testTriangl == true) {
            float masivStoron[] = {aSide, bSide, cSide};
            Arrays.sort(masivStoron);
            if ((masivStoron[2] * masivStoron[2]) == (masivStoron[0] * masivStoron[0] + masivStoron[1] * masivStoron[1])) {
                rightTriangle = true;
            }
        }
    }


Цитата:

Цитата lxa85
Это была шутка Игра слова катет и катят. »

Простите. Я не хотел обидеть. Без злости и задней мысли все пишу. Я просто так раскрываю свою точку зрения. Еще раз прошу прощения если показался дерзким или где то хамил.

А вот и полностью сам код!
Главный класс

Код:

package square;

public class Square {

    public static void main(String[] args) {
        Triangl triangle = new Triangl(3, 4, 5);
        triangle.valueOut();
    }
}


Класс с методами

Код:

package square;

import java.util.Arrays;

public class Triangl {

    private float aSide;
    private float bSide;
    private float cSide;
    private double square;
    private double perimeter;
    private String otvet;
    private boolean testTriangl;
    private boolean rightTriangle;
    private float masivStoron[];

    public Triangl(int aSide, int bSide, int cSide) {
        this.masivStoron = new float[]{aSide, bSide, cSide};
        this.aSide = aSide;
        this.bSide = bSide;
        this.cSide = cSide;
    }

//Собственный метод вывода
    private void print(String str) {
        System.out.println(str);
    }

//   
//      Проверка "на дурака" введенных значений, проверка планарности треугольника, проверка на прямоугольность
// 
    private void triangleTest() {
        //      Проверка нет ли стороны с отрицательным значением или равным нулю
        if (aSide <= 0 || bSide <= 0 || cSide <= 0) {
            otvet = "minusovoe";
        } else {
            //      Проверка планарности треугольника
            if (((aSide + bSide) > cSide && (aSide + cSide) > bSide) && (bSide + cSide) > aSide) {
                testTriangl = true;
            } else {
                //      Данные числа не могут соответствовать длине сторон треугольника 
                otvet = "nesootvetstvie";
                testTriangl = false;
            }
        }
//        Проверка на прямоугольность
        if (testTriangl == true) {
            float masivStoron[] = {aSide, bSide, cSide};
            Arrays.sort(masivStoron);
            if ((masivStoron[2] * masivStoron[2]) == (masivStoron[0] * masivStoron[0] + masivStoron[1] * masivStoron[1])) {
                rightTriangle = true;
            }
        }
    }
//   
//    Вычисление площади
//

    private void square() {
        if (testTriangl == true) {
            if (rightTriangle == true) {
                square = masivStoron[0] * masivStoron[1] / 2;
            } else {
                if (testTriangl == true) {
                    perimeter = (aSide + bSide + cSide) / 2;
                    square = Math.sqrt(perimeter * (perimeter - aSide) * (perimeter - bSide) * (perimeter - cSide));
                }
            }
            otvet = "uspeshno";
        }
    }
//
//      Вывод ответа   
//   

    public void valueOut() {
        this.triangleTest();
        this.square();
        switch (otvet) {
            case "minusovoe":
                print("Длина не может быть отрицательным числом");
                break;
            case "uspeshno":
                print("Треугольник -" + testTriangl + "\nПрямоугольный -" + rightTriangle);
                System.out.printf("Площадь треугольника равна %.2f кв.ед\n", square);
                break;
            case "nesootvetstvie":
                print("У треугольника не может быть сторон с такими значениями");
                break;
            default:
                print("\tхм... что то не так с программой... ");
        }
    }
}


lxa85 28-04-2015 18:25 2501905

Цитата:

Цитата nomad____1
Простите. Я не хотел обидеть. »

а я и не обижался :)


Код:

    private void square() {
        if (testTriangl == true) {
            if (rightTriangle == true) {
                square = masivStoron[0] * masivStoron[1] / 2;
            } else {
                if (testTriangl == true) {
                    perimeter = (aSide + bSide + cSide) / 2;
                    square = Math.sqrt(perimeter * (perimeter - aSide) * (perimeter - bSide) * (perimeter - cSide));
                }
            }
            otvet = "uspeshno";
        }
    }

Двойная проверка условия testTriangle.

Код:

    public void valueOut() {
        this.triangleTest();
        this.square();
        switch (otvet) {
            case "minusovoe":
                print("Длина не может быть отрицательным числом");
                break;
            case "uspeshno":
                print("Треугольник -" + testTriangl + "\nПрямоугольный -" + rightTriangle);
                System.out.printf("Площадь треугольника равна %.2f кв.ед\n", square);
                break;
            case "nesootvetstvie":
                print("У треугольника не может быть сторон с такими значениями");
                break;
            default:
                print("\tхм... что то не так с программой... ");
        }
    }

Забудьте вы про то, что класс должен что то писать в консоль! Не его это задача. Соотв. что за глупая переменная otvet ? У нее от силы 4 значения, а ей аж строковая переменная отдана.
Класс как результат вычисления square должен отдавать либо результат вычисления площади, либо отрицательное число с ошибкой.
Анализ ошибки на стороне "пользователя" класса.
Если уж хотите что-нибудь писать, пишите в стандартный поток ошибок. А заодно узнайте, что это за звери - стандартный поток ввода, стандартный поток вывода, стандартный поток ошибок. Заодно прочитайте про волшебную вещь перенаправления потоков.

Анализ планарности треугольника происходит каждый раз при вычислении площади. Что ИМХО не есть правильно.
Выставление флагов планарности и прямоугольности ИМХО должно выставляться в процессе задания параметров треугольника. (Сеттеры и геттеры)

nomad____1 28-04-2015 19:18 2501934

Цитата:

Цитата lxa85
Забудьте вы про то, что класс должен что то писать в консоль! Не его это задача. Соотв. что за глупая переменная otvet ? У нее от силы 4 значения, а ей аж строковая переменная отдана.
Класс как результат вычисления square должен отдавать либо результат вычисления площади, либо отрицательное число с ошибкой.
Анализ ошибки на стороне "пользователя" класса.
Если уж хотите что-нибудь писать, пишите в стандартный поток ошибок. А заодно узнайте, что это за звери - стандартный поток ввода, стандартный поток вывода, стандартный поток ошибок. Заодно прочитайте про волшебную вещь перенаправления потоков.
Анализ планарности треугольника происходит каждый раз при вычислении площади. Что ИМХО не есть правильно.
Выставление флагов планарности и прямоугольности ИМХО должно выставляться в процессе задания параметров треугольника. (Сеттеры и геттеры)
»

Благодарю. Понял. Перепишу. Почему именно в консоль? Да потому что я только выучил в яве основы ООП. А точнее я учил ее три дня по пол часа когда выложил первый код. Я только еще на старте. До многопоточности еще далеко. С типом метода int, float, boolean и т.д. у меня немножко проблемы. До конца не могу понять. Так что когда разберусь перепишу и выложу. А тем временем поучу свинги что бы не в консольку вводить и выводить) У меня просто сумасшедший план. За месяц выучить ООП (уже почти полностью прошел и более менее разобрался), основы свингов, авт и ява FX, основы баз данных. Очень хочу чем поскорее устроится на стажировку (желательно оплачиваемую). Анриал? Я думаю ДА))))

Цитата:

Цитата lxa85
Анализ планарности треугольника происходит каждый раз при вычислении площади. Что ИМХО не есть правильно.
Выставление флагов планарности и прямоугольности ИМХО должно выставляться в процессе задания параметров треугольника. (Сеттеры и геттеры)
»

Просто я использовал Конструктов вместо сеттеров и геттеров для установки параметров.

Цитата:

Цитата lxa85
Двойная проверка условия testTriangle. »

Что то недоглядел

Цитата:

Цитата lxa85
Если уж хотите что-нибудь писать, пишите в стандартный поток ошибок. А заодно узнайте, что это за звери - стандартный поток ввода, стандартный поток вывода, стандартный поток ошибок. Заодно прочитайте про волшебную вещь перенаправления потоков. »

За это огромнейшее спасибо!!!. Обязательно прочту.

lxa85 28-04-2015 21:04 2501971

nomad____1, Конструктор - он конструирует. Он выполняется один раз при создании объекта. Объект создали, далее конструктор мы не дергаем.
А вот установку параметров (св-тв) объекта - это другая, более интересная и захватывающая история.
Св-ва (поля) планарности и "прямоугольности" объекта Triangle надо сделать закрытыми (private), чтобы я не мог влиять на них извне.

Ситуация.
Я ввожу треугольник (1, 1, 6). Процедура установки параметров отрабатывает ситуацию и сбрасывает флаг планарности.
Процедура вычисления площади, написанная как
if planarity {square = ...} else {...};
отдаст ошибку. При этом я пологая, что для вычисления площади я не буду каждый раз "рассчитывать" условия планарности.
Тогда я принудительно говорю объекту, что он планарен (triangle.planarity = true) и все, здравствуй не верная площадь.
Поэтому признаки должны быть скрытыми (private)
Модификация признаков - в процессе установки сторон треугольника. (Setter

User001 30-04-2015 10:20 2502495

Цитата:

Цитата nomad____1
До многопоточности еще далеко. »

lxa85 имел ввиду потоки ввода / вывода.
Цитата:

Цитата nomad____1
Triangl»

Букву жалко?
Цитата:

Цитата lxa85
case "minusovoe": »

Цитата:

Цитата lxa85
case "uspeshno": »

Использовать строки весьма расточительно. Смотрите в сторону enum.
Цитата:

Цитата lxa85
Соотв. что за глупая переменная otvet ? »

Дополню. Вот тут про JS, но суть одинаковая. Обратите внимание на правило №1.

nomad____1 30-04-2015 11:12 2502507

Читаю о потоках и ошибках. Такого в уроках не рассказывали :( Но спасибо что указали. Это весьма полезно. Теперь все что вы писали мне стает более менее ясно. сегодня возьмусь за переписку программы полностью.
Цитата:

Цитата User001
lxa85 имел ввиду потоки ввода / вывода. »

Я уже понял.
Цитата:

Цитата User001
Букву жалко? »

Нууу... :)
Цитата:

Цитата User001
Использовать строки весьма расточительно. Смотрите в сторону enum. »

Благодарю
Цитата:

Цитата User001
Дополню. Вот тут про JS, но суть одинаковая. Обратите внимание на правило №1. »

Весьма интересно и полезно. Благодарю!

nomad____1 30-04-2015 11:38 2502512

Читал вот о таком примере.
Скрытый текст

Код:

  Scanner scanner = new Scanner(System.in);
        int value = scanner.nextInt();
//выводим
        System.out.println(value);


Достаточно толково. Это как в с++ консолин и консолаут) Просто судя по урокам и некоторой литературе то они это упускали. Следовательно я понял что такой шняги как в с++ нету.
Что касается сеттеров. То проверку каждой стороны можно прописать на "валидность" еще в сеттере. Конструктор можно не использовать. Но планарность проверяется после введения "правильных" сторон. После проверки планарности еще проверить на прямоугольность. Потом вычислить площадь и вывод в консоль? Я правильно понял (разбил так сказать на объекты). Если нет то пожалуйста напишите что за чем, а я попробую это написать.

P.S. Хотя я кое что уже придумал. Я понял как это все грамотно сделать.))) СПС

Цитата:

Цитата lxa85
Класс как результат вычисления square должен отдавать либо результат вычисления площади, либо отрицательное число с ошибкой.
Анализ ошибки на стороне "пользователя" класса.
»


nomad____1 06-05-2015 19:51 2504539

Код переделал и представляю вашему вниманию. Прочитал о return-ах. На комментарии не скупился. О потоках ввода/вывода еще что то нашел, а вот об ошибках толком ничего. Если можете то скиньте ссылку/литературу
Main класс

Код:

package mathprogram;

public class MathProgram {

    public static void main(String[] arg) {
        Triangle triangle = new Triangle();
        triangle.inputSides();
        if (triangle.isSetSides() == true) {
            if (triangle.isPlanarity() == true) {
                if (triangle.isRightTriangle() == true) {
                    triangle.getRightTriangleSquare();
                } else {
                    triangle.getGeronSquare();
                }
            } else {
                System.out.println("Данная фигура не может быть треугольником");
            }
            if (triangle.isPlanarity() == true) {
                System.out.println("Площадь треугольника равна " + triangle.getSquare() + " кв.ед.");
            }
        } else {
            System.out.println("Введенные данные не могут быть сторонами какой либо геометрической фигуры");
        }
    }
}


класс с методами

Код:

package mathprogram;

import java.util.Arrays;
import java.util.Scanner;

public class Triangle {

    private float aSide;
    private float bSide;
    private float cSide;
    private boolean setSides;
    private boolean planarity;
    private boolean rightTriangle;
    private float square;

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * метод для ввода данных в консоль с клавиатуры
    */
//</editor-fold>
    public void inputSides() {
        Scanner input = new Scanner(System.in);
        System.out.println("Введите первую сторону");
        float sideA = input.nextFloat();
        System.out.println("Введите вторую сторону");
        float sideB = input.nextFloat();
        System.out.println("Введите первую сторону");
        float sideC = input.nextFloat();
        setSides(sideA, sideB, sideC);
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * сортировка массива и переназначение сторон для удобства. стороны А и В -
    * самые меньшие (катеты если треугольник прямоугольный), сторона С - самая
    * большая (гипотенуза если треугольник прямоугольный)
    */
//</editor-fold>
    private void sortSides() {
        float[] arraySides = {aSide, bSide, cSide};
        Arrays.sort(arraySides);
        aSide = arraySides[0];
        bSide = arraySides[1];
        cSide = arraySides[2];
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * метод проверяющий введенные значения
    *
    * @param sideA
    * @param sideB
    * @param sideC
    * @return
    */
//</editor-fold>
    public boolean setSides(float sideA, float sideB, float sideC) {
        setSides = false;
        if (sideA > 0 && sideB > 0 && sideC > 0) {
            aSide = sideA;
            bSide = sideB;
            cSide = sideC;
            setSides = true;
            planarity();
            sortSides();
        }
        return isSetSides();
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * метод проверяющий треугольник на планарность
    *
    * @return
    */
//</editor-fold>
    private boolean planarity() {
        planarity = false;
        if (aSide + bSide > cSide && bSide + cSide > aSide && aSide + cSide > bSide) {
            planarity = true;
            rightTriangle();
        }
        return isPlanarity();
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * метод проверяющий треугольник на прямоугольность
    *
    * @return
    */
//</editor-fold>
    private boolean rightTriangle() {
        rightTriangle = false;
        if (aSide * aSide + bSide * bSide == cSide * cSide) {
            rightTriangle = true;
        }
        return rightTriangle;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * метод вычисляющий площадь по теореме Герона
    *
    * @return
    */
//</editor-fold>
    private float geronSquare() {
        float perimeter = (aSide + bSide + cSide) / 2;
        square = (float) Math.sqrt(perimeter * ((perimeter - aSide) * (perimeter - bSide) * (perimeter - cSide)));
        return square;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * метод вычисляющий площадь по стандартной формулой для прямоугольного
    * треугольника
    *
    * @return
    */
//</editor-fold>
    private float rightTriangleSquare() {
        square = aSide * bSide / 2;
        return square;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * площадь вычисленная по теореме Герона
    *
    * @return
    */
//</editor-fold>
    public float getGeronSquare() {
        return geronSquare();
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * площадь вычисленная стандартной формулой для прямоугольного треугольника
    *
    * @return
    */
//</editor-fold>
    public float getRightTriangleSquare() {
        return rightTriangleSquare();
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return the setSides информация о том корректно ли были введены длины
    * сторон
    */
//</editor-fold>
    public boolean isSetSides() {
        return setSides;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return the planarity информация о планарности фигуры (можно ли ее
    * отнести к треугольникам с точки зрения классической планиметрии)
    */
//</editor-fold>
    public boolean isPlanarity() {
        return planarity;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return the rightTriangle информация является ли данный треугольник
    * прямоугольным
    */
//</editor-fold>
    public boolean isRightTriangle() {
        return rightTriangle;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return the square с помощью данной функции можно получить площадь
    * треугольника
    */
//</editor-fold>
    public float getSquare() {
        return square;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return the aSide с помощью данной функции можно получить значение стороны.
    * одна с самых маленьких сторон треугольника (предположительно один из
    * катетов если треугольник прямоугольный)
    */
//</editor-fold>
    public float getaSide() {
        return aSide;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return the bSide с помощью данной функции можно получить значение стороны.
    * одна с самых маленьких сторон треугольника (предположительно один из
    * катетов если треугольник прямоугольный)
    */
//</editor-fold>
    public float getbSide() {
        return bSide;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return
    * the cSide с помощью данной функции можно получить значение стороны.
    * самая большая сторона треугольника (предположительно гипотенуза если
    * треугольник прямоугольный)
    */
//</editor-fold>
    public float getcSide() {
        return cSide;
    }
}



Старался как мог. Реализовал интерфейс через который можно получить данные, но не изменить их. Так сказать обеспечил безопасность. Притом девушка подкинула идею. Усложнить можно если треугольник задается в 2Д плоскости координатами вершин и потом в 3д плоскости. Соответственно написать конструкторы и написать пару методов для нахождения длинны отрезков заданных координатами их концов а далее по написанному моему трафарету. Еще пару дней и это все упакую в красивую оболочку с кнопочками и полями. Но только если все написано правильно и нормально. Хочется довести все до ума. Заодно и набить руку.

lxa85 07-05-2015 01:09 2504632

nomad____1, ну ... блин, ну куда, ну с какого перепуга?
Ну не пхай ты в класс чего не попадя. Чаа.
Я пишу ситуацию, скорректирую задачу.
Затем, уж прости, порежу код.
----
Ситуация. Я кодер, сижу прожу. Случилось, что мне до зарезу понадобился треугольник.
Я пишу ландшафтный дизайн, создаю обучалку, игру, занимаюсь графикой и строю программную модель объекта на пару тысяч полигонов.
Цель.
Зачем?
Мне нужен класс треугольника, который отдает мне площадь, и чтобы не сильно врал в ответах.

Поехали.
Что за глупость
public void inputSides()
Код:

    public void inputSides() {
        Scanner input = new Scanner(System.in);
        System.out.println("Введите первую сторону");
        float sideA = input.nextFloat();
        System.out.println("Введите вторую сторону");
        float sideB = input.nextFloat();
        System.out.println("Введите первую сторону");
        float sideC = input.nextFloat();
        setSides(sideA, sideB, sideC);
    }


одна мысль
Все текстовые вопросы - вне класса. Табу! Класс, если он не "болтливый", должен быть как безвольная скотинка. "Муу" - строго по команде.
Одна процедура вопросы задает, потом стороны запоминает, потом еще и другую вызывает. (Создает еще один экземпляр кода возврата, копию данных в ОЗУ, передачу управления, всё по полной программе вызова процедур)
Что будет, если я захочу изменить треугольник? Мне надо вспоминать предыдущие стороны? Брр
Класс должен обрабатывать те данные, которые я ему скажу. Не спрашивать меня, не строить умного, а молча кушать данные. Молча. Кушать.
(почитал дальше)
Э. Весь этот код - в основную процедуру. Ctrl-C, Ctrl-V и его никто не видел.

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

Сортировка данных

Код:

    private void sortSides() {
        float[] arraySides = {aSide, bSide, cSide};
        Arrays.sort(arraySides);
        aSide = arraySides[0];
        bSide = arraySides[1];
        cSide = arraySides[2];
    }


А вот это а-яй-яй. Это геометрическое нарушение. За это по рукам. В общем случае треугольник ABC =! CBA. Нельзя треугольник читать как попало, даже если очень хочется.

Прямоугольный треугольник
Код:

    private boolean rightTriangle() {
        rightTriangle = false;
        if (aSide * aSide + bSide * bSide == cSide * cSide) {
            rightTriangle = true;
        }
        return rightTriangle;
    }


А зачем нам надо возвращать rightTriangle? Не устанавливать, а возвращать?
Или в Java куда не ткни, попадешь в процедуру с функцией?
Код:

public class Triangle {
    private float aSide;
    private float bSide;
    private float cSide;
    private boolean setSides;
    private boolean planarity;
    private boolean rightTriangle;
    private float square;

private float aSide; - это тоже процедура, возвращающая float ??! (ликбез для меня проведите пожалуйста)

Возвращаемые значения площади
Код:

    public float getRightTriangleSquare() {
        return rightTriangleSquare();
    }
    private float rightTriangleSquare() {
        square = aSide * bSide / 2;
        return square;
    }

Зачем мы вводили флаг прямоугольности, если я могу его проигнорировать?
Код:

        Triangle triangle = new Triangle();
        triangle.inputSides();

        System.out.println(triangle.getaSide());
        System.out.println(triangle.getbSide());
        System.out.println(triangle.getcSide());

        System.out.println(triangle.getSquare());
        System.out.println(triangle.getRightTriangleSquare());
        System.out.println(triangle.getGeronSquare());

Код:

run:
Введите первую сторону
7
Введите вторую сторону
6
Введите первую сторону
5
5.0
6.0
7.0
0.0
15.0
14.6969385
Площадь треугольника равна 14.6969385 кв.ед.

Почему возвращаемая площадь появляется только после явного указания метода вычисления? Разве у нее не должно быть "дефолтного"/правильного значения, вычисленного максимально правдоподобно?

Пока все, надо и другими делами заняться. Вспомню чего - напишу.

nomad____1 07-05-2015 01:58 2504634

Цитата:

Цитата lxa85
Я чуть позже картинок нарисую, может полегче станет, мне по крайней мере, должно, я верю. »

это будет вери гуд... Что же... колледж и универ сломали мозг набекрень...:shot: Не зря я решил забрать доки с универа. Хочу правильно кодить. Нашел документацию гугловскою по форматированию кода и написанию. Почитаю завтра.
Цитата:

Цитата lxa85
А зачем нам надо возвращать rightTriangle? Не устанавливать, а возвращать? »

Просто подумал может кому надо будет просто инфу прямоугольный он или нет. И метод возвращает значение переменной. Ей по умолчанию задается значение лож, а если проходит проверку то правда.
Цитата:

Цитата lxa85
Что за глупость
public void inputSides()
Код:
public void inputSides() {
Scanner input = new Scanner(System.in);
System.out.println("Введите первую сторону");
float sideA = input.nextFloat();
System.out.println("Введите вторую сторону");
float sideB = input.nextFloat();
System.out.println("Введите первую сторону");
float sideC = input.nextFloat();
setSides(sideA, sideB, sideC);
} »

я лоханулся с копипастом.
Цитата:

Цитата lxa85
Э. Весь этот код - в основную процедуру. Ctrl-C, Ctrl-V и его никто не видел. »

понял в мейн класс переместить... т.к. оно тут не нужно...
Цитата:

Цитата lxa85
А вот это а-яй-яй. Это геометрическое нарушение. За это по рукам. В общем случае треугольник ABC =! CBA. Нельзя треугольник читать как попало, даже если очень хочется. »

так то так... это было сделано ради удобности вычислений... знаю что неправильно...

очень жду рисунков... я пока как слепой котенок... мало знаю и мало ориентируюсь... зато пробую исправится

nomad____1 07-05-2015 02:16 2504636

Цитата:

Цитата lxa85
private float aSide; - это тоже процедура, возвращающая float ??! (ликбез для меня проведите пожалуйста) »

Так это "глобальная" переменная для класса. Она "приват" - доступна только для методов из данного класса. И тип даны которые она может мстить флоат. Изменить из вне не получится. Только получить значение из геттера. Или я неправильно понял и применил?

класс пользователя

Код:

package mathprogram;

import java.util.Scanner;

public class MathProgram {

    public static void main(String[] arg) {
        Triangle triangle = new Triangle();
//        triangle.inputSides();

      Scanner input = new Scanner(System.in);
        System.out.println("Введите первую сторону");
        float sideA = input.nextFloat();
        System.out.println("Введите вторую сторону");
        float sideB = input.nextFloat();
        System.out.println("Введите третью сторону");
        float sideC = input.nextFloat();
        triangle.setSides(sideA, sideB, sideC);


        if (triangle.isSetSides() == true) {
            if (triangle.isPlanarity() == true) {
                if (triangle.isRightTriangle() == true) {
                    triangle.getRightTriangleSquare();
                } else {
                    triangle.getGeronSquare();
                }
            } else {
                System.out.println("Данная фигура не может быть треугольником");
            }
            if (triangle.isPlanarity() == true) {
                System.out.println("Площадь треугольника равна " + triangle.getSquare() + " кв.ед.");
            }
        } else {
            System.out.println("Введенные данные не могут быть сторонами какой либо геометрической фигуры");
        }
    }
}


Оно неплохо тут вжилось)

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


Код:


private float rightTriangle;

 ...
какой то код
 ...

    private boolean rightTriangle() {
        rightTriangle = false;
        if (aSide * aSide + bSide * bSide == cSide * cSide) {
            rightTriangle = true;
        }
        return rightTriangle;
    }


Неудачный выбор названия переменной так как оно совпадает с названием метода. Только НО "rightTriangle;"-это переменная, а "rightTriangle();" - это метод. Сначала инициализируется переменная rightTriangle но она пустая так как изначально ей не присвоено никакого значения (хотя можно и было присвоить ложь). Потом в методе ей присваивается значение в зависимости пройдет условие или нет. А после булевский метод rightTriangle() возвращает значение. В даном случае он возвращает значение глобальной переменной.
Нужно было бы так написать.

Скрытый текст

Код:

private float rightTriangle;

 ...
какой то код
 ...

    private boolean testRightTriangle() {
        rightTriangle = false;
        if (aSide * aSide + bSide * bSide == cSide * cSide) {
            rightTriangle = true;
        }
        return rightTriangle;
    }


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

Код:

if (triangle.isSetSides() == true) {
            if (triangle.isPlanarity() == true) {
                if (triangle.isRightTriangle() == true) {
                    triangle.getRightTriangleSquare();
                } else {
                    triangle.getGeronSquare();




Если что то не так то прошу исправить.!!!
так как правильно и красиво кодить это не заучить правила и писать по ним как под трафарет, а научится правильно думать, уметь проводить анализ.

nomad____1 07-05-2015 14:07 2504742

Вот с утра не было дел. Шел дождь. Делать было нечего. Порция очередного "гавнокода" :(
мейн

Дописано Ваш тест.
Код:

package mathprogram;

import java.util.Scanner;

public class MathProgram {

    public static void main(String[] arg) {
        Triangle triangle = new Triangle();
//        triangle.inputSides();

        Scanner input = new Scanner(System.in);
        System.out.println("Введите первую сторону");
        float sideA = input.nextFloat();
        System.out.println("Введите вторую сторону");
        float sideB = input.nextFloat();
        System.out.println("Введите третью сторону");
        float sideC = input.nextFloat();
        triangle.setSides(sideA, sideB, sideC);

        System.out.println(triangle.getaSide());
        System.out.println(triangle.getbSide());
        System.out.println(triangle.getcSide());

        System.out.println(triangle.getSquare());
        System.out.println(triangle.getRightTriangleSquare());
        System.out.println(triangle.getGeronSquare());
        if (triangle.getSquare() <= 0) {
            System.out.println("введены некорректные данные");
        }
    }
}



методарий

Код:

package mathprogram;

import java.util.Arrays;

public class Triangle {

    private float aSide;
    private float bSide;
    private float cSide;
    private boolean setSides;
    private boolean planarity;
    private boolean rightTriangle;
    private float square;

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * метод проверяющий введенные значения
    *
    * @param sideA
    * @param sideB
    * @param sideC
    * @return
    */
//</editor-fold>
    public boolean setSides(float sideA, float sideB, float sideC) {
        setSides = false;
        if (sideA > 0 && sideB > 0 && sideC > 0) {
            aSide = sideA;
            bSide = sideB;
            cSide = sideC;
            setSides = true;
//            sortSides();
            planarity();
        }
        return setSides;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * метод проверяющий треугольник на планарность
    *
    * @return
    */
//</editor-fold>
    private boolean planarity() {
        planarity = false;
        if (aSide + bSide > cSide && bSide + cSide > aSide && aSide + cSide > bSide) {
            planarity = true;
            rightTriangle();
        }
        return planarity;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * метод проверяющий треугольник на прямоугольность
    *
    * @return
    */
//</editor-fold>
    private boolean rightTriangle() {
        rightTriangle = false;
        if (aSide * aSide + bSide * bSide == cSide * cSide || aSide * aSide + cSide * cSide == bSide * bSide || bSide * bSide + cSide * cSide == aSide * aSide) {
            rightTriangle = true;
        }
        square();
        return rightTriangle;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * метод вычисляющий площадь по теореме Герона
    *
    * @return
    */
//</editor-fold>
    private float geronSquare() {
        if (planarity == true) {
            float perimeter = (aSide + bSide + cSide) / 2;
            square = (float) Math.sqrt(perimeter * ((perimeter - aSide) * (perimeter - bSide) * (perimeter - cSide)));
        }
        return square;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * метод вычисляющий площадь по стандартной формулой для прямоугольного
    * треугольника
    *
    * @return
    */
//</editor-fold>
    private float rightTriangleSquare() {
        if (planarity == true && rightTriangle == true) {
            square = aSide * bSide / 2;
        }
        return square;
    }

    private float square() {
        if (planarity == true) {
            if (isRightTriangle() == true) {
                rightTriangleSquare();
            } else {
                geronSquare();
            }
        }
        return 0;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * площадь вычисленная по теореме Герона
    *
    * @return
    */
//</editor-fold>
    public float getGeronSquare() {
        return geronSquare();
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * площадь вычисленная стандартной формулой для прямоугольного треугольника
    *
    * @return
    */
//</editor-fold>
    public float getRightTriangleSquare() {
        return rightTriangleSquare();
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return the setSides информация о том корректно ли были введены длины
    * сторон
    */
//</editor-fold>
    public boolean isSetSides() {
        return setSides;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return the planarity информация о планарности фигуры (можно ли ее
    * отнести к треугольникам с точки зрения классической планиметрии)
    */
//</editor-fold>
    public boolean isPlanarity() {
        return planarity;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return the rightTriangle информация является ли данный треугольник
    * прямоугольным
    */
//</editor-fold>
    public boolean isRightTriangle() {
        return rightTriangle;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return the square с помощью данной функции можно получить площадь
    * треугольника
    */
//</editor-fold>
    public float getSquare() {
        square();
        return square;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return the aSide с помощью данной функции можно получить значение стороны.
    * одна с самых маленьких сторон треугольника (предположительно один из
    * катетов если треугольник прямоугольный)
    */
//</editor-fold>
    public float getaSide() {
        return aSide;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return the bSide с помощью данной функции можно получить значение стороны.
    * одна с самых маленьких сторон треугольника (предположительно один из
    * катетов если треугольник прямоугольный)
    */
//</editor-fold>
    public float getbSide() {
        return bSide;
    }

//<editor-fold defaultstate="collapsed" desc="описание метода">
    /**
    * @return the cSide с помощью данной функции можно получить значение стороны.
    * самая большая сторона треугольника (предположительно гипотенуза если
    * треугольник прямоугольный)
    */
//</editor-fold>
    public float getcSide() {
        return cSide;
    }
}



Теперь класс "сам" определяет лучший способ вычисления площади. В меру болтлив. Зря не "тявкает" в консоль.

Сортировка массива была сделана для того что бы не писать такую колбасу так как мне показалось это не совсем эстетичным.
Код:

rightTriangle = false;
        if (aSide * aSide + bSide * bSide == cSide * cSide || aSide * aSide + cSide * cSide == bSide * bSide || bSide * bSide + cSide * cSide == aSide * aSide) {
            rightTriangle = true;

Переделал признаю что на меня вне сошла лень. Больше так не буду.

Флаги сделал доступными для чтения для того что бы можно было получить инфу например о планарности треугольника только. Или прямоугольность. Не всегда же программа должна только площадь считать. Так сказать наращиваю функционал.

User001 07-05-2015 14:20 2504744

Цитата:

Цитата nomad____1
Просто подумал может кому надо будет просто инфу прямоугольный он или нет. И метод возвращает значение переменной. Ей по умолчанию задается значение лож, а если проходит проверку то правда. »

Про rightTriangle - а почему он где-то из planarity вызывается?
Цитата:

Цитата nomad____1
public boolean setSides(float sideA, float sideB, float sideC) »

Внутри вы устанавливаете флаг, потом вызываете публичный метод, который проверяет этот флаг и возвращаете результат этого публичного метода. Не кажется сложным?

И, вообще, решите чего вы хотите от класса и от этого уже начинайте.

nomad____1 07-05-2015 15:30 2504770

Цитата:

Цитата User001
Просто подумал может кому надо будет просто инфу прямоугольный он или нет. И метод возвращает значение переменной. Ей по умолчанию задается значение лож, а если проходит проверку то правда. »
Про rightTriangle - а почему он где-то из planarity вызывается? »

Проходит проверка на планарность, а потом вызывается метод по котором проверяется фигура на прямоугольность. Можно написать просто методы. Но все равно их вызвать надо будет в методе square() что бы метод сам подтянул что ему нужно для вычисления. Хм... так красивее было бы. Так и сделаю...

Цитата:

Цитата User001
Внутри вы устанавливаете флаг, потом вызываете публичный метод, который проверяет этот флаг и возвращаете результат этого публичного метода. Не кажется сложным? »

метод не публичный, а закрытый и доступный только методам данного класса. Мне кажется не сложно. Проверка введенных значений, если проходит то вызывается метод который проверяет фигуру на планарность. Иначе стороны неправильно введены и программа дальше работать не будет. Я думал так правильно будет.

User001 08-05-2015 07:37 2504996

Цитата:

Цитата nomad____1
метод не публичный, а закрытый и доступный только методам данного класса. »

Цитата:

Цитата nomad____1
public boolean setSides(float sideA, float sideB, float sideC) {...
return isSetSides();} »

Цитата:

Цитата nomad____1
public boolean isSetSides() »

Написано public.
Цитата:

Цитата nomad____1
Проходит проверка на планарность, а потом вызывается метод по котором проверяется фигура на прямоугольность. »

Мне не совсем очевидно, что метод проверки на планарность делает что-то кроме проверки на планарность (дергает методы, которые еще и меняют состояние класса).

nomad____1 08-05-2015 14:12 2505138

Цитата:

Цитата User001
Написано public. »

Это сеттеры они должны быть публичными. Иначе они не будут доступными с других классов.
Цитата:

Цитата nomad____1
Код:

if (aSide + bSide > cSide && bSide + cSide > aSide && aSide + cSide > bSide) {
 planarity = true;

»

Это проверка на планарность и установка флага планарности (флаг нужен если например мы просто хотим получить инфу о планарности), а вызывает другой метод для того что бы обеспечить то что зовется "самостоятельность". Притом я же сказал
Цитата:

Цитата nomad____1
Проходит проверка на планарность, а потом вызывается метод по котором проверяется фигура на прямоугольность. Можно написать просто методы. Но все равно их вызвать надо будет в методе square() что бы метод сам подтянул что ему нужно для вычисления. Хм... так красивее было бы. Так и сделаю... »

Будет правильнее сделать как я писал. Наверно так будет целесообразно. Есть методы которые что то проверяют, считают независимо. Но что бы оно обрело смысл то поместью вызов методов в метод square. Так просто при вызове данного метода будет выводится площадь сразу. Вся логика метода данного закрыта и недоступна для изменения. Мы сможем только вызвать данный метод на выполнение через публичный геттер или какое то промежуточное значение (так же через геттер (планарность, прямоугольность и т.д.)) но при этом не можем изменить значение для правильной логики и вычислений.

Цитата:

Цитата lxa85
Зачем мы вводили флаг прямоугольности, если я могу его проигнорировать?
Код:
Код:

Triangle triangle = new Triangle();
 triangle.inputSides();
System.out.println(triangle.getaSide());
 System.out.println(triangle.getbSide());
 System.out.println(triangle.getcSide());
System.out.println(triangle.getSquare());
 System.out.println(triangle.getRightTriangleSquare());
 System.out.println(triangle.getGeronSquare());

»

Вот например. Проигнорировать больше не получится. Будет выполнятся принудительно и последовательно. Я же кажется писал что перепишу. Сейчас времени нет. В течении 2-3 часов выложу. И еще кое что.
Цитата:

Цитата nomad____1
Простите. Я не хотел обидеть. Без злости и задней мысли все пишу. Я просто так раскрываю свою точку зрения. Еще раз прошу прощения если показался дерзким или где то хамил. »


nomad____1 08-05-2015 23:06 2505329

Тогда как такой код???
мейн

Код:

package mathprogram;

import java.util.Scanner;

public class MathProgram {

    public static void main(String[] arg) {
        Triangle triangle = new Triangle();
//        triangle.inputSides();

        Scanner input = new Scanner(System.in);
        System.out.println("Введите первую сторону");
        float sideA = input.nextFloat();
        System.out.println("Введите вторую сторону");
        float sideB = input.nextFloat();
        System.out.println("Введите третью сторону");
        float sideC = input.nextFloat();
        triangle.setSides(sideA, sideB, sideC);
        triangle.getSquare();
        if (triangle.getSquare() <= 0) {
            System.out.println("Введены некорректные данные");
        }else{
            System.out.println("Площадь треугольника равна "+triangle.getSquare()+" кв.ед.");
        }
    }
}

методарий
Код:

package mathprogram;

public class Triangle {

    private float aSide;
    private float bSide;
    private float cSide;
    private boolean setSides;
    private boolean planarity;
    private boolean rightTriangle;
    private float square;

    public boolean setSides(float sideA, float sideB, float sideC) {
        setSides = false;
        if (sideA > 0 && sideB > 0 && sideC > 0) {
            aSide = sideA;
            bSide = sideB;
            cSide = sideC;
            setSides = true;
        }
        return setSides;
    }

    private boolean planarity() {
        planarity = false;
        if (aSide + bSide > cSide && bSide + cSide > aSide && aSide + cSide > bSide) {
            planarity = true;
        }
        return planarity;
    }

    private boolean rightTriangle() {
        rightTriangle = false;
        if (aSide * aSide + bSide * bSide == cSide * cSide || aSide * aSide + cSide * cSide == bSide * bSide || bSide * bSide + cSide * cSide == aSide * aSide) {
            rightTriangle = true;
        }

        return rightTriangle;
    }

    private float geronSquare() {
        if (planarity == true) {
            float perimeter = (aSide + bSide + cSide) / 2;
            square = (float) Math.sqrt(perimeter * ((perimeter - aSide) * (perimeter - bSide) * (perimeter - cSide)));
        }
        return square;
    }

    private float rightTriangleSquare() {
        if (planarity == true && rightTriangle == true) {
            square = aSide * bSide / 2;
        }
        return square;
    }

    private float square() {
        if (planarity == true) {
            if (rightTriangle == true) {
                rightTriangleSquare();
            } else {
                geronSquare();
            }
        }
        return 0;
    }

    public float getGeronSquare() {
        planarity();
        geronSquare();
        return square;
    }

    public float getRightTriangleSquare() {
        planarity();
        rightTriangleSquare();
        return square;
    }

    public boolean isPlanarity() {
        return planarity;
    }

    public boolean isRightTriangle() {
        return rightTriangle;
    }

    public float getSquare() {
        planarity();
        rightTriangle();
        square();
        return square;
    }

    public float getaSide() {
        return aSide;
    }

    public float getbSide() {
        return bSide;
    }

    public float getcSide() {
        return cSide;
    }
}


Все защищено. Лишнего ничего нет. Тявкает то что ему сказано. Может и не тявкать если надо. Это уже мы выбираем. Стороны вводятся через сеттеры. Внутренние методы работают только то что надо, а именно считают и не вызываю других методов. Можно получить любые интересующие данные благодаря геттерам. Принудительно что то в логике изменить нельзя. Также класс сам считает более подходящим способом.

lxa85 09-05-2015 00:28 2505336

nomad____1, хочешь иголку воткну?
Ну так, чтобы не скучно было? :)
В код не подглядывай, а утром поищи ошибку самостоятельно.
Если не найдешь - смотри тест. Но лучше сам.
Тест
Не, не, не! Не надо!
Да я ж под пару тройку спойлеров то точно спрячу ;)
Я предупреждал!
Код:

        float sideA = 5; float sideB = 4; float sideC = 3;
        triangle.setSides(sideA, sideB, sideC);
        triangle.getSquare();
        System.out.println("Площадь треугольника равна "+triangle.getSquare()+" кв.ед.");
       
        sideA = 3; sideB = 4; sideC = 5;
        triangle.setSides(sideA, sideB, sideC);
        triangle.getSquare();
        System.out.println("Площадь треугольника равна "+triangle.getSquare()+" кв.ед.");


nomad____1 09-05-2015 00:50 2505340

ок... на честность... поищу... утром... пффф))) я ложусь в 4 часа ночи))) по пару раз на день захожу сюда... так что до утра попробую найти, а нет то посмотрю текст

может этот кусок переписать
Код:

    public float getRightTriangleSquare() {
        planarity();
        rightTriangleSquare();
        return square;

на такой
Код:

    public float getRightTriangleSquare() {
        planarity();
        rightTriangle();
        if (rightTriangle == true) {
            rightTriangleSquare();
        } else {
            square = 0;
        }
        return square;
    }

а то как то совсем не фонтан.
и еще парочку...
Скрытый текст

было
Код:

    private float square() {
        if (planarity == true) {
            if (rightTriangle == true) {
                rightTriangleSquare();
            } else {
                geronSquare();
            }
        }
        return 0;
    }

стало
Код:

    private float square() {
        if (planarity == true) {
            if (rightTriangle == true) {
                rightTriangleSquare();
            } else {
                geronSquare();
            }
        }else{
            square=0;
        }
        return square;
    }


Скрытый текст

было
Код:

    public float getRightTriangleSquare() {
        planarity();
        rightTriangleSquare();
        return square;
    }

стало
Код:

    public float getRightTriangleSquare() {
        planarity();
        rightTriangle();
        if (rightTriangle == true&&planarity==true) {
            rightTriangleSquare();
        } else {
            square = 0;
        }
        return square;
    }


Скрытый текст

было
Код:

    public float getRightTriangleSquare() {
        planarity();
        rightTriangleSquare();
        return square;
    }

стало
Код:

    public boolean isRightTriangle() {
        planarity();
        if (planarity==true){
            rightTriangle();
        }else{
            rightTriangle=false;
        }
        return rightTriangle;
    }


nomad____1 09-05-2015 01:33 2505346

Цитата:

Цитата lxa85
nomad____1, хочешь иголку воткну?
Ну так, чтобы не скучно было?
В код не подглядывай, а утром поищи ошибку самостоятельно.
Если не найдешь - смотри тест. Но лучше сам.
Тест
Не, не, не! Не надо!
Да я ж под пару тройку спойлеров то точно спрячу ;)
Я предупреждал!
Код:
Код:

float sideA = 5; float sideB = 4; float sideC = 3;
 triangle.setSides(sideA, sideB, sideC);
 triangle.getSquare();
 System.out.println("Площадь треугольника равна "+triangle.getSquare()+" кв.ед.");
sideA = 3; sideB = 4; sideC = 5;
 triangle.setSides(sideA, sideB, sideC);
 triangle.getSquare();
 System.out.println("Площадь треугольника равна "+triangle.getSquare()+" кв.ед."); »



Ахах)))) даже и не подумал) сортировку массива и пере присвоение убрал, а тут такой фейл оставил)))
Четко) :laugh: :laugh: :laugh: :lol: :biggrin: :up
Я хотел написать метод нахождение минимума и максимума и с его помощью считать. Но как то вылетело. И пожалуйста скиньте рисунки которые обещали... Или будет массив и будет сортировка но только! в даном методе исключительно ради точности вычислений.

Зато сам еще потестил и нашел пару багов)))

P.S.
Утром перепишу)

nomad____1 09-05-2015 20:18 2505566

С днем Великой победы товарищи!!!! :Beer:

Для исправление данной "иголки" использовал массив и сортировку. Но только в данном методе. На остальные данные не влияет и на логику программы в целом.
Код:

    private float rightTriangleSquare() {
        float [] arr={aSide, bSide, cSide};
        Arrays.sort(arr);
        if (planarity == true && rightTriangle == true) {
            square = arr[0] * arr[1] / 2;
        }
        return square;
    }

А вот переписанное!
мейн

Код:

package mathprogram;

import java.util.Scanner;

public class MathProgram {

    public static void main(String[] arg) {
        Triangle triangle = new Triangle();
        Scanner input = new Scanner(System.in);
        System.out.println("Введите первую сторону");
        float sideA = input.nextFloat();
        System.out.println("Введите вторую сторону");
        float sideB = input.nextFloat();
        System.out.println("Введите третью сторону");
        float sideC = input.nextFloat();
        triangle.setSides(sideA, sideB, sideC);
        if (triangle.getSquare() <= 0) {
            System.out.println("Введены некорректные данные");
        } else {
            System.out.println("Площадь треугольника равна " + triangle.getSquare() + " кв.ед.");
        }
    }
}

методарий
Код:

package mathprogram;

import java.util.Arrays;

public class Triangle {

    private float aSide;
    private float bSide;
    private float cSide;
    private boolean setSides;
    private boolean planarity;
    private boolean rightTriangle;
    private float square;

    public boolean setSides(float sideA, float sideB, float sideC) {
        setSides = false;
        if (sideA > 0 && sideB > 0 && sideC > 0) {
            aSide = sideA;
            bSide = sideB;
            cSide = sideC;
            setSides = true;
        }
        return setSides;
    }

    private boolean planarity() {
        planarity = false;
        if (aSide + bSide > cSide && bSide + cSide > aSide && aSide + cSide > bSide) {
            planarity = true;
        }
        return planarity;
    }

    private boolean rightTriangle() {
        rightTriangle = false;
        if (aSide * aSide + bSide * bSide == cSide * cSide || aSide * aSide + cSide * cSide == bSide * bSide || bSide * bSide + cSide * cSide == aSide * aSide) {
            rightTriangle = true;
        }
        return rightTriangle;
    }

    private float geronSquare() {
        if (planarity == true) {
            float perimeter = (aSide + bSide + cSide) / 2;
            square = (float) Math.sqrt(perimeter * ((perimeter - aSide) * (perimeter - bSide) * (perimeter - cSide)));
        }
        return square;
    }

    private float rightTriangleSquare() {
        float [] arr={aSide, bSide, cSide};
        Arrays.sort(arr);
        if (planarity == true && rightTriangle == true) {
            square = arr[0] * arr[1] / 2;
        }
        return square;
    }

    private float square() {
        if (planarity == true) {
            if (rightTriangle == true) {
                rightTriangleSquare();
            } else {
                geronSquare();
            }
        } else {
            square = 0;
        }
        return square;
    }

    public float getGeronSquare() {
        planarity();
        geronSquare();
        return square;
    }

    public float getRightTriangleSquare() {
        planarity();
        rightTriangle();
        if (rightTriangle == true && planarity == true) {
            rightTriangleSquare();
        } else {
            square = 0;
        }
        return square;
    }

    public boolean isPlanarity() {
        return planarity;
    }

    public boolean isRightTriangle() {
        planarity();
        if (planarity == true) {
            rightTriangle();
        } else {
            rightTriangle = false;
        }
        return rightTriangle;
    }

    public float getSquare() {
        planarity();
        rightTriangle();
        square();
        return square;
    }

    public float getaSide() {
        return aSide;
    }

    public float getbSide() {
        return bSide;
    }

    public float getcSide() {
        return cSide;
    }
}


lxa85 09-05-2015 22:41 2505630

nomad____1, хорошо, только маленькая поправка.
Код:

    private float rightTriangleSquare() {
        if (planarity == true && rightTriangle == true) {
                    float [] arr={aSide, bSide, cSide};
                    Arrays.sort(arr);
            square = arr[0] * arr[1] / 2;
        }
        return square;
    }

Если треугольник непланарный и неправильный, то лишние действия нам не нужны.
P.S. На счет картинок. Почти все ошибки исправлены, поэтому они тебе здесь уже не нужны. Там уже ничего примечательного.

nomad____1 10-05-2015 00:18 2505657

Цитата:

Цитата lxa85
Если треугольник не планарный и не правильный, то лишние действия нам не нужны. »

:yes:
Ок благодарю) Вашу поправку внесу в класс. Уже упаковал с помощью javaFX в оболочку. Теперь еще поднаростить функционал)))
Цитата:

Цитата lxa85
Почти все ошибки исправлены »

А что не так еще осталось. Это уже ради интереса.

P.S.
Завтра допишу функционал еще... Как говорил
Цитата:

Цитата nomad____1
девушка подкинула идею. Усложнить можно если треугольник задается в 2Д плоскости координатами вершин и потом в 3д плоскости. Соответственно написать конструкторы и написать пару методов для нахождения длинны отрезков заданных координатами их концов а далее по написанному моему трафарету. »


nomad____1 17-05-2015 21:19 2508476

что можете посоветовать учить после завершения ООП. JavaFX немного понял принципы. Можно ли приступать к изучению JDBC, мавен, ант т в какой последовательности.

lxa85 18-05-2015 15:03 2508696

nomad____1, мысль вслух.
Лучший учитель - это натура.
Учиться согласно поставленных целей.
Задачками мир наполнен более чем.

User001 20-05-2015 14:18 2509410

Цитата:

Цитата nomad____1
что можете посоветовать учить после завершения ООП. »

Если вы считаете, что у вас достаточный уровень - смотрите доступные вам вакансии, берите тестовые задания, собеседуйтесь. Если еще не готовы - ищите задачи (фриланс, open source и т.д.), пытайтесь решить. Дальше уже и станет понятно. Может, вас сразу возьмут и поставят задачи.

nomad____1 22-05-2015 23:31 2510437

Цитата:

Цитата User001
Если вы считаете, что у вас достаточный уровень - смотрите доступные вам вакансии, берите тестовые задания, собеседуйтесь. Если еще не готовы - ищите задачи (фриланс, open source и т.д.), пытайтесь решить. Дальше уже и станет понятно. Может, вас сразу возьмут и поставят задачи. »

Спасибо... Так и делаю. А насчет ООП то я имел ввиду основы. За эти дни я мельком почитал Шилдта, а так же выучил многопоточность, исключения, ООД и собственно стандартные потоки IO... Теперь вижу что данная программа кривая просто нет слов... Так же начал учить XML. Притом на роботу сразу тупо. Понимаю что не возьмут. Я пока на практику/стажировку/интернатуру... Есть несколько фирм в соседнем городе которые такое практикуют.


Время: 01:54.

Время: 01:54.
© OSzone.net 2001-