MODULE Geom2D IMPLICIT NONE TYPE punto REAL :: x,y END TYPE punto TYPE cerchio TYPE(punto) :: centro REAL :: raggio END TYPE cerchio INTERFACE OPERATOR (-) PROCEDURE Distanza_Punti END INTERFACE CONTAINS FUNCTION Distanza_Punti(p,q) RESULT(d) IMPLICIT NONE TYPE(punto), INTENT(IN) :: p,q REAL :: d d = SQRT((P%x-Q%x)**2 + (P%y-Q%y)**2) RETURN END FUNCTION SUBROUTINE Stampa_Cerchio(c) IMPLICIT NONE TYPE(cerchio), INTENT(IN) :: c WRITE (*,*) 'Cerchio come tipo derivato:' WRITE (*,*) c WRITE (*,*) 'Cerchio per componenti:' WRITE (*,'(A,F6.2,",",F6.2)',ADVANCE='NO') "Il cerchio ha centro in ",c%centro%x,c%centro%y WRITE (*,'(A,3F6.2,/)') " e raggio ",c%raggio RETURN END SUBROUTINE Stampa_Cerchio END MODULE Geom2D PROGRAM Stampa_Geom2D USE Geom2D IMPLICIT NONE TYPE(punto) :: o, p TYPE(cerchio) :: mezzo o = punto(1.0,2.0) mezzo = cerchio(o,0.5) CALL Stampa_Cerchio(mezzo) p = punto(2.0,3.0) WRITE(*,*) "La distanza tra i punti O e P e' ",Distanza_Punti(o,p) WRITE(*,*) "... usata come operatore: ",(o-p) STOP "Fine esecuzione" END PROGRAM Stampa_Geom2D