수리수리연수리 코드얍

4. Fortran의 산술연산과 format이 없는 입출력문(실전편) 본문

즐거운 Fortran

4. Fortran의 산술연산과 format이 없는 입출력문(실전편)

ydduri 2023. 3. 13. 17:11

실습 코드: ydduri 깃허브 - Joyful_Fortran_Tutorial

목차

1. format이 없는 입출력문
2. 산술연산 연습하기
3. 내장함수

1. format이 없는 입출력문

1) 세 점수 입력 받아 평균 계산(4_1_1.f90)

전글인 4. Fortran의 산술연산과 format이 없는 입출력문(이론편)에서 format이 없는 입출력문에 대해서 배웠다. format은 입출력의 형태를 지정하는 방식을 이야기하는 것인데, 이번에는 format을 지정하지 않고 입력문, 출력문을 어떻게 작성하는지에 초점을 맞추었다.

Fortran에서 입력문은 read, 출력문은 print로 나타낸다. 매우 직관적이다. 그렇다면 입출력문에 format을 지정하지 않겠다는 것을 Fortran에게 어떻게 전달해야 할까? 그건 바로 *(별표)다!

  • read*, x1, x2, ... , xm(이때 x1, x2, ..., xm은 입력 받을 변수명)
  • print*, x1, x2, ... , xm(이때 x1, x2, ..., xm은 출력할 변수명 혹은 상수값)

먼저, 지금까지 배운 내용을 바탕으로 점수 세 개를 입력 받은 뒤 세 점수의 평균을 계산하여 출력하는 프로그램을 작성해 보자!

결과
(입력이 정해지지 않았으므로 결과는 사람마다 다를 수 있음)

 Enter three scores
100.0 85.0 60.0
 average score:   81.6666641
  • 첫 번째 print* 문에서 'Enter three scores'라는 안내문 출력
  • read* 문에서 세 개의 점수 score1, score2, score3 입력
  • 두 번째 print* 문에서 'average score: 계산한 평균' 출력

2) max, min 내장함수를 활용한 최고점과 최저점 출력(4_1_2.f90)

이번에는 위에서 짠 프로그램에 더해서, 최고점과 최저점을 함께 출력해보도록 하자! 방법은 간단하다. 최댓값을 출력하는 max, 최솟값을 출력하는 min이라는 내장함수를 이용하면 된다.

  • max(x1, x2, ... , xm): x1, x2, ..., xm의 최댓값을 계산
  • min(x1, x2, ... , xm): x1, x2, ..., xm의 최솟값을 계산

결과
(입력이 정해지지 않았으므로 결과는 사람마다 다를 수 있음)

 Enter three scores
100.0 85.0 60.0
 average score:   81.6666641    
 highest score:   100.000000    
 lowest score:   60.0000000

2. 산술연산 연습하기(4_2.f90)

이번에는 산술연산과 좀 더 친해지는 시간이다! 아래 6가지 식의 값을 계산하는 프로그램을 짜되, 이번에는 read 문이 아니라 프로그램 내에서 값을 할당하여 결과를 계산하도록 작성해보자. 프로그램 내에서 값을 할당해주어야 하는 변수는 총 3개인데, 각각 x = 1.2, y = 3.4, n = 2.0을 할당하면 된다.

  • $2xy^2-2x^2y$
  • $(4+\frac{x}{y})^{n-1}$
  • $\sqrt{3x^2+5y^2}$
  • $e^{xy}-|x^2-y^2|$
  • $ln(x+y)^2$
  • $cos(\log_{10}{(x+3y)})$

결과

   17.9519997       4.35294104       7.88162422       49.0254898       3.05211282      0.491569757

3. 내장함수

1) 헷갈리는 내장함수의 대표주자, int, nint, floor, ceiling(4_3_1.f90)

내장함수 중에는 직관적으로 사용할 수 있는 것들이 많지만, 종종 그 기능이 헷갈리는 경우들이 있다. 헷갈리는 내장함수의 대표주자라 할 수 있는 int, nint, floor, ceiling의 결과 차이를 직접 확인해보는 것이 이번 문제의 목표이다.

  • int(x): x의 정수부
  • nint(x): x를 반올림
  • floor(x): x를 내림
  • ceiling(x): x를 올림

결과

 x=   3.40000010    
 int(x)=           3
 nint(x)=           3
 floor(x)=           3
 ceiling(x)=           4

x로 3.4를 입력했을 때,

  • int(x): 3.4의 정수부인 3만 출력(소수점 아래 절삭)
  • nint(x): 3.4를 반올림하여 3 출력
  • floor(x): 3.4를 내림하여 3 출력
  • ceiling(x): 3.4를 올림하여 4 출력

만일 x로 3.6을 입력했다면, 반올림 값을 출력하는 nint(x)의 결과만 4로 달라지고 나머지 값들은 동일할 것이다.

2) 삼각함수(4_3_2.f90)

이번에는 좀 대기과학스러운 문제를 풀어보도록 하겠다. 삼각함수를 활용해서, 위도를 degree 단위로 입력하면 코리올리 매개변수(Coriolis parameter) 값을 계산하여 출력해주는 프로그램을 작성해보자!(공식은 알려드리니 걱정하지 않으셔도 좋다)

코리올리 매개변수를 계산하는 식은 아래와 같다.

$f = 2\Omega sin\phi$

이때 $\Omega$는 지구의 회전 각속도로, $7.292\times 10^{-5}rads^{-1}$의 값을 가지고, $\phi$는 위도이다. 아마 감이 오셨을 테지만, 프로그램을 짤 때 상수인 $\Omega$는 parameter문을 사용해서 나타내주고, 위도 $\phi$는 입력받을 수 있도록 만들 것이다.

코리올리 매개변수를 계산할 때 sin 함수를 사용해야 하는데, Fortran에도 물론 삼각함수가 내장되어 있으나, 그 인자를 radian 단위로 작성해야 한다는 특징이 있다. 그런데 우리는 위도를 degree 단위로 입력받을 것이기 때문에 degree 각도를 radian 각도로 변환하는 과정이 필요한데, 이는 degree와 radian의 관계식을 이용하면 된다.

$1^{\circ} = (\frac{\pi}{180})radian$

이는 degree를 radian으로 바꾸기 위해서는 degree 각도에 $\frac{\pi}{180}$를 곱해주면 된다는 것을 보여준다. 이 과정을 보다 간편하게 수행하기 위해 $\frac{\pi}{180}$를 d2rad(degree to radian 이라는 뜻)라는 변수로 선언해주도록 하겠다.

결과

 Enter the latitude
40
 latitude=   40.0000000     f=   9.37441364E-05

degree로 입력받은 위도 40도를 d2rad를 곱해줌으로써 radian 단위로 만들어주고, 이를 주어진 식에 대입하여 최종적으로 coriolis parameter f를 구할 수 있었다.

이번 글을 보시면서 과연 format은 어떻게 지정하는가에 대한 궁금증이 증폭되셨지 않을까 생각한다. Fortran 문법에서 중요한 'format'을 포함한 일반적인 입출력문에 대해서는 다음 글에서 다룰 예정이니 관심 있게 봐주시면 좋을 것 같다!

Comments