서브로틴 (Subroutine) 부프로그램
포트란에서는 함수와 서브루틴 2가지 형태의 부프로그램을 제공한다.
Subroutine 서브루틴명(가인수목록)
선언부
실행부
End subroutine 서브루틴명
call 서브루틴명 (실인수들)
함수와 서브푸틴의 공통점
- 다른 프로그램 단위의 제어 아래에서 특정 임무를 수행하기 위해 설게된 프로그램 단위
- 동일한 프로그램의 구성을 가진다. (머리말, 선언부, 실행부, end 문)
- 내부, 모듈, 외부 부프로그램 중 하나가 된다.
- 유효 범위 규칙이 적용된다.
- 타 부프로그램의 인수로서 사용될 수 있다.
- 재귀 기능을 구현할 수 있다.
함수와 서브루틴의 차이점
- 함수는 그것을 인용한 프로그램 단위에 하나의 값을 돌려주지만, 서브루틴은 하나 이상의 값을 돌려주거나 돌려주는 값이 없이 메시지만 출력하기도 한다.
- 함수는 함수이름을 통해서 값을 돌려주지만, 서브루틴은 인수를 통해 값을 돌려준다.
- 함수는 식에서 함수이름을 사용하는 것으로 호출할 수 있으나, 서브루틴은 CALL 문으로 호출하다.
예제1 각도 변환
1. 극좌표를 직교좌표로 변환하여 출력하는 프로그램을 작성하시오.
! 극좌표를 직교좌표로 변환
Program ploar_to_rect
Implicit none
Real :: Rcoord, Tcoord, Xcoord, Ycoord
Read*, Rcoord, Tcoord
Call covert_to_rectangular(Rcoord,Tcoord,Xcoord,Ycoord)
Print*, Xcoord, Ycoord
pause
Contains
Subroutine covert_to_rectangular(R,Theta,X,Y)
Real , intent(in):: R, Theta
Real, intent(out) :: X, Y
X = R * COS(theta) ; Y = R * SIN(theta)
End subroutine covert_to_rectangular
End program ploar_to_rect
해설
Call covert_to_rectangular(Rcoord, Tcoord, Xcoord, Ycoord) 이 실행될때, 실인수 Rcoord와 Tcoord 의 값은 각각 가인수 R과 Theta 에 전달된다. 따라서, (Rcoord, Tcoord, Xcoord, Ycoord) 와 (R, Theta, X, Y) 처럼 인수명은 달라도 형선언은 반드시 같아야 한다.
R과 Theta는 값을 받아들여 서브루틴 내에서 사용될 값이기 때문에, IN속성의 인수로 선언되었다.
IN속성은 서브루틴을 호출한 프로그램에 해로운 값들을 반환하려는 의도가 없으므로, 서브루틴 내에서 어떠한 새로운 값도 할당되지 않는다.
가인수 X와 Y는 호출프로그램에 단지 어떤 값을 되돌려 주도록 의도하고 프로그램을 설계하였기 때문데, INTENT(OUT) 속성을 가지도록 선언하였다. INTENT(OUT) 으로 선언되면 X, Y 값이 계산되고 서브루틴의 실행이 완료되면, 이 값들은 각각 대응하는 실인수인 Xcoord, Ycoord 로 반환된다.
실인수 가인수
Rcoord ------> R
Tcoord ------> Theta
Xcoord <------ X
Ycoord <------ Y
만약, INTENT(INOUT)속성으로 선언되면, 인수는 서브루틴의 양방향으로 정보를 전달하기 위해 사용된다.
실인수 <------> 가인수
OUT, INOUT 인수는 호출프로그램에 값을 돌려주도록 의도되었기 때문에, 대응하는 실인수는 변수이어야 한다.
2. 위 코드를 외부 서브루틴으로 작성하시오.
! 극좌표를 직교좌표로 변환 외부 서브루틴 이용
Program ploar_to_rect
Implicit none
Interface
Subroutine covert_to_rectangular(R,Theta,X,Y)
Real , intent(in):: R, Theta
Real, intent(out) :: X, Y
End subroutine covert_to_rectangular
End interface
Real :: rcoord, tcoord, xcoord, ycoord
Read*, rcoord, tcoord
Call covert_to_rectangular(rcoord,tcoord,xcoord,ycoord)
Print*, xcoord, ycoord
End program ploar_to_rect
Subroutine covert_to_rectangular(R,Theta,X,Y)
Real , intent(in):: R, Theta
Real, intent(out) :: X, Y
X = R * COS(theta) ; Y = R * SIN(theta)
End subroutine covert_to_rectangular
3. 위 서브루틴 프로그램을 함수를 이용해서 작성하시오.
Program ploar_to_rect
Implicit none
Real :: rcoord, tcoord, xcoord, ycoord
Read*, rcoord, tcoord
Print*, covert_to_rectangular(rcoord,tcoord)
contains
function covert_to_rectangular(R,Theta)
Real , intent(in):: R, Theta
Real ,dimension(2):: covert_to_rectangular
covert_to_rectangular(1) = R * COS(theta)
covert_to_rectangular(2) = R * SIN(theta)
End function covert_to_rectangular
End program ploar_to_rect
과제
1. 아래 값들의 합을 계산하는 프로그램을 서브루틴을 이용하여 작성하시오.
1~1000
1001~2000
2001~3000
3001~4000
…..
9001~10000
2. -999로 표기된 결측 값이 있는 일차 배열을 인풋으로 받아, -999를 제거한 평균을 계산하는 프로그램 (서브루틴 이용)
3. 어떤 각의 도 분 초 를 입력받아, 10진수 각도 (degree) 로 변환하여 출력하는 프로그램을 작성하시오.
풀이