포인터와 연결 구조체를 이용한 인터넷 주소 통계 처리
PROGRAM Internet_Address
IMPLICIT NONE
TYPE List_Node
CHARACTER(15) :: TCP_IP_Address
INTEGER :: Count
TYPE(List_Node), POINTER :: NEXT
END TYPE List_Node
CHARACTER(15) :: Address, FileName*20
INTEGER :: OpenStatus, InputStatus
TYPE(List_Node), POINTER :: AddressList
WRITE (*, '(1X, A)', ADVANCE ="NO") "Enter name of address file : "
READ *, FileName
OPEN (UNIT = 10, FILE = FileName, STATUS = "OLD", IOSTAT = OpenStatus)
IF (OpenStatus > 0) THEN
STOP "*** cannot open address file ***"
END IF
NULLIFY(AddressList)
DO
READ (UNIT = 10, FMT = '(A)', IOSTAT = InputStatus) Address
IF (InputStatus > 0) THEN
STOP "*** Input error ***"
END IF
IF (InputStatus < 0) THEN
EXIT ! end of file
END IF
CALL Add_To_List(AddressList, Address)
END DO
CALL Output_Addresses(AddressList)
CONTAINS
SUBROUTINE Add_To_List(AddressList, Address)
TYPE(List_Node), POINTER :: AddressList, LocPtr
CHARACTER(*), INTENT(IN) :: Address
INTEGER :: AllocateStatus
LOGICAL :: In_the_List
IF (.NOT. ASSOCIATED(AddressList)) THEN
ALLOCATE(AddressList, STAT = AllocateStatus)
IF (AllocateStatus /= 0) STOP "*** out of memory ***"
AddressList%TCP_IP_Address = Address
AddressList%Count = 1
NULLIFY(AddressList%Next)
ELSE
CALL Search(AddressList, Address, LocPtr, In_the_List)
IF (In_the_List) THEN
LocPtr%Count = LocPtr%Count + 1
ELSE
ALLOCATE(LocPtr, STAT = AllocateStatus)
IF (AllocateStatus /= 0) STOP "*** out of memory ***"
LocPtr%TCP_IP_Address = Address
LocPtr%Count = 1
LocPtr%Next => AddressList
AddressList => LocPtr
END IF
END IF
END SUBROUTINE Add_To_List
SUBROUTINE Search(AddressList, Address, LocPtr, In_the_List)
TYPE(List_Node), POINTER :: AddressList, LocPtr
CHARACTER(*), INTENT(IN) :: Address
LOGICAL, INTENT(INOUT) :: In_the_List
LocPtr => AddressList
In_the_List = .FALSE.
DO
IF (In_the_List .OR. .NOT. ASSOCIATED(LocPtr)) EXIT
IF (LocPtr%TCP_IP_Address == Address) THEN
In_the_List = .TRUE.
ELSE
LocPtr => LocPtr%Next
END IF
END DO
END SUBROUTINE Search
SUBROUTINE Output_Addresses(AddressList)
TYPE(List_Node), POINTER :: AddressList, Ptr
Ptr => AddressList
PRINT *, "Summary of Internet address data"
PRINT *
PRINT *, " Address Count"
PRINT *, "==========================="
DO
IF (.NOT. ASSOCIATED(Ptr)) THEN
EXIT
END IF
PRINT '(1X, A, 4X, I4)', Ptr%TCP_IP_Address, Ptr%Count
Ptr=>Ptr%Next
END DO
END SUBROUTINE Output_Addresses
END PROGRAM Internet_Address
위 소스를 10_01_Address.f95로 저장
자료
128.159.4.20
123.111.222.333
100.1.4.31
34.56.78.90
120.120.120.120
128.159.4.20
123.111.222.333
123.111.222.333
77.66.55.44
100.1.4.31
123.111.222.333
128.159.4.20
위 자료를 address.dat로 저장
소스 컴파일 및 프로그램 테스트
'Programming > Fortran' 카테고리의 다른 글
Block IF Construct (0) | 2008.11.24 |
---|---|
컴퓨터에 따른 실수의 정밀도(precision)와 범위(range) (0) | 2008.10.31 |
컴퓨터 사용 기록 검색(Derived types and structures) (0) | 2008.09.30 |
저장값의 범위 (0) | 2008.09.29 |
다차원배열 (0) | 2008.09.25 |