25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

5.14 Clausola RESULT per le funzioni 277<br />

5.14 Clausola RESULT per le funzioni<br />

Le funzioni <strong>Fortran</strong> possono essere definite con una clausola RESULT la quale specifica, tra due<br />

parentesi, il nome della variabile che immagazzinerà il risultato fornito dalla funzione. A titolo<br />

di esempio, si consideri la seguente funzione:<br />

FUNCTION addizione(a,b,c) RESULT(somma)<br />

IMPLICIT NONE<br />

REAL, INTENT(IN) :: a, b, c<br />

REAL :: somma<br />

somma = a+b+c<br />

END FUNCTION addizione<br />

Si noti come la dichiarazione del tipo della funzione sia insito nella dichiarazione del tipo<br />

della variabile ”risultato” (nel caso in esame, la funzione ha lo stesso tipo della variabile somma<br />

ossia è una funzione reale). La clausola RESULT è, tipicamente, opzionale; il suo uso risulta,<br />

invece, obbligatorio in presenza di una funzione direttamente ricorsiva (alle procedure ricorsive<br />

sarà dedicato il prossimo paragrafo). Prima, però, si vuole riportare un altro esempio di utilizzo<br />

della clausola RESULT che sia, al contempo, un ulteriore esempio di funzioni che restituiscono<br />

in output una stringa di caratteri. La prossima funzione, infatti, restituisce il giorno della<br />

settimana (ossia una stringa del tipo lunedi, martedi, ...) che corrisponde ad una certa data:<br />

FUNCTION day_of_week(year,mounth,day) RESULT(weekday)<br />

! Calcola il giorno della settimana nota una data<br />

! La data di input non deve essere anteriore al mese di<br />

! Ottobre del 1752 (infatti furono "cancellati" 11 giorni<br />

! al mese di Settembre del 1752)<br />

IMPLICIT NONE<br />

INTEGER, INTENT(IN) :: year, mounth, day<br />

CHARACTER (LEN=9) :: weekday<br />

! Variabili locali<br />

INTEGER :: yr, mnth, hundreds, day_ptr<br />

INTEGER, PARAMETER, DIMENSION(12) :: max_days = &<br />

(/31,29,31,30,31,30,31,31,30,31,30,31/)<br />

CHARACTER(LEN=9), PARAMETER :: day_name(0:6) = (/’Domenica ’, &<br />

’Lunedi ’,’Martedi ’, &<br />

’Mercoledi’,’Giovedi ’, &<br />

’Venerdi ’,’Sabato ’ /)<br />

! Check sul mese<br />

weekday = CHAR(7) // ’<strong>Il</strong>legale’<br />

mnth=mounth<br />

IF (mnth12) RETURN<br />

! Numera i mesi a partire da Marzo; Gennaio e Febbraio sono<br />

! trattati come i mesi 11 e 12 dell’anno precedente

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!