Informatica. AA 2009/10.

Lezione di laboratorio n. 5




  1. La seguente funzione calcola il quadrato di un numero reale  e  gli somma una costante. Nel codice sotto riportato c' è anche un programma che utilizza la function:

    module abc
    contains
    function square (x) result (s)
    implicit none
    real,intent (in) ::x
    real ::s,p
    p=3.5
    s=x**2 + p
    end function square
    end module abc

    program est

    use abc
    implicit none
    real :: a,p,square
    a=5.00
    p=-1.0
    print*,10*square(a)
    print*,p
    end program est

    prevedere cosa scriverà e verificare che l' output corrisponda alle previsioni.

    Cose da notare:
        1. il programma che usa la function deve dichiarare anche il tipo dati relativo al nome della function (e non al nome della variabile in result).
        2. la variabile s della function (dove finisce il risultato) va dichiarata come tipo dati nella function ma senza l' attributo intent.
        3. le variabili locali alla function corrispondono a locazioni di memoria indipendenti da quelle che corrispondono alle variabili (anche con lo stesso nome)  del  programma che chiama la function.
        4. Il  nome della variabile utilizzata nella chiamata di square  non coincide con quello dell' argomento nella definizione della function; la corrispondenza viene effettuata,  in generale, attraverso l' ordine degli argomenti.



  2. Scrivere una function, in un modulo, che abbia un argomento di tipo array di rango 1 di real e  ritorni il  valor medio degli elementi dell'  array.  Per calcolare il valor medio occorre che la function conosca il numero di elementi dell' array. Questa informazione può essere passata come argomento oppure può essere dedotta mediante la funzione di libreria SIZE(x,n), dove x è l' array e n l' indice di cui si chiede l' estensione (n. di componenti). Per un array di rango 1, SIZE(x,1) ritorna il numero di elementi. Se si passa il numero di componenti, il dimensionamento dell' array nella function userà tale parametro. Altrimenti si indica solo il numero di indici dell' array (array di forma presunta).



  3. Una function può  anche ritornare un risultato di tipo  array. In tal caso,  il risultato dovrà  avere l' attributo dimension. Se l' array ritornato dala function deve avere le stesse dimensioni di un argomento, queste possono essere determinate facendo ricorso alla function intrinseca  size

    Data la function
    function raddoppia(x) result(dop)
    real,dimension(:),intent(in) ::x
    real,dimension(size(x)) ::dop
    dop= 2*x
    end function raddoppia

    Utilizzarla all' interno di un programma che legga l' array da tastiera e lo scriva su schermo. (Non dimenticare di inserire la function in un modulo).