CCCPaste

Cstylefortran

c     Main part
      program main
      implicit none

      common / input / a, b, alpha
      common / utility / PI, beta
      common / flags / is_triangle_created

      real a, b, alpha
      real PI, beta
      logical is_triangle_created
      PI = 3.1415927

      call Menu
      end

c     Menu
      subroutine Menu
      implicit none

      integer command

      common / input / a, b, alpha
      common / utility / PI, beta
      common / flags / 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.

      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 / flags / 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