presentazione di powerpoint - università di romabloisi/didattica/ingegneriaclinica1314/... ·...

44
Corso di Laboratorio di Informatica Ingegneria Clinica – BCLR Unità 3 Istruzioni Condizionali Domenico Daniele Bloisi

Upload: lamnhan

Post on 15-Feb-2019

215 views

Category:

Documents


0 download

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

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

Priorità

Esempi

int j=0, m=1, n=-1; float x=2.5, y=0.0;

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

Tavole di verità

2013/2014Istruzioni condizionaliUnità 3

Pagina 13

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

Operatori: precedenza

2013/2014Istruzioni condizionaliUnità 3

Pagina 18

Esempio operatori logici

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

Esercizio

Esercizio 3.2Si scriva un programma C in grado di prendere in ingresso da tastiera tre numeri interi e di stampare il maggiore tra essi

2013/2014Istruzioni condizionaliUnità 3

Pagina 44