Как вычислить периметр треугольника?

Рейтинг: -8Ответов: 1Опубликовано: 22.05.2023
   // Треугольник задан координатами своих вершин.Найти периметр треугольника. (Описать тип – точка.) //
#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;

}

Ответы

▲ 0Принят
#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;
}