25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

7.6 Un uso efficiente dei puntatori 375<br />

ad array1 si dovrà scrivere p1 prima che lo scambio abbia avuto luogo, p2 successivamente<br />

allo scambio). In realtà si poteva ovviare alla introduzione della variabile extra app, la quale è<br />

stata usata semplicemente per motivi di simmetria rispetto al procedimento standard.<br />

Un’applicazione pratica dei concetti testé esposti è rappresentata dal problema dell’ordinamento<br />

alfabetico di una lista di nomi in una lista. Nel programma che segue e che implementa<br />

proprio un algoritmo di ordinamento, la lettura delle stringhe di caratteri avviene in maniera<br />

interattiva (ad esempio da tastiera) ma unicamente per ragioni didattiche, ciò limitando di<br />

molto la mole di dati che è possibile inserire per testare il codice. E’ chiaro che in casi pratici<br />

la lista di nomi andrà letta da file e potrà essere anche decisamente lunga. Anche in questo<br />

esempio l’uso dei puntatori evita lo spostamento fisico di grossi oggetti (stringhe di500 caratteri<br />

di lunghezza) compensando così la scarsa efficienza dell’algoritmo di ordinamento utilizzato (il<br />

metodo bubble sort).<br />

PROGRAM sort<br />

IMPLICIT NONE<br />

INTEGER, PARAMETER :: max_length=500, max_no = 100<br />

TYPE :: char_pt<br />

CHARACTER(LEN=max_length), pointer :: ptr<br />

END TYPE char_pt<br />

TYPE(char_pt), dimension(max_no) :: strings<br />

TYPE(char_pt) :: swap<br />

INTEGER :: i, j, n<br />

! Invece di usare un array di stringhe di caratteri, viene impiegato<br />

! un array di puntatori ad oggetti di tipo stringa di caratteri<br />

WRITE(*,"(A,I3,A3)",ADVANCE="NO") "Inserisci il numero di &<br />

&stringhe, (massimo ",max_no,"): "<br />

READ(*,*) n<br />

DO i=1,n<br />

ALLOCATE(strings(i)%ptr)<br />

WRITE(*,"(A,I3,1X,A4)",ADVANCE="NO") "Stringa n. ", i,"--> "<br />

READ(*,*) strings(i)%ptr<br />

END DO<br />

DO i=1,n-1<br />

DO j=1,n-i<br />

! Meccanismo bubble-sort<br />

IF(strings(j)%ptr > strings(j+1)%ptr) THEN<br />

swap%ptr => strings(j)%ptr<br />

strings(j)%ptr => strings(j+1)%ptr<br />

strings(j+1)%ptr => swap%ptr<br />

END IF<br />

END DO<br />

END DO<br />

PRINT "(/,A,/,15(’=’))", "Lista ordinata:"<br />

PRINT "(A)", (trim(strings(i)%ptr), i = 1,n)

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

Saved successfully!

Ooh no, something went wrong!