알고리즘 설계의 기초인 '변수 값 밀어내기'와 '누적 곱셈'의 원리를 포트란 77 문법으로 구현해 본다. 수식 연산에 최적화된 언어 특성을 활용하여 다중 루프 구조를 간결하게 표현함.
🟪 1. 데이터 영역 및 변수 선언 (Specification)
수열 회전 시 이전 값을 보관할 정수형 변수들과, 팩토리얼 곱셈 값이 기하급수적으로 커질 것에 대비해 넉넉한 숫자형 공간(INTEGER)을 선언함. 7번째 칸 규칙을 엄수해야 한다.
fortran code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
C ====== 1번째 칸에 'C'를 적으면 이 줄은 주석 공간이 됨 ======
PROGRAM FIB_FACT_MASTER
IMPLICIT NONE
* [피보나치 변수] 첫 번째(A), 두 번째(B), 합산결과(C) 및 루프 인덱스
INTEGER FIBA, FIBB, FIBC, FIBIDX
* [팩토리얼 변수] 루프 인덱스, 제한 한도, 그리고 결과를 담을 변수
INTEGER FCTIDX, FCTLMT, FCTRES
코드를 사용할 때는 주의가 필요합니다.
🟩 2. 두 가지 알고리즘 반복 연산 (Execution)
DO 루프를 활용하여 피보나치는 변수 값을 한 칸씩 밀어내며 10번째 항까지 연속 출력하고, 팩토리얼은 1부터 5까지 곱셈을 누적하는 영역임.
fortran code
12345678901234567890123456789012345678901234567890123456789012345678901234567890
* =============================================================
* [알고리즘 A] 피보나치 수열 10번째 항까지 구하기 (DO 루프)
* =============================================================
* [초기화] 피보나치 초기 변수 값 세팅 및 첫 두 항 출력
FIBA = 1
FIBB = 1
WRITE(*, 700) FIBA
WRITE(*, 700) FIBB
* 3번째 항부터 10번째 항까지 1씩 증가하며 반복 실행함
DO 20 FIBIDX = 3, 10, 1
FIBC = FIBA + FIBB
WRITE(*, 700) FIBC
* [값 밀어내기] 다음 회전을 위해 변수 값을 왼쪽으로 이관함 (순서 주의)
FIBA = FIBB
FIBB = FIBC
20 CONTINUE
* =============================================================
* [알고리즘 B] 5 팩토리얼 (5!) 누적 곱셈 연산
* =============================================================
* [초기화] 곱셈 변수이므로 반드시 초깃값을 0이 아닌 1로 세팅해야 함
FCTRES = 1
FCTLMT = 5
DO 30 FCTIDX = 1, FCTLMT, 1
* 기존 결과값에 인덱스 숫자를 지속적으로 누적 곱셈함
FCTRES = FCTRES * FCTIDX
30 CONTINUE
WRITE(*, 800) FCTRES
* -> 정상 구동 시 5 * 4 * 3 * 2 * 1 연산 결과인 '120'이 출력됨
STOP
C =================================================================
C [FORMAT 정의 구역] 결과 데이터 표출 포맷 선언 (1~5칸 레이블)
C =================================================================
700 FORMAT(1X, 'FIBONACCI ITEM : ', I4)
800 FORMAT(1X, '5 FACTORIAL (5!) RESULT : ', I6)
END
코드를 사용할 때는 주의가 필요합니다.
💡 [실무 팁] 피보나치 '값 밀어내기 순서'와 팩토리얼 '초깃값 1'의 규칙
정보처리기능사 실기 시험 순서도 추적 검사(Trace) 시 화살표 방향을 헷갈려 대량 오답을 유발하던 두 가지 핵심 알고리즘 통제 규칙임.
- 피보나치 값 복사 시의 우선순위
- FIBC = FIBA + FIBB 연산 직후 변수 공간을 갱신할 때, 반드시 FIBA = FIBB를 먼저 실행하고 나서 FIBB = FIBC를 처리해야 함.
- 만약 순서를 뒤바꿔 FIBB = FIBC를 먼저 실행해 버리면, 변수 FIBB가 가지고 있던 기존 원본 데이터가 증발하여 다음 라인에서 FIBA = FIBB를 할 때 엉뚱한 최신 값 FIBC가 중복 복사되는 복합 논리 오류가 발생함.
- 팩토리얼 누적 변수의 0 초기화 금지 규칙
- 더하기 연산 변수는 쓰레기 값을 청소하기 위해 0으로 리셋하는 것이 정석이었음.
- 반면 곱셈을 지속적으로 누적하는 변수(FCTRES)를 0으로 세팅하는 순간 0 * 1 = 0, 0 * 2 = 0이 되어 루프를 아무리 돌려도 최종 결과가 무조건 0으로 수렴하는 프로그램 파괴 대참사가 발생함. 곱셈 연산 버퍼는 반드시 초기값 1로 시작하는 것이 규칙이다.
'프로그래밍 > Fortran 77' 카테고리의 다른 글
| [FORTRAN 기초] 알고리즘 4편: 최대공약수와 최소공배수 구하기 fortran code (0) | 2026.06.22 |
|---|---|
| [FORTRAN 기초] 알고리즘 3편: 소수 판별 및 약수 구하기 fortran code (0) | 2026.06.22 |
| [FORTRAN 기초] 알고리즘 1편: 1에서 100까지 합 구하기 기본 fortran code (0) | 2026.06.22 |
| [FORTRAN 기초] 6편: 반복문(DO ~ CONTINUE)으로 대량 데이터 루프 제어하기 fortran code (0) | 2026.06.22 |
| [FORTRAN 기초] 5편: 조건문(IF ~ THEN ~ ENDIF)으로 합격/불합격 판별하기 fortran code (0) | 2026.06.22 |