|
Главная | Правила | Регистрация | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
|
Опции темы | Опции просмотра |
02.07.2014, 18:09 | #1 (permalink) |
Новичок
Регистрация: 30.06.2014
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Определение углов в треугольнике
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. |
02.07.2014, 18:09 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
В некоторых случаях просто никак не обойтись без прочтения аналогичных тем Определение микросхемы? Определение радиоэлементов Определение радиоэлемента Определение конденсаторов |
02.07.2014, 20:04 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Да много чего. И арккосинус задан неверно, и в самой программе куча ляпов (в частности, в логике), и лишнего полнО. В общем, причесал. Разбирайтесь:
Код:
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. |
03.07.2014, 23:33 | #5 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Это просто булевский флажок. После проверки корректности длин сторон (что ни одна не превышает суммы двух других) устанавливаем исходное значение флажка true. Если треугольник равносторонний, или равнобедренный, или прямоугольный, то флажок меняет своё значение с true на false. А вот если пройдены все проверки и флажок сохранил значение true (т.е. треугольник не равносторонний, не равнобедренный и не прямоугольный), то начинаем считать углы и т.д.
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Метки |
паскаль, помогите, треугольник, углы |
Опции темы | |
Опции просмотра | |
|
|