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

Presentazione di PowerPoint - Università di Romabloisi/didattica/ingegneriaClinica1415/... · un valore intero 0 o 1, a seconda dell’esito della valutazione. Laboratorio di Informatica

Embed Size (px)

Citation preview

Corso di Laboratorio di Informatica

Ingegneria Clinica – BCLR

Unità 3

Istruzioni Condizionali

Domenico Daniele Bloisi

Docente

Ing. Domenico Daniele Bloisi, PhD

Ricercatore

Dipartimento di Ingegneria Informatica, Automatica

e Gestionale “Antonio Ruberti”

Via Ariosto 25

(adiacente Piazza Dante,

Manzoni

Tram 3 fermata via Labicana)

email: [email protected]

home page:

Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Pagina 2

http://www.dis.uniroma1.it/~bloisi

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 avvisi

http://www.dis.uniroma1.it/~bloisi/didattica/labinf1415.html#Avvisi

Pagina 3Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Orari

Lunedì 12.00 – 13.30

Aula 4, via del Castro Laurenziano 7A

Martedì 14.00 – 17.15

Aula 15, Laboratorio Didattico via Tiburtina 205

Mercoledì 12.00 – 13.30

Aula 4, via via del Castro Laurenziano 7A

Pagina 4Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

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

Pagina 5Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Operatori di uguaglianza e relazionali

Operatori di uguaglianza e relazionali

Un’espressione relazionale ha valore intero:

0 se falsa

1 se vera

In C,

falso (false) equivale a zero

vero (true) equivale a qualsiasi valore diverso da

zero

GENERALMENTE:

0 false

1 true

Pagina 7Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

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;

}

Pagina 10Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Algebra di Boole

• Sviluppata nel 1854 da George Boole

• Calcolo booleano: dominio ed operatori

Pagina 11

http://it.wikipedia.org/wiki/Algebra_di_Boole

Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

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

Pagina 12Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Tavole di verità

Pagina 13Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

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)

Pagina 14Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Operatori logici: esempi

int a, b, c, d, e;

a = 1;

b = 0;

c = a && b; // c = a and b

d = a || b; // d = a or b

e = !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.

Pagina 15Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Operatori logici: valore dell’espressione

int a, b, c, d, e;

a = 1; b = 0;

c = a && b; // c = a and b

printf("%d\n", c); // stampa 0

d = a || b; // d = a or b

printf("%d\n", d); // stampa 1

e = !a; // e = not a

printf("%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.

Pagina 16Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Operatori logici: precedenza

Espressioni complesse si possono costruire con gli operatori !, && e || usando le seguenti regole di precedenza:

1. !

2. &&

3. ||

Ad esempio, la seguente è un’espressione valida con

operatori logici:a && ! b || c;

ed è equivalente a:(a && (! b)) || c;

Pagina 17Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Operatori: precedenza

Pagina 18Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Esempio operatori logici

Pagina 19Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Istruzioni di controllo del flusso

Abbiamo visto istruzioni per:

• Invocare funzioni

• Assegnare valori a variabili

Sappiamo scrivere programmi:

• Formati da sequenze di istruzioni semplici;

• Contenenti invocazioni di diverse funzioni.

Siamo ora interessati a compiere azioni (cioè,

eseguire istruzioni) diverse in relazione alla verifica di

una condizione.

Pagina 20Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

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 sono

una forma di istruzione composta.

Pagina 21Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

L'istruzione if-else (1/3)

L'istruzione if-else consente di effettuare una

selezione a 2 vie.

Sintassi

if ( condizione )

istruzione-then

else

istruzione-else

Pagina 22Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

VERO

FALSO

L'istruzione if-else (2/3)

then else

if

Pagina 23Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

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.

Pagina 24Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

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 per printf: è possibile andare a capo

spezzando il parametro format

Pagina 25Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Controllo del flusso: if-else

if ( condizione )

istruzione-1

else

istruzione-2

istruzione-3

condizione

≠ 0

vero

0

falso

istruzione-2istruzione-1

istruzione-3

Pagina 26Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

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");

Pagina 27Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

La variante if

La parte else di un'istruzione if-else è

opzionale.

Esempio:

int a;

...

if (a == -1)

printf("ERRORE", a);

Pagina 28Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Controllo del flusso - if

if ( condizione )

istruzione-1

istruzione-3condizione

≠ 0

vero

0

falso

istruzione-1

istruzione-3

Pagina 29Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Esempio

int a, b;

...

if (a > b)

printf("%d maggiore di %d\n", a, b);

printf("questa riga verra\' stampata\n");

Pagina 30Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

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.

Pagina 31Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

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

Pagina 32Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Esercizio

Esercizio 3.1

Si 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.

Pagina 33

Esempio:Si inserisca un intero:

2

pari

Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

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;

}

Pagina 34Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

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 booleano corrispondente (falso), e sarà

sempre eseguito il ramo else del condizionale.

b è di tipo double, mentre 0 è un letterale di tipo int. Occorre, allora,

accertarsi che errori di approssimazione non portino ad avere sistematicamente una condizione con valore falso (b potrebbe valere

"quasi" zero, cioè 2.220446E-16 l’epsilon di macchina).

http://en.wikipedia.org/wiki/Machine_epsilon

Pagina 35Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

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;

}

Pagina 36Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Blocco di istruzioni

Un blocco di istruzioni raggruppa più istruzioni in

un'unica istruzione composta.

Sintassi

{

istruzione

...

istruzione

}

dove istruzione è una qualsiasi istruzione C

Pagina 37Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Blocco di istruzioni: semantica

Le istruzioni del blocco vengono eseguite in

sequenza.

Esempio:int a, b, maggiore;

...

{

maggiore = a;

printf("minore = %d\n", b);

}

Pagina 38Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Campo di azione delle variabili

definite nei blocchi di istruzioni

Un 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.

Pagina 39Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

#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 a

double i = 0.1;

// i e’ visibile e viene ridichiarata

{

double r = 5.5; // OK

i = 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’ visibile

printf("livello 1 i = %f\n", i);

// OK. i e’ visibile (double) - stampa 1.1

{

int r = 4; // OK. r precendente non e’ piu’ visibile

printf("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’ visibile

printf("livello 0 a = %f i = %d\n", a, i); // OK. i e’ visibile - stampa 2

return 0;

}

Le variabili in

questo codice

hanno diversi

scope

Uso del blocco di istruzioninell'if-else

Il ramo-then e il ramo-else di un'istruzione if-else

possono essere una qualsiasi istruzione C, in

particolare un blocco di istruzioni.

if (a > b) {

printf("maggiore = %d\n", a);

printf("minore = %d\n", b);

}

Pagina 41Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Uso del blocco di istruzioninell'if-else: esempio

Dati 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;

}

Pagina 42Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Chiarimento

if(esressione)

istruzione

if(esressione)

istruzione1

else

istruzione2

Condizione:

racchiusa tra

parentesi

tonde

Corpo: indentato e

racchiuso tra parentesi

graffe se contiene più di

una istruzione

if(a != 0)

a++;

else

a--;

if(a != 0)

a++;

b = 3;

else

a--;

NO

if(a != 0){

a++;

b = 3;

} else

a--;

error: 'else' without a

previous 'if'

Pagina 43

SI SI

Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3

Esercizio

Esercizio 3.2

Si scriva un programma C in grado di prendere in

ingresso da tastiera tre numeri interi e di stampare il

maggiore tra essi.

Pagina 44Laboratorio di Informatica

2014/2015

Istruzioni condizionali

Unità 3