Как найти ошибки алгоритма в этом коде?

  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 шт):

Автор решения: Rafale

Программа работает: вместо 90 вводил 1,57 (в радианах). При 1,57 - площадь равна 0, однако при 1.57 равна той площади, которая нужна.

→ Ссылка