728x90
반응형
입력문 : 변수값들을 입력 - read
  • 표준입력문 : 키보드로 입력
출력문 : 변수값들을 출력 – print / write
  • 표준출력문 : 화면으로 출력

입력(input)과 출력(output) - 자동서식 입출력문

1. 입력문

형식

read *, input-list    
또는
read(* , *)  input-list

  input-list에는 변수 등이 올 수 있고,  input값들은 키보드를 통해서 입력되고 input-list에 할당된다.

  프로그램이 실행 중 read문을 만나면, input-list의 모든 변수값의 입력이 될 때까지, 프로그램 실행은 일시 중지되고, 입력이 완료되면 다음 실행지점으로 자동 이동한다. 

input 값을 입력할 때의 규칙

1. read문이 실행될 때 마다, 입력대기 줄(line)에 데이터를 입력할 수 있다.

2. 입력목록의 변수 갯수 보다 입력된 데이터 수가 적으면, input-list의 모든 변수에 값이 입력될 때까지 새로운 줄을 만들고 입력을 대기한다. 

3. 입력목록의 변수 갯수 보다 입력된 데이터 수가 많으면, 먼저 입력된 데이터 순서로 입력되고 나머지 데이터는 무시된다. 

4. 입력될 자료는 input-list에 있는 변수들과 갯수 및 데이터형이 일치해야 한다.단, 정수와 실수 형을 따르지 않으면 형선언에 따라 자동 변환된다.

5. 입력 대기 줄에서 연속되는 데이터 입력은 콤마( , )나 하나 이상의 공백으로 구분해야 한다. 

 

수치형 자료 입력

read*, x, y, z  
!   => 입력창에서 10., 20., 30.  을 입력하면
!   => x=10. y=20. z=30.                        
read*, velocity, distance 
!   => 입력창에서 20.5, 500., 40.  을 입력하면
    => velocity =20.5 distance=500. (40은 무시)
character(8) :: unit_1, unit_2
read*, unit_1, unit_2
!   => 입력창에서 meter, centimeter 입력
!   => unit_1 = “meter   “
!   => unit_2 = “centimeter”

  

문자형 자료 입력

문자열도 자동서식 입력을 이용할 수 있다. 그러나, 다음의 경우 따옴표(' ') 나 쌍따옴표(" ")로 묶어야 한다. 

1. 문자열의 길이가 한 줄을 넘는 경우

2. 문자열이 빈칸, 콤마( , ), 사선( / )을 포함하고 있는 경우

3. 문자열이 생략부호, 쌍따옴표, period( . ) 로 시작하고 asterisk(*) 가 이어 나오는 경우

 

   character(7) :: chr_1, chr_2

   read *, chr_1, chr_2

 

   입력창에 다음과 같이 입력하면 

    meter, kilometer 

 

    chr_1에는 "meter฿฿", chr_2에는 "kilomet"이 입력(할당)된다.

 

2. 출력문

output 형식

   print *, output-list, ...     
   또는
   write (*,*) output-list, ...

   output-list 에는 변수, 문자형 상수, 수식 등이 올 수 있다.  output-list 없이 사용하면 빈 줄이 출력된다. 

 

예문1

distance=500
print*,distance
print*, “distance is”, distance
print*, “distance  is”, distance, “meters.”

예문2

   print *, "The speed of sound is ", velocity, " m/sec."
   print *, "The distance of travel is ", distance, " m."

 출력 

   The speed of sound is 340.0 m/sec.
   The distance of travel is 1000.0 m.

 

 

 

>>>>> 연습문제 p47

 

728x90
반응형
728x90
반응형

할당문 (Assignment statement) 또는 대입문

변수(v)에 식(e)을 부여하는데 아래와 같은 형식을 사용

                                   v = e

 

정수형, 실수형 변수 할당

   real :: xloc, yloc

   integer :: number, calc

 

   xloc = 5.23

   yloc = sqrt(25.0)              ! yloc 에 5.0이 할당

   number = 20                    ! number 에는 20이 할당

   calc = number / 4+1         ! calc에 5가 할당

   xloc =  2.0 *  xloc              ! xloc 에 10.46이 할당

 

선언된 변수형에 따라, 변수 내 할당된 값이 달라질 수 있음에 유의해야 한다. 

   real :: a, b 

   a = 3                           !  a는 실수형 변수이므로 a에 3.0이 할당된다. 

 

   iron = 3.14    ! iron 에 3이 할당. implicit none을 선언하지 않았으므로 explicit 규칙을 따름

   kiss = 4.0/2.0  ! kiss 에 2가 할당

 

 

문자형 변수 할당

  character(5) :: string, over, less*10

  string = "Alpha"        ! string 에 "Alpha"가 할당.

 

  string(3 : 5) = "ter"    ! 또는 string(3 : ) = "ter"

  string에 할당된 "Alpha"를  "Alter" 로 변경시킴

 주의: 대입문 오른쪽에 인용된 문자식에 포함된 위치에는 새로운 값이 할당될 수 없다. 

  string(2 : 3) = string(4 : 5)는 가능하지만, 

  string(2 : 4) = string(3 : 5) 는 불가능. 왜냐하면 참고되는 내부 문자열이 수정되는 내부 문자열과 중복되기 때문

 

 

문자형의 경우, 선언된 변수의 길이는 할당되는 값의 길이와 같다. 만약 문자열의 길이가 선언된 길이보다 작으면 공백으로 채우고, 선언된 길이보다 크면 잘리게 된다. 

  less = "particle"         ! less에는 "particle฿฿" 가 할당됨. (฿는 공백)

  over = "concentration"    ! over 에는 "conce" 가 할당됨

 

예문

program print_name
      character :: fname = "Park"
      character(2) :: iname = "Park"
      character(3) :: jname = "Park"
      character(3) :: kname = "park"

      print *, fname
      print *, iname
      print *, jname
      print *, kname
   end program print_name

 

 

 

728x90
반응형
728x90
반응형

연산(Operation)과 함수(Function)

연산자

  • 산술연산자  ( **, *, /, +, -  )
  • 관계연산자  ( ==, /=, >=, <=, > , < )
  • 논리연산자   (.not. , .and. , .or. , .eqv. , .neqv.  )
  • 문자연산자  ( // )
* 연산자들의 계산 우선 순위: 산술연산자, 관계연산자, 논리연산자
 
산술식: 산술연산자 ( **, *, /, +, - ) 와 결합된 표현식
관계식: 관계연산자(==, /=, >=, <=, > , < ) 와 결합된 표현식
논리식: 논리연산자 (.not. , .and. , .or. , .eqv. , .neqv.  ) 와 결합된 표현식
문자식: 문자연산자(//)와 결합된 표현식

 

기호 우선순위 이름 사용법
수학식 Fortran 표기
( ) 1 괄호 a+b(x+y) a+b*(x+y)
** 2 거듭제곱 xa x**a
* 3 곱셈 a x b a * b
/ 나눗셈 a a/b
b
+ 4 덧셈 a+b a+b
- 뺄셈 a-b a-b

 

수치연산

주의: 

산술연산을 하면 결과는 피연산자의 유형과 같아진다.

3 + 4    => 7

3.0 + 4.0  => 7.0

 

9.0 / 4.0    => 2.25

9/4    => 2

 

1.0 / 2.0    => 0.5

1/2.0    => 0

 

정수와 실수를 혼합해서 사용하면, 정수는 실수로 전환되고 결과도 실수형이 된다. 

아래는 같은 연산이지만 결과가 다른 예이다. 

3.0 + 8 / 5    =>    3.0 + 1            =>    3.0 + 1.0    =>   4.0

3 + 8.5 / 5    =>    3 + 8.0 / 5.0    =>    3 + 1.6       =>   3.0 + 1.6      =>   4.6

 

2.0 ** 3       =>    2.0 * 2.0 * 2.0    => 8.0

(-4.0) ** 2   =>    (-4.0) * (-4.0)       => 16.0

(7.0) ** (1/2) 는 (7.0) ** 0 = 1.0 으로 계산될 수 있다. 주의!

 

산술 표현의 우선순위 규칙

1. 모든 지수계산은 제일 먼저 실행된다. 연속적인 지수항은 오른쪽에서 왼쪽 순서로 실행

2. 그 다음으로 곱셈과 나뭇셈이 왼쪽에서 오른쪽으로 실행된다.

3. 마지막으로 덧셈, 뺄셈이 왼쪽에서 오른쪽으로 실행된다. 

 

 

 

문자연산 (Character operation)

두개의 문자열을 결합하려면 연결연산자 (//)를 사용한다. 

예) "Kilo" // "meters" => "Kilometers"

 

문자열에서 특정 문자를 추출하는 경우, 

   character(4) :: last_name = "Park"

   character(11) :: first_name = "Chang-Hyoun"

   print *, first_name//" "//last_name

 

   source = "sugar"

   source(:3) => "sug" 값을 가짐

   source(4:) => "ar฿฿" 값을 가짐 (฿은 공백을 의미)

 

내장함수 또는 수치함수(Numerical Functions)

포트란 내장함수

  • abs(x) x의 절대값
  • cos(x) x 라디안의 코사인 함수 값
  • sin(x)
  • tan(x)
  • exp(x) 지수함수
  • int(x) x의 정수부
  • fraction(x) x의 소수부
  • floor(x) x보다 작거나 같은 가장 큰 정수
  • log(x) x의 자연로그
  • mod(x,y)  int(x/y) * y
  • nint(x) x에 가장 가까운 정수
  • real(x) x를 실수형으로 변환
  • float(x) x를 실수형으로 변환
  • sqrt(x) x의 제곱근
  • max(x1, x2, x3, ...) 최대값
  • min(x1, x2, x3, ...) 최소값

 

연습문제

1. 주어진 표현식의 결과를 구하여라
  • 2+3/5
  • (2+3)**2
  • 25.01**1/2
  • (2.0 + 3**2 ) /( 8-2+1)
  • abs (1-2-4)
  • int (5.0 + 4.0/ 3.0 )
  • “one”//”two”

2. 다음과 같이 변수가 주어졌을 때, 다음 표현식의 결과?

    TWO=2.0

    THREE=3.0

    FOUR=4.0

    IntEight=8

    IntFive=5

    Str_1 = For

    Str_2 = tran

    Label_1=foot

    Label_2=lbs

 

1)    TWO+THREE * THREE

2)    IntFive/3

3)    (THREE+TWO/ FOUR )**2

4)    IntFive**2 / TWO**2

5)    Str_1//Str_2//-90

6)    Label_1// //Label_2

7)    Str_2(2:3)//ndom

 

 

3. 다음 식을 fortran 표현식으로 써라

1) 10+5B-4AC
2) A2 + B2 – 2AB cos T
 
4. 다음 식의 계산값을 구하는 프로그램을 작성하라. 
   Y=7x4 + 3x3 + 4x2 + 2x + 1

   x=40, y=?

 
 
728x90
반응형
728x90
반응형

Fortran의 기본적인 5가지 데이터 유형

수치형 상수 

  • 정수형 integer
  • 실수형 real
  • 복소수형 complex

비수치형 상수 

  • 문자형 character
  • 논리형 logical

 

사용 예

 

  정수형 실수형
고정형 지수형
바른 예 0
137
-2315
+17745
1.234
-0.01536
+56473.
3.372E2
0.3372E3
337.2E0
33720E-2
잘못된 예 9,999
16.0
--5
7-
12,345
63

 

  문자형 (문자열) 논리형
바른 예 PDQ123-A
‘C.H. Park
Dont
.TRUE.
.FALSE.
잘못된 예 PDQ123-A
Dont

.T.
.F.
True
False

 

정수형

소수점(.), 콤마(,)를 갖지 않는 십진수

 

실수형

십진수나 지수표현으로 나타냄.

소수점(.)은 허용되나 콤마(,)는 허용되지 않음.

예) 2.37456E2, 23745.6E-2 모두 2.37456x10^2을 의미

 

문자열 (또는 문자형 상수)

쌍따옴표(" ") 또는 따옴표(' ')로 둘러싸야함.

상수의 길이는 문자의 갯수이고 공백도 문자로 포함시킴.

예) "C.H. Park", "Don't"

 

 

변수 (Variable)

수치형 변수 

  • 정수형 integer
  • 실수형 real
  • 복소수형 complex

비수치형 변수 

  • 문자형 character
  • 논리형 logical

형식

     형선언 :: 변수명1, 변수명2, ...

      형선언 :: 변수명1 = 값1, 변수명2 = 값2, ...

 

컴파일러는 변수를 메모리 위치와 연결시킨다. 어떤 변수의 값은 연결된 메모리에 저장되어 있는 값이다.

각 변수에 대해서 부여되는 값의 유형을 정하기 위해서 형선언을 사용한다. 

변수는 주어진 데이터 유형에 맞게 사용되어야 하고, 그렇지 않으면 프로그램이 올바로 작동하지 않을 수 있다. 따라서, 개개의 변수형을 정확히 지정하는 것은 매우 중요하다. 이렇게 하지 않으면, 서로 다른 유형의 값이 결합(연산)되거나 어떤 변수에 그 변수형과 다른 형의 값이 할당되면 혼합모드 오류(mixed-mode error)를 야기할 수 있다. 

 

변수명 작성 규칙 

첫 글자는 반드시 영문자로 시작하고 30개까지의 문자, 숫자, 밑줄(_)로 구성할 수 있으나 나머지 특수문자 사용 불가. 

Fortran은 문자형 외에는 상수 대소문자를 구분하지 않는다.

예) Lightening_McQueen

 

예문 

    integer :: record_number, ...

    real :: temperature_1st, pressure_sfc

    character(len = 15) :: first_name, last_name, ...

    character(len=15) :: initial*12  이라고 지정하면 변수 initial 의 크기는 20이 아니고 12이다. 

    logical :: True_or_False

 

implicit none 문

Fortran은 내부적으로 지정자(또는 변수명)가 i,j,k,l,m,n 으로 시작하면 그 지정자는 자동으로 정수형으로 지정되고, 그 외 문자는 실수형으로 지정된다. 따라서, 이런 내부 명명 규칙을 무력화 시키기 위해서 implicit none 문을 사용한다. Fortran 77 때 부터 지정된 규칙이므로, implicit none 문을 사용해서 명시적으로 형을 선언하겠다고 하고 프로그래밍하도록 한다.

 

변수 초기화 

변수는 초기에 정의되지 않은 상태이므로 초기화가 필요하다. 초기화를 하지 않은 경우 잘 못 된 값이 계산될 수 있다. 

예문

    integer :: numvalues=1, Sum=0  

    real :: W=1.0, X=2.5, Y=7.73, Z=-2.956

    character(len=9) :: name =“C. H. Park

    logical :: flag = .true.

 

명명된 상수 : parameter 속성

어떤 상수는 주어진 이름을 가지고 있다. 예를 들어 "pi"는 원주율 상수 3.141592... , "e"는 2.71828... 이다. 

아래와 같이  parameter 속성을 부여함으로 명명된 상수로 지정하는 것을 허용할 수 있다.

이는 프로그램 전체에서 사용할 상수를 지정해서 상수명만 불러오면 되므로, 숫자가 바뀌면 모든 값이 자동으로 변하기 때문에 프로그래밍이 간단해 진다. 

    integer,  parameter :: limit = 30

    real, parameter :: pi = 3.141592, TwoPi = 2.0 * pi

    character(2), parameter :: units = "km"

    character(*), parameter :: units= "km" 

               !여기서 별표(*)는  명명된 문자형 상수(unit)의 길이가 할당된 문자열 상수 ("km") 의 길이인 2라는 뜻이다. 

 

 

 

선언문 

implicit none 문

   Default 형선언 (i,j,k,l,m,n 으로 시작하는 모든 변수는 정수형 변수임)을 사용하지 않고, 사용자 위주의 형선언을 사용하기 위한 명령문

형식

    program  program_name

        implicit none

 

상수 선언문 - parameter  문

    pi = 3.141592 와 같이 항상 동일한 값(상수)로 사용되는 변수를 선언할 때 사용 
형식 
    형선언, parameter :: 변수명 = 값
예문
    real, parameter :: pi = 3.14
    character(2), parameter :: units = "km"
 

 

연습문제 

1. 재코딩하기

    program reformatting; integer :: degreef &

        , degreec ; read *, &

         degreef ; degreec &

          =5*(degreef-32)/9; print*, &

          degreec; end program reformatting

 

 

2. 선언문 중 잘못된 부분 수정

1) ReAl :: x

2) CHARACTER :: name

3) CHARACTER(LEN=10) :: name

4) REAL :: var-1

5) integer :: 2a

6) logical :: wibble = .true.

7) logical (len=12) :: frisnet

8)character(len=6) :: you_know = yknow

9) integer :: ia ib ic id

 

name type initial value
feet   
miles  
town
home_town
in_Busan
sin_half
integer 
real
character (< 20 letters)
character ( < 20 letters)
logical 
real



your home town 
is your home town in Busan?
0.47942

 

 

 

 

 

 

728x90
반응형
728x90
반응형

Fortran 프로그램의 일반적인 형식

형식

program 프로그램명
    선언 부분
    실행 부분
    부프로그램 부분
end program 프로그램명

 

예문

program Example
    implicit none
    
    real :: distance, velocity,  &
            time
    real :: list
    integer :: list
    character(len = n ) :: list       ! 또는
    character( n ) :: list
    
    형선언자 :: v_1 = e_1, .... , v_n = c_n
    형선언자, parameter :: n_1 = c1, ... n_n = c_n

    read *, input-list
    print *, output-list
 
    stop


end program Example

 

포트란95 기본 코딩 방법

  1. 포트란은 영문 대소문자 구분하지 않음. 
  2. 사용가능한 특수문자 (=  +  -  *  /  (  )  ,  .     !  $  :  ;  %  &  <  >  ?  \  _)
  3. 하나의 프로그래밍 line은 최대 132 문자까지 작성가능. 1~132 컬럼 사이에서 자유롭게 작성
  4. line과 line을 연결하기 위해서는 앰퍼샌드( & )를 첫 줄 맨앞과 다음 줄 맨 뒤에 사용. 최대 39개 줄까지 연결 가능
  5. 하나의 line에 하나 이상의 명령문을 포함하려면 세미콜론( ; )으로 구분한다. 
  6. 느낌표( ! ) 뒤의 내용은 주석이다. 
  7. 문번호가 필요하면 모든 문장의 맨 먼저 나와야 하고, 1~99999 정수를 사용할 수 있다. 
  8. 문법적 오류 감소를 위해서 각 변수 하나하나를 변수명, 변수형, 변수의 기억 장소 크기 등을 사용자가 철저히 명시적으로 정의할 것. implicit none 을 사용하면, 명시적 선언이 우선하게 됨.
  9. 다층화 및 블록화 시킨 변수구조형 선언 (do순환구조나 블록 if 구조를 사용하여 프로그램의 블록화 또는 구조화 가능)
  10. 철저한 구조화 프로그램 작성
  11. 문번호의 사용 제한 (문번호 사용하지 말것!)

프로시저를 이용한 포트란 코딩 법

  • 프로시저의 시작문 (module, program, subroutine, function, block data)
  • 선언문(use 문, implicit none 문, 변수 선언문, ...)
  • 실행문 (표현식, 선택구조, 순환구조, ...)
  •  프로시저의 종료문 (end 문)
  1. 내부 프로시저는 반드시 상위 프로시저에서만 사용가능
  2. 외부 프로시저는 별도로 컴파일되는 독립 프로시저.  반드시 주프로시저 밖에서 작성함.    
  3. 프로시저 종료는 반드시 end 문 사용
  4. 각 프로시저에서 모듈을 호출할때는 use 문 사용하고, 프로시저 시작문 바로 다음 줄에 작성해야 함.
  5. 사용자가 변수 형과 속성을 정의하고 사용하겠다는 의미로 반드시 implicit none 문을 사용
  6. 변수선언은 변수형 :: 변수명들 로 표기한다. 이중 콜론(::)은 변수형과 변수명을 구분하는 용도

예문

!모듈 프로시저 (반드시 주프로그램 앞에 위치해야)
    module variablegroup
    implicit none
    integer :: i, j
    real(kind=16) :: a, b
    end module variablegroup
    
! 주 프로시저 (모든  연산과정을 제어하는 기능)
    program mainprocedure
    use variablegroup
    implicit none
    integer :: k
    real(kind=16) :: c     
    i=1; j=2; a=3; b=4
    call internalprocedure(c)
    call externalprocedure(k)
    write(*, "(' a+b = ', f10.2)") c
    write(*, "(' +j=', i10)") k     
    contains  ! 이하 프로그램이 내부 프로시저임을 나타내는 명령어

       ! 내부 프로시저 (주 프로시저의 일부분에 해당하는 프로시저)
        subroutine internalprocedure(d)
        use variablegroup  !주 프로시저와 공유하므로 생략 가능
        implicit none           !주 프로시저와 공유하므로 생략 가능
        real(kind=16) :: d
        d=a+b
        end subroutine internalprocedure     
    end program mainprocedure

! 외부 프로시저
    subroutine externalprocedure(p)
    use variablegroup
    implicit none
    integer :: p
    p=i+j
    end subroutine externalprocedure

 

728x90
반응형
728x90
반응형

순환구조의 종류

1. DO (횟수 제어 순환구조)

    (구조명 : ) do [var = 초기값, 끝값, (증분)]

                          실행문

                      end do

do 이후 [ ] 내용이 없는 구조도 가능

 

2. DO WHILE (조건적 순환구조)

    (구조명 : )  do while (조건)

                           실행문

                      end do 

 

 

 

!! f(x) = x^3 + 4x^2 - 10 = 0 근을 bisection method (이분법) 로 계산하는 프로그램(2)

program bisection
    implicit none
    integer :: i, maxit    ! 4바이트 정수형 선언
    real(kind=16) :: a, b, x, p, fa, fb, fp, tol, f    ! 16바이트 실수형 선언

    f(x) = ( x + 4 ) * x * x - 10       !   문함수로서 프로시저 내에서의 한줄 함수식을 표현
10  print *, ' type a and b : '
    read *, a, b
!! 이하 이분법 계산과정    
    if ( a > b ) then 
        x = a
        a = b
        b = x
    end if
    fa = f(a)
    fb = f(b)
    if ( fa * fb > 0.0 ) then 
        print *, 'f(a) and f(b) have same signs ! ' 
        goto 10
    else
        print *, ' Input tolerance '
        read *, tol
        print *, ' Input maximum number of iterations ' 
        read *, maxit
    end if


loop : do while (abs(fp) > 1.0e-20 .and. (b-a)/2 < tol .and. i <= maxit ) 
            i = i + 1    
            print *, ' ** p, i, f(p) ' , p, i, f(p)
            
inner :     if (fa * fp > 0) then        ! 구조명 inner 인 순환구조 시작
                a = p         
                fa = fp    
            else        
                b = p         
                fb = p    
            end if inner        
            p = a + (b-a)/2 
            fp = f(p)
          end do loop    
end program bisection


       


    

DO WHILE 순환구조

구조명 : do while (조건)

           실행문들 ...

              end do 구조명

 

조건의 자료값이 참일때만 실행

728x90
반응형
728x90
반응형

순환구조의 종류

1. DO (횟수 제어 순환구조)

    (구조명 : ) do [var = 초기값, 끝값, (증분)]

                          실행문

                      end do

do 이후 [ ] 내용이 없는 구조도 가능

 

2. DO WHILE (조건적 순환구조)

    (구조명 : )  do while (조건)

                           실행문

                      end do 

 

 

 

(예제)

f(x) = x^3 + 4x^2 - 10 = 0 근을 bisection method (이분법) 로 계산하는 프로그램
이분법 계산과정


1) 입력한 양 끝단점  a,b의 함수 f(a), f(b)의 부호가 같으면 a,b 사이에 근이 없다. 
2) f(a), f(b)의 부호가 다르면 a, b, 사이에 근이 존재
3) 근이 있는 경우, 중앙점 p를 계산하고 함수 f(p)를 계산한다. 
4) f(a)와f(p)의 부호가 같으면, 근은 p와 b사이에 존재하므로 p를 a라 놓고 다시 계산
5) f(a)와f(p)의 부호가 다르면, 근은 p와 a사이에 존재하므로 p를 b라 놓고 다시 계산
6) 근이 있는 점들의 간격이 허용치보다 작으면 계산은 종료
7) 반복횟구가 허용치를 넘어도 계산 종료
8) 함수 f(p)가 0에 가까우면 p가 근이 되므로 계산 종료. 

    
    program mainprocedure
    implicit none
    integer :: i, maxit    ! 4바이트 정수형 선언
    real(kind=16) :: a, b, x, p, fa, fb, fp, tol, f    ! 16바이트 실수형 선언

    f(x) = ( x + 4 ) * x * x - 10       !   문함수로서 프로시저 내에서의 한줄 함수식을 표현
10  print *, ' type a and b : '
    read *, a, b
!! 이하 이분법 계산과정    
    if ( a > b ) then 
        x = a
        a = b
        b = x
    end if
    fa = f(a)
    fb = f(b)
    if ( fa * fb > 0.0 ) then 
        print *, 'f(a) and f(b) have same signs ! ' 
        goto 10
    else
        print *, ' Input tolerance '
        read *, tol
        print *, ' Input maximum number of iterations ' 
        read *, maxit
    end if


loop : do i = 1, maxit         ! 구조명 loop 인 순환구조 시작. 다중 구조의 경우, 구조명으로 분리하는게 편리
        p = a + ( b - a ) /2 
        fp = f(p)

outer : if(abs(fp) <= 1.0e-20 .or. (b-a)/2 < tol) then  ! 구조명 outer 인 순환구조 시작
            print *, ' Final results ' 
            print *, 'p, i, tol ', p, i, tol
            exit loop                ! 순환구조를 완전히 벗어나는 분기 명령어
        else
            print *, 'p, i, tol ', p, i, tol    
inner :     if (fa*fp > 0) then        ! 구조명 inner 인 순환구조 시작
                a = p         
                fa = fp    
            else        
                b = p         
                fb = p    
            end if inner        
        end if outer
end do loop    
pause
end program mainprocedure
728x90
반응형
728x90
반응형

Select Case 문 

program mainprocedure
    implicit none
    intrinsic modulo           
    ! modulo(a,b)는 a를 b로 나눌때 나머지를 계산하는 내장함수. 값이 0이면 a는 b의 배수임.
    integer :: year, month, days
    
10  print *, ' type year and month ? '    
    ! print * 은 표준 출력장치(화면)을 사용할 경우. write(*,*)와 같은 의미
    if (year <= 0)   
    
    select case (month)
        case (4,6,9,11)
        days = 30
    case (2)
        if (modulo(year, 4) == 4) then 
            days = 29
        else 
            days = 28
        end if
    case default
        days = 31 
    end select
    
    print *, " The number of dasy in month : ", month, ' is ', days
    goto 10
end program mainprocedure

728x90
반응형
728x90
반응형

선택구조를 사용한 프로그램의 사용 예

  1. 간단한 IF 문 사용
  2. 블록 IF 문 사용

 

1. 간단한 IF문 사용

 

program mainprocedure
    implicit none
    integer :: month, days
10  print *, ' Tyep a month ?'   
    read *, month    ! 표준 입력장치(키보드)를 통해서 입력 받을 경우
    
    if(month ==1) days=31
    if(month ==2) days=29
    if(month ==3) days=31
    if(month ==4) days=30
    if(month ==5) days=31
    if(month ==6) days=30
    if(month ==7) days=31
    if(month ==8) days=31
    if(month ==9) days=30
    if(month ==10) days=31
    if(month ==11) days=30
    if(month ==12) days=31
    
    if (month < 1 .or. month > 12) stop    ! 해당하는 달이 존재하지 않으면 무조건 종료한다.
    print *, ' Month:days ', month, days
    goto 10   !! 결과 출력 후 무조건 goto 문에 의해 다음 자료를 입력받기 위해 문번호 10으로 분기한다. 
    
end program mainprocedure

 

 

 

2. 블록 IF문 사용  

앞의 코드를 아래와 같이 수정할 수 있다.

program mainprocedure
    implicit none
    integer :: month, days
10  print *, ' Tyep a month ?'
    read *, month
    
    if(month ==1) then ; days=31
    else if(month ==2) then ;  days=29
    else if(month ==3) then ; days=31
    else if(month ==4) then ;  days=30
    else if(month ==5) then ;  days=31
    else if(month ==6) then ;  days=30
    else if(month ==7) then ;  days=31
    else if(month ==8) then ;  days=31
    else if(month ==9) then ;  days=30
    else if(month ==10) then ;  days=31
    else if(month ==11) then ;  days=30
    else if(month ==12)  then ; days=31
    else ; stop
    endif
        
    print *, ' Month:days ', month, days
    goto 10
    
end program mainprocedure

 

 

 

728x90
반응형
728x90
반응형
728x90
반응형

+ Recent posts