SECONDA UNIVERSITA DEGLI STUDI DI NAPOLI CORSI DI LAUREA IN INGEGNERIA AEROSPAZIALE E MECCANICA ELEMENTI DI PROGRAMMAZIONE a.a. 2009/10 Prof Andrea Prevete andrea@prevete.it DOCUMENTAZIONE A SUPPORTO DELLA PREPARAZIONE PER LA PROVA SCRITTA Di seguito è riportato il codice Fortran, quando necessario commentato, che realizza semplici operazioni aventi per oggetto interi, vettori e matrici. Gli esempi proposti hanno il solo scopo di mostrare alcune caratteristiche sintattiche e di uso del Fortran, propedeutiche per affrontare con successo la prova scritta d esame. E sicuramente un utile esercizio scrivere gli stessi programmi utilizzando il linguaggio C.! dopo aver letto da tastiera un array di interi, vengono sommati separatamente i positivi ed i negativi,! infine vengono mostrate su schermo le due somme così ottenute PROGRAM pos_neg INTEGER, PARAMETER :: n_elem=5 INTEGER, DIMENSION(n_elem) :: array INTEGER :: i, s_neg, s_pos! gli elementi sono immessi, separati da uno spazio,! su una stessa linea PRINT*, 'Inserisci i', n_elem,'valori dell''array:' READ*, (array(i), i=1, n_elem)! do implicito s_neg=0 s_pos=0 DO i=1,n_elem SELECT CASE (array(i)) CASE(:-1) s_neg=s_neg+array(i) CASE(1:) s_pos=s_pos+array(i) CASE DEFAULT exit END SELECT PRINT*, "La somma degli elementi positivi e':",s_pos
PRINT*, "La somma degli elementi negativi e':",s_neg! dopo aver letto da tastiera un array di interi, vengono determinati i valori massini e minimi,! quindi mostrati su schermo PROGRAM min_max INTEGER, PARAMETER :: n_elem=5 INTEGER, DIMENSION(n_elem) :: array INTEGER :: i INTEGER :: Min INTEGER :: Max PRINT*, 'Inserisci l''elemento', i,'dell''array:' READ*, array(i) min=array(1) max=array(1) DO i=2,n_elem IF (array(i)<min) THEN min=array(i) ELSE IF (array(i)>max) THEN max=array(i) PRINT*, "Il valore minimo dell'array e':",min PRINT*, "Il valore massimo dell'array e':",max! scambia fra di loro i valori! di due righe di una matrice PROGRAM swap INTEGER, PARAMETER :: row=4 INTEGER, PARAMETER :: col=3 INTEGER, DIMENSION(row, col) :: mtrc INTEGER :: p, q, i, j, temp
!definisco una matrice e la valorizzo direttamente nel codice!reshape mi permette di organizzare i valori secondo! le volute dimensioni della matrice mtrc= RESHAPE((/ 1,2,3,4,5,6,7,8,9,10,11,12 /),(/ row,col /)) PRINT*, "immetti due indici di riga fra 1 e", row DO i= 1, row print*, (mtrc(i, j), j=1, col) READ*, p READ*, q DO j=1, col temp=mtrc(p, j) mtrc(p, j)=mtrc(q, j) mtrc(q, j)=temp DO i= 1, row print*, (mtrc(i, j), j=1, col) PRINT*, "fine processo"! dopo aver chiesto all'utente di immettere da tastiera fino ad! top (parametro del programma) interi positivi, riconoscendo lo! 0 come fine sequenza,! il programma mostra la sequenza a video! in ordine inverso rispetto all'immissione! ed organizzata in 2 colonne PROGRAM stampa_reverse INTEGER, PARAMETER :: top=10 INTEGER, DIMENSION(top+1) :: elenco INTEGER :: i PRINT*, "immetti fino a", top, "interi positivi, 0 per terminare" i=1! ciclo lettura DO PRINT*, "intero n.ro", i READ*, elenco(i) IF (elenco(i) == 0) THEN i=i-1 EXIT END IF IF (i == top) THEN
EXIT i=i+1! ciclo scrittura DO IF (i < 2) THEN IF (I == 1) THEN WRITE(*,'(i5)'), elenco(1) EXIT END IF WRITE(*,'(2i5)'), elenco(i), elenco(i-1) i=i-2 PRINT*, "fine processo"! dopo aver letto da tastiera una sequenza di interi! viene determinata la posizione del primo minimo! e quella dell'ultimo massimo.! Quindi vengono restituiti i valori del min e del max,! infine la sequenza di interi compresa fra le posizioni prima! determinate PROGRAM damin_amax INTEGER, PARAMETER :: n_elem=6 INTEGER, DIMENSION(n_elem) :: array INTEGER :: i INTEGER :: pmin!posizione del min nel vettore INTEGER :: pmax!posizione del max nel vettore PRINT*, 'Inserisci i',n_elem,'valori dell''array:' DO i=1,n_elem READ*, array(i) pmin=1 pmax=1 DO i=2,n_elem IF (array(i) < array(pmin)) THEN pmin=i ELSE IF (array(i) >= array(pmax)) THEN pmax=i
PRINT*, "Il valore minimo dell'array e':",array(pmin) PRINT*, "Il valore massimo dell'array e':",array(pmax) PRINT*, "La sequenza in input compresa fra minimo e massimo Š:" PRINT*, (array(i), i=pmin, pmax)! do implicito! dopo aver letto da tastiera una matrice di interi! viene calcolata la somma degli elementi! sulla diagonale principale e quella degli elementi! sulla diagonale secondaria.! Poi questi valori sono rispettivamente sommati e! sottratti a tutti gli elementi della! matrice non diagonali.! Infine viene mostrata in output! la nuova matrice PROGRAM DiagP_DiagS INTEGER, PARAMETER :: n_elem=3 INTEGER, DIMENSION(n_elem, n_elem) :: matr INTEGER :: i, j INTEGER :: diagp=0!somma degli interi sulla diagonale principale INTEGER :: diags=0!somma degli interi sulla diagonale secondaria PRINT*, 'Inserisci i',n_elem,'interi della riga', i, "della matrice:" READ*, (matr(i, j), j=1, n_elem)! do implicito diagp=diagp+matr(i,i) diags=diags+matr(i, n_elem+1-i) DO j=1,n_elem IF ((i /= j).and. (i /= n_elem+1-j)) THEN matr(i, j)=matr(i, j) + diagp - diags END IF PRINT*, "La nuova matrice Š:"
PRINT*, (matr(i, j), j=1, n_elem)! do implicito