728x90
반응형

논리 데이터형 (Logical data type)

 

Fortran에는 .TRUE. , .FALSE. 두가지 논리형 상수가 있다.

 

형식

    LOGICAL :: V1, V2, ...

 

    V1 은 논리형으로 선언되는 변수

 

다른 형선언문들처럼 프로그램의 선언부에 위치해야 한다. 

또한 자동서식 입출력이 가능하다. 

 

예문

    logical :: Trues, Falses   

        Trues = .true.

        Falses = .false.

   print *, Trues, Falses, .true., .false.

 

 

자동서식 입력을 사용할때는 .T..F.를 입력해야 한다. 

    logical :: True, False   

    read *, A, B, C

 

입력값이

   .T., fall, .TRUE 이면

 

결과

    T F F

 

    

 

   print *, A, B, .true., .false.

 

 

728x90
반응형
728x90
반응형

CASE 구문

IF-ELSE IF 구문과 같이 광범위하게 사용하지는 않지만, 몇몇 선택구조를 구현하는데 유용한 CASE 구문

 

 SELECT  CASE (선택자 index)

        CASE (expression 1)

          statement 1

        CASE (expression 2

            statement 2

                :

        CASE(expression n)

            statement n

  END SELECT

 

선택자 index는 정수, 문자, 논리식이 될 수 있다. expression은 선택자가 가질 수 있는 값의 목록 또는 DEFAULT 이다. 

CASE 구문이 실행될 때, 선택자가 expression 1 값에 해당된다면, 문블럭1이 실행되고 END SELECT 문 다음에 나오는 문으로 이동한다.

선택자가 expression 1값에 해당되지 않을 경우,

DEFAULT 문이 있으면 DEFAULT 와 연관된 문블럭이 실행되고,

DEFAULT 문이 없으면 SELECT CASE  구문 다음의 문으로 이동한다. 

 

 

 

기명 CASE 구문

CASE 구문에도 이름을 붙일 수 있다. 

형식

구문명: SELECT CASE (index)
                       
            END SELECT 구문명

 

 

예문

Heros : select case (HeroCode)
        case(1) 
            print *, "Superman"
        case (2) 
            print *, "Spyderman"
        case (3) 
            print *, "Ironman"
        case (4) 
            print *, "Batman"
        default
            print *, "Wonder Woman"
end select Heros

   

            

 

 

연습문제 

1. 점수 (score)90점 이상이면 ’excellent’ , 80점 이상이면,  ’good’, 70점 이상이면 ’fair’를  70점 미만이면 “bad”를 출력하는 프로그램을 작성하시오. 이를 case문을 이용해서 작성하시오

728x90
반응형
728x90
반응형

단순 논리 IF 구문

      IF (논리식) 실행문

(논리식)이 참이면 실행문이 실행되고, 거짓이면 넘어간다.

 

 if (2.0 <= x .and. x <= 4.0) print *, x

 

이는 아래의 블럭 IF 문과 같다. 

      IF (논리식) THEN

          문블럭

      END IF

(논리식)이 참이면 문블럭이 실행되고, 거짓이면 넘어간다. 두 경우 모두 END IF 문 다음 부터 실행이 계속된다. 

단순 if문의 경우, 문블럭에 다른 if문을 사용할 수 없다. 

 

   if (a >= 0) then 
       x = a * a
       y = sqrt(a) 
   end if

   

블럭 IF 문 (일반적인 형태의 IF문)   

   IF (논리식) THEN

       문블럭1

    ELSE

      문블럭2

   END IF

(논리식)의 참, 거짓을 구별하여 명령문 수행.

논리식이 이 참이면 문블럭1만 실행되고, 거짓이면, 문블럭2만 실행됨. 두 경우 모두 END IF문 다음으로 실행이 이어짐. 

Program test_if
  implicit none
	real :: a=1, b=2, c=3,d
	d = b**2 – 4 * a* c
	if ( d>=0 ) then
		print*,’실근’
	else
		print*,’허근’
	endif
End program test_if

IF-ELSE IF 구문

       IF (논리식1) THEN

            문블럭1

       ELSE IF (논리식2) THEN

                 문블럭2

       ELSE IF (논리식3) THEN

                 문블럭3

               :

       ELSE

                 문블럭n

       END IF

주의! 들여쓰기를 통해서 if, else, end if 간의 혼돈을 줄여야 한다.

 

 

기명 IF 구문(named construct)

구문명 : IF (논리식) THEN

              :

             END IF 구문명

 

예)

outer: if (x > longer ) then 

                 longer = x

                 y = longer * 2

      inner: if (y < shorter) then 

                       print *, " Short "

                 else

                       y = 2.0

                 end if innner

          end if outer

 

 

 

연습문제

1. 다음 IF 문이 타당한지 결정하라.

  • if(a>b) print*, a
  • If b<c n= n+1
  • If(x<=y) stop
  • If(a=x) read*,y
  • If(1<=N<=10) N= 10

2. 점수 (score)가 90점 이상이면 ’excellent’ 를, 80점 이상이면,  ’good’을, 70점 이상이면 ’fair’를  70점 미만이면 “bad”를 출력하는 프로그램을 IF문을 사용하여 작성하시오.

 

3-5. 아래 IF문 실행 결과를 쓰시오. 

3.

If ( x> 3 ) then
	if ( x< 6 ) then
		print*,’x:’,x
	endif
endif

4.

If ( x<3) then
	print*,’x:’,x
else if (x>6) then
	print*,’x:’,x
endif

5.

If ( x<3) then
	if ( x>6) then
		print*,’x:’,x
	endif
endif

6-8. 다음 순서도를 보고 코딩하라.

6. 

7.

 

8.

9.

728x90
반응형
728x90
반응형

논리식 (logical expression)

단순 논리식(simple logical expression)

형식

 

1. 논리상수 (.TRUE. 또는 .FALSE.)

2. 논리변수

3. 아래 관계식 형태  

      expr1 관계연산자 expr2    (expr는 수치 또는 문자식)

 

관계 연산자

기호 의미
<
>
<=
>= 
==
/=
.LT.
.GT.
.LE.
.GE.
.EQ.
.NE.
~보다 작은
~보다 큰
~보다 작거나 같은
~보다 크거나 같은 
~와 같은
~와 같지 않은

주의!

  • == 는 같음을 표시하는 관계 연산자 
  • = 은 대입 연산자

 

수치형 데이터

x < 7 에서 x 가 5 이면 참, 8이면 거짓이다. 

 

a ** 3 >= 3.0 * b * c  의 경우, 수치연산이 논리식보다 우선 실행되므로, (a ** 3) >= (3.0 * b * c ) 와 같다. 

 

문자형 데이터

문자 데이터는 각 문자마다 할당된 ASCII코드 값으로 프로그램 내부에서 사용된다. 

A, B, ..., Z를 각각 65,66,..., 90

a, b, ..., z 를 97,98, ... 122

 

"A" < "F"        => 참

"dog" > "cat"  => 참   ("d" > "c" 이므로)

 

길이가 다른 두 문자열은 공백을 추가하여 큰 길이 문자열과 동일하게 만들어 비교한다. 

"treat" < "treatment"    은 참이고 "treat฿฿฿฿" < "treatment"   로 해석된다. 왜냐하면 공백은 모든 문자에 선행하기 때문이다. 

 

 

 

복합 논리식 (compound logical expression)

논리 연산자

논리연산자 의미 우선순위
.NOT.
.AND.
.OR.
.EQV.
.NEQV.
(부정)
(논리곱)
(논리합)
(논리등가)
(논리비등가)
1
2
3
4
4

진리표

p q p .AND. q p .OR. q p .EQV. q p .NEQV. q
.TRUE.
.TRUE.
.FALSE.
.FALSE.
.TRUE.
.FALSE.
.TRUE.
.FALSE.
.TRUE.
.FALSE.
.FALSE.
.FALSE.
.TRUE.
.TRUE.
.TRUE.
.FALSE.
.TRUE.
.FALSE.
.FALSE.
.TRUE.
.FALSE.
.TRUE.
.TRUE.
.FALSE.

만약 논리식이 수치연산자, 관계연산자, 논리연산자가 섞여있다면, 실행 순서는 아래와 같다.

1. 수치(함수)연산

2. 관계연산

3. 논리연산

 

예)

   a ** 2 + 1 > 10 .and. .not. a < 3 은 참이고,   ( a ** 2 + 1 > 10 ) .and. .not.  (a < 3 )으로 해석된다. 

   b == 1 .or. 2 은 (b == 1) .or. 2 와 같으나 유효하지 않다. 왜냐하면 2가 논리식이 아니기 때문이다. 

 

예문 (복합논리식)

program logical_appl

	implicit none
	real :: X=-3.56, Y=0.0, Z=44.7
	integer :: M=-5, N=8

	print*, "1)"
	if (M <= N) print*, "M 은 N 보다 작거나 같다."
	
	print*, "2)"
	if (2 * abs(M) <=8) then
		print*, "절대값 M의 두배는 8보다 작거나 같다."
	else
		print*, "절대값 M의 두배는 8보다 크거나 같다."
	endif
	
	print*, "3)"
	if ( nint(z) == (6 * N - 3) ) print*, "Z에 가장 가까운 정수는 N의 6배에서 3을 뺀 것과 같다."
	
	print*, "4)"	
	if (.not. (X < Y)) then 
		print*, "X가 Y보다 작지 않다."
	else 
		print*, "X가 Y보다 작지 않은 것이 아니다."
	endif
	
	print*, "5)"
	if (.not. ((M > N) .and. (X < Z)) .neqv. ((M <= N) .and. (X >= Z))) then
		print*, "'M이 N보다 크고 동시에 X가 Z보다 작은것'과 'M이 N보다 작거나 같고 동시에 X가 Z보다 크거나 &
	    같다는 것'이 논리적으로 서로 같지 않다는 것이 아니다."
	endif	  
		
end program logical_appl

 

 

연습문제

1. 다음의 표현식을 써라.

  • x 는 3보다 크다.
  • y 는 2 와 5 사이의 값이다.
  • r 은 음이고 z 는 양이다.
X > 3
Y > 2.and. Y<5
R < 0.and. Z > 0

 

2. 다음의 표현식을 써라.

  • alpha 와 beta 는 둘 다 양이다.
  • alpha 와 beta 는 같은 부호를 가진다.
  • –5 < x < 5
  • A는 6보다 작거나 혹은 10보다 크다
Alpha  > 0 .and. beta >0
(Alpha > 0 .and. beta > 0).or. 
    (Alpha < 0 .and. beta < 0)
X> -5.and.X<5
A <= 6.or. A > 10
 
728x90
반응형
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
반응형

+ Recent posts