728x90
반응형

!! 포트란95는 구조화된 프로그래밍이 가능하다.

 

구조의 종류 

  1.  프로시저구조 
  2. 변수선언구조 (type)
  3. 선택구조 (if-then-elseif-then-else-endif)
  4. 순환구조 (do-loop, do-while, forall)

 

1. 프로시저구조

프로시저는 특정 기능을 발휘하는 프로그램 단위나 블록을 의미

대표적인 프로시저: program, subroutine, function, module, block data

 

내부 프로시저

  • 내부 프로시저는 contains로 호출한다.
  • 내부 프로시저 내에서 서브루틴과 함수 프로시저를 사용할 수 있다.
  • 내부 프로시저는 호출하는 프로시저의 변수명을 고유할 수 있다. 
  • 내부 프로시저는 호출하는 프로시저에만 작용할 수 있다. 
  • 내부 프로시저 내에서 독립적인 변수 선언도 가능하다
  • 모든 내부 프로시저를 외부 프로시저로 작성할 수도 있다.

 

외부 프로시저

  • 외부 프로시저로 작성하면 모듈 프로시저를 반드시 호출하여 인수로서 자료값을 전달할 수 있고, 이 값들의 기억장소만 공유할 수 있다. 
  • 외부 프로시저는하나의 프로그램 단위이므로 독립적으로 컴파일 된다. 

 

 

 

 

2. 변수형 선언구조

사용자가 직접 사용할 변수를 정의하는 선언문들을 하나의 블록에 모아 작성한 프로그램 구조

종류:

1) 모듈 프로시저 (부프로시저들을 하나의 구조로 작성한 module)

    변수, 배열, 부프로그램, 함수 프로시저도 선언할 수 있다.

    각 프로시저에서 use 문으로 호출하여, 모듈 프로시저에서 정의한 변수 및 프로시저를 사용할 수 있다. 

2) 파생형 변수 선언구조

 

 

 

 

3. 변수형

기본 5가지:     integer, real, complex, chracter

복소수형 변수는 실수부와 허수부를 각각 4, 8, 16 바이트로 선언할 수 있다. 

배정도 실수형 변수 선언을 위한 logical, double precision

기본 5가지 변수형을 이용하여 변수 속의 변수를 선언하는 파생변수 선언구조 (파생형) 를 작성할 수 있다. 예를 들어, 성적표를 작성하는 프로그램의 경우, 학번(정수형), 이름(문자형), 과목당 성적(실수형), 총점과 평균 (실수형), 학점(문자형)의 복합적인 변수형을 임의로 선언할 수 있다. 이때, 변수(a) 속의 변수값(b)을 사용할 때는 특수문자 %를 사용하여 a%b 로 표기하여 변수속의 변수값에 접근할 수 있다 (예제 생략)

 

 

 


! 변수선언구조를 이용한 프로그램의 사용예
module username
    implicit none
    real(kind=16) :: a, b, c    ! 4배정도 실수형 변수 선언
end module username

program mainprocedure
    use username     ! use문은 작성 우선순위가 높아 반드시 implicit none 보다 먼저 위치해야 함.
    implicit none

    ! 변수 선언부
    real(kind=16) :: d
    write(*,*) a, b, c
    read(*,*) a, b, c

    

    d = b * b -4 * a * c   ! 판별식
    write(*,*) d
    if (d < 0) then
        call complexroots
    else
        call realroots
    end if

 

    pause
    
    
    contains        ! 내부 프로시저를 호출
        subroutine realroots  
            implicit none
            real(kind=16) :: r1, r2
            if (d > 0) then 
                r1 = (-b + sqrt(d))/(2*a) 
                r2 = (-b - sqrt(d))/(2*a)
            else
                r1 = -b/(2*a)
                r2 = r1
            end if 
            write(*,*) ' roots : ' , r1, r2
        end subroutine realroots
        subroutine complexroots
            implicit none
            real(kind=16) :: r1, r2
            r1 = cmplx(-b/(2*a), sqrt(-d)/(2*a))
            r2 = cmplx(-b/(2*a), sqrt(-d)/(2*a))
            write(*,*) ' coplex roots : ' ,r1, r2
        end subroutine complexroots

end program mainprocedure

 

 

728x90
반응형

+ Recent posts