G. Mecca – Università della Basilicata – mecca@unibas.it
Programmazione Procedurale in Linguaggio C++
Sottoprogrammi Parte 8 Il FORTRAN
versione 2.1
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
Sommario
m
Un Altro Esempio: Il FORTRAN
m
Confronto tra Reali
m
Definizione di Funzioni
m
Definizione di Procedure
m
Chiamata di Funzioni
m
Chiamata di Procedure
m
Passaggio dei Parametri Programmazione Modulare
Sottoprogrammi: FORTRAN >> Sommario
G. Mecca - Programmazione Procedurale in Linguaggio C++ 3
Un Altro Esempio: Il FORTRAN
m
Sottoprogrammi in FORTRAN
ðfunzioniðprocedure (chiamate “subroutine”)
m
Differenze fondamentali
ðin FORTRAN i parametri sono passati normalmente per riferimento
ðnon esistono oggetti globali ðnon esistono regole di visibilità
>> equazioni1f.for
Confronto tra Reali
m
Una postilla
ðil FORTRAN è un linguaggio orientato al calcolo di precisione
ði compilatori tendono a tenere in considerazione i problemi numerici
m
Esempio
ðconfronto tra due valori reali ðconfronto tra un valore reale e 0
Sottoprogrammi: FORTRAN >> Confronto tra Reali
G. Mecca - Programmazione Procedurale in Linguaggio C++ 5
Confronto tra Reali
m
Infatti
ðla rappresentazione dei reali è approssimata (virgola mobile)
ði confronti possono introdurre errori
ðdi conseguenza il compilatore li segnala con degli avvertimenti (WARNING)
Sottoprogrammi: FORTRAN >> Confronto tra Reali
0017) if ((x1.eq.x2).or.(x1.eq.y2).or.
WARNING - The use of .EQ. or .NE. with non-integer operands can produce misleading results
Confronto tra Reali
m
Nei casi ordinari
ðè possibile ignorare gli avvertimenti
m
Una possibile soluzione
ðbasare i confronti sulle differenze
ðcon una precisione accettabile (es: 10-20) ðdefinire una funzione booleana “uguali”
ðche riceve due numeri reali
ðe restituisce vero se la differenza tra i due
Sottoprogrammi: FORTRAN >> Confronto tra Reali
G. Mecca - Programmazione Procedurale in Linguaggio C++ 7
Confronto tra Reali
logical function uguali(n1, n2) real n1, n2
if (abs(n1-n2).lt.1E-20) then uguali = .true.
else
uguali = .false.
end if return end
Utilizzo: invece di if (x.eq.y) then ...
if (uguali(x,y)) then ...
>> equazioni2f.for
Definizione di Funzioni
m
Sintassi
<tipoRis> function <nome> (<parametri>)
<istruzioni>
end m
Dove
ð<tipoRis> è un tipo di dato ð<nome> è un identificatore
ð<istruzioni> è un blocco di istruzioni ð<parametri> è l’elenco dei parametri
Sottoprogrammi: FORTRAN >> Definizione di Funzioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 9
Definizione di Funzioni
real function discriminante (a, b, c) implicit none
real a, b, c
discriminante = b*b-4*a*c return
end
real function primaRadice (a, b, c) implicit none
real a, b, c
real discriminante
primaRadice=-b+sqrt(discriminante(a,b,c)) return
end
Sottoprogrammi: FORTRAN >> Definizione di Funzioni
tipo dei parametri
istruzione di assegnazione
“speciale”
dichiarazione del tipo della funzione
Definizione di Funzioni
m
Elenco dei parametri
ðviene specificato solo l’elenco dei nomi senza tipo
<nomeP1>, <nomeP2> ...
m
Dichiarazione del tipo
ðviene dichiarato tra le istruzioni
ðcon una sintassi simile a quella della dichiarazione delle variabili
Sottoprogrammi: FORTRAN >> Definizione di Funzioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 11
Definizione di Funzioni
m
Istruzione return
ðil corpo deve contenerne almeno una
m
Sintassi
return m
Attenzione
ðper specificare il valore da restituire viene utilizzata un’istruzione di assegnazione
“speciale”
<nomeFunzione> = <espressione>
Definizione di Procedure
m
Sintassi
subroutine <nome> (<parametri>)
<istruzioni>
end m
Dove
ð<nome> è un identificatore
ð<istruzioni> è un blocco di istruzioni
ð<parametri> è l’elenco dei nomi dei param.
Sottoprogrammi: FORTRAN >> Definizione di Procedure
G. Mecca - Programmazione Procedurale in Linguaggio C++ 13
Definizione di Procedure
subroutine leggiEquazione(a, b, c) implicit none
real a, b, c
write (*,*) 'Inserisci i coeff. dell''equazione' read (*,*) a, b, c
return end
subroutine stampaRadici(a, b, c, x, y) implicit none
real a, b, c real x, y
write (*,*) a, 'x2+', b, 'x+', c, '=0' write (*,*) 'Radici: x=', x, ', y=', y return
end
Sottoprogrammi: FORTRAN >> Definizione di Procedure
Utilizzo delle Funzioni
m
All’interno di espressioni
<nomeFunzione>(<arg1>, <arg2>,...<argn>) m
Differenza
ðè necessario che il tipo della funzione sia dichiarato tra le dichiarazioni del modulo chiamante
m
ATTENZIONE
ðse non si usa IMPLICIT NONE vengono utilizzate le regole di tipizzazione implicite
Sottoprogrammi: FORTRAN >> Utilizzo delle Funzioni
G. Mecca - Programmazione Procedurale in Linguaggio C++ 15
Utilizzo delle Procedure
m
Come istruzioni a sé stante
ðviene utilizzata la parola chiave call
ðper il resto la chiamata è analoga a quella del C++
m
Sintassi
call <nomeProc>(<arg1>, <arg2>,...<argn>)
Passaggio dei Parametri
m
Le regole del FORTRAN
ðnon è possibile distinguere sintatticamente tra parametri standard e per riferimento ðogni volta che ad un parametro viene
associato un argomento modificabile, il passaggio è per riferimento
ðse l’argomento è una costante, il passaggio è standard
Sottoprogrammi: FORTRAN >> Passaggio dei Parametri
G. Mecca - Programmazione Procedurale in Linguaggio C++ 17
Passaggio dei Parametri
subroutine leggiEquazione(a, b, c) implicit none
real a, b, c
write (*,*) 'Inserisci i coeff. dell''equazione' read (*,*) a, b, c
return end
program prova implicit none real x, y x = 1 y = 2
call leggiEquazione(x, y, 3) ...
Sottoprogrammi: FORTRAN >> Passaggio dei Parametri
In questo caso:
-i primi due parametri vengono passati per riferimento
-il terzo parametro viene passato per valore
Programmazione Modulare
m
Caratteristiche del FORTRAN
ðnon è possibile utilizzare dati globali ðnon ci sono regole di visibilità (isottoprogrammi possono comparire in qualsiasi ordine)
ðè ammessa la compilazione separata ðnon essendoci regole di visibilità, non
vengono utilizzati i file di intestazioni
Sottoprogrammi: FORTRAN >> Programmazione Modulare
G. Mecca - Programmazione Procedurale in Linguaggio C++ 19
Riassumendo
m
Un Altro Esempio: Il FORTRAN
ðConfronto tra RealiðDefinizione di Funzioni ðDefinizione di Procedure ðChiamata di Funzioni ðChiamata di Procedure ðPassaggio dei Parametri ðProgrammazione Modulare
Termini della Licenza
m This work is licensed under the Creative Commons Attribution- ShareAlike License. To view a copy of this license, visit
http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
Termini della Licenza
m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare
http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.