내부 부프로그램으로 처리한 함수를 이용하여 온도 변환 프로그램 작성

PROGRAM Temp_Conv

IMPLICIT NONE

REAL :: FahrenheitTemp, CelsiusTemp

WRITE (*, '(1X, A)', ADVANCE = "NO") "화씨 온도를 입력하시오(ex:50) : "
READ *, FahrenheitTemp

CelsiusTemp = Fahr_To_Celsius(FahrenheitTemp)
! 함수를 이용하여 계산

PRINT '(/ 1X, 2(A, F6.2))', "화씨 온도 ", FahrenheitTemp, " = 섭씨 온도 ", CelsiusTemp

CONTAINS
! 함수 정의 구역 선언

! 함수 정의
FUNCTION Fahr_To_Celsius(Temp)

REAL :: Fahr_To_Celsius ! 함수 이름으로 함수가 리턴할 값의 타입 지정
REAL, INTENT(IN) :: Temp ! 받는 인수의 타입 지정

Fahr_To_Celsius = (Temp -32.0) / 1.8 ! 함수 이름에 값을 지정하면 리턴

END FUNCTION Fahr_To_Celsius

END PROGRAM Temp_Conv

위 소스를 06_01_Temp_Conv.f95로 저장

컴파일 및 프로그램 테스트



회귀 분석

온도와 부피의 회귀분석

온도 : 독립변수, 부피 : 종속변수

파일에서 온도와 부피를 읽어와 처리

PROGRAM Temp_Vol

IMPLICIT NONE

INTEGER :: Count = 0, OpenStatus, InputStatus
CHARACTER(20) :: FileName
REAL :: Temperature, Volume, SumOfTemps = 0.0, SumOfTemps2 = 0.0, &
SumOfVols = 0.0, SumOfProds = 0.0, MeanTemperature, &
MeanVolume, Slope, Y_Intercept

WRITE (*, '(1X, A)', ADVANCE = "NO") "자료 파일 이름(20자 이내)을 입력하시오 : "
! 한 띄고 출력, ADVANCE = "NO"는 출력하고 그 줄바꿈 하지 않음
READ *, FileName

OPEN (UNIT = 15, FILE = FileName, STATUS = "OLD", IOSTAT = OpenStatus)
! 파일을 열어 15이라 함. STATUS = "OLD"는 기존의 존재하는 파일
! IOSTAT = OpenStatus는 파일 오픈한 결과를 할당. 0 이면 성공적으로 open, 0 초과이면 못 연 것

IF (OpenStatus > 0) THEN
STOP "*** 파일을 열 수 없음 ***"
END IF

PRINT *
PRINT '(1X, A11, A10)', "Temperature", "Volume"
PRINT '(1X, A11, A10)', "===========", "======="

DO

READ (UNIT = 15, FMT = '(4X, F4.1, T13, F4.1)', IOSTAT = InputStatus) Temperature, Volume
! 파일 15의 자료를 읽는다. IOSTAT = InputStatus는 읽은 결과를 할당. 양의 값-입력오류, 음의 값-데이터의 끝, 0-잘 읽음

IF (InputStatus > 0) THEN
STOP "*** 입력 에러 ***" ! 프로그램 종료하기
END IF

IF (InputStatus < 0) THEN
EXIT ! DO 루프 빠져나가
END IF

PRINT '(1X, F8.1, F12.1)', Temperature, Volume
Count = Count + 1
SumOfTemps = SumOfTemps + Temperature
SumOfTemps2 = SumOfTemps2 + Temperature ** 2
SumOfVols = SumOfVols + Volume
SumOfProds = SumOfProds + Temperature * Volume

END DO

CLOSE(15)
! 15번 파일을 닫는다.

MeanTemperature = SumOfTemps / REAL(Count)
MeanVolume = SumOfVols / REAL(Count)

PRINT *
PRINT '(1X, A, F6.2, A, F6.2)', "평균 온도 =", MeanTemperature, " ; 평균 부피 =", MeanVolume

Slope = (SumOfProds - SumOfTemps * MeanVolume) / (SumOfTemps2 - SumOfTemps * MeanTemperature)
Y_Intercept = MeanVolume - Slope * MeanTemperature

PRINT '(/1X, "회귀식" /1X, " y =", F5.1, "x + ", F5.1, /1X, "여기서 x는 온도, y는 부피")', Slope, Y_Intercept

END PROGRAM Temp_Vol

위 소스를 05_01_Temp_Vol.f95 로 저장

자료 파일

1200034203221015
1300038803221121
1400044803241425
1500051303201520
1600055503181665
1700061303191865
1800067503232080
1900072103282262
2000076803252564
2100083503272869
2200088903303186

위 자료 파일을 05_01_Temp_Vol.dat 로 저장

컴파일 및 프로그램 테스트



출력 서식 지정

PROGRAM Prin

IMPLICIT NONE

INTEGER :: Num = 3, L = 5378, Kappa = -12345
REAL :: A1 = 7.5, B1 = 0.182, C1 = 625.327
REAL :: A2 = .12345E8, B2 = .0237, C2 = 4.5E-12, D2 = -76.1684E12
REAL :: A3 = 0.3, B3 = 7.9
INTEGER :: A4 = 141

PRINT '(1X, 2I5, I7, I10)', Num, Num - 3, L, Kappa
PRINT '(1X, 2I5.2, I7, I10.7)', Num, Num - 3, L, Kappa
PRINT '(1X, 2I5.0, I7, I10)', Num, Num - 3, L, Kappa

PRINT *,

PRINT '(1X, 2F6.3, F8.2)', A1, B1, C1

PRINT *,

PRINT '(1X, 2E15.5, 2E15.4)', A2, B2, C2, D2

PRINT *,

PRINT '(1X, "X =", F6.2, " Y =", F6.2)', A3, B3
PRINT '(1X, A, F6.2, A, F6.2)', "X =", A3, " Y =", B3

PRINT *,

PRINT '(1X, A11, 3X, A4, 2X, I3)',"John Q. Doe", "CPSC", A4
PRINT '(1X, A11, T16, A4, 2X, I3)',"John Q. Doe", "CPSC", A4

PRINT '(1X, I10, 3/ 1X, 2I10, // 1X 3I10)', A4, A4, A4, A4, A4, A4

END PROGRAM Prin

위 소스를 c.f95로 저장

컴파일 및 출력 확인



PRINT '(1X, 2I5, I7, I10)', Num, Num - 3, L, Kappa
두 개의 5칸을 차지하는 정수 출력(2I5), 7칸 차지하는 정수 출력(I7), 10칸 차지하는 정수 출력(I10)

PRINT '(1X, 2I5.2, I7, I10.7)', Num, Num - 3, L, Kappa
두 개의 5칸을 차지하나 최소한 2개는 꼭 정수 출력(2I5.2), 7칸 차지하는 정수 출력(I7), 10칸 차지하는 그러나 최소 7개는 꼭 정수 출력(I10)

PRINT '(1X, 2I5.0, I7, I10)', Num, Num - 3, L, Kappa


PRINT '(1X, 2F6.3, F8.2)', A1, B1, C1
두 개의 6칸을 차지하고 소수점 아래가 3칸을 차지하는 실수 출력(2F6.3), 8칸을 차지하고 소수점 아래가 2칸을 차지하는 정수 출력


PRINT '(1X, 2E15.5, 2E15.4)', A2, B2, C2, D2
두 개의 15칸을 차지하고 유효자리수가 5개의 실수 출력(2E15.5), 2개의 15칸을 차지하고 유효자리수가 4개인 실수 출력(2E15.4)


PRINT '(1X, "X =", F6.2, " Y =", F6.2)', A3, B3
PRINT '(1X, A, F6.2, A, F6.2)', "X =", A3, " Y =", B3
문자 출력을 형식 지정에서도 할 수 있고, 변수 나열에서도 할 수 있음


PRINT '(1X, A11, 3X, A4, 2X, I3)',"John Q. Doe", "CPSC", A4
11칸을 차지하는 문자 출력(A11), 3칸의 공백(3X), 4칸의 문자 출력(A4), 2칸의 공백(2X), 3칸의 정수 출력(I3)

PRINT '(1X, A11, T16, A4, 2X, I3)',"John Q. Doe", "CPSC", A4
T16은 16칸에서 시작한다는 뜻


PRINT '(1X, I10, 3/ 1X, 2I10, // 1X 3I10)', A4, A4, A4, A4, A4, A4
3/는 세 번의 엔터를 친 효과, //은 두 번의 엔터를 친 효과

DO WHILE 을 이용한 온도 변환

섭씨온도를 화씨온도로 변환

계속 변환할 지 결정

-40도씨 이상만 변환

PROGRAM Temp

IMPLICIT NONE

REAL :: Celsius, Fahrenheit
CHARACTER :: Response = "Y"

DO WHILE (Response /= "N")

PRINT *, "-40도씨 이상의 섭씨 온도를 입력하시오(ex:36)"
READ *, Celsius

IF (Celsius >= -40) THEN
Fahrenheit = 1.8 * Celsius + 32.0

PRINT *,"섭씨온도 ", Celsius, " = 화씨온도 ", Fahrenheit

PRINT *
PRINT *, "온도 변환을 더 하시겠습니까? 그만 두려면 N을 입력하시오."
READ *, Response
END IF

END DO

END PROGRAM Temp

위 소스를 b.f95로 저장

컴파일 및 프로그램 테스트



'Programming > Fortran' 카테고리의 다른 글

회귀 분석(파일 처리, 입력 서식 지정)  (0) 2008.09.02
출력 서식 지정  (0) 2008.08.29
온도변환(DO, EXIT, CYCLE, END DO)  (0) 2008.08.28
감가상각 (DO, END DO)  (0) 2008.08.27
곱셈표 (DO, END DO)  (0) 2008.08.27

섭씨 온도를 화씨온도로 변환하기

계속 반복하여 계산할 지 결정

-40도씨 이상만 변환

PROGRAM Temp

IMPLICIT NONE

REAL :: Celsius, Fahrenheit
CHARACTER :: Response

DO

PRINT *, "-40도씨 이상의 섭씨 온도를 입력하시오(ex:36)"
READ *, Celsius

IF (Celsius < -40) THEN
PRINT *,"-40도씨 이상의 섭씨 온도만 처리합니다."
CYCLE ! DO loop의 처음으로 이동
END IF

Fahrenheit = 1.8 * Celsius + 32.0

PRINT *,"섭씨온도 ", Celsius, " = 화씨온도 ", Fahrenheit

PRINT *
PRINT *, "온도 변환을 더 하시겠습니까 (Y or N)?"

READ *, Response

IF (Response == "N" .OR. Response == "n") EXIT ! N라고 하면 DO loop 종료

END DO

END PROGRAM Temp


위 소스를 04_03_Temp.f95로 저장

컴파일 및 프로그램 테스트



'Programming > Fortran' 카테고리의 다른 글

출력 서식 지정  (0) 2008.08.29
온도 변환(DO WHILE, END DO)  (0) 2008.08.28
감가상각 (DO, END DO)  (0) 2008.08.27
곱셈표 (DO, END DO)  (0) 2008.08.27
반가수기(.OR. .AND. .NOT)  (0) 2008.08.27

+ Recent posts