Площади треугольников

помогите, пожалуйста, разобраться с кодом.

Даны координаты вершин двух треугольников, требуется определить их площади и вывести номер треугольника, площадь которого больше.

Со стандартного устройства ввода вводятся через пробел координаты шести точек:

Ax, Ay, Bx, By, Сx, Сy, Dx, Dy, Ex, Ey, Fx, Fy,

где точки A, B, C —вершины первого треугольника, а точки D, E, F — вершины второго.

Координаты всех точек являются вещественными из диапазона от -1000 до 1000, заданными с тремя знаками после запятой.

Требуется вывести «1»(без кавычек), если площадь первого треугольника больше либо равна площади второго, иначе требуется вывести «2»(без кавычек).

Input

1.000 1.000 1.000 3.000 4.000 1.000 1.000 1.000 1.000 6.000 7.000 1.000

Output

2

Примечание Используйте спецификатор «%f» для ввода вещественных чисел. Гарантируется, что площади каждого из треугольников больше нуля. Сравнивать вещественные числа требуется с погрешность 0.001, а это значит: число A будет равно числу B с точностью до 0.001, когда abs(A-B) <= 0.001, где abs(A-B) возвращает абсолютное значение (A-B), то есть max(A, B) - min(A, B).

Площадь треугольника по координатам его вершин можно найти следующим образом:

S = | (Bx - Ax) * (Ay + By) + (Cx - Bx) * (Cy + By) + (Ax - Cx) * (Ay + Cy)| / 2

#include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    float Ax,Ay,Bx,By,Cx,Cy,Dx,Dy,Ex,Ey,Fx,Fy, s1, s2;
    scanf("%3f %3f %3f %3f %3f %3f %3f %3f %3f %3f %3f %3f", &Ax,&Ay,&Bx,&By,&Cx,&Cy,&Dx,&Dy,&Ex,&Ey,&Fx,&Fy);
    s1=abs((Bx-Ax)*(Ay+By)+(Cx-Bx)*(Cy+By)+(Ax-Cx)*(Ay+Cy))/2;
    s2=abs((Ex-Dx)*(Dy+Ey)+(Fx-Ex)*(Fy+Ey)+(Dx-Fx)*(Dy+Fy))/2;
    if(s1>=s2) printf("1");
    else printf("2");
    return 0;
    } 

Программа по логике должна работать корректно, но при введении чисел из примера выводится 1, а не 2


Ответы (2 шт):

Автор решения: Sergey

Ошибка (маленькая) заключалась в том, что вы неправильно задавали форматирование при вводе значений. Вы писали %3f а ширина поля, на самом деле, была 5(!). В результате координаты вводились неверно и дальнейший расчёт давал полную чепуху.

Ошибки (большие) я увидел так:

  1. Вы не оформили расчёт площади как функцию
  2. Вы не проверяли введённые значения

Подправленный код выглядит так:

#include <stdio.h>
#include <stdlib.h>

float area(float Ax, float Ay, float Bx, float By, float Cx, float Cy) {
    return abs((Bx-Ax)*(Ay+By)+(Cx-Bx)*(Cy+By)+(Ax-Cx)*(Ay+Cy))/2;
}

int main() {
    float Ax,Ay,Bx,By,Cx,Cy,Dx,Dy,Ex,Ey,Fx,Fy, s1, s2;
    scanf("%5f %5f %5f %5f %5f %5f %5f %5f %5f %5f %5f %5f", 
           &Ax,&Ay,&Bx,&By,&Cx,&Cy,&Dx,&Dy,&Ex,&Ey,&Fx,&Fy);
    printf("Первый треугольник: (%6.3f,%6.3f), (%6.3f,%6.3f), (%6.3f,%6.3f)\n", Ax,Ay,Bx,By,Cx,Cy);
    printf("Второй треугольник: (%6.3f,%6.3f), (%6.3f,%6.3f), (%6.3f,%6.3f)\n", Dx,Dy,Ex,Ey,Fx,Fy);

    s1 = area(Ax,Ay,Bx,By,Cx,Cy);
    s2 = area(Dx,Dy,Ex,Ey,Fx,Fy);

    printf("s1 = %8.3f\n", s1);
    printf("s2 = %8.3f\n", s2);

    if(s1>=s2) printf("1\n");
    else printf("2\n");

    return 0;
}

Выдаёт "2" :-)

→ Ссылка
Автор решения: Harry

Мои 5 копеек.

  1. Даже в условии явно написано, что спецификатор чтения - %f. Не %3f, не %5f , а именно %f...
  2. В условии явно указано, что при отличии менее чем на 0.001 площади считаются одинаковыми.

А потому

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    float Ax,Ay,Bx,By,Cx,Cy,Dx,Dy,Ex,Ey,Fx,Fy, s1, s2;
    scanf("%f %f %f %f %f %f %f %f %f %f %f %f",
          &Ax,&Ay,&Bx,&By,&Cx,&Cy,&Dx,&Dy,&Ex,&Ey,&Fx,&Fy);

    s1 = fabs((Bx-Ax)*(Ay+By)+(Cx-Bx)*(Cy+By)+(Ax-Cx)*(Ay+Cy))/2;
    s2 = fabs((Ex-Dx)*(Dy+Ey)+(Fx-Ex)*(Fy+Ey)+(Dx-Fx)*(Dy+Fy))/2;

    if (s1 > s2 || fabs(s1-s2) <= 0.001) printf("1");
    else printf("2");

}
→ Ссылка