1. 부프로그램 (subprograms)
복잡한 문제를 다루는 경우, 단순한 문제를 개별적으로 고려하여 각각 해결하게 하는 알고리즘을 설계하는 것이 편리하다.
부프로그램은 이들 각각의 부 알고리즘을 구현하돌고 작성된 것으로 부프로그램을 조합하여 원래 문제를 풀기 위한 완전한 프로그램을 구성하게 된다.
Fortran에서는 이러한 부프로그램으로 함수와 서브루틴을 제공한다. 실행은 다른 프로그램 유닛에 의해 제어된다.
- 주 프로시저 : program
- 서브루틴 프로시저 : subroutine
- 함수 프로시저 : function
- 모듈 프로시저 : module
구분 | 명령문 | 사용하는 경우 | 호출 |
서브루틴 부프로시저 |
subroutine | 하위 프로시저로 전달하는 자료값이 하나 이상이며 | Call 문 |
상위프로시저로 전달하는 계산한 자료값도 하나 이상일 때 | |||
함수 프로시저 |
Function | 하위 프로시저로 전달하는 자료값이 하나 이상이며 | 내장함수의 사용방법과 같이별도의 호출문이 없다 |
상위프로시저로 전달하는 계산한 자료값은 하나 일 때 |
2. 함수 부프로그램(Function)
Function 함수명(가인수목록)
선언부
실행부
End Function 함수명
함수명은 포트란 지정자로 적합한 어떤 것이라도 가능.
가인수목록은 콤마로 구분되는 지정자목록.
형선언자 Function 함수명(가인수목록)
선언부
실행부
End Function 함수명
형선언자는 데이터형의 이름이다. 이 형식에서는 함수가 돌려주는 값의 형도 선언한다.
가인수목록 내의 변수들을 가인수 또는 모조인수라고 하고, 함부 부프로그램으로 정보를 전달해 준다. 함수 부프로그램의 선언부는 주 프로그램 선언부와 같은 형식이다. 추가적으로 아래에 명시된 항목을 가질 수 있다.
- 함수 값의 형
- 가인수의 형, 인수의 정보 전달 방식을 알려주는 Intent 지정자 포함
예문
! 온도변환 프로그램
function Fahr_to_Celsius (Temp)
REAL::Fahr_to_Celsius
REAL, intent(in) :: temp
Fahr_to_Celsius = (temp-32.0) /1.8
end function Fahr_to_Celsius
Fahr_to_Celsius 함수가 실수값을 돌려주기 때문에 실수형(real)으로 선언되었다. 또는 아래와 같이 head에 한꺼번에 선언할 수 있다.
REAL Function Fahr_to_Celsius(Temp)
Temp는 실수형인 가인수로서 단지 함수로 정보만 전달하는데 사용될 것이기 때문에, 이 함수 부프로그램의 선언부에 아래와 같이 선언되어야 한다.
REAL, INTENT(IN) :: Temp
- 내부 부프로그램 : 주 프로그램의 end program 문 바로 앞에 부 프로그램을 위치시킴
- 모듈 부프로그램 : 모듈 (module) 안에 위치시킴
- 외부 부프로그램 : 주프로그램의 End program문의 다음에 위치시킴
내부 부프로그램 사용 예문
program temperature_conversion
implicit none
REAL :: Ftemp, Ctemp
do
write(*,*) "enter a Fahrenheit temperature:“
read*, Ftemp
Ctemp=Fahr_to_Celsius(Ftemp)
print'(1x,2(f6.2,a))', Ftemp,"in Fahrenheit is equivalent to",Ctemp,"in Celcius“
enddo
contains
function Fahr_to_Celsius (Temp)
REAL::Fahr_to_Celsius
REAL, intent(in) :: temp
Fahr_to_Celsius = (temp-32.0) /1.8
end function Fahr_to_Celsius
end program temperature_conversion
외부 부 프로그램 사용 예문
program temperature_conversion
implicit none
REAL :: Ftemp, Ctemp
do
write(*,*) "enter a Fahrenheit temperature:“
read*, Ftemp
Ctemp=Fahr_to_Celsius(Ftemp)
print'(1x,2(f6.2,a))', Ftemp,"in Fahrenheit is equivalent to",Ctemp,"in Celcius“
enddo
end program temperature_conversion
function Fahr_to_Celsius (Temp)
REAL::Fahr_to_Celsius
REAL, intent(in) :: temp
Fahr_to_Celsius = (temp-32.0) /1.8
end function Fahr_to_Celsius
3. 재귀 (Recursive)
RECURSIVE Function 함수명 RESULT
END Function 함수명
RECURSIVE FUNCTION Factorial(n) RESULT(Fact)
integer :: Fact ! result variable
integer, intent(in) :: n
if (n==0) then
Fact = 1
else
Fact = n * factorial(N-1)
end if
END FUNCTION Factorial
예를 들어, 3! 을 계산하기 위한 Factorial(3)의 호출을 생각해 보자. n이 3이면 0 이 아니기 때문에 ( n != 0 ), 귀납단계는 인수 N-1=2 를 가진 또 다른 Factorial(2)을 호출하도록 한다. 원 함수의 호출이 중지되기 전에, 인수 n의 현재 값 3은 실행이 재개될 때, n의 값을 다시 불러올 수 있도록 저장된다. 다시 N -1 = 1 인 Factorial(1)이 호출되고, 그 다음 단계에서 N-1 = 0 이 되면 Factorial(0) 이 되어 n == 0 이므로, 최종적으로 Fact 에 1 이 할당된다.
과제