Как найти ошибки алгоритма в этом коде?
PROGRAM MAIN
IMPLICIT NONE
! triangle parameters
REAL a, b, c, d, f
COMMON /TRIANGLE/ a, b, d
REAL CosMinAngle, q1, q2, q3
! function declaration
REAL Area, MinAngle
REAL Side
INTEGER NUM
CALL TriangleInput()
DO WHILE (.TRUE.)
CALL MENU
! reading command number
READ *, NUM
PRINT *
! process input
SELECT CASE(NUM)
CASE(1)
CALL TriangleInput
CASE(2)
f = AREA(a, b, d)
PRINT *,'Area of a triangle: ', f
CASE(3)
CALL MinAngle()
PRINT *,'Minimum triangle angle: ', MinAngle()
CASE(4)
CALL CosMinAngle()
PRINT '(A,$)','Cosine of minimum angle: '
PRINT *, CosMinAngle()
CASE(5)
PRINT *, 'Enter one of the 2 sides and angle: '
READ *, a, b , d
c = Side(a, b, d)
PRINT *,'The 3rd side of the triangle: ', Side()
CASE(6)
PRINT *, 'Goodbuy!'
STOP
CASE DEFAULT
PRINT *, 'Number entered incorrectly'
END SELECT
END DO
END
SUBROUTINE MENU
IMPLICIT NONE
! display the menu
PRINT '(/,A,$)','Enter one of the suggested commands:'
PRINT *
PRINT *,'1. Entering a new triangle'
PRINT *,'2. Triangle area calculation'
PRINT *,'3. Minimum angle calculation'
PRINT *,'4. Cosine calculation of the minimum angle'
PRINT *,'5. Find the 3rd side of the triangle'
PRINT *,'6. Exit'
END
! Entering a new triangle
SUBROUTINE TriangleInput
IMPLICIT NONE
REAL a, b, d
COMMON /TRIANGLE/ a, b, d
REAL c, Side
DO WHILE (.TRUE.)
PRINT *,'Enter the two sides and an angle: '
READ *, a, b, d
c = Side(a, b, d)
! triangle existence test
IF (((a+b).GE.c).AND.((a+c).GE.b).AND.((b+c).GE.a))THEN
PRINT *, 'Triangle set.'
RETURN
ELSE
PRINT *, 'The triangle does not exist'
RETURN
END IF
END DO
END
! Triangle area calculation
REAL FUNCTION Area()
IMPLICIT NONE
REAL a, b, d
COMMON /TRIANGLE/ a, b, d
REAL Pi
PARAMETER (Pi = 3.141592652)
Area = 1/2*(a*b*SIN(d))
RETURN
END
! Minimum angle calculation
REAL FUNCTION MinAngle()
IMPLICIT NONE
REAL a, b, d
COMMON /TRIANGLE/ a, b, d
REAL CosMinAngle
REAL Pi, f
PARAMETER (Pi = 3.141592652)
MinAngle = ACOS(CosMinAngle())*180/Pi
RETURN
END
! Cosine calculation of the minimum angle
REAL FUNCTION CosMinAngle()
IMPLICIT NONE
REAL a, b, c, d
COMMON /TRIANGLE/ a, b, d
REAL q1, q2, q3, Side
c = Side(a, b, d)
! Find the minimum side of the triangle
IF (a .LT. b) THEN
IF (a .LT. c) THEN
q1 = a
q2 = b
q3 = c
ELSE
q1 = c
q2 = a
q3 = b
END IF
ELSE
IF (b .LT. c) THEN
q1 = b
q2 = a
q3 = c
ELSE
q1 = c
q2 = a
q3 = b
END IF
END IF
CosMinAngle = (q3**2 + q2**2 - q1**2) / (2 * q3 * q2)
RETURN
END
! Find the 3rd side of the triangle
REAL FUNCTION Side()
IMPLICIT NONE
REAL a, b, d
COMMON /TRIANGLE/ a, b, d
Side = SQRT(a**2+b**2-2*a*b*COS(d))
RETURN
END
На ввод: 2 стороны и угол между ними. Найти площадь (area), косинус минимального угла, минимальный угол и 3 сторону треугольника. Подпрограмма для вычисления площади выдает ноль. Остальные подпрограммы выдают значения при Rad (радианах), поэтому третья сторона получается неправильной (например, для 3 4 90 3-я сторона равна 5,8, хотя должно быть 5). Если вводить угол в радианах, то можно получить приближенные значения минимального угла и косинуса, но при вычислении неизвестной стороны выходит большая погрешность (например, при 3 4 1,57 3-я сторона = 3.4688246, а не 5)
Ответы (1 шт):
Программа работает: вместо 90 вводил 1,57 (в радианах). При 1,57 - площадь равна 0, однако при 1.57 равна той площади, которая нужна.