Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 02.07.2014, 18:09   #1 (permalink)
katusha17
Новичок
 
Регистрация: 30.06.2014
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Exclamation Определение углов в треугольнике

По введенным координатам вершин треугольника (которые записаны в файл 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.
katusha17 вне форума   Ответить с цитированием

Старый 02.07.2014, 18:09
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

В некоторых случаях просто никак не обойтись без прочтения аналогичных тем

Определение микросхемы?
Определение радиоэлементов
Определение радиоэлемента
Определение конденсаторов

Старый 02.07.2014, 20:04   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от katusha17 Посмотреть сообщение
Что тут не так?
Да много чего. И арккосинус задан неверно, и в самой программе куча ляпов (в частности, в логике), и лишнего полнО. В общем, причесал. Разбирайтесь:
Код:
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 связано с тем, что треугольник может одновременно быть равнобедренным и прямоугольным.
Vladimir_S вне форума   Ответить с цитированием
Старый 02.07.2014, 21:36   #3 (permalink)
katusha17
Новичок
 
Регистрация: 30.06.2014
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо большое)
katusha17 вне форума   Ответить с цитированием
Старый 03.07.2014, 21:27   #4 (permalink)
katusha17
Новичок
 
Регистрация: 30.06.2014
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Я немного не понимаю сути переменной b.
katusha17 вне форума   Ответить с цитированием
Старый 03.07.2014, 23:33   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Метки
паскаль, помогите, треугольник, углы

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 11:14.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.