CCCPaste

5857268ac4156

c     Main menu 
      PROGRAM main
      IMPLICIT NONE

      INTEGER command

      COMMON / input / a, b, alpha
      COMMON / utility / PI, beta
      COMMON / flag / is_triangle_created

      REAL calculate_area, find_min_angle, min_angle_cos
      REAL a, b, alpha
      REAL PI, beta
      LOGICAL is_triangle_created
      is_triangle_created = .FALSE.
      PI = 3.1415927

      PRINT *, '1. Create new triangle.'
      PRINT *, '2. Calculate area.'
      PRINT *, '3. Find minimal angle.'
      PRINT *, '4. Find cosin of minimal angle.'
      PRINT *, '5. Exit.'
c     Delete this 
      PRINT *, '6. (temp) Show triangle params.'
c     Delete this
    1 PRINT *, '>> '

      READ *, command
      IF(.NOT. is_triangle_created .AND.
     + (command .EQ. 2 .OR. command .EQ. 3 .OR. command .EQ. 4)) THEN
         PRINT *, 'Error: triangle is not created.'
         GOTO 1
      ENDIF

      SELECT CASE (command)
      CASE (1)
         CALL input_triangle
      CASE (2)
         PRINT *, 'Area = ', calculate_area()
      CASE (3)
         PRINT *, 'Minimal angle = ', find_min_angle()
      CASE (4)
         PRINT *, 'Minimal angle cosin = ', min_angle_cos()
      CASE (5)
         GOTO 2
      CASE (6)
c     Delete this      
         CALL write_triangle
c     Delete this
      CASE default
         PRINT *, 'Unexpected command'
      END SELECT
      GOTO 1
    2 END

c     Triangle creation
      SUBROUTINE input_triangle
      IMPLICIT NONE
      
      COMMON / input / a, b, alpha
      COMMON / utility / PI, beta
      COMMON / flag / is_triangle_created
      
      REAL a, b, alpha
      REAL PI, beta
      LOGICAL is_triangle_created

    3 PRINT *, 'Enter [a] [b] [alpha]:'
      READ *, a, b, alpha

      IF(a .LE. 0 .OR. b .LE. 0 .OR. alpha .LE. 0 .OR. 
     + (a .LE. b*SIN(alpha * PI/180))) THEN
         PRINT *, 'Error: triangle is not exist'
         GOTO 3
      ENDIF

      is_triangle_created = .TRUE.
      PRINT *, 'Triangle is created'
      END

c     Area calculation
      REAL FUNCTION calculate_area()
      IMPLICIT NONE

      COMMON / input / a, b, alpha
      COMMON / utility / PI, beta

      REAL a, b, alpha
      REAL PI, beta

      beta = ASIN(b/a * SIN(alpha * PI/180)) * 180/PI
      calculate_area = 0.5 * a * b * SIN((180 - beta - alpha) * PI/180)

      RETURN
      END

c     Minimal angle finding
      REAL FUNCTION find_min_angle()
      IMPLICIT NONE

      COMMON / input / a, b, alpha
      COMMON / utility / PI, beta

      REAL a, b, alpha
      REAL PI, beta
      REAL gamma, minv

      beta = ASIN(b/a * SIN(alpha * PI/180)) * 180/PI
      gamma = 180 - alpha - beta

      minv = alpha
      IF (beta .LT. minv) THEN 
         minv = beta
      ENDIF
      IF (gamma .LT. minv) THEN 
         minv = gamma
      ENDIF
      find_min_angle = minv

      RETURN
      END
      
c     Calculate cosin of minimal angle
      REAL FUNCTION min_angle_cos()
      IMPLICIT NONE

      COMMON / input / a, b, alpha
      COMMON / utility / PI, beta

      REAL a, b, alpha
      REAL PI, beta, find_min_angle

      min_angle_cos = COS(find_min_angle() * PI/180)
      END

c     Delete
      SUBROUTINE write_triangle

      COMMON / input / a, b, alpha
      COMMON / utility / PI, beta

      REAL a, b, alpha
      REAL PI, beta

      PRINT *, 'a = ', a
      PRINT *, 'b = ', b
      PRINT *, 'alpha = ', alpha

      END
c     Delete