Как решить домашнюю программу, которая читает треугольник с трех сторон и вычисляет площадь, если введенные данные верны? (2)

1

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

Вот задача снова:

Создайте класс с именем MyTriangle, который содержит следующие два метода:

/** Return true if the sum of any two sides is * greater than the third side. */
public static boolean isValid (double side1, double side2, double side3)

/** Return the area of the triangle. */ 
public static double area (double side1, double side2, double side3)

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

Попытка ниже: Вопрос: Я не могу понять этого, и постоянное перечитывание главы не пробивает стены. Вопрос прокомментирован в коде ниже:

import java.util.Scanner;

public class NewClass1 {   

double area;
double side1, side2, side3;
double x1, x2, x3, y1, y2, y3;

public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.print("Enter two integers for side 1:");
        double x1 = input.nextDouble();
        double y1 = input.nextDouble();

        System.out.print("Enter two integers for side 2:");
        double x2 = input.nextDouble();
        double y2 = input.nextDouble();

        System.out.print("Enter two integers for side 3:");
        double x3 = input.nextDouble();
        double y3 = input.nextDouble();

        boolean isValid = true;

            if (isValid) {
                System.out.println("Input is invalid");
            }
                else
                    area(side1, side2, side3); //Using area does not work and I don't know how to remedy this. I've read the chapter over and over... I cannot get it to work.

    }

    public static double area(double side1, double side2, double side3) {
        double x1 = 0;
        double x2 = 0;
        double y1 = 0;
        double y2 = 0;
        double x3 = 0;
        double y3 = 0; 

            side1 = Math.pow(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2), 0.5);
            side2 = Math.pow(Math.pow(x3 - x1, 2) + Math.pow(y3 - y1, 2), 0.5);
            side3 = Math.pow(Math.pow(x3 - x2, 2) + Math.pow(y3 - y2, 2), 0.5);

            //Calculates the sides/angles using Heron formula
            double s = (side1 + side2 + side3)/2;
            double area = Math.pow(s * (s - side1) * (s - side2) * (s - side3), 0.5);

            return (area);
    } 

    public static boolean isValid(double side1, double side2, double side3) {

        return (((side1 + side2) > side3) && ((side1 + side3) > side2) && ((side2 + side3) > side1));
    }
}

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

Пересмотренный код

import java.util.Scanner;

public class NewClass1 {   

    public static void main(String[] args) {

            Scanner input = new Scanner(System.in);

            System.out.print("Enter side 1: ");
            double side1 = input.nextDouble();

            System.out.print("Enter side 2: ");
            double side2 = input.nextDouble();

            System.out.print("Enter side 3: ");
            double side3 = input.nextDouble();

            double a = area(side1, side2, side3);
            boolean isV = isValid(side1, side2, side3);

                    if (isV)
                        System.out.println("Inout is Invalid");
                    else
                        System.out.println("Area is: " + a);
        }

    public static boolean isValid(double side1, double side2, double side3) {

         return (((side1 + side2) > side3) && ((side1 + side3) > side2) && ((side2 + side3) > side1));
    }

    public static double area(double side1, double side2, double side3) {

                //Calculates the sides/angles using Heron formula
        double s = (side1 + side2 + side3)/2;
        double theArea = Math.pow(s * (s - side1) * (s - side2) * (s - side3), 0.5);

            return (theArea);
    } 
}

Я продолжаю получать NaN в качестве ответа для этого района. Что я делаю не так?

Я занимаюсь этим более 7 часов просто потому, что не понимаю возможных проблем. У меня 2 месяца на этом курсе CompSci.

  • 1
    NaN потому что (s * (s - side1) * (s - side2) * (s - side3) является отрицательным (когда Java пытается получить квадратный корень из отрицательных значений, она выбрасывает NaN).
  • 1
    Ваш исправленный код работает для меня, за исключением одного: if (isV) должно быть if (!isV) . Какие цифры вы вводите?
Показать ещё 10 комментариев
Теги:
netbeans

3 ответа

2
Лучший ответ

Ваш метод isValid возвращает true, если треугольник действителен, но вы принимаете противоположное:

double a = area(side1, side2, side3);
boolean isV = isValid(side1, side2, side3);
if (isV)
    System.out.println("Inout is Invalid");

Это также поддерживается вашими входными данными (в комментарии) сторон 11.1, 22.2 и 33.3. Это не треугольник, это серия перекрывающихся отрезков.

Если вы 3/4/5 совершенно правильный треугольник 3/4/5, вы получите сообщение об ошибке, указывающее, что это не треугольник.

Таким образом, просто изменить код, чтобы быть что - то вроде (там нет точки вызова area на недостоверных данных):

if (! isValid(side1, side2, side3))
    System.out.println("Inout is Invalid");
else
    System.out.println("Area is " + area(side1, side2, side3));

Внесение изменений:

package test2;
import java.util.Scanner;

public class test2 {   
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter three sides, separated by spaces: ");
        double s1 = input.nextDouble();
        double s2 = input.nextDouble();
        double s3 = input.nextDouble();
        if (isValid(s1, s2, s3))
            System.out.println("Area is: " + area(s1, s2, s3));
        else
            System.out.println("Input is Invalid");
    }

    public static boolean isValid(double s1, double s2, double s3) {
         return ((s1 + s2 > s3) && (s1 + s3 > s2) && (s2 + s3 > s1));
    }

    public static double area(double s1, double s2, double s3) {
        double s = (s1 + s2 + s3) / 2;
        double theArea = Math.pow(s * (s - s1) * (s - s2) * (s - s3), 0.5);
        return theArea;
    } 
}

и вводя правильный треугольник, например 3/4/5 или 5/5/8 вы получите правильные результаты:

Enter three sides, separated by spaces: 3 4 5
Area is: 6.0

Enter three sides, separated by spaces: 5 5 8
Area is: 12.0
  • 0
    ! означает «не равно», да? Я пытаюсь решить это в моей голове. Если бы это не было равно, не вычислили if бы площадь и else сообщили бы об ошибке?
  • 0
    Неважно. Я полностью игнорирую уравнение, когда задаю вопрос. Спасибо за просмотр моего кода !!!!!!
1

Используйте это.. Формула Heron

Изображение 174551

Изображение 174551

double sidesSvalue = (a + b + c)/2.0d;
double productofSides = (sidesSvalue  * (sidesSvalue -a) * (sidesSvalue -b) * (sidesSvalue -c));
double Area= Math.sqrt(productofSides );
return Area;

когда ваши значения недействительны, они попадают в область, пожалуйста, исправьте свой условный код, вы должны использовать что-то вроде этого

if(!isValid)
   print error message
else 
   calculate area

одна вещь всегда пытается использовать один и тот же примитивный тип при использовании DMAS-операций.

  • 0
    ! isValid я теперь понимаю. Операции DMAS? Не думайте, что я достаточно далеко в этой главе, чтобы понять, кто они. Сожалею.
  • 0
    Dmas (деление, умножение, сложение, вычитание). :)
Показать ещё 1 комментарий
1

if (isV) должно быть, if (!isV). Если условие неверно, вы выполняете формулу Херона с потенциально опасным входом, что может привести к отрицательному результату s * (s - side1) * (s - side2) * (s - side3). Взятие квадратного корня из отрицательного числа не определено с помощью примитивных типов Java.

  • 0
    Спасибо за ваш вклад. с благодарностью

Ещё вопросы

Сообщество Overcoder
Наверх
Меню