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

Условие:
Три непараллельные прямые заданы коэффициентами a, b и c. Коэффициенты а и b не могут быть одновременно равны нулю. Определить площадь треугольника, образованного этими прямыми с точностью до трёх знаков после запятой.

Технические условия:
В файле "input.txt" находятся коэффициенты a,b и c для трёх прямых - потри в каждой строке. В файл "output.txt" нужно вывести единственное число - значение площади образованного треугольника.

Примеры входных и выходных данных:

Input.txt

Output.txt

0 1 1
1 0 1
4 3 19

6.000

1 0 0
0 1 0
1 1 2

2.000

1 -1 0
1 0 6
1 -2 0

9.000

-1 1 1
1 -2 -2
0 1 4

4.500

1 -1 -1
2 -1 -1
1 2 17

7.500

 

Решение:
var
a1,a2,a3:integer;
b1,b2,b3:integer;
c1,c2,c3:integer;
x1,x2,x3:real;
y1,y2,y3:real;
s,d1,d2,d3,p:real;
f:text;
begin
assign(f,'input.txt');
reset(f);
read(f,a1,b1,c1);
read(f,a2,b2,c2);
read(f,a3,b3,c3);
close(f);
{
Находим координаты пересечения прямых 1 и 2 в общем и частных случаях}
if (a1<>0) and (b1<>0) and (a2<>0) and (b2<>0) then begin
y1:=(c2*a1-a2*c1)/(a1*b2-a2*b1);x1:=(c1-b1*y1)/a1;end;
if (a1=0) and (b1<>0) and (a2<>0) and (b2<>0) then begin
y1:=c1/b1;x1:=(c2*b1-b2*c1)/(a2*b1);end;
if (a1<>0) and (b1=0) and (a2<>0) and (b2<>0) then begin
x1:=c1/a1;y1:=(a1*c2-a2*c1)/(a1*b2);end;
if (a1<>0) and (b1<>0) and (a2=0) and (b2<>0) then begin
y1:=c2/b2;x1:=(b2*c1-b1*c2)/(a1*b2);end;
if (a1<>0) and (b1<>0) and (a2<>0) and (b2=0) then begin
x1:=c2/a2;y1:=(a2*c1-a1*c2)/(a2*b1);end;
if (a1=0) and (b1<>0) and (a2<>0) and (b2=0) then begin
y1:=c1/b1;x1:=c2/a2;end;
if (a1<>0) and (b1=0) and (a2=0) and (b2<>0) then begin
y1:=c2/b2;x1:=c1/a1;end;
{
Находим координаты пересечения прямых 2 и 3 в общем и частных случаях}
if (a2<>0) and (b2<>0) and (a3<>0) and (b3<>0) then begin
y2:=(c3*a2-a3*c2)/(a2*b3-a3*b2);x2:=(c2-b2*y2)/a2;end;
if (a2=0) and (b2<>0) and (a3<>0) and (b3<>0) then begin
y2:=c2/b2;x2:=(c3*b2-b3*c2)/(a3*b2);end;
if (a2<>0) and (b2=0) and (a3<>0) and (b3<>0) then begin
x2:=c2/a2;y2:=(a2*c3-a3*c2)/(a2*b3);end;
if (a2<>0) and (b2<>0) and (a3=0) and (b3<>0) then begin
y2:=c3/b3;x2:=(b3*c2-b2*c3)/(a2*b3);end;
if (a2<>0) and (b2<>0) and (a3<>0) and (b3=0) then begin
x2:=c3/a3;y2:=(a3*c2-a2*c3)/(a3*b2);end;
if (a2=0) and (b2<>0) and (a3<>0) and (b3=0) then begin
y2:=c2/b2;x2:=c3/a3;end;
if (a2<>0) and (b2=0) and (a3=0) and (b3<>0) then begin
y2:=c3/b3;x2:=c2/a2;end;
{
Находим координаты пересечения прямых 1 и 3 в общем и частных случаях}
if (a1<>0) and (b1<>0) and (a3<>0) and (b3<>0) then begin
y3:=(c1*a3-a1*c3)/(a3*b1-a1*b3);x3:=(c3-b3*y3)/a3;end;
if (a1=0) and (b1<>0) and (a3<>0) and (b3<>0) then begin
y3:=c1/b1;x3:=(c3*b1-b3*c1)/(a3*b1);end;
if (a1<>0) and (b1=0) and (a3<>0) and (b3<>0) then begin
x3:=c1/a1;y3:=(a1*c3-a3*c1)/(a1*b3);end;
if (a1<>0) and (b1<>0) and (a3=0) and (b3<>0) then begin
y3:=c3/b3;x3:=(b3*c1-b1*c3)/(a1*b3);end;
if (a1<>0) and (b1<>0) and (a3<>0) and (b3=0) then begin
x3:=c3/a3;y3:=(a3*c1-a1*c3)/(a3*b1);end;
if (a1=0) and (b1<>0) and (a3<>0) and (b3=0) then begin
y3:=c1/b1;x3:=c3/a3;end;
if (a1<>0) and (b1=0) and (a3=0) and (b3<>0) then begin
y3:=c3/b3;x3:=c1/a1;end;
{
Вычисляем длины трёх сторон треугольника}
d1:=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
d2:=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
d3:=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
{
Находим полупериметр}
p:=(d1+d2+d3)/2;
{
По формуле Герона вычисляем площадь}
S:=sqrt(p*(p-d1)*(p-d2)*(p-d3));
assign(f,'output.txt');
rewrite(f);
writeln(f,s:0:3);
close(f);
end.