• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Определение углов в треугольнике

katusha17

Ученик
Регистрация
30 Июн 2014
Сообщения
5
Реакции
0
Баллы
0
Определение углов в треугольнике

По введенным координатам вершин треугольника (которые записаны в файл coord.txt), считаются длины сторон и углы треугольника, но только в том случае считаются углы, когда треугольник не равносторонний, не прямоугольный и не равнобедренный. Далее вид треугольника записывается в отдельный файл VidTrg.txt.
Alfa у меня постоянно получается по нулям, а gamma почти всегда отрицательный или неверно посчитан.

Ниже код.
Что тут не так?

Program VID_TRG;
var x1,y1,z1,x2,y2,z2,x3,y3,z3:real;
d1,d2,d3:real;
f:text;
f1:text;
s:string;
alfa,beta,gamma:real;

function arccos(x:real):real;
begin
arccos:=arctan(sqrt(1-sqr(x))/x);
end;

begin
assign (f,'coord.txt');
reset (f);
d1:=0; d2:=0; d3:=0;
while not eof(f) do
begin
read (f,x1,y1,z1,x2,y2,z2,x3,y3,z3);
d1:=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1));
d2:=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)+(z3-z2)*(z3-z2));
d3:=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)+(z1-z3)*(z1-z3));
d1:=round(d1*10)/10;
d2:=round(d2*10)/10;
d3:=round(d3*10)/10;
writeln (d1:0:2,' ',d2:0:2,' ',d3:0:2);

if ((d1+d2>d3) and (d2+d3>d1) and (d1+d3>d2)) then
begin

if (d1=d2) and (d2=d3) then
s:='treygolnik ravnostoronniy';
writeln(s);

if ((d1=d2) or (d1=d3) or (d2=d3)) and ((d1<>d2) or (d1<>d3) or (d2<>d3)) then
s:='treygolnik ravnobedrenniy';
writeln(s);

if ((d1*d1)=(d2*d2)+(d3*d3)) or ((d2*d2)=(d1*d1)+(d3*d3)) or ((d3*d3)=(d1*d1)+(d3*d3)) then
s:='treygolnik pryamoygolniy';
writeln(s);

if ((d1<>d2) and (d2<>d3) and (d3<>d1)) then
alfa:= (arccos((sqr(d2)+sqr(d3)-sqr(d1))/(2*d2*d3)))*(180/pi);
beta:= (arccos((sqr(d1)+sqr(d3)-sqr(d2))/(2*d1*d3)))*(180/pi);
gamma:= (arccos((sqr(d1)+sqr(d2)-sqr(d3))/(2*d1*d2)))*(180/pi);
writeln('Alfa = ',alfa:0:3);
writeln('Beta = ',beta:0:3);
writeln('Gamma = ',gamma:0:3);
if (alfa>90) or (beta>90) or (gamma>90) then
s:='tupougolniy'
else
s:='ostrougolniy';
end

else s:='treygolnik ne suchesvuet!';
writeln(s);

assign(f1,'VidTrg.txt');
rewrite(f1);
write(f1,s);
close(f1);
end;

close (f);
readln;
end.
 
Что тут не так?
Да много чего. И арккосинус задан неверно, и в самой программе куча ляпов (в частности, в логике), и лишнего полнО. В общем, причесал. Разбирайтесь:
Код:
var
 x1,y1,z1,x2,y2,z2,x3,y3,z3,d1,d2,d3,alfa,beta,gamma:real;
 f,f1:text;
 s,s1:string;
 b:boolean;

function arccos(x:real):real;
begin
 if x=1 then arccos:=0 else
 if x=-1 then arccos:=Pi else
 arccos:=(Pi/2)-arctan(x/Sqrt(1-x*x));
end;

begin
 assign(f,'D:\coord.txt');
 reset(f);
 read(f,x1,y1,z1,x2,y2,z2,x3,y3,z3);
 close(f);
 d1:=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1));
 d2:=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)+(z3-z2)*(z3-z2));
 d3:=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)+(z1-z3)*(z1-z3));
 writeln (d1:0:2,' ',d2:0:2,' ',d3:0:2);
 if (d1+d2>d3) and (d2+d3>d1) and (d1+d3>d2) then
  begin
   b:=true;
   if (d1=d2) and (d2=d3) then
    begin
     b:=false;
     s:='treygolnik ravnostoronniy';
     writeln(s);
    end;
   if ((d1=d2) and (d1<>d3)) or
      ((d1=d3) and (d1<>d2)) or
      ((d2=d3) and (d2<>d1)) then
    begin
     b:=false;
     s:='treygolnik ravnobedrenniy';
     writeln(s);
    end;
   if (Round(d1*d1*100)=Round(d2*d2*100)+Round(d3*d3*100)) or
      (Round(d2*d2*100)=Round(d1*d1*100)+Round(d3*d3*100)) or
      (Round(d3*d3*100)=Round(d1*d1*100)+Round(d2*d2*100)) then
    begin
     b:=false;
     s1:='treygolnik pryamoygolniy';
     writeln(s1);
    end else s1:='';
   if b then
    begin
     alfa:= (arccos((sqr(d2)+sqr(d3)-sqr(d1))/(2*d2*d3)))*(180/pi);
     beta:= (arccos((sqr(d1)+sqr(d3)-sqr(d2))/(2*d1*d3)))*(180/pi);
     gamma:=(arccos((sqr(d1)+sqr(d2)-sqr(d3))/(2*d1*d2)))*(180/pi);
     writeln('Alfa = ',alfa:0:3);
     writeln('Beta = ',beta:0:3);
     writeln('Gamma = ',gamma:0:3);
     if (alfa>90) or (beta>90) or (gamma>90) then
      s:='tupougolniy'
     else
      s:='ostrougolniy';
     writeln(s);
    end;
  end
 else
  begin
   s:='treygolnik ne suchesvuet!';
   writeln(s);
  end;
 assign(f1,'D:\VidTrg.txt');
 rewrite(f1);
 writeln(f1,s);
 if s1<>'' then writeln(f1,s1);
 close(f1);
 readln;
end.

Сразу поясню, что введение строки s1 связано с тем, что треугольник может одновременно быть равнобедренным и прямоугольным.
 
Спасибо большое)
 
Я немного не понимаю сути переменной b.
 
Я немного не понимаю сути переменной b.
Это просто булевский флажок. После проверки корректности длин сторон (что ни одна не превышает суммы двух других) устанавливаем исходное значение флажка true. Если треугольник равносторонний, или равнобедренный, или прямоугольный, то флажок меняет своё значение с true на false. А вот если пройдены все проверки и флажок сохранил значение true (т.е. треугольник не равносторонний, не равнобедренный и не прямоугольный), то начинаем считать углы и т.д.
 
Назад
Сверху