presentazione di powerpoint - università di romabloisi/didattica/ingegneriaclinica1314/... ·...
TRANSCRIPT
Corso di Laboratorio di InformaticaIngegneria Clinica – BCLR
Unità 3
Istruzioni Condizionali
Domenico Daniele Bloisi
Docente
Ing. Domenico Daniele Bloisi, PhDRicercatore
Dipartimento di Ingegneria Informatica, Automaticae Gestionale “Antonio Ruberti”Via Ariosto 25(adiacente Piazza Dante,
fermate Manzoni, Vittorio Emanuele,
Tram 3 fermata via Labicana)
Email: [email protected]
Home page: http://www.dis.uniroma1.it/~bloisi2013/2014Istruzioni condizionali
Unità 3Pagina 2
Ricevimento
In aula, subito dopo le lezioni Su appuntamento (tramite invio di una email) presso: Dipartimento di Ingegneria Informatica, Automatica e Gestionale Antonio Ruberti, via Ariosto 25 - II piano, stanza A209
Si invitano gli studenti a controllare regolarmente la bacheca degli avvisihttp://www.dis.uniroma1.it/~bloisi/didattica/labinf1314.html#Avvisi
2013/2014Istruzioni condizionaliUnità 3
Pagina 3
Orari
Lunedì 12.00 – 13.30 Aula 15, via Scarpa 14
Lunedì 14.00 – 17.15Aula 15, Laboratorio Didattico via Tiburtina 205
Martedì 14.00 – 15.30 Aula 16, via Scarpa 14
Mercoledì 12.00 – 13.30 Aula 15, via Scarpa 14
2013/2014Istruzioni condizionaliUnità 3
Pagina 4
Sommario – Unità 3
• Operatori di uguaglianza e relazionali • Calcolo booleano• Istruzione if-else e istruzione if• Condizioni ed espressioni booleane• Blocco di istruzioni• if annidati• Espressione condizionale• Istruzione switch
2013/2014Istruzioni condizionaliUnità 3
Pagina 5
Operatori di uguaglianza e relazionali
Un’espressione relazionale ha valore intero:0 se falsa1 se vera
In C, ● falso (false) equivale a zero● vero (true) equivale a qualsiasi valore diverso
da zero
GENERALMENTE:0 false1 true
2013/2014Istruzioni condizionaliUnità 3
Pagina 7
Esercizio Operatori
Cosa stampano le varie istruzioni printf?#include <stdio.h>int main (void){
int j = 0, m = 1, n = -1, tot;float x = 2.5, y = 0.0, ris;ris = x + (y >= n);printf("\nRisultato:\t%f\n", ris);tot = ((j + 1) == m) != (y * 2);printf("\nTotale:\t%d\n", tot);printf("Totale in float:\t%f\n", tot);ris = ((j + 1) == m) != (y * 2);printf("\nRisultato intero:\t%d\n", ris);printf("Risultato float:\t%f\n", ris);tot = ((-x) + j) == ((y > n) >= m);printf("\nTotale:\t%d\n", tot);printf("Totale in float:\t%f\n", tot);return 0;
}2013/2014Istruzioni condizionali
Unità 3Pagina 10
Algebra di Boole
• Sviluppata nel 1854 da George Boole
• Calcolo booleano: dominio ed operatori
2013/2014Istruzioni condizionaliUnità 3
Pagina 11
http://it.wikipedia.org/wiki/Algebra_di_Boole
Esempi
- true and false vale false (falso)- true or false vale true (vero)- not true vale false (falso)- false or (true and (not false)) è equivalente a: false or (true and true) che è equivalente a: false or true che vale: true
2013/2014Istruzioni condizionaliUnità 3
Pagina 12
Operatori logici
Il C mette a disposizione 3 operatori logici per ottenere espressioni in algebra booleana
• && (AND logico)
• || (OR logico)
• ! (NOT logico o negazione logica)
2013/2014Istruzioni condizionaliUnità 3
Pagina 14
Operatori logici: esempi
int a, b, c, d, e;a = 1;b = 0;c = a && b; // c = a and bd = a || b; // d = a or be = !a; // e = not a
Nota: in a && b il valore di b è calcolato solo se a è vero, in a || b il valore di b ècalcolato solo se a è falso.
2013/2014Istruzioni condizionaliUnità 3
Pagina 15
Operatori logici: valore dell’espressione
int a, b, c, d, e;a = 1; b = 0;c = a && b; // c = a and bprintf("%d\n", c); // stampa 0 d = a || b; // d = a or bprintf("%d\n", d); // stampa 1e = !a; // e = not aprintf("%d\n", e); // stampa 0
Come con gli operatori di uguaglianza e relazionali le espressioni che coinvolgono gli operatori logici restituiscono un valore intero 0 o 1 a seconda dell’esito della valutazione
2013/2014Istruzioni condizionaliUnità 3
Pagina 16
Operatori logici: precedenza
Espressioni complesse si possono costruire con gli operatori !, && e || usando le seguentiregole di precedenza:
1. !2. &&3. ||
Ad esempio, la seguente è un’espressione valida con operatori logici:a && ! b || c;Ed è equivalente a:(a && (! b)) || c;
2013/2014Istruzioni condizionaliUnità 3
Pagina 17
Istruzioni di controllo del flusso
Abbiamo visto istruzioni per:• Invocare funzioni• Assegnare valori a variabili
Sappiamo scrivere programmi• Formati da sequenze di istruzioni semplici;• Che invochino diverse funzioni.
Siamo ora interessati a compiere azioni (cioè, eseguire istruzioni) diverse in relazione alla verifica di una condizione.
2013/2014Istruzioni condizionaliUnità 3
Pagina 20
Istruzioni condizionali
Il C mette a disposizione del programmatore due forme di istruzione condizionale:
• l'istruzione if-else
• l'istruzione switch
Tali istruzioni sono dette condizionali, e sonouna forma di istruzione composta.
2013/2014Istruzioni condizionaliUnità 3
Pagina 21
L'istruzione if-else (1/3)
L'istruzione if-else consente di effettuare unaselezione a 2 vie.
Sintassi
if ( condizione )istruzione-then
elseistruzione-else
2013/2014Istruzioni condizionaliUnità 3
Pagina 22
VERO
FALSO
L'istruzione if-else (2/3)
condizione
then else
if
2013/2014Istruzioni condizionaliUnità 3
Pagina 23
L'istruzione if-else (3/3)
Semantica
Viene valutata prima la condizione.• Se la valutazione risulta vera (valore di ritorno diverso da 0), viene eseguita istruzione-then• Se risulta falsa (valore di ritorno 0), viene eseguita istruzione-else.
In entrambi i casi l'esecuzione prosegue con l'istruzione che segue l'istruzione if-else.
2013/2014Istruzioni condizionaliUnità 3
Pagina 24
Esempio
int a, b;...if (a > b)
printf("%d maggiore di %d\n", a, b);else
printf("%d maggiore di (o uguale a) " "%d\n", b, a);
Nota printf: È possibile andare accapo spezzando il parametro format
2013/2014Istruzioni condizionaliUnità 3
Pagina 25
Controllo del flusso – if-else
if ( condizione )istruzione-1
elseistruzione-2
istruzione-3
condizione
≠ 0vero
0falso
istruzione-2istruzione-1
istruzione-3
2013/2014Istruzioni condizionaliUnità 3
Pagina 26
Esempio
int a, b;...if (a > b)
printf("%d maggiore di %d\n", a, b);else
printf("%d maggiore di (o uguale a) " "%d\n", b, a);
printf("questa riga verra\' stampata\n");
2013/2014Istruzioni condizionaliUnità 3
Pagina 27
La variante if
La parte else di un'istruzione if-else è opzionale.
Esempio:
int a;...if (a == -1)
printf("ERRORE", a);
2013/2014Istruzioni condizionaliUnità 3
Pagina 28
Controllo del flusso - if
if ( condizione )istruzione-1
istruzione-3 condizione
≠ 0vero
0falso
istruzione-1
istruzione-3
2013/2014Istruzioni condizionaliUnità 3
Pagina 29
Esempio
int a, b;...if (a > b)
printf("%d maggiore di %d\n", a, b);printf("questa riga verra\' stampata\n");
2013/2014Istruzioni condizionaliUnità 3
Pagina 30
Condizione in un'istruzione if-else
La condizione in un'istruzione if-else può essere una qualsiasi espressione (tranne una struttura), ad esempio:
• Una variabile
• Un operatore di confronto (==, !=, >, <, >=,<=) applicato a variabili (o espressioni) di un tipo primitivo;
• Un'espressione complessa, ottenuta applicando gli operatori booleani !, && e || a espressioni più semplici;
• La chiamata a una funzione.
2013/2014Istruzioni condizionaliUnità 3
Pagina 31
Esempi
int a, b;...if (a) ... if (a > b)...if (quadrato(a))...if ( (quadrato(a) && (a>b) ) || !b )
chiamata di funzione
operatore di confronto
variabile
espressione complessa
2013/2014Istruzioni condizionaliUnità 3
Pagina 32
Esercizio
Esercizio 3.1Si scriva un programma C in grado di prendere in ingresso da tastiera un intero e di stampare la parola “pari” nel caso in cui si tratti di un numero pari, la parola “dispari” altrimenti.
2013/2014Istruzioni condizionaliUnità 3
Pagina 33
Si inserisca un intero:2pari
Esercizio: soluzione
#include <stdio.h>
int main() {int x;printf("Si inserisca un intero:\n");scanf("%d", &x);if((x % 2) == 0)
printf("pari\n");else
printf("dispari\n");return 0;
}
2013/2014Istruzioni condizionaliUnità 3
Pagina 34
Errori nelle condizioni
int a;double b;
if (a=0)...if (b==0)...
L’errore riguarda l’uso dell’operatore di assegnazione invece dell’operatore di confronto. In questo caso il compilatore non segnala alcuna anomalia, dato che il risultato dell’espressione (a=0) viene convertito nel valore booleanocorrispondente cioè falso, e sarà sempre eseguito il ramo else del condizionale.
Occorre accertarsi che errori di approssimazione non portino ad avere sistematicamente il valore falso.
2013/2014Istruzioni condizionaliUnità 3
Pagina 35
Esercizio
Compilare ed eseguire il seguente programma#include <stdio.h>
int main() {int a = 0;if(a = 0)
printf("primo ramo then\n");else
printf("primo ramo else\n");if(a == 0)
printf("secondo ramo then\n");else
printf("secondo ramo else\n");return 0;
}
2013/2014Istruzioni condizionaliUnità 3
Pagina 36
Blocco di istruzioni
Un blocco di istruzioni raggruppa più istruzioni in un'unica istruzione composta.
Sintassi
{istruzione...istruzione
}
Dove istruzione è una qualsiasi istruzione C
2013/2014Istruzioni condizionaliUnità 3
Pagina 37
Blocco di istruzioni: semantica
Le istruzioni del blocco vengono eseguite insequenza.
Esempio:int a, b, maggiore;...{
maggiore = a;printf("minore = %d\n", b);
}
2013/2014Istruzioni condizionaliUnità 3
Pagina 38
Campo di azione delle variabilidefinite nei blocchi di istruzioniUn blocco di istruzioni può contenere al suo interno dichiarazioni di variabili.
Una variabile dichiarata dentro un blocco ha come campo di azione (scope) il blocco stesso, inclusi eventuali blocchi interni.
Questo significa che la variabile è visibile nel blocco e in tutti i suoi blocchi interni, ma non è visibile all'esterno del blocco.
2013/2014Istruzioni condizionaliUnità 3
Pagina 39
#include <stdio.h>#include <math.h>
int main () {double a = 2e3;int i = 1;printf("livello 0 a = %f i = %d\n", a, i);{
printf("livello 1 a = %f i = %d\n", a, i);// OK. a e’ visibile - stampa il valore di adouble i = 0.1;// i e’ visibile e viene ridichiarata{
double r = 5.5; // OKi = i + 1; // OK. i e’ visibile (double)printf("livello 2.1 r = %f i = %f\n", r, i);// OK. r e’ visibile - stampa 5.5
}//printf("r = %f\n", r); // ERRORE. r non e’ visibileprintf("livello 1 i = %f\n", i);// OK. i e’ visibile (double) - stampa 1.1{
int r = 4; // OK. r precendente non e’ piu’ visibileprintf("livello 2.2 r = %d a = %f\n", r, a);// OK. a e’ ancora visibile - stampa il valore di a
}}i = i + 1; // OK. i e’ visibileprintf("livello 0 a = %f i = %d\n", a, i); // OK. i e’ visibile - stampa 2return 0;
}
Le variabili in questo codice hanno diversiscope
Uso del blocco di istruzioninell'if-elseIl ramo-then e il ramo-else di un'istruzione if-elsepossono essere una qualsiasi istruzione C, in particolare un blocco di istruzioni.
if (a > b) {printf("maggiore = %d\n", a);printf("minore = %d\n", b);
}
2013/2014Istruzioni condizionaliUnità 3
Pagina 41
Uso del blocco di istruzioninell'if-else: esempioDati mese ed anno, calcolare mese ed anno del mese successivo.
int mese, anno, mesesucc, annosucc;...if (mese == 12) {
mesesucc = 1;annosucc = anno + 1;
}else {
mesesucc = mese + 1;annosucc = anno;
}
2013/2014Istruzioni condizionaliUnità 3
Pagina 42
Chiarimentoif(esressione)
istruzione
if(esressione)istruzione1
elseistruzione2
condizionecorpo: indentato e racchiuso tra graffe se contiene più di una istruzione
if(a != 0)a++;
elsea--;
if(a != 0)a++;b = 3;
elsea--;
NO
if(a != 0){a++;b = 3;
} elsea--;
error: 'else' without a previous 'if'
2013/2014Istruzioni condizionaliUnità 3
Pagina 43
SI SI