# Вычисление набора геометрических характеристик треугольника (Лабораторная работа № 1), страница 2

c--------------------------------------------------------------

vvod storon

c--------------------------------------------------------------

subroutine vvod

common /var/a,b,s,angle,cos_angle,pi,i,p

print *,'Vvedite dlini  storon'

print *,'a:'

print *,'b:'

findc=sqrt((a**2)+(b**2))

cos_angle=0

s=0

angle=0

c----------------------------------------------------------------

a<=0   ||    b<=0    || c<=0

c----------------------------------------------------------------

if (a .le. 0 .or. b .le. 0 .or. c .le. 0) then

a=0

else

c-----------------------------------------------------------------

a+b <= c || b+c <= a || a+c <= b

c-------------------------------------------------------------------

if (a+b .le. c .or. b+c .le. a .or. a+c .le. b) then

a=0

end if

end if

end

c--------------------------------------------------------------

c--------------------------------------------------------------

subroutine plosh

common /var/a,b,c,s,angle,cos_angle,pi,i,p

real p

if (a .le. 0) then

print *,'Neverno vvedeni dannie'

return

end if

if (s .le. 0) then

p=(a+b+c)/2

s=(p*(p-a)*(p-b)*(p-c))**0.5

end if

print *,'S= ',s

end

c----------------------------------------------------------------

vuchislenie minimalnogo ygla

c----------------------------------------------------------------

subroutine minim

common /var/a,b,c,s,angle,cos_angle,pi,i,p

if (a .le. 0) then

print *,'Neverno vvedeni dannie'

return

end if

if (angle .le. 0) then

if (cos_angle .le. 0) then

call minim_cos

end if

angle= (acos (cos_angle))*180./pi

end if

print *,'Min = ',angle

end

c------------------------------------------------------------------

vuchislenie cos minimalnogo ygla

c------------------------------------------------------------------

subroutine minim_cos

common /var/a,b,c,s,angle,cos_angle,pi,i,p

if (a .le. 0) then

print *,'Neverno vvedeni dannie'

return

end if

if (a.le.b).and.(a.le.c)then

cos_angle=((a**2)-((b**2)+(c**2)))/(-2.0)*b*c)

else

if(b.le.a).and.(b.le.c)then

cos_angle=((b**2)-((a**2)+(c**2)))/((-2.0)*a*c)

else

if (c.le.a).and.(c.le.b))then

cos_angle=((c**2)-((a**2)+(b**2)))/((-2.0)*a*b)

end if

end if

end if

print *,'Cos = ',cos_angle

return

end

4.Систематестов

 Стороны Площадь Минимальный угол Косинус минимального угла 0 0 0 Проверка не корректна Проверка не корректна Проверка не корректна 20 20 20 173.2050781 60 0.5 -30 20 20 Неверно введены данные Проверка не корректна Проверка не корректна 50 10 30 Неверно введены данные Проверка не корректна Проверка не корректна 3 4 5 6 37 0.8

5. Иследование

1)Для обнаружения ситуации переполнение мы вычисляем площадь равностороннего треугольника. Переполнение возникло при длине стороны, а =10.

Программа выдала сообщение “Infinity”.

 a S 1019 4,3301266E+37 1020 Infinity

При уменьшении длины стороны треугольника до 10 возникла другая особая ситуация. При длине стороны 10 площадь стала равной нулю.

 a S 10-22 4.2038954E-45 10-23 0

погрешность

результата решения задачи от неточности исходных данных

 Сторона 1 Сторона 2 Сторона 3 p Минимальный угол 3 4 5 3.1415926535 3 4 5 3.141592653 3 4 5 3.14159265 3 4 5 3.1415926 3 4 5 3.141592 3 4 5 3.14159

Исследование 2: Поиск исчезновения порядка

 Сторона 1 Сторона2 Площадь 108 108 1.4142135623730951D+008 108 107 1.0049875621120890D+008 108 106 1.0000499987500624D+008 108 105 1.0000004999998749D+008 108 104 1.0000000050000000D+008 108 103 1.0000000000499999D+008 108 102 1.0000000000004999D+008 108 101 1.0000000000000050D+008 108 10-1 1.0000000000000000D+008 1015 1015 … … 1015 106 1.0000000000000000D+015