Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Дмитрий99667
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 37
#1

Функция вычисления длины отрезка

09.10.2017, 14:10. Просмотров 657. Ответов 19
Метки нет (Все метки)

Доброго времени суток , помогите пожалуйста отладить программу , вот условие и мой код:

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

Входные данные
На вход программе подается 6 целых чисел — координаты вершин треугольника. Все числа по модулю не превосходят 30000.

Выходные данные
Выведите значение периметра этого треугольника ровно с 10-ю знаками после десятичной точки

ПРОБЛЕМА: При тестировании проги большинство тестов проходит корректно , но на некоторых выводит результат NAN некорректной операции , ниже пишу пример входной строки при которой происходит баг
Test Ожидалось Получилось
-15809 20304 18912 -10503 10020 22779 106814.5554724964 NaN


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.Scanner;
 
public class Program1 {
    static Scanner in= new Scanner(System.in);
    public static void main(String[] args) {
        int 
        x1 = in.nextInt(),
        y1 = in.nextInt(),
        x2 = in.nextInt(),
        y2 = in.nextInt(),
        x3 = in.nextInt(),
        y3 = in.nextInt();
       
      
       System.out.printf("%.10f", (len(x1,y1,x2,y2)+len(x1,y1,x3,y3)+len(x2,y2,x3,y3)));
    }
    public static double len(int x, int y, int xk, int yk)
   {
       return(Math.sqrt((x-xk)*(x-xk)+(y-yk)*(y-yk)));
 
   }
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2017, 14:10
Ответы с готовыми решениями:

Массив: Нахождение длины максимального отрезка
Задача: Вот что накалякал, но сам понимаю, что какая то хрень. Помогите...

Class A { хранит координаты радиуса-вектора (х,у) и имеет метод для вычисления длины вектора
class A { хранит координаты радиуса-вектора (х,у) и имеет метод для вычисления...

Рекурсивная функция для вычисления суммы платежа кредита за месяц
package alg; public class func { public static double plateg(int n) {...

Функция вычисления длины отрезка
Здравствуйте. Помогите пожалуйста, с клавиатуры вводятся координаты вершин...

Функция для вычисления длины отрезка
Задание, составить и протестировать функцию для вычисления длины отрезка,...

19
ArtemFM
238 / 221 / 163
Регистрация: 10.09.2015
Сообщений: 834
09.10.2017, 14:40 #2
Я когда-то делал подобное задание. Но у меня там нет метода main и во вторых состоит из 2-х классов. Но, думаю, не составит труда взять нужные методы и в один класс с main запихнуть всё, если нужно

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Point {
   
    private double x;
    private double y;
 
    public double getX() {
        return x;
    }
 
    public double getY() {
        return y;
    }
 
    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }
 
    public double distanceTo(Point point) {
        double temp = Math.pow(point.getX() - x, 2);
        temp += Math.pow(point.getY() - y, 2);
        return Math.sqrt(temp);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class Triangle {
  
    private Point a;
    private Point b;
    private Point c;
 
    public Point getA() {
        return a;
    }
 
    public Point getB() {
        return b;
    }
 
    public Point getC() {
        return c;
    }
 
    public Triangle(Point a, Point b, Point c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }
 
    public double area() {
        double sideA = a.distanceTo(b);
        double sideB = a.distanceTo(c);
        double sideC = b.distanceTo(c);
        double s = (sideA + sideB + sideC) / 2;
        double areaTriangle = Math.sqrt(s * (s - sideA) * (s - sideB) * (s - sideC));
        if (areaTriangle == 0) {
            throw new IllegalArgumentException("The area triangle can't be calculated");
        }
        return areaTriangle;
    }
}
Добавлено через 3 минуты
вот как вызывать:

Java
1
2
   Triangle figure = new Triangle(new Point(0, 1), new Point(2, 4), new Point(5, 1));
   String result = figure.area();
0
JIeIIIa
772 / 449 / 99
Регистрация: 23.05.2012
Сообщений: 6,698
09.10.2017, 14:43 #3
int на long поменять
0
ArtemFM
238 / 221 / 163
Регистрация: 10.09.2015
Сообщений: 834
09.10.2017, 14:49 #4
NaN - это у double превышение зарезервированной длинны. Слишком большие цифры берёшь для поиска значений, возможно

Добавлено через 2 минуты
И нахождение периметра, вроде как не только сложить длинны сторон, но ещё и поделить на 2 эту сумму
0
Дмитрий99667
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 37
09.10.2017, 14:51  [ТС] #5
ArtemFM , а как избавиться от этой проблемы ? ведь в условии требуют вводить именно эти числа
-15809 20304 18912 -10503 10020 22779 , насколько я знаю типа длиннее дабл уже нет

Добавлено через 1 минуту
поделить на 2 это уже полупериметр будет
0
Curry
2545 / 1710 / 219
Регистрация: 01.06.2013
Сообщений: 3,526
Записей в блоге: 7
09.10.2017, 14:54 #6
Дмитрий99667, вам же предложили вместо int использовать long.
Можно double.
Java
1
public static double len(double x, double y, double xk, double yk)
0
ArtemFM
238 / 221 / 163
Регистрация: 10.09.2015
Сообщений: 834
09.10.2017, 15:07 #7
Нет никаких ошибок. Вот с твоими числами проверил:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class TestTriagl {
    public static void main(String[] args) {
        int x1 = -15809;
        int y1 = 20304;
 
        int x2 = 18912;
        int y2 = -10503;
 
        int x3 = 10020;
        int y3 = 22779;
 
        double A = lenSide(x1, y1, x2, y2);
        double B = lenSide(x1, y1, x3, y3);
        double C = lenSide(x2, y2, x3, y3);
 
        System.out.printf("Answer: %.10f", A + B + C);
    }
 
    public static double lenSide(int x1, int y1, int x2, int y2) {
        return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
    }
}
0
Дмитрий99667
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 37
09.10.2017, 15:07  [ТС] #8
KolodeznyDiver , у меня изначально в исходном коде уже был записан double , а значения координат явно входят в тип int
-15809 20304 18912 -10503 10020 22779
0
ArtemFM
238 / 221 / 163
Регистрация: 10.09.2015
Сообщений: 834
09.10.2017, 15:08 #9
Java
1
2
Answer: 106814,5554724964
Process finished with exit code 0
0
Дмитрий99667
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 37
09.10.2017, 15:10  [ТС] #10
но вы немного поменяли мой код , забиваю данные в свою пишет нан
0
ArtemFM
238 / 221 / 163
Регистрация: 10.09.2015
Сообщений: 834
09.10.2017, 15:12 #11
В общем double самый большой для дробных чисел.
И ничего с NaN не сделаешь. Просто не использовать числа, коль до 30000 разрешено по модуля, типа таких -30000 30000
или будешь ловить NaN. Это не ошибка программы, скорее ошибка поставленной задачи.
0
Дмитрий99667
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 37
09.10.2017, 15:14  [ТС] #12
Так мои числа и не превосходили 30000 по модулю ,. а ошибку пишет все равно с ними вот в чем загвоздка
-15809 20304 18912 -10503 10020 22779
0
Curry
2545 / 1710 / 219
Регистрация: 01.06.2013
Сообщений: 3,526
Записей в блоге: 7
09.10.2017, 15:18 #13
Цитата Сообщение от Дмитрий99667 Посмотреть сообщение
KolodeznyDiver , у меня изначально в исходном коде уже был записан double
Сравните строку 17 вашего код с тем что я предложил.

Добавлено через 1 минуту
Цитата Сообщение от Дмитрий99667 Посмотреть сообщение
Так мои числа и не превосходили 30000 по модулю ,. а ошибку пишет все равно с ними вот в чем загвоздка
Они у вас в квадрат возводятся, вот в чем загвоздка.
0
ArtemFM
238 / 221 / 163
Регистрация: 10.09.2015
Сообщений: 834
09.10.2017, 15:20 #14
Поменяй (x1-x2)*(x1-x2) на Math.pow(x1-x2, 2) и вторую часть так же и не будет ошибки
0
Дмитрий99667
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 37
09.10.2017, 15:30  [ТС] #15
да , поменял тип на long и все заработало наверно и с дабл прокатит, но все равно не понимаю вот что : числа типа int возводятся в квадрат уже в методе len который возвращает тип double (именно здесь я уже учел возведение в квадрат) как видно из моего исходного кода, причем тут тип вводимых чисел ??? ведь я вызываю len которая уже double как видно из исходника , а вводимые числа соответствуют intу

Добавлено через 4 минуты
А почему же у нас исчезла ошибка ? ведь ничего принципиально не изменилось-просто хочу докопаться до истины - что же тогда изменилось ???- просто не хочу расставлять типы методом перебора и тоже самое с функциями Math.pow(x1-x2, 2) , хочу понять что принципиально изменилось , объясните пожалуйста ведь это не есть хорошо подгонять под ответ
0
ArtemFM
238 / 221 / 163
Регистрация: 10.09.2015
Сообщений: 834
09.10.2017, 15:32 #16
Всё значение в скобках Math.sqrt() в начале то, которое ты туда отправил и лишь на выходе double

У тебя получается

Math.sqrt(int - int * int - int +...) => double

B видимо выходит за область инта
0
Дмитрий99667
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 37
09.10.2017, 15:36  [ТС] #17
а что измениться если мы вызовем метод возведения в степень , какой тут механизм ?
0
Curry
2545 / 1710 / 219
Регистрация: 01.06.2013
Сообщений: 3,526
Записей в блоге: 7
09.10.2017, 15:40 #18
Цитата Сообщение от Дмитрий99667 Посмотреть сообщение
числа типа int возводятся в квадрат уже в методе len который возвращает тип double
Без разницы что он возвращает, в квадрат у вас возводились int.

Добавлено через 2 минуты
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Без разницы что он возвращает, в квадрат у вас возводились int.
В смысле, возвращать то тоже нужно double, но в double аргументы сами собой не превращаются при умножении.
0
ArtemFM
238 / 221 / 163
Регистрация: 10.09.2015
Сообщений: 834
09.10.2017, 15:40 #19
Лучший ответ Сообщение было отмечено Дмитрий99667 как решение

Решение

Math.pow(int, 2)
получается выглядит так:

(int x1 - int x2) тут оба значение int и ответом будет int

но прежде чем ответ возводить в степень, Math.pow ответ от x1 - x2 кастует в double

У тебя бы работало, если бы ты написал так



return Math.sqrt((double )(x-xk) * (double) (x-xk)+ (double)(y-yk) * (double) (y-yk)));

таким образом мы сразу будем после разности 2-х интов кастовать ответ в double и перемножали между друг другом уже не инты а даблы
1
Дмитрий99667
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 37
09.10.2017, 15:51  [ТС] #20
ArtemFM , спасибо , это походу то что я хотел услышать , теперь механизм вроде как ясен
0
09.10.2017, 15:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2017, 15:51

Функция нахождения длины отрезка
При любом вводимом значение выводит одно и то же, где я промахнулся? ...

Написать вспомогательные функции вычисления длины отрезка
Помогите пожалуйста! Задан четырехугольник координатами вершин.Вычислить...

Вычисления длины отрезка по координатам его концов
Всем привет. Помогите с задачкой, пожалуйста. Создать модуль, содержащий...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru