Другие языки программирования и технологии

Что не так с программой? C++

Даны произвольные числа х1, х2, х3, у1, у2, у3. Принадлежит ли начало координат треугольника с вершинами (х1,у1), (х2,у2), (х3,у3)

начало координат входит в треугольник, если его площадь равна сумме трех площадей треугольников, образованных с помощью точки 0;0

#define _CRT1_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
float tran(float a, float b, float c, float d, float e, float f)
{
float S;
S=0.5*((a-c)*(e-f)-(d-f)*(b-c));
S=fabs(S);
return S;
}
int main()
{
float x1, x2, x3, y1, y2, y3, s1, s2, s3, s4;
setlocale(LC_CTYPE, "RUSSIAN");

printf("Введите x1:\n");
scanf_s("%f", &x1);
printf("Введите x2:\n");
scanf_s("%f", &x2);
printf("Введите x3:\n");
scanf_s("%f", &x3);
printf("Введите y1:\n");
scanf_s("%f", &y1);
printf("Введите y2:\n");
scanf_s("%f", &y2);
printf("Введите y3:\n");
scanf_s("%f", &y3);

s1=tran(x1, x2, x3, y1, y2, y3);
s2=tran(0.0, x2, x3, 0.0, y2, y3);
s3=tran(x1, 0.0, x3, y1, 0.0, y3);
s4=tran(x1, x2, 0.0, y1, y2, 0.0);
if(s2+s3+s4==s1)
printf("Начало координат входит в треугольник"); else printf("Начало координат не входит в треугольник");
}
Не вижу С++: printf, scanf, fabs - это в чистом виде C (без плюсов).

Вещественные числа - это всегда ПРИБЛИЗИТЕЛЬНЫЕ значения. Их нельзя сравнивать с помощью ==. Можно сравнивать, например, так: fabs(s2 + s3 + s4 - s1) < eps. Где eps - малое значение чуть больше точности вычислений.

К тому же, ты используешь имеющие крайне низкую точность float, а не куда более точные double.

P.S. Правильность вычисления площади не проверял: неужели нельзя было назвать параметры хотя бы ax, bx, cx, ay, by, cy - вместо этих безумных a, b, c, d, e, f в которых кто угодно запутается.
Серёга Сергеев
Серёга Сергеев
55 976
Лучший ответ
#include <iostream>
using namespace std;
struct Point {
Point() : x(0), y(0) { }
Point(double _x, double _y) : x(_x), y(_y) { }
double x;
double y;
friend double operator-(const Point& a, const Point& b) {
return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
}
};
struct Segment {
Point a;
Point b;
double length()const { return a - b; }
operator double()const { return length(); }
};
class Triangle {
public:
Triangle(const Segment& ab, const Segment& bc, const Segment& ac)
: ab_(ab), bc_(bc), ac_(ac) { }
double area()const {
const auto p = (ab_ + bc_ + ac_) / 2;
return sqrt(p * (p - ab_) * (p - bc_) * (p - ac_));
}
bool belongs(const Point p = { 0, 0 }) {
Segment pa = { p, ab_.a };
Segment pb = { p, bc_.a };
Segment pc = { p, ac_.b };
auto pab = Triangle(ab_, pa, pb);
auto pbc = Triangle(bc_, pb, pc);
auto pac = Triangle(ac_, pa, pc);
auto sum = pab.area() + pbc.area() + pac.area();
return abs(sum - area()) < 1e-13;
}
private:
Segment ab_;
Segment bc_;
Segment ac_;
};
double input(const char* msg) {
cout << msg << ": ";
double value;
cin >> value;
return value;
}
Point point(const char* mx, const char* my) {
auto x = input(mx);
auto y = input(my);
return { x, y };
}
int main() {
while (true) {
Point a = point("x1", "y1");
Point b = point("x2", "y2");
Point c = point("x3", "y3");
Triangle triangle({ a, b }, { b, c }, { a, c });
if (triangle.belongs()) cout << "Yes";
else cout << "No";
cout << "!\n";
}
}
Ruslan Shahanov
Ruslan Shahanov
88 746
Серёга Сергеев Автор вопроса попыталась просчитать площади через векторное произведение и в данном случае это более оптимальный вариант, чем сначала считать длины сторон, потом формулу Герона...