외부 함수에 대하여 Interface 정의하여 프로그램 작성

PROGRAM Temp_Conv

IMPLICIT NONE

INTERFACE
FUNCTION Fahr_To_Celsius(Temp)
REAL :: Fahr_To_Celsius
REAL, INTENT(IN) :: Temp
END FUNCTION Fahr_To_Celsius
END INTERFACE

REAL :: Fahr_To_Celsius
REAL :: FahrenheitTemp, CelsiusTemp

PRINT *, "화씨온도를 입력하시오"
READ *, FahrenheitTemp

CelsiusTemp = Fahr_To_Celsius(FahrenheitTemp)

PRINT *, "화씨온도 ", FahrenheitTemp, " = 섭씨온도 ", CelsiusTemp

END PROGRAM Temp_Conv

FUNCTION Fahr_To_Celsius(Temp)

IMPLICIT NONE

REAL :: Fahr_To_Celsius

REAL, INTENT(IN) :: Temp

Fahr_To_Celsius = (Temp - 32.0) / 1.8

END FUNCTION Fahr_To_Celsius

위 소스를 06_08_Temp_Conv.f95로 저장

컴파일 및 프로그램 테스트



외부함수를 이용한 온도 변환 프로그램 작성

END PROGRAM 다음에 Function을 작성

PROGRAM Temp_Conv

IMPLICIT NONE

REAL :: Fahr_To_Celsius
REAL :: FahrenheitTemp, CelsiusTemp

PRINT *, "화씨온도를 입력하시오"
READ *, FahrenheitTemp

CelsiusTemp = Fahr_To_Celsius(FahrenheitTemp)

PRINT *, "화씨온도 ", FahrenheitTemp, " = 섭씨온도 ", CelsiusTemp

END PROGRAM Temp_Conv

FUNCTION Fahr_To_Celsius(Temp)

IMPLICIT NONE

REAL :: Fahr_To_Celsius

REAL, INTENT(IN) :: Temp

Fahr_To_Celsius = (Temp - 32.0) / 1.8

END FUNCTION Fahr_To_Celsius

위 소스를 06_07_Temp_Conv.f95로 저장

컴파일 및 프로그램 테스트



모듈(module)을 이용한 온도 변환

모듈 작성

MODULE Temp_Lib

IMPLICIT NONE

CONTAINS

FUNCTION Fahr_to_Celsius(Temp)

REAL :: Fahr_to_Celsius
REAL, INTENT(IN) :: Temp

Fahr_to_Celsius = (Temp - 32.0) / 1.8

END FUNCTION

FUNCTION Celsius_to_Fahr(Temp)

REAL :: Celsius_to_Fahr
REAL, INTENT(IN) :: Temp

Celsius_to_Fahr = 1.8 * Temp + 32.0

END FUNCTION Celsius_to_Fahr

END MODULE Temp_Lib

위 소소를 06_05_Temp_Lib.f95로 저장

모듈을 사용하는 주 프로그램 작성

PROGRAM Temp_Conv

USE Temp_Lib

IMPLICIT NONE

REAL :: FahrenheitTemp, CelsiusTemp

PRINT *, "화씨온도를 입력하시오(ex:100)"
READ *, FahrenheitTemp

CelsiusTemp = Fahr_to_Celsius(FahrenheitTemp)

PRINT *,"화씨온도 ", FahrenheitTemp, " = 섭씨온도 ", CelsiusTemp

END PROGRAM Temp_Conv


위 소스를 06_06_Temp_Conv.f95로 저장

컴파일 및 프로그램 테스트



컴파일 결과 temp_lib.mod가 자동적으로 생성되었다.



사다리꼴 적분 근사법

PROGRAM Integ

IMPLICIT NONE

REAL :: A, B, DeltaX, X, Y, Sum
INTEGER :: N, I

PRINT *, "X**2 + 1의 두 점 사이의 면적 구하기"
PRINT *

PRINT *, "면적을 구하려는 두 점과 두 점의 분할 개수 입력(ex:0, 1, 50)"
READ *, A, B, N

DeltaX = (B - A) / REAL(N)

X = A
Sum = 0.0

DO I = 1, N - 1

X = X + DeltaX
Sum = Sum + F(X)

END DO

Sum = DeltaX * ((F(A) + F(B)) / 2.0 + Sum)

PRINT '(1X, I4,"개의 간격을 이용한 근사 면적 : ", F10.5)', N, Sum

CONTAINS

FUNCTION F(X)

REAL :: F
REAL, INTENT(IN) :: X

F = X ** 2 + 1.0

END FUNCTION F


END PROGRAM Integ

위 소스를 06_03_Integ.f95로 저장

컴파일 및 프로그램 테스트



포아송 확률 구하기

2개의 함수 이용

함수에서 다른 함수 이용

PROGRAM Pois_Pro

IMPLICIT NONE

REAL :: AveOccurs, Probability
INTEGER :: NumOccurs

PRINT *, "포아송 확률을 계산합니다."

WRITE (*, '(1X, A)', ADVANCE = "NO"), "단위 시간 동안 평균 발생 횟수(3.5) : "
READ *, AveOccurs

WRITE (*, '(1X, A)', ADVANCE = "NO"), "발생 횟수(5) : "
READ *, NumOccurs

Probability = Poisson(AveOccurs, NumOccurs)

PRINT '(1X, "포아송 확률 = ", F6.4)', Probability

CONTAINS

FUNCTION Poisson(Lamda, N)

REAL :: Poisson ! 리턴한 값의 타입
REAL, INTENT(IN) :: Lamda ! 받는 인수의 타입
INTEGER, INTENT(IN) :: N

Poisson = (Lamda ** N * EXP(-Lamda)) / REAL(Factorial(N))

END FUNCTION Poisson

FUNCTION Factorial(N)

INTEGER :: Factorial, I
INTEGER, INTENT(IN) :: N

Factorial = 1

DO I = 2, N

Factorial = Factorial * I

END DO

END FUNCTION Factorial

END PROGRAM Pois_Pro

위 소스를 06_02_Pois_Pro.f95로 저장

컴파일 및 프로그램 테스트



+ Recent posts