cp ../es1/secondo.f90 . (attenzione al punto finale!!)il cui significato è : copia nella cartella corrente ( indicata in modo abbreviato mediante il punto finale) il file secondo.f90 che "si trova" nella cartella raggiungibile da quella corrente risalendo alla cartella in cui quest' ultima è "contenuta" e "scendendo" nella sottocartella di nome es2. Ovvero, in modo più preciso, si chiede di copiare il file il cui nome completo è quello della cartella corrente ( /home/user/es1 ), a cui viene tolto l' ultimo segmento (es1) e viene aggiunto es2/secondo.f90 su un nuovo file il cui nome termina con lo stesso nome del faile di partenza ( secondo.f90 ) ma inizia col nome della cartella corrente ( . ovvero /home/user/es2 ). La versione lunga es esplicita del comando precedente sarebbe:
cp /home/user/es1/secondo.f90 /home/user/es2/secondo.f90Da notare che se l' ultimo file de comando cp non esiste, viene creato. Se invece esiste già un file con quel nome, viene sovrascritto (ed il vecchio contenuto è perso per sempre).
Fatto questo (verificare col comando ls che la copia sia stata
realizzata), occorre ricompilare il file secondo.f90 mediante il
compilatore Fortran (g95) per
creare il file eseguibile contenente le istruzioni macchina che
implementano le elaborazioni descritte dal sorfgente Fortran.
Invece di usare il defualt del compilatore (in assenza di altre
indicazioni, il comando g95 secondo.f90
creerebbe un file eseguibile di nome a.out nella cartella corrente)
si consiglia di compilare mediante il comando
g95 secondo.f90 -o secondo.xIl modificatore -o secondo.x "dice" al compilatore che il file di istruzioni macchina eseguibili dal processore deve essere battezzato secondo.x (o in qualsiasi altro modo si voglia battezzare il file).
IF( espressione logica )THENesegue le istruzioni del blocco di istruzioni 1 se l' espressione logica tra parentesi è vera e quelle del blocco 2 se è falsa. Usare il costrutto Fortran IF ( ... ) THEN ... ELSE ... END IF per fare in modo che il programma per la soluzione dell' equazione di secondo grado scriva le soluzioni reali solo se esistono, mentre, se non esistono visualizzi su schermo un messaggio diagnostico. (Ricordare che l' ordine con cui si scrivono le istruzioni nel sorgente Fortran corrisponde a quello di esecuzione delle corrispondenti istruzioni macchina.)
...blocco 1
ELSE
...blocco 2
END IF
Si può attribuire un valore iniziale ad una
variabile nella
stessa
istruzione in cui se ne definisce il tipo. Le variabili
possono poi essere
ridefinite nel programma
assegnando loro un nuovo valore (eventualmente dipendente dal
vecchio). Nota: l'istruzione implicit none che appare come prima istruzione negi
esempi di
programmi dati in questo corso equivale a richiedere che siano date le
dichiarazioni
esplicite
del tipo dati di ogni variabile utilizzata nel programma. In assenza di
tale istruzione, il Fortran assumerebbe che le variabili non dichiarate
esplicitamente il cui nome inizi per lettere
comprese tra a e h e tra o e z siano reali mentre quelle il cui nome
inizia per i,j,k,l,m,n siano intere.
Questa convenzione implicita del Fortran è
potenzialmente pericolosa per la possibilita di introdurre
inavvertitamente variabili non previste (e non inizializzate) e
quindi è buona
norma, anche se non è
un obbligo del linguaggio, utilizzare sempre l' istruzione implict
none.
Es:
program par
implicit none
integer :: i=2
print*,i
i=i+1
print*,i , i+3
end program par
verificare il funzionamento del programma.
program do_loops
implicit none
integer :: i,j,n_ciclo = 1
print*," loop #
",n_ciclo ! ciclo n. 1 ; scriviamo di quale
ciclo si tratta per identificarlo in output
do i = 1,10,1
print*,i
end do
n_ciclo = n_ciclo + 1
! incrementiamo il numero di ciclo
print*," loop # ",n_ciclo ! ciclo n. 2
do i = 1,10
print*,i
end do
n_ciclo = n_ciclo + 1
print*," loop # ",n_ciclo ! ciclo n. 3
do i = 1,10,-1
print*,i
end do
n_ciclo = n_ciclo + 1
print*," loop # ",n_ciclo ! ciclo n. 4
do i = 10,10,2
print*,i
end do
n_ciclo = n_ciclo + 1
print*," loop # ",n_ciclo ! ciclo n. 5
do i = 10,1,-1
print*,i
end do
n_ciclo = n_ciclo + 1
print*," loop # ",n_ciclo ! ciclo n. 8
do i = 1,3
do j = i+1,3
print*,"i= ",i," j= ",j
end do
end do
end program do_loops
integer :: i , j
i = 0
do j = 1,10
i = i + j
end do
print*,i
program media
implicit none
real :: aver,x
integer :: i,N
print*," N= ?"
read*,N
print*," immetti i dati uno alla volta"
aver=0.0
do i=1,N
read*,x
aver = aver + x
end do
aver = aver/N
print*," media di ",N," dati : ",aver
end program media
Suggerimenti:
1. scrivere un programma che scriva su file fort.1 un certo numero (quante ?) di coppie ordinate (x,f(x)) ad ascisse equispaziate. Per scrivere su file, invece dell' istruzione print*,... si può usare l' istruzione write(unit=M,fmt=*)... dove ... rappresenta la lista delle variabili o costanti che si vuole scrivere. M rappresenta un intero positivo (con g95 deve essere diverso da 0, 5 e 6). Il file su cui il programma scriverà avrà nome fort.M Da ricordare: 2. Per
visualizzare un grafico x-y: dalla finestra terminale
dare il
comando
gnuplot
e
poi, al prompt (gnuplot>), il comando
plot 'fort.1' with lines (che si puo' abbreviare in plot 'fort.1' w l )
per avere un grafico del risultato.
Se si avessero più colonne nello stesso file e si volessero graficare i dati delle colonne 2 e 4 il comando andrebbe modificato come:
plot 'fort.1' using 2:4 w l
abbreviabile in:
plot 'fort.1' u 2:4 w l Per terminare dare quit;
per
avere aiuto circa l' uso di gnuplot: help. Un'
osservazione del grafico risultante dovrebbe darci qualche
indicazione sull' adeguatezza del campionamento della
funzione.
I grafici possono anche essere
salvati su file mediante i comandi
di gnuplot:
set term postscript colorseguiti dalla lista di comandi per tracciare i grafici oppure replot (cfr help gnuplot per l' utilizzo).
set output "nomefile.ps"