Il linguaggio Fortran 90: 2. Istruzioni di Controllo

Download Il linguaggio Fortran 90:  2. Istruzioni di Controllo

Post on 15-Jan-2016

45 views

Category:

Documents

0 download

Embed Size (px)

DESCRIPTION

Il linguaggio Fortran 90: 2. Istruzioni di Controllo. Strutture di Controllo. Programmi visti in precedenza permettono di eseguire le istruzioni solo nella sequenza indicata. - PowerPoint PPT Presentation

TRANSCRIPT

<ul><li><p>Il linguaggio Fortran 90: 2. Istruzioni di Controllo</p></li><li><p>Strutture di Controllo Programmi visti in precedenza permettono di eseguire le istruzioni solo nella sequenza indicata. La risoluzione di molti problemi richiede la scrittura di programmi in cui le azioni che si svolgono dipendono dallinput del problema. Strutture di controllo permettono di alterare la sequenza di esecuzione delle istruzione del programma al verificarsi di determinate condizioni.Due tipi fondamentali di istruzioni di controllo:Istruzioni Condizionali Cicli</p></li><li><p>Istruzioni Condizionalinome: IF (condizione) THENistruzione 1istruzione 2END IF nome________________________________</p><p>nome: IF (condizione) THEN istruzione 1istruzione 2ELSE istruzione 1istruzione 2END IF nome</p></li><li><p>Stampa del maggiore tra due interi!File: max.for !Scopo: primo esempio di istruzione condizionale(IF-THEN-ELSE) </p><p>PROGRAM max ! Questo programma legge due numeri interi e stampa il maggiore </p><p>IMPLICIT NONE INTEGER :: primo, secondo, maggiore </p><p>WRITE (*,*) 'Inserisci due numeri interi, poi schiaccia il tasto RETURN' READ (*,*) primo, secondo IF (primo &gt; secondo) THEN maggiore = primo ELSE maggiore = secondo END IF WRITE (*,*) 'Il maggiore dei due valori inseriti e'': ', maggiore STOP </p><p>END PROGRAM max</p></li><li><p>Istruzioni condizionali nidificate.Le istruzioni condizionali possono essere a loro volta nidificate.Istruzione ELSE IF permette di realizzare IF annidati.</p><p>nome: IF (condizione1) THEN istruzione 1istruzione 2ELSE IF (condizione2) THENistruzione 1istruzione 2 ELSE istruzione 1 istruzione 2END IF nome </p></li><li><p>Classificazione dei Triangoli 1! File: triang1.for ! Scopo: applicazione degli IF annidati</p><p>PROGRAM triangolo1</p><p>! *** SEZIONE DICHIARATIVA *** !IMPLICIT NONE REAL :: primo, secondo, terzo ! le lunghezze dei tre lati </p><p>! *** SEZIONE ESECUTIVA *** !WRITE (*,*) 'Inserisci le lunghezze dei tre lati del triangolo: ' READ (*,*) primo,secondo,terzo</p></li><li><p>Classificazione dei Triangoli 1 (cont.)if1: IF (primo == secondo) THEN if2: IF (secondo == terzo) THEN WRITE (*,*) 'Equilatero' ! I tre lati sono sono uguali fra loro ELSE WRITE (*,*) 'Isoscele' ! 1 coppia di lati uguali fra loro END IF if2ELSE if3: IF (secondo == terzo) THEN ! primo secondo WRITE (*,*) 'Isoscele' ! 1 coppia di lati uguali fra loro ELSE IF (primo == terzo) THEN ! (primo secondo) e (secondo terzo) WRITE (*,*) 'Isoscele' ! 1 coppia di lati uguali fra loro ELSE WRITE (*,*) 'Scaleno' ! 0 coppie di lati uguali fra loro END IF if3END IF if1 STOP</p><p>END PROGRAM triangolo1</p></li><li><p>Classificazione dei Triangoli 2Il programma pu essere semplificato scegliendo un diverso algoritmo di soluzioneIf logico: IF (condizione) istruzione</p><p>! File: triang2.for</p><p>PROGRAM triangolo2</p><p>! *** SEZIONE DICHIARATIVA *** ! IMPLICIT NONEREAL :: primo, secondo, terzo INTEGER :: uguali ! il numero di coppie di lati uguali fra loro</p></li><li><p>Classificazione dei Triangoli 2! *** SEZIONE ESECUTIVA *** !WRITE (*,*) 'Inserisci le lunghezze dei tre lati del triangolo: ' READ (*,*) primo,secondo,terzo uguali = 0 IF (primo == secondo) uguali = uguali + 1 IF (secondo == terzo) uguali = uguali + 1 IF (primo == terzo) uguali = uguali + 1 </p><p>IF (uguali == 0) THEN WRITE (*,*) 'Scaleno' ELSE IF (uguali == 1) THEN WRITE (*,*) 'Isoscele' ELSE WRITE (*,*) 'Equilatero' END IFSTOP </p><p>END PROGRAM triangolo2</p></li><li>Espressioni LogicheLe condizioni sono espressioni logiche, possono assumere due valori di verit.Costanti logiche: .TRUE. o .FALSE. Variabili logiche: LOGICAL :: variabile_logicaOperatori relazionali==, /=, &gt;, &gt;=, </li><li><p>Operatori Logicix .AND. y: .TRUE. sse x e y sono .TRUE. (altrimenti .FALSE.) x .OR. y: .TRUE. sse x o y sono .TRUE.x .EQV. y: .TRUE. sse x = yx .NEQV. y:.TRUE. sse x /= y.NOT. y: .TRUE. sse y = .FALSE.</p><p>Es: LOGICAL :: x, y, zx = .TRUE. y = .FALSE. z = (x .OR. y) .AND. (x .NEQV. y) .AND. (x /= y) = .TRUE.</p></li><li><p>Regole di precedenza tra operatori logiciOperatori aritmeticiOperatori relazionali da sx a dxOperatori .NOT. da sx a dxOperatori .AND. da sx a dxOperatori .OR. da sx a dxOperatori .EQV. e . NEQV. da sx a dx</p></li><li><p>Classificazione di triangoli 3! File: triang3.for</p><p>PROGRAM triangolo3 </p><p>IMPLICIT NONEREAL :: primo, secondo, terzo ! le lunghezze dei tre lati </p><p>WRITE (*,*) 'Inserisci le lunghezze dei tre lati del triangolo: ' READ (*,*) primo,secondo,terzo IF (primo == secondo .AND. secondo == terzo) THEN WRITE (*,*) 'Equilatero'ELSE IF (primo == secondo .OR. secondo == terzo .OR. primo == terzo) THEN WRITE (*,*) 'Isoscele' ELSE WRITE (*,*) 'Scaleno' END IF STOP</p><p>END PROGRAM triangolo3</p></li><li><p>Calcolo delle radici di unequazionedi secondo grado!File: radici.for</p><p>PROGRAM radici!Scopo: Questo programma calcola le radici di unequazione! a*x**2+ b*x + c = 0</p><p>! *** SEZIONE DICHIARATIVA *** ! IMPLICIT NONEREAL :: a, b, cREAL :: discriminante, parte_immag, parte_realeREAL :: x1, x2! Soluzioni dellequazione</p><p>! *** SEZIONE ESECUTIVA *** !WRITE (*,*) 'Inserire i tre coeefficienti A, B e C: 'READ (*,*) a, b, c!Calcola il discriminantediscriminante = b**2 - 4 * a * c</p></li><li><p>Calcolo delle radici di unequazione di secondo grado (cont)! Calcola le radici in funzione del discriminanteIF (discriminante &gt;0) THEN ! due radici reali x1 = (-b + sqrt(discriminante)) / (2.*a) x2 = (-b - sqrt(discriminante)) / (2.*a) WRITE (*,*) 'Due radici reali: ', x1, x2ELSE IF (discriminante == 0.) THEN ! Radici reali e coincindenti x1 = ( -b ) / (2. * a) WRITE (*,*) 'due radici reali e coincidenti: ', x1ELSE ! Radici complesse parte_reale = ( -b ) / (2. * a) parte_immag = sqrt(abs(discriminante)) / (2.*a) WRITE (*,*) 'due radici immaginarie:', parte_reale, '+/- i', parte_immagEND IFSTOP </p><p>END PROGRAM radici</p></li><li><p>Listruzione Casenome: SELECT CASE (espressione) CASE (sel 1)! Se espressione nel ! range di sel 1istruzione 1CASE (sel 2) ! Se espressione nel ! range di sel 2istruzione 2....CASE DEFAULT ! In tutti gli altri casi istruzione</p><p>END SELECT nome</p></li><li><p>Calcolo della data del giorno successivo!File: datasuc1.for !Scopo: esempio di uso dellistruzione CASE</p><p>PROGRAM data_successiva ! Questo programma legge giorno, mese ed anno di una data e determina! la data successiva. Date possibili in ingresso: 1/1/1900 - 30/12/2000 </p><p>! *** SEZIONE DICHIARATIVA *** !IMPLICIT NONE INTEGER :: giorno, mese, anno ! dati in inputINTEGER :: giorni_del_mese ! dato da calcolare </p><p>! *** SEZIONE ESECUTIVA *** !WRITE (*,*) 'Data (giorno, mese, anno)? ' READ (*,*) giorno, mese, anno WRITE (*,*) 'Il giorno successivo al', giorno, '/', mese, '/', anno, ' e'':'SELECT CASE (mese) CASE (9,4,6,11) giorni_del_mese = 30 CASE (1,3,5,7,8,10,12) giorni_del_mese = 31</p></li><li><p>Calcolo della data del giorno successivo (cont.)CASE (2) IF (MOD(anno,4) == 0 .AND. anno /= 1900) THEN giorni_del_mese = 29 ELSE giorni_del_mese = 28 END IF END SELECTultimo: IF (giorno == giorni_del_mese) THEN giorno = 1 dicembre: IF (mese == 12) THEN mese = 1 anno = anno + 1 ELSE mese = mese + 1 END IF dicembre ELSE giorno = giorno + 1 END IF ultimo WRITE (*,*) giorno, '/', mese, '/', anno STOP</p><p>END PROGRAM data_successiva</p></li><li><p>Istruzioni di CicloPermettono di ripetere un insieme di istruzioni finch una certa condizione si verifica.Cicli indefiniti: Il numero di ripetizioni non noto in anticipoCicli definiti o iterativi: Il numero di ripetizioni noto prima dellinizio del ciclo. </p></li><li><p>Cicli indefiniti: Ciclo WHILEDOistruzione 1IF (espressione logica) EXIT istruzione 2END DOQuando la condizione di fine ciclo vera, il controllo passa allistruzione successiva a END DO.istruzione 1 viene eseguita almeno una volta.</p></li><li><p>Calcolo della lunghezza di una sequenza di interiCalcola la lunghezza di una sequenza di interi positivi terminati da uno 0Gli interi sono letti in input uno ad uno finch lutente non indica lo 0</p></li><li><p>Calcolo della lunghezza di una sequenza di interi (cont.)! File: lung.for! Scopo: primo esempio di uso di un ciclo di iterazione indefinita </p><p>PROGRAM calcola_lunghezza </p><p>IMPLICIT NONE INTEGER :: lunghezza !la lunghezza della sequenzaINTEGER :: dato ! il dato letto in input</p><p>WRITE(*,*) 'Inserisci una sequenza di interi, terminata da 0: ' lunghezza = 0 ! all'inizio la lunghezza e' inizializzata a 0DO ! iterazione indefinita READ (*,*) dato IF (dato == 0) EXIT ! condizione di uscita dal ciclo lunghezza = lunghezza + 1 END DO WRITE(*,*) 'La sequenza (senza lo 0 finale) e'' lunga ',lunghezza STOP END PROGRAM calcola_lunghezza</p></li><li><p>Calcolo del Massimo Comun Divisore! File: mcd1.for </p><p>PROGRAM massimo_comun_divisore ! Questo programma legge due numeri interi a, b positivi e ne calcola ! il massimo comun divisore.</p><p>! *** SEZIONE DICHIARATIVA *** !IMPLICIT NONE INTEGER :: a, b ! dati letti da tastiera INTEGER :: mcd ! massimo comun divisore LOGICAL :: trovato </p><p>! *** SEZIONE ESECUTIVA *** !WRITE (*,*) 'Inserisci due interi positivi: 'READ (*,*) a, b IF (a </p></li><li><p>Calcolo del Massimo Comun Divisore (cont.)DO IF (mcd == 1 .OR. trovato) EXIT IF (MOD(a,mcd) == 0 .AND. MOD(b,mcd) == 0) THEN trovato = .TRUE. ELSE mcd = mcd - 1 END IF END DO WRITE (*,*) 'Massimo comun divisore di ', a, ' e ', b, ' : ', mcd STOP </p><p>END PROGRAM massimo_comun_divisore</p></li><li><p>Calcolo della Media e della Varianzan numeri reali x1,., xn. </p><p>Media: </p><p>Varianza: </p></li><li><p>Calcolo della Media e della Varianza (cont.) ! File: stat.for</p><p>PROGRAM media_varianza ! Questo programma calcola la media e la varianza di un insieme di! dati positivi o nulli forniti in input</p><p>! *** SEZIONE DICHIARATIVA *** !IMPLICIT NONE INTEGER :: n=0 ! Numero di dati letti in inputREAL :: std_dev = 0 ! Deviazione standardREAL :: sum_x = 0 ! Somma dei dati REAL :: sum_x2 = 0 ! Somma dei quadrati dei dati REAL :: x ! Dato in inputREAL :: x_bar ! Media dei dati</p></li><li>Calcolo della Media e della Varianza (cont.)! *** SEZIONE ESECUTIVA *** !DO WRITE (*,*) 'Digita il numero: (num</li><li><p>Calcolo della Media e della Varianza (cont.)! Controlla che i dati di input siano sufficientiIF (n &lt; 2) THEN WRITE (*,*) 'Bisogna immettere almeno due valori.'ELSE x_bar = sum_x / real(n) std_dev = sqrt ((real(n) * sum_x2 - sum_x**2) / (real(n) * real(n-1))) WRITE (*,*) 'La media di questo insieme e'':', x_bar WRITE (*,*) 'La deviazione standard e'':', std_dev WRITE (*,*) 'Il numero dei dati in input e'':', nEND IF STOP </p><p>END PROGRAM media_varianza</p></li><li><p>Cicli Annidati Allinterno di unistruzione di ciclo si possono eseguire altre istruzioni di cicloE possibile associare un nome ad un ciclo: </p><p>nome: DO ..IF (espressione logica ) EXIT nome..END DO nome</p></li><li><p>Numeri perfettiUn numero perfetto un numero somma di tutti i suoi divisori ad esclusione del numero stesso. Es: 6 = 1 + 2 + 3Per ogni intero positivo in input viene verificato se il numero perfettoIl ciclo DO esterno legge i dati in input, il ciclo DO interno verifica se il numero perfetto. </p></li><li><p>Numeri Perfetti (cont.)! File: perfetto.for</p><p>PROGRAM perfetto ! Questo programma determina se ogni intero positivo letto in input ! perfetto</p><p>! *** SEZIONE DICHIARATIVA *** ! IMPLICIT NONE INTEGER :: dato ! dato in inputINTEGER :: somma = 1 ! somma dei divisori INTEGER :: i = 2 ! potenziale divisore; si parte da 2 </p><p>! *** SEZIONE ESECUTIVA *** !!leggi: DO WRITE (*,*) 'Inserisci valore (val </p></li><li><p>Numeri Perfetti (cont.) verifica: DO IF (MOD(dato,i) == 0) THEN IF (dato == i*i) THEN WRITE (*,*) i somma = somma + i ELSE WRITE (*,*) i, dato / i somma = somma + i + dato / i END IF END IF i = i + 1 IF (i*i &gt; dato) EXIT verifica END DO verifica IF (somma == dato) THEN WRITE (*,*) dato, ' E'' UN NUMERO PERFETTO' ELSE WRITE (*,*) dato, ' non e'' un numero perfetto' END IF END DO leggiSTOP </p><p>END PROGRAM perfetto</p></li><li><p>Cicli definiti: Ciclo DO Il numero di iterazioni noto prima dellesecuzione dellistruzione di ciclo</p><p>DO indice = inizio, fine, incremento istruzione 1.istruzione 2END DO </p></li><li>Ciclo DO (cont.)inizio, fine, incremento: sono espressioni calcolate prima dellinizio del cicloAllinizio:indice = inizioLe istruzioni del corpo del ciclo sono eseguite se: abs(indice) </li><li><p>Ciclo DO (Cont.)DO i = 1, 10, 2istruzione 1 </p><p>istruzione nEND DO Il corpo del ciclo eseguito 5 volteDO i = 3, -3, -2istruzione 1 </p><p>istruzione nEND DOIl corpo del ciclo eseguito 4 volte</p></li><li><p>Calcolo del Fattoriale! File: fatt.for! Scopo del programma illustrare luso di cicli definiti</p><p>PROGRAM fatt! Calcola il fattoriale di un intero</p><p>IMPLICIT NONEINTEGER :: n, i , fattoriale! Variabili che indicano lintero, lindice del ciclo ed il fattoriale</p><p>WRITE (*,*) 'Inserisci un intero: 'READ (*,*) n fattoriale = 1DO i=2, n fattoriale = fattoriale * iEND DO WRITE (*,*) 'Il fattoriale di', n, ' e'':', fattorialeSTOP </p><p>END PROGRAM fatt</p></li><li><p>Stampa di un Quadrato! File: quadrato.for ! Scopo: illustrazione di un esercizio con cicli e stringhe</p><p>PROGRAM quadrato ! Questo programma legge un numero intero positivo n da tastiera e! stampa un quadrato di asterischi di dimensione n</p><p>! *** SEZIONE DICHIARATIVA *** ! IMPLICIT NONEINTEGER, PARAMETER :: max_lunghezza = 25 ! lunghezza massima del lato INTEGER :: n ! dato letto da tastiera INTEGER :: i ! indice dei cicliCHARACTER(max_lunghezza) :: linea ! linea da stampare</p></li><li><p>Stampa di un Quadrato (cont.)! *** SEZIONE ESECUTIVA *** ! WRITE (*,*) 'Dimensione del lato (lmin=1, lmax=25): ' READ (*,*) nIF (n &lt; 1 .OR. n &gt; 25) THEN WRITE (*,*) n, ' e'' un input non valido.'ELSE DO i = 1, n linea(i:i) = '*' END DO DO i = n+1, max_lunghezza linea(i:i) = ' ' END DO DO i = 1, n WRITE (*,*) linea END DOEND IFSTOP</p><p>END PROGRAM quadrato</p></li><li><p>Cicli DO annidati: Calcolo della Tavola Pitagorica! File: tavolpit.for! Scopo: illustrare un programma con cicli annidati</p><p>PROGRAM tavola_pitagorica ! Questo programma legge un numero intero positivo n da tastiera e! stampa tutti i prodotti i * j (1 </p></li><li><p>Traiettoria di un proiettileTraiettoria parabolica di un proiettile sparato con velocit iniziale v0 e angolo theta dalla posizione (0,0)vx = v0 * COS(theta) vy = v0 * SIN(theta)Altezza dal suolo al tempo t:y(t) = vy * t + 1/2 * g * t**2Distanza orizzontale percorsa al tempo tx(t) = vx * tData la velocit v0, determinare:la gittata (distanza orizzontale del proiettile prima di toccare terra) al variare di theta tra 0 e 90 con step di 1.langolo theta per cui la gittata massima. </p></li><li><p>Calcolo della gittataTempo di atterraggio: vy * t + 1/2 * g * t**2 = 0 t1 = 0, t2 = - 2 * vy / grange = vx t2 = - 2 * vx * vy / g = - 2 v0**2 * COS(theta) * SIN(theta) /g</p></li><li><p>Traiettoria di un proiettile (cont.)! File: gittata.for</p><p>PROGRAM gittata! Scopo: Calcolare la distanza percorsa da un proiettile sparato con! angolo theta e velocit v = 20 m/s</p><p>! *** SEZIONE DICHIARATIVA *** ! IMPLICIT NONE REAL, PARAMETER :: gradi_a_rad = 0.01745329! Conversione da gradi a radiantiREAL, PARAMETER :: gravity = -9.81INTEGER :: max_degrees ! Angolo di massima g...</p></li></ul>

Recommended

View more >