Как вычислить периметр треугольника?
// Треугольник задан координатами своих вершин.Найти периметр треугольника. (Описать тип – точка.) //
#include <iostream>
#include <cmath>
#include <conio.h>
using namespace std;
// Описание типа "Точка" с координатами x и y
struct Point {
double x;
double y;
};
// Объявление подпрограммы (функции) для вычисления расстояния между двумя точками
double calculateDistance(Point p1, Point p2);
// Объявление подпрограммы (функции) для вычисления периметра треугольника
double calculatePerimeter(Point p1, Point p2, Point p3);
int main() {
setlocale(0, "");
Point p1, p2, p3;
cout << "Введите координаты первой точки (x, y): ";
cin >> p1.x >> p1.y;
cout << "Введите координаты второй точки (x, y): ";
cin >> p2.x >> p2.y;
cout << "Введите координаты третьей точки (x, y): ";
cin >> p3.x >> p3.y;
// Вызов подпрограммы (функции) для вычисления периметра треугольника
double perimeter = calculatePerimeter(p1, p2, p3);
cout << "Периметр треугольника: " << perimeter << endl;
system("pause");
return NAN;
}
// Определение подпрограммы (функции) для вычисления расстояния между двумя точками
double calculateDistance(Point p1, Point p2) {
double dx = p2.x - p1.x;
double dy = p2.y - p1.y;
return sqrt(dx * dx + dy * dy);
}
// Определение подпрограммы (функции) для вычисления периметра треугольника
double calculatePerimeter(Point p1, Point p2, Point p3) {
double side1 = calculateDistance(p1, p2);
double side2 = calculateDistance(p2, p3);
double side3 = calculateDistance(p3, p1);
if ((side1 + side2 > side3 && side1 + side3 > side2 && side2 + side3 > side1)){
double p = (double)(side1 + side2 - side3) / 2;
double s = sqrt(p * (p - side1) * (p - side2) * (p - side3));
cout << "S = " << s << endl;
}
if { ((isnan(perimeter)) cout << "error";
else
cout << " perimetr ne suchestvuet" << endl;
}
return side1 + side2 + side3;
}
Ответы (1 шт):
Автор решения: megorit
→ Ссылка
#include <cmath>
#include <stdexcept>
#include <iostream>
struct Point {
double x;
double y;
double distance(const Point& other) const {
return std::sqrt(
std::pow(other.x-x,2) + std::pow(other.y-y,2)
);
}
bool operator==(const Point& other) const {
return (other.x == x && other.y == y);
}
bool operator!=(const Point& other) const {
return (other.x != x || other.y != y);
}
};
double calculatePerimeter(
const Point& p1, const Point& p2, const Point& p3
) {
if (p1 == p2 || p2 == p3 || p3 == p1)
throw std::invalid_argument {
"Collision of coordinates of vertices of triangle"
};
const double edge1 = p1.distance(p2);
const double edge2 = p2.distance(p3);
const double edge3 = p3.distance(p1);
const bool exists = edge1 + edge2 > edge3
&& edge1 + edge3 > edge2
&& edge2 + edge3 > edge1;
if (!exists)
throw std::invalid_argument{"Triange does not exist"};
return edge1 + edge2 + edge3;
}
int main() {
Point triangle[3];
for (int point = 0; point < 3;) {
std::cin.clear();
std::cout << "Enter x:";
std::cin >> triangle[point].x;
if (!std::cin) continue;
std::cout << "Enter y:";
std::cin >> triangle[point].y;
if (!std::cin) continue;
++point;
}
try {
const auto& [p1,p2,p3] = triangle;
std::cout << calculatePerimeter(p1,p2,p3) << std::endl;
}
catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}
return 0;
}