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

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

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

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Помогите решить задачу. На 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.06.2023, 22:27
Ответы с готовыми решениями:

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

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

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

8
 Аватар для Tanya2007
593 / 230 / 72
Регистрация: 13.05.2020
Сообщений: 412
12.06.2023, 10:58
Цитата Сообщение от 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
Сообщений: 57
12.06.2023, 11:29  [ТС]
Цитата Сообщение от 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
 Аватар для Tanya2007
593 / 230 / 72
Регистрация: 13.05.2020
Сообщений: 412
12.06.2023, 11:37
Цитата Сообщение от 4eJIMegBegocBuH Посмотреть сообщение
но не помогло (
А если округлять до 6 знаков не сумму длин отрезков, а каждую длину отрезка, например перед возвратом в main.
0
0 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 57
12.06.2023, 12:32  [ТС]
Цитата Сообщение от Tanya2007 Посмотреть сообщение
А если округлять до 6 знаков не сумму длин отрезков, а каждую длину отрезка, например перед возвратом в main.
ответ отрицательный
0
 Аватар для Tanya2007
593 / 230 / 72
Регистрация: 13.05.2020
Сообщений: 412
12.06.2023, 13:17
Лучший ответ Сообщение было отмечено 4eJIMegBegocBuH как решение

Решение

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

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

Добавлено через 13 минут
Цитата Сообщение от 4eJIMegBegocBuH Посмотреть сообщение
Все числа по модулю не превосходят 30000.
Мне еще думается, что скорее всего происходит переполнение int, если координаты достаточно велики, например от -30000 до 30000. Тогда 60000 в квадрате, это переполнение, все биты которые не влезают в 4 байта, просто откидываются. Попробуйте int заменить на long long.
1
0 / 1 / 0
Регистрация: 15.02.2020
Сообщений: 57
12.06.2023, 13:21  [ТС]
Цитата Сообщение от Tanya2007 Посмотреть сообщение
Мне еще думается, что скорее всего происходит переполнение int, если координаты достаточно велики, например от -30000 до 30000. Тогда 60000 в квадрате, это переполнение, все биты которые не влезают в 4 байта, просто откидываются. Попробуйте int заменить на long long.
точно) спасибо, помогло)
0
 Аватар для Tanya2007
593 / 230 / 72
Регистрация: 13.05.2020
Сообщений: 412
12.06.2023, 13:30
Цитата Сообщение от 4eJIMegBegocBuH Посмотреть сообщение
точно) спасибо, помогло)
Ну отлично)
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6186 / 2888 / 1042
Регистрация: 01.06.2021
Сообщений: 10,598
14.06.2023, 20:43
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2023, 20:43
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru