3.9.2 Sub-rotinas

As sub-rotinas também seguem as idéias dos subprogramas que permitem calcular alguma expressão fora do programa principal. As diferenças básicas das funções e das sub-rotinas são a forma de chamada dentro do programa principal e como elas retornam os valores.

Quando desejamos obter um valor de uma função intrínseca ou uma função particular do programador, chamamos a função (que é uma variável) e ela mesma nos retorna um valor.

A utilização de uma sub-rotina consiste inicialmente na chamada que é feita pelo comando call, por exemplo call subroutine pitagoras(ca,co,hip), em que pitagoras é o nome da subrotina e os argumentos ca e co são os valores de entrada e hip são os valores de saída da subrotina.

Note que em uma sub-rotina o nome não retorna o valor e sim uma ou algumas variáveis que estão no argumento que acompanha o nome da subrotina. Em uma function o próprio nome, que é uma variável, é quem retorna algum valor.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! PROGRAMA PARA EXEMPLIFICAR UMA SUBROTINA
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
program prog_sub_1
implicit none
!
real(kind=4) :: ca, co, hip
!
write(*,*)'---> Triangulo Retangulo <---'
write(*,*)'Digite o tamanho do cateto adjacente:'
read(*,*) ca
write(*,*)'Digite o tamanho do cateto oposto:'
read(*,*) co
!
!
! AS VARIAVEIS DO ARGUMENTO DE hipotenusa PODEM SER DIFERENTES DAQUELAS 
! DO ARGUMENTO DA SUBROTINA. O VALOR DA VARIAVEL DEPENDE DA POSICAO QUE 
! ESTA OCUPA ASSIM: 
! ca RECEBE adjacente, co RECEBE oposto, hip RECEBE hipotenusa
!
call hipotenusa(ca,co,hip)
!
write(*,500) hip
500 format('O tamanho da hipotenusa sera: ',f15.6)
!
stop
end program prog_sub_1
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! SUBROTINA QUE CALCULA O VALOR DA HIPOTENUSA
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
subroutine hipotenusa(adjacente,oposto,hipote)
implicit none
!
real(kind=4), intent(in) :: adjacente,oposto
real(kind=4), intent(out) :: hipote
!
hipote = sqrt( adjacente*adjacente + oposto*oposto )
!
! UMA SUBROTINA TERMINA SEMPRE COM O COMANDO RETURN
return
!
end subroutine
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!