На определение треугольника

  • Автор темы Famous
  • Дата начала
F

Famous

Гость
#1
Собственно вот сама задача
Определить, существует ли треугольник с заданными целочисленными длинами сторон а, в, с. Если да, то определить тип треугольника - остроугольный, тупоугольный или прямоугольный.
А вот та кодировка которую я составил, но в чём-то присутствует ошибка, когда я ввожу стороны любые какие я бы не ввёл, выдаёт сообщение об ошибки или же что треугольник не существует...помогите разобраться
Код:
program treygolnichek;
var x,y,z,m,n,p,x1,x2,y1,y2,l1,l2,l3,c:real;
begin
write ('x= ');readln (x);
write ('y= ');readln (y);
write ('z= ');readln (z);
write ('m= ');readln (m);
write ('n= ');readln (n);
write ('p= ');readln (p);
if (x>0) and (y>0) and (z>0) then
begin
if (x+y>=z) and (x+z>=y) and (y+z>=x) then
begin
l1:=sqrt(sqr((x1-x2))+(sqr(y1-y2)));
l2:=sqrt(sqr((x1-x2))+(sqr(y1-y2)));
l3:=sqrt(sqr((x1-x2))+(sqr(y1-y2)));
c:=(sqr(l1)+sqr(l2)-sqr(l3))/(2*l1*l2);{cosinus naibolshego ygla}
if abs(c)<1e-10 then writeln('treugolnik pryamougolnyj')
else if c>0 then writeln('treugolnik ostrougolnyj') {ECJIu cos>0, To ygol Menbshe 90 gradusov}
else if c<0 then writeln('treugolnik tupougolnyj');{boJIshe 90 gradusov}
readln;
end
else
writeln('Treygolnik ne sushestvuet"');
end
else
writeln('Treygolnik ne sushestvuet');
end.
 

hosm

* so what *
18.05.2009
2 442
9
#3
Может, допустим, что x, у, z - длины сторон.
write ('m= ');readln (m); write ('n= ');readln (n); write ('p= ');readln (p);
а это что за буквы такие? =)
l1:=sqrt(sqr((x1-x2))+(sqr(y1-y2))); l2:=sqrt(sqr((x1-x2))+(sqr(y1-y2))); l3:=sqrt(sqr((x1-x2))+(sqr(y1-y2)));
кто такие x1,x2,y1,y2? не видно, где они задаются.

либо поясните, что написали, либо вот обращайтесь к отписавшему выше...
 
F

Famous

Гость
#4
кто такие x1,x2,y1,y2? не видно, где они задаются.
сами значения мы задаём когда уже вводим x,y,z,m,n,p,
хотя я вот насчёт m,n,p сомневаюсь что они вообще лишние...хотя преподавательница говорит мол если вводить то надо 6 переменных...
 

hosm

* so what *
18.05.2009
2 442
9
#5
Вот это есть определение переменных:
а присваивание им значений в коде отсутствует, т.е. они считаются равными 0.
А они потом используются при вычислениях.
Поэтому если проходит условие на длину сторон:
Код:
 if (x>0) and (y>0) and (z>0) then
begin
if (x+y>=z) and (x+z>=y) and (y+z>=x) then
то в результате получается деление на 0 (или переполнение в результате деления на 0, я уже не помню)
хотя преподавательница говорит мол если вводить то надо 6 переменных...
Может, тогда не длину сторон задавали, а координаты точек-вершин треугольника? (x1, y1) (x2, y2) (x3, y3)
Или она посчитала какие-то промежуточные переменные.
l1:=sqrt(sqr((x1-x2))+(sqr(y1-y2))); l2:=sqrt(sqr((x1-x2))+(sqr(y1-y2))); l3:=sqrt(sqr((x1-x2))+(sqr(y1-y2)));
это что за копипаста? Что тут должно считаться?
 

BashOrgRu

Well-Known Member
15.03.2009
77
0
#6
Задача легко решается, зная формулу косинуса и то, что при убывания значения косинуса угол возрастает(на отрезке от 0 до пи).

Код:
program help;
uses crt;
var a,b,c:integer;
cosA,cosB,cosC,MinCos:real;
begin
ClrScr;
writeln('a=');
readln(a);
writeln('b=');
readln(b);
writeln('c=');
readln(c);
if (a+b>=c) and (a+c>=b) and (b+c>=a) then
begin
{Применям cosX= (y^2+z^2-x^2)/2yz}
cosA:=(b*b+c*c-a*a)/(2*b*c);
cosB:=(c*c+a*a-b*b)/(2*a*c);
cosC:=(a*a+b*b-c*c)/(2*a*b);
MinCos:=cosC;
if cosA<=cosB then
begin
if cosA<=cosC then MinCos:=cosA;
end
else
if cosB<=cosC then MinCos:=cosB;
writeln('cos=',MinCos:6:2);
if MinCos=0 then writeln('Прямоугольный')
else
if MinCos>0 then writeln('Остроугольный')
else writeln('Тупоугольный');
end
else
writeln('Не существует.');
readkey;
end.