0 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 55
1

Периметр треугольника по трём точкам

11.06.2023, 22:27. Показов 1529. Ответов 8

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Помогите решить задачу. На 17 тесте неверный ответ, но я уже не представляю что тут может быть не так.

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

Формат ввода:
На вход программе подается 6 целых чисел — координат x1, y1, x2, y2, x3, y3 вершин треугольника. Все числа по модулю не превосходят 30000.

Формат вывода:
Выведите значение периметра этого треугольника с точностью до 6 знаков после десятичной точки.

Я написал следующий код:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cmath> 
#include <iomanip>
using namespace std;
 
double dist(int x1, int y1, int x2, int y2) {
    double dist =  sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    return dist;
}
 
int main() {
    int x1, y1, x2, y2, x3, y3;
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
    cout << fixed << setprecision(6) <<dist(x1, y1, x2, y2) + dist(x1, y1, x3, y3) + dist(x2, y2, x3, y3);
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2023, 22:27
Ответы с готовыми решениями:

Найти наибольший периметр треугольника, вершины которого принадлежат различным точкам множества
Дано множество A из N точек (N &gt; 2, точки заданы своими координатами х, у). Найти наибольший...

Угол по трем точкам
Есть некая воображаемая замкнутая область, заданная 10 точками. Все линии должны быть прямыми, и...

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

Известна гипотенуза С и противолежащий угол B прямоугольного треугольника. Найти периметр треугольника
Помогите написать данную программу: Известна гипотенуза С и противолежащий угол B прямоугольного...

8
419 / 206 / 64
Регистрация: 13.05.2020
Сообщений: 385
12.06.2023, 10:58 2
Цитата Сообщение от 4eJIMegBegocBuH Посмотреть сообщение
setprecision(6)
теряется точность при округлении double и float, например, если у вас в итоге получается число 3,1525645, то оно с этим флагом округлится до 3,152564. Потому что представление double(float) в компьютере в данном случае такого вида: 3,1525645 = 3,1525644(9), поэтому и округление идет до 64, а не до 65.
Обойти проблему можно так:

C++
1
2
double f = std::round(3.1525645 * 1000000) / 1000000;   //умножаем и делим на 1000000 т.к. нужно 6 знаков после запятой
    cout << fixed << setprecision(6) << f;
На выходе получаем 3,152565.
0
0 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 55
12.06.2023, 11:29  [ТС] 3
Цитата Сообщение от Tanya2007 Посмотреть сообщение
Сообщение от 4eJIMegBegocBuH
setprecision(6)
теряется точность при округлении double и float, например, если у вас в итоге получается число 3,1525645, то оно с этим флагом округлится до 3,152564. Потому что представление double(float) в компьютере в данном случае такого вида: 3,1525645 = 3,1525644(9), поэтому и округление идет до 64, а не до 65.
Обойти проблему можно так:
C++Выделить код
1
2
double f = std::round(3.1525645 * 1000000) / 1000000;   //умножаем и делим на 1000000 т.к. нужно 6 знаков после запятой
    cout << fixed << setprecision(6) << f;
На выходе получаем 3,152565.
дополнил код:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cmath> 
#include <iomanip>
using namespace std;
 
double dist(int x1, int y1, int x2, int y2) {
    double dist = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    return dist;
}
 
int main() {
    int x1, y1, x2, y2, x3, y3;
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
    double answer = round((dist(x1, y1, x2, y2) + dist(x1, y1, x3, y3) + dist(x2, y2, x3, y3))*1000000)/1000000;
    cout << fixed << setprecision(6) << answer;
}
но не помогло (
0
419 / 206 / 64
Регистрация: 13.05.2020
Сообщений: 385
12.06.2023, 11:37 4
Цитата Сообщение от 4eJIMegBegocBuH Посмотреть сообщение
но не помогло (
А если округлять до 6 знаков не сумму длин отрезков, а каждую длину отрезка, например перед возвратом в main.
0
0 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 55
12.06.2023, 12:32  [ТС] 5
Цитата Сообщение от Tanya2007 Посмотреть сообщение
А если округлять до 6 знаков не сумму длин отрезков, а каждую длину отрезка, например перед возвратом в main.
ответ отрицательный
0
419 / 206 / 64
Регистрация: 13.05.2020
Сообщений: 385
12.06.2023, 13:17 6
Лучший ответ Сообщение было отмечено 4eJIMegBegocBuH как решение

Решение

Может тест с подковыркой, например подается два отрезка с одинаковыми координатами, а третий с другими, представляющих собой угол? Тогда если соединить линией концы угла, то периметр треугольника будет другим.

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

Добавлено через 13 минут
Цитата Сообщение от 4eJIMegBegocBuH Посмотреть сообщение
Все числа по модулю не превосходят 30000.
Мне еще думается, что скорее всего происходит переполнение int, если координаты достаточно велики, например от -30000 до 30000. Тогда 60000 в квадрате, это переполнение, все биты которые не влезают в 4 байта, просто откидываются. Попробуйте int заменить на long long.
1
0 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 55
12.06.2023, 13:21  [ТС] 7
Цитата Сообщение от Tanya2007 Посмотреть сообщение
Мне еще думается, что скорее всего происходит переполнение int, если координаты достаточно велики, например от -30000 до 30000. Тогда 60000 в квадрате, это переполнение, все биты которые не влезают в 4 байта, просто откидываются. Попробуйте int заменить на long long.
точно) спасибо, помогло)
0
419 / 206 / 64
Регистрация: 13.05.2020
Сообщений: 385
12.06.2023, 13:30 8
Цитата Сообщение от 4eJIMegBegocBuH Посмотреть сообщение
точно) спасибо, помогло)
Ну отлично)
0
Эксперт функциональных языков программированияЭксперт С++
4125 / 1938 / 960
Регистрация: 01.06.2021
Сообщений: 6,831
Записей в блоге: 6
14.06.2023, 20:43 9
Цитата Сообщение от 4eJIMegBegocBuH Посмотреть сообщение
C++
1
2
3
4
double dist(int x1, int y1, int x2, int y2) {
    double dist =  sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    return dist;
}
это велосипед! пиши так:

C++
1
hypot(x1 - x2, y1 - y2)
0
14.06.2023, 20:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.06.2023, 20:43
Помогаю со студенческими работами здесь

Даны стороны треугольника в массиве, необходимо найти периметр и площадь треугольника
Желательно проще, проходим только базу, заранее спасибо!

По трем точкам построить многоугольник
решаю задачки на codeforces.ru, встретилась задача: В Древней Берляндии цирки имели арены в форме...

Нарисовать параболу по трем заданным точкам
Привет. Не получается высчитать Y для построения параболы. Парабола рисуется, но не по заданным...

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

Массивы. Геометрия. Об окружности минимального радиуса по трем точкам
Определить радиус и центр окружности минимального радиуса, проходящей хотя бы через три различные...

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

Найти координаты вершины параболы по трем заданым точкам
Помогите написать функцию. Точки задаются в коде. Как из функции вернуть два значения? main(){...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru