Istruzioni condizionali di diramazione in Fortran 90 Ing. Luca De Santis DIS - Dipartimento di informatica e sistemistica Anno accademico 2006/2007 Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 1 / 17
Cosa vedremo in questa lezione 1 Istruzioni di diramazione (o di salto) 2 Costrutto IF-THEN-ELSE 3 Espressioni logiche Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 2 / 17
Istruzioni condizionali Istruzioni di diramazione (o di salto) Per implementare algoritmi complessi abbiamo bisogno di istruzioni più complesse! Programmazione strutturata: principi (Jacopini e Böhm) Completezza: istruzioni di sequenza, alternativa e iterazione Singolo punto di ingresso e di uscita Componibilità delle strutture di controllo Problema 1: scrivere programma (file MAX.F90) che: Legga due numeri interi Stampi il valore massimo fra i due letti Esempio: lettura: -3, 2. Stampa 2., Lettura: 2, -3. Stampa 2. Problema 2: scrivere programma (file PARI.F90) che: Legga un numero intero Stampi il messaggio PARI oppure DISPARI, a seconda del caso Non è possibile con gli strumenti visti finora Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 3 / 17
Programma MAX Istruzioni di diramazione (o di salto) 1! F i l e : max. f 9 0 2! Time stamp : 01/12/20 1 2 : 1 3 : 0 3 c a d o l i 3! Scopo : primo esempio d i i s t r u z i o n e c o n d i z i o n a l e ( IF THEN ELSE ) 4 5 PROGRAM max 6! Questo programma l e g g e due numeri i n t e r i e stampa i l massimo v a l o r e i n s e r i t o 7 8! SEZIONE DICHIARATIVA 9 IMPLICIT NONE 10 INTEGER : : primo, secondo, massimo 11 12! SEZIONE ESECUTIVA 13 WRITE (, ) I n s e r i s c i due numeri i n t e r i, p o i s c h i a c c i a i l t a s t o RETURN 14 READ (, ) primo, secondo 15 IF ( primo > secondo ) THEN 16 massimo = primo 17 ELSE 18 massimo = secondo 19 END IF 20 WRITE (, ) I l massimo v a l o r e i n s e r i t o e :, massimo 21 22 STOP 23 END PROGRAM max Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 4 / 17
Programma PARI Istruzioni di diramazione (o di salto) 1! F i l e : p a r i. f 9 0 2! Time stamp : 01/12/19 1 5 : 0 7 : 3 2 c a d o l i 3! Scopo : a l t r o esempio d i i s t r u z i o n e c o n d i z i o n a l e ( IF THEN ELSE ) 4 5 PROGRAM p a r i 6! Questo programma legge un numero i n t e r o e stampa un messaggio 7 8! SEZIONE DICHIARATIVA 9 IMPLICIT NONE 10 INTEGER : : numero 11 12! SEZIONE ESECUTIVA 13 WRITE (, ) I n s e r i s c i un numero i n t e r o, p o i s c h i a c c i a i l t a s t o RETURN: 14 READ (, ) numero 15 IF (MOD( numero, 2 ) == 0) THEN 16 WRITE (, ) numero, e PARI 17 ELSE 18 WRITE (, ) numero, e DISPARI 19 END IF 20 21 STOP 22 END PROGRAM p a r i Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 5 / 17
Diagramma di flusso Istruzioni di diramazione (o di salto) Prima di passare ad analizzare i costrutti di diramazione introduciamo la notazione grafica dei diagrammi di flusso Diagramma di flusso Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 6 / 17
Diagramma di flusso Istruzioni di diramazione (o di salto) Prima di passare ad analizzare i costrutti di diramazione introduciamo la notazione grafica dei diagrammi di flusso Diagramma di flusso Esempio (Programma calcola metà tempo): Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 6 / 17
Costrutto IF-THEN-ELSE Costrutto IF-THEN-ELSE Sintassi (forma generale) del costrutto IF-THEN-ELSE: IF (espressione logica 1) THEN sequenza di istruzioni 1 ELSE IF (espressione logica 2) THEN sequenza di istruzioni 2 ELSE sequenza di istruzioni 3 END IF L indentazione aumenta la leggibilità del codice Note: THEN va sulla stessa riga di IF END IF è obbligatorio ELSE IF non è obbligatorio, ma ce ne può essere più di uno. il ramo ELSE non è obbligatorio, sequenza di istruzioni può essere anche un istruzione condizionale espressione logica ha tipo LOGICAL(.TRUE.,.FALSE.). Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 7 / 17
Costrutto IF-THEN-ELSE (cont.) Costrutto IF-THEN-ELSE Esempi di costrutti condizionali validi:! i s t r u z i o n e d i d i r a m a z i o n e s e n z a e l s e e e l s e i f IF ( c o n d i z i o n e ) THEN ( i s t r u z i o n i ) END IF! i s t r u z i o n e d i d i r a m a z i o n e con e l s e e s e n z a e l s e i f IF ( c o n d i z i o n e ) THEN ( i s t r u z i o n i ) ELSE ( i s t r u z i o n i ) END IF! i s t r u z i o n e d i d i r a m a z i o n e s e n z a e l s e e un e l s e i f IF ( c o n d i z i o n e ) THEN ( i s t r u z i o n i ) ELSE IF ( c o n d i z i o n e ) THEN ( i s t r u z i o n i ) END IF! i s t r u z i o n e d i d i r a m a z i o n e con e l s e e con 2 e l s e i f IF ( c o n d i z i o n e ) THEN ( i s t r u z i o n i ) ELSE IF ( c o n d i z i o n e ) THEN ( i s t r u z i o n i ) ELSE IF ( c o n d i z i o n e ) THEN ( i s t r u z i o n i ) ELSE ( i s t r u z i o n i ) END IF Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 8 / 17
Pseudocodice e diagramma di flusso Costrutto IF-THEN-ELSE Pseudocodice Esistono molti modi diversi per rappresentare il costrutto IF-THEN-ELSE. Noi useremo: SE condizione è vera ALLORA regole dell algoritmo ALTRIMENTI SE condizione è vera ALLORA regole dell algoritmo ALTRIMENTI regole dell algoritmo Diagramma di flusso Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 9 / 17
Pseudocodice e diagramma di flusso Costrutto IF-THEN-ELSE Pseudocodice Diagramma di flusso Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 9 / 17
Espressioni logiche Espressioni logiche (o booleane) Forma: a 1 op a 2, a 1 e a 2 possono essere espressioni aritmetiche, variabili, costanti (anche di caratteri) Non è possibile confrontare espressioni di tipo CHARACTER con espressioni di altro tipo Nel caso di confronto tra interi e reali gli interi vengono convertiti implicitamente in reali Il risultato delle operazioni di confronto relazionale è sempre un valore di tipo LOGICAL (.TRUE. o.false.) Nella valutazione delle espressioni, gli operatori relazionali vengono valutati da sinistra verso destra e comunque dopo tutti gli operatori aritmetici Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 10 / 17
Espressioni logiche Espressioni logiche (cont.) Alcuni esempi di espressioni logiche: Operatori relazionali (sono sei): Espressione logica Valore 5 > 2.TRUE. 5 < 2.FALSE. 5 == 3 + 2.TRUE. 1 + 4 == 3 + 2.TRUE. 5 > 2.0.TRUE. Operatore Significato == Uguale > Maggiore < Minore /= Diverso >= Maggiore o uguale <= Minore o uguale Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 11 / 17
Espressioni logiche Esempio: equazioni di primo grado Scrivere un programma che, presi in ingresso i coefficienti a e b dell equazione ax + b = o determini la soluzione della stessa e la stampi a video Dati in ingresso: coefficienti reali a e b dell equazione Algoritmo con pseudocodice Algoritmo con diagramma di flusso Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 12 / 17
Espressioni logiche Esempio: equazioni di primo grado Scrivere un programma che, presi in ingresso i coefficienti a e b dell equazione ax + b = o determini la soluzione della stessa e la stampi a video Dati in ingresso: coefficienti reali a e b dell equazione Algoritmo con pseudocodice 1. Leggi il valore di a 2. Leggi il valore di b 3. SE a è uguale a zero ALLORA 3.1 SE b è uguale a zero ALLORA stampa a video equazione indeterminata ALTRIMENTI stampa a video equazione senza soluzioni ALTRIMENTI stampa a video -b/a Algoritmo con diagramma di flusso Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 12 / 17
Espressioni logiche Esempio: equazioni di primo grado Scrivere un programma che, presi in ingresso i coefficienti a e b dell equazione ax + b = o determini la soluzione della stessa e la stampi a video Dati in ingresso: coefficienti reali a e b dell equazione Algoritmo con pseudocodice Algoritmo con diagramma di flusso Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 12 / 17
Espressioni logiche Equazioni di primo grado: codice 1! F i l e : eq1grado. f 9 0 2! Time stamp : 02/01/02 1 8 : 1 6 : 5 7 c a d o l i 3! Scopo : a p p l i c a z i o n e i s t r u z i o n i c o n d i z i o n a l i 4 5 PROGRAM e q u a z i o n e p r i m o g r a d o 6! Questo programma l e g g e due v a l o r i r e a l i che r a p p r e s e n t a n o i c o e f f i c i e n t i a, b 7! di un equazione di primo grado e ne stampa l a soluzione, se e s i s t e 8 9! SEZIONE DICHIARATIVA 10 IMPLICIT NONE 11 REAL : : a, b 12 13! SEZIONE ESECUTIVA 14 WRITE(, ) Questo programma r i s o l v e e q u a z i o n i d i primo grado d e l l a forma : 15 WRITE(, ) ax + b = 0 16 WRITE(, ) I n s e r i s c i v a l o r e c o e f f i c i e n t e a : 17 READ(, ) a 18 WRITE(, ) I n s e r i s c i v a l o r e c o e f f i c i e n t e b : 19 READ(, ) b 20 IF ( a == 0. ) THEN 21 IF ( b == 0. ) THEN 22 WRITE(, ) Equazione indeterminata 23 ELSE 24 WRITE(, ) Equazione p r i v a d i s o l u z i o n i 25 END IF 26 ELSE 27 WRITE(, ) La s o l u z i o n e e :, b/a 28 END IF 29 30 STOP 31 END PROGRAM e q u a z i o n e p r i m o g r a d o Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 13 / 17
Espressioni logiche Considerazioni sull operatore == L operatore == significa che la rappresentazione di due numeri è uguale A causa dell approssimazione intrinsecamente presente, questo confronto non è affidabile per i reali Esempio: anche se arccos( 2/2) = arcsin( 2/2), il compilatore Fortran 90 produce: IF (ACOS(SQRT(2.)/2) == ASIN(SQRT(2.)/2)) THEN WARNING -- Floating-point comparisons for equality may produce inconsistent results. L espressione logica vale.false. (non viene eseguito il ramo THEN). Il compilatore genera un warning ( avvertimento ): il programma è sintatticamente corretto, ma potrebbe nascondere un errore semantico Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 14 / 17
Espressioni logiche Considerazioni sull operatore == (cont.) Per questo motivo, una condizione algebrica del tipo: b 2 4ac = 0 dovrebbe sempre essere tradotta in una del tipo: b 2 4ac ε, con ε fissato in maniera opportuna. In Fortran 90 questa condizione va tradotta in: 1! t o l l e r a n z a (VA SCELTA CON CRITERIO ) 2 REAL, PARAMETER : : e p s i l o n = 1E 10 3... 4 IF ( abs ( b b 4. a c ) <= e p s i l o n ) THEN 5... Esercizio: scrivere programma per la soluzione di equazioni di secondo grado. Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 15 / 17
Espressioni logiche Equazioni di secondo grado: codice 1! F i l e : eq2grado. f 9 0 2! Time stamp : 02/01/02 1 8 : 1 6 : 5 7 c a d o l i 3! Scopo : a p p l i c a z i o n e i s t r u z i o n i c o n d i z i o n a l i 4 5 PROGRAM e q u a z i o n e s e c o n d o g r a d o 6! Questo programma l e g g e t r e v a l o r i r e a l i che r a p p r e s e n t a n o i c o e f f i c i e n t i a, b 7! e c d i un e q u a z i o n e d i secondo grado e ne stampa l e s o l u z i o n i r e a l i o 8! c o m p l e s s e e c o n i u g a t e, s e e s i s t o n o 9 10! SEZIONE DICHIARATIVA 11 IMPLICIT NONE 12 REAL, PARAMETER : : e p s i l o n = 1E 10! t o l l e r a n z a (VA SCELTA CON CRITERIO ) 13 REAL : : a, b, c! i c o e f f i c i e n t i i n i n p u t 14 REAL : : d i s c r i m i n a n t e! da c a l c o l a r e 15 REAL : : p a r t e r e a l e, parte immag! s i g n i f i c a t i v e s e l e s o l. sono c o m p l e s s e 16 17! SEZIONE ESECUTIVA 18 WRITE(, ) Questo programma r i s o l v e e q u a z i o n i d i secondo grado d e l l a forma : 19 WRITE(, ) axˆ2 + bx + c = 0 20 WRITE(, ) I n s e r i s c i v a l o r e c o e f f i c i e n t e a : 21 READ(, ) a 22 WRITE(, ) I n s e r i s c i v a l o r e c o e f f i c i e n t e b : 23 READ(, ) b 24 WRITE(, ) I n s e r i s c i v a l o r e c o e f f i c i e n t e c : 25 READ(, ) c Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 16 / 17
Espressioni logiche Equazioni di secondo grado: codice (cont.) 26 IF ( a == 0. ) THEN! l equazione e d i primo grado 27 IF ( b == 0. ) THEN 28 IF ( c == 0. ) THEN 29 WRITE(, ) Equazione indeterminata 30 ELSE 31 WRITE(, ) Equazione p r i v a d i s o l u z i o n i 32 END IF 33 ELSE 34 WRITE(, ) L equazione e di primo grado e l a sua & 35 &u n i c a s o l u z i o n e ( r e a l e ) e :, c / b 36 END IF 37 ELSE! l equazione e d i secondo grado 38 d i s c r i m i n a n t e = b b 4. a c 39 IF ( d i s c r i m i n a n t e < e p s i l o n ) THEN! s o l u z i o n i c o m p l e s s e e c o n i u g a t e 40 p a r t e r e a l e = b / ( 2. a ) 41 parte immag = s q r t ( abs ( d i s c r i m i n a n t e ) ) / ( 2. a ) 42 WRITE(, ) Equazione con due s o l u z i o n i c o m p l e s s e e c o n i u g a t e : 43 WRITE(, ) p a r t e r e a l e, +i, parte immag, e, & 44 & p a r t e r e a l e, i, parte immag 45 ELSE IF ( abs ( d i s c r i m i n a n t e ) <= e p s i l o n ) THEN! s o l u z i o n i r e a l i c o i n c i d e n t i 46 WRITE(, ) Equazione con due s o l u z i o n i r e a l i c o i n c i d e n t i :, & 47 & b / ( 2. a ) 48 ELSE! s o l u z i o n i r e a l i d i s t i n t e 49 WRITE(, ) Equazione con due s o l u z i o n i r e a l i d i s t i n t e :, & 50 & ( b + s q r t ( d i s c r i m i n a n t e ) ) / ( 2. a ), e, & 51 & ( b s q r t ( d i s c r i m i n a n t e ) ) / ( 2. a ) 52 END IF 53 END IF 54 55 STOP 56 END PROGRAM e q u a z i o n e s e c o n d o g r a d o Fortran 90: Istruzioni di diramazione DIS - Dipartimento di informatica e sistemistica 17 / 17