Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/64: Рейтинг темы: голосов - 64, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 39

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

09.10.2017, 14:10. Показов 13600. Ответов 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)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.10.2017, 14:10
Ответы с готовыми решениями:

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

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

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

19
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
09.10.2017, 14:40
Я когда-то делал подобное задание. Но у меня там нет метода 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
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
09.10.2017, 14:43
int на long поменять
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
09.10.2017, 14:49
NaN - это у double превышение зарезервированной длинны. Слишком большие цифры берёшь для поиска значений, возможно

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

Добавлено через 1 минуту
поделить на 2 это уже полупериметр будет
0
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,550
Записей в блоге: 9
09.10.2017, 14:54
Дмитрий99667, вам же предложили вместо int использовать long.
Можно double.
Java
1
public static double len(double x, double y, double xk, double yk)
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
09.10.2017, 15:07
Нет никаких ошибок. Вот с твоими числами проверил:

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
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 39
09.10.2017, 15:07  [ТС]
KolodeznyDiver , у меня изначально в исходном коде уже был записан double , а значения координат явно входят в тип int
-15809 20304 18912 -10503 10020 22779
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
09.10.2017, 15:08
Java
1
2
Answer: 106814,5554724964
Process finished with exit code 0
0
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 39
09.10.2017, 15:10  [ТС]
но вы немного поменяли мой код , забиваю данные в свою пишет нан
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
09.10.2017, 15:12
В общем double самый большой для дробных чисел.
И ничего с NaN не сделаешь. Просто не использовать числа, коль до 30000 разрешено по модуля, типа таких -30000 30000
или будешь ловить NaN. Это не ошибка программы, скорее ошибка поставленной задачи.
0
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 39
09.10.2017, 15:14  [ТС]
Так мои числа и не превосходили 30000 по модулю ,. а ошибку пишет все равно с ними вот в чем загвоздка
-15809 20304 18912 -10503 10020 22779
0
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,550
Записей в блоге: 9
09.10.2017, 15:18
Цитата Сообщение от Дмитрий99667 Посмотреть сообщение
KolodeznyDiver , у меня изначально в исходном коде уже был записан double
Сравните строку 17 вашего код с тем что я предложил.

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

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

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

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

B видимо выходит за область инта
0
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 39
09.10.2017, 15:36  [ТС]
а что измениться если мы вызовем метод возведения в степень , какой тут механизм ?
0
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,550
Записей в блоге: 9
09.10.2017, 15:40
Цитата Сообщение от Дмитрий99667 Посмотреть сообщение
числа типа int возводятся в квадрат уже в методе len который возвращает тип double
Без разницы что он возвращает, в квадрат у вас возводились int.

Добавлено через 2 минуты
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Без разницы что он возвращает, в квадрат у вас возводились int.
В смысле, возвращать то тоже нужно double, но в double аргументы сами собой не превращаются при умножении.
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
09.10.2017, 15:40
Лучший ответ Сообщение было отмечено Дмитрий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
0 / 0 / 0
Регистрация: 03.08.2016
Сообщений: 39
09.10.2017, 15:51  [ТС]
ArtemFM , спасибо , это походу то что я хотел услышать , теперь механизм вроде как ясен
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2017, 15:51
Помогаю со студенческими работами здесь

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

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

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

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

Функции вычисления длины отрезка по заданным координатам его концов
lazarus Написать функции вычисления длины отрезака по заданным координатам его концов в плоскости и пространстве.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru