오늘은 Fortran77에 대한 기초 두번째 시간입니다.
오늘도 열심히 해보겠습니다.
입출력
저번에 Fortran은 출력같은 경우 Write(UNIT, FMT)를 이용하는 것으로 알려드렸습니다.
또한 입력같은 경우에는 Read(UNIT, FMT)를 이용합니다.
UNIT은 저번에도 설명을 하였으나, 다시 설명을 해보자면, C언어에서 파일디스크립터와 같은 역할을 지닌다고 생각하시면 됩니다.
FMT는 포맷을 의미하죠.
하지만, 파일 입출력 또는 포맷을 지정을 해야하는 특수한 경우가 아니라면, '*'을 넣어 기본값으로 지정을 해주시면 됩니다.
program ProgramName
Write(*, *) "Hello, World"
end program
이런식으로 작성을 한다면, 기본인 모니터에 띄워줍니다.
이런식으로 출력이 됩니다.
입력하는 방법도 그리 어렵지 않습니다.
기본적인 형식은
Read(UNIT, FMT) Variable1, Variable2, ...
이런식입니다.
그럼 간단하게(?) 예시를 작성해볼까요?
program InOut
Write(*, *) "Input 2 Variables!"
Read(*, *) In1, In2
Write(*, *) "Output: ", In1, In2
end program
이러한 프로그램을 작성을 해보았습니다.
간단한 코드에 대한 해석을 해보자면, 2개의 값을 받은 이후에 출력을 하는 것입니다.
Write를 사용할 때, C처럼 %d같은 형식 지정자가 아닌, 따옴표를 이용하면, 출력문에 변수의 값을 넣을 수 있습니다.
즉 In1과 In2에 대한 입력을 받은 이후, In1, In2에 입력하였던 값을 출력하는 것입니다.
이런식으로 작동이 된다면, 잘 작동이 된 것입니다.
그러나 만약 앞에서 변수를 선언하지 않고, 입력을 한다면, 만약 나는 실수로 저장하길 바라는데, 정수로 저장되는 불상사가 터질 수 있습니다.
변수 선언은 크게 어렵지 않습니다.
<typename> <variable name>
이런 형식을 지니고 있습니다.
기본적인 정수형과 실수형 타입을 알려드리자면, Integer와 Real입니다.
위의 소스코드를 약간 수정해봅시다.
program InOut
Integer In1
Real In2
Write(*, *) "Input 2 Variables!"
Read(*, *) In1, In2
Write(*, *) "Output: ", In1, In2
end program
이런식으로 작성을 하고, 실행을 해보면, In1은 정수형으로, In2는 실수형으로 정의도어 출력이 됩니다.
이런식으로 작동이 됩니다.
또한 포트란같은 경우 변수의 앞글자에 따라, 선언이 되지 않은 변수에 대한 타입을 지정해줍니다.
정수형 같은 경우 I부터 N까지, 실수형은 A부터 H, O부터 Z까지입니다.
반복문
포트란에서의 반복문은 흔히 Do-Loop문이라고도 불립니다.
다른 언어와 달리 이질감이 있을 수 있을 수 있으니, 집중하시면 좋겠습니다.
Do-Loop 문
포트란90에서는 Do-Enddo라는 현대적인 For문이 존재하나, 77에서는 그렇지 않습니다.
기본적인 형태는
do label, val1 = ?, val2
<code>
label continue
다음과 같습니다.
For문과 유사하나, 라벨이 등장하다는 것과 continue가 존재한다는 것이죠.
간단하게 설명 드리자면, 라벨은 C언어에서의 goto를 통해 접근이 가능한 것들을 수들로 표현한 것이라고 생각하시면 됩니다.
int main(void){
ex1:
goto ex1;
}
여기서, ex1을 수로 표현한 것이 포트란에서의 라벨이라고 생각하시면 됩니다.
또한 마지막에 continue가 마지막으로 Do에서 지정한 라벨이 지정되어 있으면, Do-Loop 문의 시작으로 이동하게 해줍니다.
예시로 1부터 n까지의 합을 구하는 프로그램을 구현해봅시다.
크게 어렵지는 않습니다.
program DoLoop
Integer Input, Result
Result = 0
Read(*, *) Input
do 10, I=1, Input
Result = Result + I
10 continue
Write(*, *) "Result: ", Result
end program
이런식으로 작성하시면 됩니다.
입력인 Input과 결과값인 Result에 대하여, 정수형을 선언한 이후, Result는 0으로 초기화를 한 이후에, Input에 몇까지 더할지를 읽고, 이를 Do-Loop문을 이용하여, 계산을 진행하면 어렵지 않습니다.
그리고 마지막에 Write를 이용하여, 결과값인 Result를 출력해줍니다.
While-Loop문
포트란에는 While-Loop문이 존재하나, 이도 Fortran90때 등장한 것이라, Fortran77 같은 경우에는 라벨과 if문, goto문을 이용하시면 됩니다.
아직 우리는 if문을 제대로 배우지를 않았기에, 간단하게 설명하겠습니다.
기본적인 형태는 다음과 같습니다.
label if (logic) then
<execute code>
goto label
endif
이런식으로 조건에 맞을 때까지 반복하게 하여, while문과 같은 역할을 할 수 있습니다.
이를 이용하여, 위의 프로그램을 구현을 해본다면
program whileLoop
Integer Input, Result, I
Result = 0
I = 0
Read(*, *) Input
10 if (I .LT. Input) then
I = I + 1
Result = Result + I
goto 10
end if
Write(*, *) "Result: ", Result
end program
이런식으로 표현이 가능합니다
소스코드
오늘 작성된 소스코드는 깃허브에 업로드 해놓았습니다.
'Fortran > Fortran77' 카테고리의 다른 글
[Fortran77]Fortran 기초(3) (0) | 2021.08.26 |
---|---|
[Fortran77]Fortran 기초(1) (2) | 2021.08.12 |