Informatica AA 2009/10

Lezione di laboratorio n. 4



  1. Il Fortran, oltre a variabili dei cinque tipi dati primitivi, permette di dichiarare variabili con indici (per ciascuno dei tipi primitivi): gli array. Questi possono essere pensati come variabili collettive etichettate con un nome comune e i cui elementi sono selezionabili mediante gli indici.
    Un vettore Fortran (array di rango 1) è definito da una istruzione
  2.       tipo, dimension(N)    :: A
    dove tipo rappresenta il tipo dati primitivo dell' array (real, integer, character, logical, complex) ed  N è una costante intera  esprimente il numero di componenti del vettore.    Un vettore può   esser letto componente per componente con istruzioni    del tipo:
              do I=1,N
                 read*,A(I)
              end do
    oppure mediante un' unica istruzione:

            read*,A

    o infine mediante un do implicito:

            read*,(A(i),i=1,N)

    Analogamente si possono scrivere le componenti del vettore sostituendo read con print o write nei precedenti esempi.

    Provare a scrivere due programmi che prima leggano tutte le componenti dell'  array e poi le scrivano, secondo i primi due metodi. Verificarne le differenze di funzionamento a seconda di come si immettono i dati  (uno alla volta seguito da "enter" o tutti insieme seguiti da "enter"). (Suggerimento pratico: usare valori ragionevolmente piccoli di N)
     



  3. La dimensione di un  vettore può anche essere dichiarata a run time (allocazione dinamica), quando cioè il programma  viene eseguito.

  4. In tal caso andrà specificato l' aggettivo allocatable  nella dichiarazione dell' array, senza dare esplicitamente la dimensione come ad esempio in

    real, dimension(:), allocatable    :: A

    Per far sì che venga riservata la memoria (RAM) per A sarà necessario che, una volta noto il valore di N, si esegua l' istruzione

    allocate(A(N))
    Quando la memoria allocata non serve più  la si può  rilasciare al sistema operativo mediante il comando  

          deallocate(A)

    Provare a modificare uno dei  programmi dell' esercizio n.1 in modo che usi il meccanismo dell' allocazione dinamica.
     


  5. Scrivere un programma  che accetti in input 8 cifre 0 o 1 e le inserisca in un array  di nome a. Se le consideriamo come le cifre della rappresentazione binaria di un intero (positivo) vogliamo che il programma fornisca in output il valore decimale corrispondente. La cifra piu' significativa sia a(1) e la meno significativa a(8).

  6. L' istruzione REAL, DIMENSION... permette di definire qualsiasi insieme di interi contigui come insieme di variabilità  per l' indice di un vettore. Per esempio, l' istruzione
  7.             REAL, DIMENSION(-5:10)      :: A
    definisce A come array di 16 componenti (indice variabile tra -5 e 10, 0 compreso)

    Scrivere un programma   che legga interi (con segno) e scriva quante volte è  stato immesso ogni intero tra -5 e 5 (ogni intero può essere immesso un numero arbitrario di volte). In pratica si sta chiedendo di realizzare l' istogramma dei numeri immessi nell' intervallo predefinito.  Il modo piu'  semplice di organizzare l' elaborazione e' di utilizzare l'  intero appena letto come indice della componente dell' array  da incrementare di 1. L' array va preventivamente azzerato e va posta attenzione al caso di interi al di fuori degli indici ammissibili.

    Esempio:  a fronte dell'  input:  -3  15  3  4   2  1  2  2  -3  22,  il programma dovrebbe  scrivere:

    -5 0
    -4 0
    -3 2
    -2 0
    -1 0
    0 0
    1 1
    2 3
    3 1
    4 1
    5 0

    Il Fortran ammette operazioni di array. Cioè operazioni scritte usando solo il nome dell' aray ma che vengono espanse dal compilatore in operazioni su tutte le componenti dell' array. P.es. i due costrutti:
    a = b +2*c
    
    e
    do i=1,N
       a(i)=b(i) + 2*c(i)
    end do
    
    sono equivalenti se a,b e c sono tre array con lo stesso numero di componenti.