CCCPaste

Forstyle

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**2 .LE. (b*SIN(alpha))**2)) 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, gamma

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

      IF (alpha .LE. beta .AND. alpha .LE. gamma) THEN
         find_min_angle = alpha  
      ELSEIF (beta .LE. alpha .AND. beta .LE. gamma) THEN
         find_min_angle = beta
      ELSE
         find_min_angle = gamma
      ENDIF

      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