C/C++

Помогите с обработкой исключений. Как описать исключение того, что длины сторон треугольника не меньше 0?

#include
#include
using namespace std;
#include
class Triangle //Класс треугольник
{
private:
double x1, x2, x3, y1, y2, y3, a, b, c;// координаты вершин, стороны
public:
void postr_treug() {
cout << "x1="; cin >> x1;
cout << "y1="; cin >> y1;
cout << "x2="; cin >> x2;
cout << "y2="; cin >> y2;
cout << "x3="; cin >> x3;
cout << "y3="; cin >> y3;
}
void dlini_storon()
//ищу длины сторон
{
cout << endl;
a = sqrt(((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2))); cout << " a=" << a << endl; //аналогично длине вектора
b = sqrt(((x1 - x3) * (x1 - x3)) + ((y1 - y3) * (y1 - y3))); cout << " b=" << b << endl;
c = sqrt(((x2 - x3) * (x2 - x3)) + ((y2 - y3) * (y2 - y3))); cout << " c=" << c << endl;
}

};
int main(void)
{
setlocale(LC_ALL, "ru");
Triangle triangle;
triangle.postr_treug();
triangle.dlini_storon();
}
system("pause");
return 0;
}

1)if (a <= 0 || b <= 0 || c<= 0) вызвать исключение (вывод сообщения об ошибке )
2)if (((a + b) > c) &( (b + c) > a) &((a + c) > b)) вызвать исключение (вывод сообщения )
Нашла, что нужно throw catch использовать, но как и куда применять не понимаю.
#include <iostream>
#include <string>
using namespace std;
struct Point {
Point() : x(0), y(0) {}
double x;
double y;
double length(const Point& p)const {
return sqrt(pow(p.x - x, 2) + pow(p.y - y, 2));
}
};
struct Triangle {
Triangle() = default;
Point a;
Point b;
Point c;
double perimeter()const {
return a.length(b) + b.length(c) + c.length(a);
}
double area()const {
auto p = perimeter() / 2;
auto ab = a.length(b);
auto bc = b.length(c);
auto ca = c.length(a);
return sqrt(p * (p - ab) * (p - bc) * (p - ca));
}
bool is_exist()const {
auto p = perimeter() / 2;
auto ab = a.length(b);
auto bc = b.length(c);
auto ca = c.length(a);
if ((p - ab) * (p - bc) * (p - ca) <= 0) return false;
if ((b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x) == 0) return false;
return true;
}
};
double input_double(string name) {
cout << name;
double value;
cin >> value;
return value;
}
Point input_point(string name) {
Point p;
p.x = input_double(name + "x: "s);
p.y = input_double(name + "y: "s);
return p;
}
Triangle input_triangle() {
Triangle t;
t.a = input_point("A"s);
t.b = input_point("B"s);
t.c = input_point("C"s);
return t;
}
int main() {
system("chcp 1251 > nul");
auto triangle = input_triangle();
if (triangle.is_exist()) {
auto perimeter = triangle.perimeter();
auto area = triangle.area();
cout << "Площадь: " << area << '\n'
<< "Периметр: " << perimeter << '\n';
} else {
puts("Треугольник не существует!");
}
system("pause > nul");
}
Ердос Зауре Казыбаев
Ердос Зауре Казыбаев
59 971
Лучший ответ
Леха .......... Понимаю, что VS многие стандартные ошибки и предупреждения не выдает.
Но то, что гл. функция int main() ничего в конце не возвращает, должно быть хотя-бы предупреждение компилятора.
Программисты такую "мелочь" не заьбывают и ставят в конце return 0;
А писателям "алгоритмов", смотрю, на всё наsrать)))
Ердос Зауре Казыбаев По стандарту языка С++ main по умолчанию возвращает 0. Я же вам уже говорил, что вы ещё в каменном веке живёте))
В первой же структуре - ошибка)))
Point() : x(0), y(0) {} нужно закрыть ";"
Мне дальше проверять?)))
Алесей Жилин
Алесей Жилин
37 945
Но зачем? Треугольник же строится по трём точкам на плоскости, а не по длинам сторон, значит, стороны в принципе не могут получиться отрицательными или не сойтись по длине. Худший случай - это когда треуольник вырожденный, т. е. вершины лежат на одной прямой, но это можно в принципе проверить одним условием и без корней, с помощью векторной алгебры.

Теперь что касается "нашла, что нужно throw catch": можно поинтересоваться, в каком месте можно найти, "что нужно throw catch", но не найти, как именно эти конструкции используются?
Игорь Пинквас
Игорь Пинквас
36 956