728x90
반응형

1. 부프로그램 (subprograms)

특정 연산이나 기능을 발휘할 수 있도록 여러 줄의 명령문으로 구성된 프로그램 단위. 자료값만 다르고 연산과정이 정확히 같은 경우, 주어진 자료값만 바꾸어 연산을 수행할 수 있다.

복잡한 문제를 다루는 경우, 단순한 문제를 개별적으로 고려하여 각각 해결하게 하는 알고리즘을 설계하는 것이 편리하다. 

부프로그램은 이들 각각의 부 알고리즘을 구현하돌고 작성된 것으로 부프로그램을 조합하여 원래 문제를 풀기 위한 완전한 프로그램을 구성하게 된다. 

Fortran에서는 이러한 부프로그램으로 함수와 서브루틴을 제공한다. 실행은 다른 프로그램 유닛에 의해 제어된다. 

  • 주 프로시저 :            program
  • 서브루틴 프로시저 : subroutine
  • 함수 프로시저 :        function
  • 모듈 프로시저 :        module

 

구분 명령문 사용하는 경우 호출
서브루틴
부프로시저
subroutine 하위 프로시저로 전달하는 자료값이 하나 이상이며 Call
상위프로시저로 전달하는 계산한 자료값도 하나 이상일 때
함수
프로시저
Function 하위 프로시저로 전달하는 자료값이 하나 이상이며 내장함수의 사용방법과 같이별도의 호출문이 없다
상위프로시저로 전달하는 계산한 자료값은 하나 일 때
 

2. 함수 부프로그램(Function)

 

Function 함수명(가인수목록) 
   선언부
   실행부
End Function 함수명

함수명은 포트란 지정자로 적합한 어떤 것이라도 가능.

가인수목록은 콤마로 구분되는 지정자목록.

형선언자 Function 함수명(가인수목록)
   선언부
   실행부
End Function 함수명

형선언자는 데이터형의 이름이다. 이 형식에서는 함수가 돌려주는 값의 형도 선언한다.

가인수목록 내의 변수들을 가인수 또는 모조인수라고 하고, 함부 부프로그램으로 정보를 전달해 준다. 함수 부프로그램의 선언부는 주 프로그램 선언부와 같은 형식이다. 추가적으로 아래에 명시된 항목을 가질 수 있다. 

  1. 함수 값의 형
  2. 가인수의 형, 인수의 정보 전달 방식을 알려주는 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
위에서 작성된 부프로그램은 아래 3가지 방법으로 주프로그램에서 받아들여 진다. 
  1. 내부 부프로그램 : 주 프로그램의 end program 문 바로 앞에 부 프로그램을 위치시킴
  2. 모듈 부프로그램 : 모듈 (module) 안에 위치시킴
  3. 외부 부프로그램 : 주프로그램의 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와 RESULT를 붙여 사용한다. 함수 이름 대신 결과변수의 형을 선언함으로써 그 함수의 형이 지정된다. 비재귀 알고리즘으로도 코딩이 가능하나 어떤 문제들(예를 들어, factorial, Hanoi 탑 문제 등)은 재귀가 가장 자연스럽고 직접적인 방법이 될 수 있다. 
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 이 할당된다. 

 
 

과제

1. Factorial 를 계산하는 함수를 작성하시오.
2. -999 표기된 결측 값이 있는 일차 배열을 인풋으로 받아, -999 제거한 평균을 계산하는 프로그램 (함수를 이용!)
3.첫번째 열은 년도, 두번째 열은 기온을 나타낼 때, 정확한 라인 수를 모른다고 가정할 때 다음 three.txt 파일을 읽고, 짝수 해인 경우는 짝수해 들의 기온 평균을, 홀수 해인 경우엔 홀수 해들의 기온 평균을 구하시오.  

 

 
 
728x90
반응형

+ Recent posts