MODULE Parole IMPLICIT NONE INTERFACE OPERATOR (+) MODULE PROCEDURE concatena END INTERFACE CONTAINS FUNCTION concatena(a,b) IMPLICIT NONE CHARACTER (LEN=*), INTENT(IN) :: a, b CHARACTER (LEN=(LEN_TRIM(a) + LEN_TRIM(b) + 1)) :: concatena concatena = TRIM(a)//" "//TRIM(b) RETURN END FUNCTION concatena END MODULE Parole MODULE Anagrafe USE Parole IMPLICIT NONE TYPE data INTEGER :: g, m, a END TYPE data TYPE nascita CHARACTER(132) :: luogo TYPE(data) :: giorno END TYPE nascita TYPE generalita CHARACTER(132) :: nome, cognome TYPE(nascita) :: evento END TYPE generalita INTERFACE ASSIGNMENT (=) PROCEDURE Aggiunge_nascita END INTERFACE INTERFACE Stampa PROCEDURE Stampa_nascita PROCEDURE Stampa_generalita END INTERFACE CONTAINS SUBROUTINE Aggiunge_nascita(g,n) IMPLICIT NONE TYPE(Generalita), INTENT(INOUT) :: g TYPE(Nascita), INTENT(IN) :: n g%evento = n RETURN END SUBROUTINE Aggiunge_nascita SUBROUTINE Stampa_nascita(n) IMPLICIT NONE TYPE(nascita), INTENT(IN) :: n WRITE (*,'(3a,2(i2.2,"/"),i4)') & "Sono nato a ", TRIM(n%luogo), & ", il giorno ", n%giorno%g, n%giorno%m, n%giorno%a RETURN END SUBROUTINE Stampa_nascita SUBROUTINE Stampa_generalita(n) IMPLICIT NONE TYPE(generalita), INTENT(IN) :: n WRITE (*,'(a,1x,2(i2.2,"/"),i4)') n%nome+n%cognome+ & "e' nato a "+ TRIM(n%evento%luogo) + & ", il giorno ", n%evento%giorno%g, n%evento%giorno%m, n%evento%giorno%a RETURN END SUBROUTINE Stampa_generalita END MODULE Anagrafe PROGRAM stampa_anagrafe USE Anagrafe IMPLICIT NONE TYPE(generalita) :: tizio TYPE(nascita) :: n n = nascita("Milano",data(29,2,2004)) tizio%nome = "Filippo" tizio%cognome="Deiliberti" tizio = n CALL Stampa(tizio) STOP END PROGRAM stampa_anagrafe