PDA

Показать полную графическую версию : правильность написания кода


Страниц : 1 [2] 3

nomad____1
30-04-2015, 11:12
Читаю о потоках и ошибках. Такого в уроках не рассказывали :( Но спасибо что указали. Это весьма полезно. Теперь все что вы писали мне стает более менее ясно. сегодня возьмусь за переписку программы полностью.
lxa85 имел ввиду потоки ввода / вывода. »
Я уже понял.
Букву жалко? »
Нууу... :)
Использовать строки весьма расточительно. Смотрите в сторону enum. »
Благодарю
Дополню. Вот тут про JS, но суть одинаковая. Обратите внимание на правило №1. »
Весьма интересно и полезно. Благодарю!

nomad____1
30-04-2015, 11:38
Читал вот о таком примере.


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


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

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

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

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


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

Поехали.
Что за глупость
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
Я чуть позже картинок нарисую, может полегче станет, мне по крайней мере, должно, я верю. »
это будет вери гуд... Что же... колледж и универ сломали мозг набекрень...:shot: Не зря я решил забрать доки с универа. Хочу правильно кодить. Нашел документацию гугловскою по форматированию кода и написанию. Почитаю завтра. А зачем нам надо возвращать rightTriangle? Не устанавливать, а возвращать? »
Просто подумал может кому надо будет просто инфу прямоугольный он или нет. И метод возвращает значение переменной. Ей по умолчанию задается значение лож, а если проходит проверку то правда.Что за глупость
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 и его никто не видел. »
понял в мейн класс переместить... т.к. оно тут не нужно...
А вот это а-яй-яй. Это геометрическое нарушение. За это по рукам. В общем случае треугольник ABC =! CBA. Нельзя треугольник читать как попало, даже если очень хочется. »
так то так... это было сделано ради удобности вычислений... знаю что неправильно...

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

nomad____1
07-05-2015, 02:16
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
Вот с утра не было дел. Шел дождь. Делать было нечего. Порция очередного "гавнокода" :(

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

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
Просто подумал может кому надо будет просто инфу прямоугольный он или нет. И метод возвращает значение переменной. Ей по умолчанию задается значение лож, а если проходит проверку то правда. »Про rightTriangle - а почему он где-то из planarity вызывается?
public boolean setSides(float sideA, float sideB, float sideC) »Внутри вы устанавливаете флаг, потом вызываете публичный метод, который проверяет этот флаг и возвращаете результат этого публичного метода. Не кажется сложным?

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

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

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

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

User001
08-05-2015, 07:37
метод не публичный, а закрытый и доступный только методам данного класса. »
public boolean setSides(float sideA, float sideB, float sideC) {...
return isSetSides();} »
public boolean isSetSides() »
Написано public.
Проходит проверка на планарность, а потом вызывается метод по котором проверяется фигура на прямоугольность. »Мне не совсем очевидно, что метод проверки на планарность делает что-то кроме проверки на планарность (дергает методы, которые еще и меняют состояние класса).

nomad____1
08-05-2015, 14:12
Написано public. »
Это сеттеры они должны быть публичными. Иначе они не будут доступными с других классов.
if (aSide + bSide > cSide && bSide + cSide > aSide && aSide + cSide > bSide) {
planarity = true; »
Это проверка на планарность и установка флага планарности (флаг нужен если например мы просто хотим получить инфу о планарности), а вызывает другой метод для того что бы обеспечить то что зовется "самостоятельность". Притом я же сказал
Проходит проверка на планарность, а потом вызывается метод по котором проверяется фигура на прямоугольность. Можно написать просто методы. Но все равно их вызвать надо будет в методе square() что бы метод сам подтянул что ему нужно для вычисления. Хм... так красивее было бы. Так и сделаю... »
Будет правильнее сделать как я писал. Наверно так будет целесообразно. Есть методы которые что то проверяют, считают независимо. Но что бы оно обрело смысл то поместью вызов методов в метод 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()); »
Вот например. Проигнорировать больше не получится. Будет выполнятся принудительно и последовательно. Я же кажется писал что перепишу. Сейчас времени нет. В течении 2-3 часов выложу. И еще кое что.
Простите. Я не хотел обидеть. Без злости и задней мысли все пишу. Я просто так раскрываю свою точку зрения. Еще раз прошу прощения если показался дерзким или где то хамил. »

nomad____1
08-05-2015, 23:06
Тогда как такой код???


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
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
ок... на честность... поищу... утром... пффф))) я ложусь в 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
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
С днем Великой победы товарищи!!!! :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
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
Если треугольник не планарный и не правильный, то лишние действия нам не нужны. » :yes:
Ок благодарю) Вашу поправку внесу в класс. Уже упаковал с помощью javaFX в оболочку. Теперь еще поднаростить функционал)))
Почти все ошибки исправлены »
А что не так еще осталось. Это уже ради интереса.

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

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

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




© OSzone.net 2001-2012