2013년 9월 10일 화요일

논리 연산자, 관계 연산자

From Evernote:

논리 연산자, 관계 연산자

논리 연산자
논리형은 두 가지 값만을 가질 수 있다. .true. 또는 .false.
논리형에 대한 연산은 논리 연산자를 사용한다.
  • .not.
  • .and.
  • .or.
  • .eqv.
  • .neqv.


관계 연산자
관계 연산자는 두 표현식을 비교하는 연산자이다.

  • <
    작다.
  • <=
    작거나 같다.
  • >
    크다.
  • >=
    크거나 같다.
  • ==
    같다.
  • /=
    같지 않다.


논리식
논리식의 결과는 .true. 또는 .false. 이다.

만일, 두 실수형의 값을 비교하는 경우에는 주의해야 하는데, 컴퓨터가 실수값을 표현하는데 있어서 그 정밀도가 유한하기 때문이다. 이런 경우에는 두 실수 값을 직접 비교( a == b )하기 보다는 두 값의 차이가 허용 오차 이내인지를 판별하는 것이 좋다.

real, parameter :: delta = 0.000001
abs(a -b) < delta ! a와 b의 값이 거의 같다면 .true. 

abs는 매개변수로 주어진 값의 절대값을 반환하는 함수이다.









산술 연산자

From Evernote:

산술 연산자

  • **    
    거듭제곱
  • *       
    곱하기
  • /        
    나누기
  •       
    더하기
  • -        
    빼기

산술 연산자의 우선 순위는 ** > *, / > +, - 순이다. 

물론, 괄호를 사용하면 우선순위를 바꿀 수 있다. 예를 들어,
3 * 2 + 1
은 7이지만,
3 * (2 + 1)
은 9이다.

우선 순위가 같은 경우에는 왼쪽의 연산자가 먼저 계산된다. 예를 들어,
a * b / c
의 경우에 a * b가 먼저 계산된 후의 결과값을 c로 나눈다.

하지만, 거듭제곱의 경우에는 오른쪽의 연산자가 먼저 계산된다. 예를 들어,
2 ** 2 ** 3
은 2 ** 8 이지, 4 ** 3이 아니다.


 
산술식
정수의 나눗셈(나누는 수와 나누어지는 수가 모두 정수인 경우)인 경우 그 결과는 항상 0에 가까운 정수값이 된다.

정수의 나눗셈 결과를 실수형으로 받으려면 real 함수를 사용해야 하는데, 이 함수는 매개변수로 받은 값을 실수형으로 변환한다. real(2)는 2.0이라는 실수형 값이 된다.

val = real(2) / 3 ! = 1.5
val = 2 / real(3) ! = 1.5
val = real(2/3) ! = 0 (이 경우, 2/3이 먼저 계산되므로 최종 결과는 0이 된다.)


서로 다른 자료형의 값을 산술 연산하는 경우에, 먼저 약한 자료형이 강한 자료형으로 변환된 후에 연산이 수행되며, 결과 값은 강한 자료형이 된다. 자료형이 강한 순서는 복소수형 > 실수형 > 정수형의 순서이다.
따라서, real(2) / 3의 경우에 3이 먼저 실수형으로 변환된 후에 나눗셈 연산이 수행된다.



파생된 자료형, 구조체

From Evernote:

파생된 자료형, 구조체

포트란의 5가지 기본 자료형 이외에도 사용자가 직접 자료형을 정의할 수 있는데, 이를 구조체(structure)라고 한다.

정의

type :: atom
character (len =2) :: label
real :: x , y , z
end type atom

atom이란 이름의 구조체는 2 문자 길이의 이름과 3개의 x, y, z 좌표를 갖도록 정의하였다.



선언

type(atom) :: carbon1

carbon1이라는 이름의 변수가 atom이라는 자료형으로 선언되었다.



멤버

carbon1%label = "C"
carbon1%x = 0.0000
carbon1%y = 1.3567
carbon1%z = 2.5000

구조체의 각 멤버는 구조체 선택자(%)를 사용해서 접근할 수 있다. %의 앞뒤로 공백문자가 있어서는 안된다.



구조체의 배열

type(atom), dimension (10) :: molecule
molecule(1)%type = "C"

위와 같이 구조체 또한 배열의 형태로 사용할 수 있다.





암묵적 형 선언

From Evernote:

암묵적 형 선언

포트란은 암묵적 형 선언(implicit typing)이 지원되므로 변수를 선언하지 않고도 사용할 수 있다. 변수를 선언하지 않은 경우에는 변수명의 첫 문자를 기준으로 변수의 자료형이 결정되는데, 만일 변수명이 i, j, k, l, m, n으로 시작한다면 정수형으로 간주되고, 그 외의 경우에는 실수형으로 간주된다.

하지만, 변수 선언 없이 사용하는 것은 좋은 프로그래밍 습관이 아니므로 모든 프로그램의 첫 문장에 다음과 같은 선언문을 사용해서 암묵적 형선언 옵션을 사용하지 않도록 한다.

implicit none


문자열

From Evernote:

문자열

문자열의 요소는 각각의 문자로 또는 그룹으로 참조할 수 있다.

character(len =80) :: author
author = "Elex"

author(1:3)은 부분문자열인 "Ele"를 반환한다.
마찬가지 방식으로 문자열 중 하나의 문자를 참조하기 위해, author(2:2)와 같이 사용하면 "l"을 반환한다.


만일 첫 번째 첨자가 생략된 때에는 그 값이 1인 것으로 간주되며, 두 번째 첨자가 생략된 때에는 문자열의 길이와 같은 것으로 간주된다.

author(:3) ! "Ele"
author(3:) ! "ex"
author(:) ! "Elex"




배열

From Evernote:

배열

배열은 동일한 자료형을 가진 변수들의 집합이다. 배열은 1차원 배열부터 7차원 배열까지 선언할 수 있으며, 배열을 선언할 때에는 dimension 키워드를 사용한다.

real, dimension(5) :: vector ! 5개의 요소를 가진 실수형 1차원 배열
integer, dimension (3, 3) :: matrix ! 정수형 2차원 배열

각 배열의 요소는 첨자를 통해서 참조할 수 있는데, vector 배열의 첫 번째 요소는 vector(1) 이다. 마찬가지로 2차원 배열인 matrix 배열의 요소는  matrix(1,1), matrix (2,1), matrix (3,1), matrix (1,2), ..., matrix(3,3) 이다.


배열의 첨자 범위를 직접 지정할 수도 있다.

real, dimension (1:5) :: vector
real, dimension (-10:8) :: a1 ! 19개의 요소를 가진 1차원 배열
integer, dimension (-3:3, -20:0, 1:2, 6, 2, 5:6, 2) :: grid1 ! 7차원 배열

grid1 배열의 요소의 갯수는 7 * 21 * 2 * 6 * 2 * 2 = 14112개 이다.


컴파일러의 종류에 따라 7차원 이상의 배열을 사용할 수 있기도 하지만, 표준에 따르면 최대 7차원 배열까지만 선언할 수 있다.


변수

From Evernote:

변수

선언
변수는 프로그램 (또는 서브프로그램)의 시작 부분에 선언해야 한다.

integer :: total
real :: average1, average2 ! 실수형 변수 2개를 선언
complex :: cx
logical :: done
character( len=80) :: line ! 길이가 80인 문자열


할당
total = 6.7
average1 = average2
done = .true.
line = "this is a line"
cx = (1.0, 2.0) ! cx = 1.0 + 2.0i
cx = cmplx (1.0/2.0, -3.0) ! cx = 0.5 – 3.0i
cx = cmplx ( x, y) ! cx = x + yi

  • 문자열은 이중 따옴표(")로 감싼다.
  • 상수값은 직접 복소수 자료형에 할당할 수 있다.
  • 변수값을 복소수 자료형에 할당하려면, 내장함수 중 하나인 cmplx 함수를 사용해야 한다.

상수

From Evernote:

상수

상수는 그 값이 변경될 수 없는 데이터이다.

이름없는 상수(literal)
리터럴은 흔히 값이라고 번역되곤 한다.

정수형 상수 : 300
실수형 상수 : 3.14
복소수형 상수 : (3.0, -3.0)
논리형 상수 : .true. 또는 .false.
문자형 상수 : "Fortran"

이름있는 상수
이름있는 상수와 변수는 프로그램(또는 서브프로그램)의 시작 부분에 선언되어야 한다. : 형 선언문
이름있는 상수는 parameter 키워드를 사용해서 선언한다.

real, parameter :: pi = 3.141592

기본 자료형

From Evernote:

기본 자료형

변수와 상수는 다섯 가지의 고유(intrinsic) 자료형 또는 파생(derived) 자료형 중 하나를 갖는다.

다섯 가지의 고유 자료형은,
정수형 (integer)
1, 2, 3, 0, -1, -2, -3, ...

실수형 (real)
3.14, -100.876, ...

복소수형 (complex)
복소수형은 실수부와 허수부, 2개의 실수로 구성된다.
(2.0, -1.0) ...

논리형 (logical)
.true. 또는 .false.

문자형 (character)
문자 또는 문자열을 나타내며 문자열의 길이는 len으로 지정할 수 있다. 만일 문자열의 길이가 지정되지 않은 경우에는, 1이다.


식별자 이름

From Evernote:

식별자 이름

포트란 90에서 변수명(식별자)은
  • 31자 이내로 해야 한다.
  • 영문자와 숫자, 그리고 밑줄 문자(_)만 사용할 수 있고, 첫 글자는 문자로 시작해야 한다.
  • 대소문자를 구분하지 않는다.



개발환경 설정

From Evernote:

개발환경 설정

#. MinGW

MinGW 웹사이트를 방문해서 MinGW Installation Manager를 다운로드 받아 실행한다. 실행 후 나타나는 대화상자에서 GUI 관련 옵션을 체크해 두면 아래 이미지와 같은 GUI 방식을 사용할 수 있다.


맨 위에 있는 MSYS와 MinGW 패키지를 선택하고, fortran 관련 패키지를 선택한다.



메뉴바의 Installation > Apply Changes를 실행하면 관련 파일들이 다운로드 된다.


#. Photran

이클립스의 다운로드는 http://www.eclipse.org/에서..., 자세한 설명은 생략한다.
이클립스 실행 후 포트란 플러그인을 설치한다.




#. 환경변수 설정
시스템 환경 변수에 PATH값을 추가한다.



시작하기

From Evernote:

시작하기


hello_fortran.f95 

program hello_fortran
! this program prints "Hello Fortran!" to the screen
    implicit none

    print *, "Hello Fortran!"
end program hello_fortran


  • 프로그램은 program 프로그램_이름 으로 시작하고,
  • end program 프로그램_이름 으로 끝난다.
  • print *는 화면에 데이터를 출력한다.
  • 느낌표(!) 뒤에 따라오는 모든 문자는 주석이며 컴파일러에서는 무시된다.
  • 프로그램의 가독성을 높이기 위해서 들여쓰기를 사용하며, 빈 줄도 사용할 수 있다.
  • 포트란 90에서는 대문자 또는 소문자를 사용할 수 있다. 반면, 포트란 77에서는 대문자만 사용할 수 있다.