Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

46
Istruzioni di selezione (If/else/switch)

Transcript of Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Page 1: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Istruzioni di selezione (If/else/switch)

Page 2: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 2

espressione

Page 3: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 3

espressione

condizione

Page 4: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 4

espressione

condizione

successo

Page 5: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 5

Sintassi di if

if (espressione) istruzione

dove espressione è una qualsiasi espressione C++ e istruzione può essere una singola istruzione o una sequenza di istruzioni racchiusa tra { e }.

Page 6: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 6

Semantica di if• Nellesecuzione di un'istruzione if viene

valutata l'espressione tra parentesi– Se il suo valore è non nullo allora viene

eseguita l'istruzione – Se il suo valore è nullo l'istruzione

viene ignorata.– In entrambi i casi l'esecuzione procede

con l'istruzione successiva all'if

Page 7: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 7

Esempi di uso di if

: :if ( x < y) x = x + 5;: :if (x==0) {

x = -1; y = y + 25;

}:

Page 8: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 8

Esempio di programma

#include<iostream.h>int main ( ){ int x, y;

cout<< " Inserire due numeri " ;cin>>x>>y;if(x > y) cout << "Il primo e piu grande.\n";if(x == y) cout<< "Sono uguali.\n";if(x < y) cout<<"Il secondo e piu grande.\n";cout<<" letti"<< x<<" e "<<y<<"\n";return 0;

}

Page 9: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 9

espressione

condizione

Page 10: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 10

espressione

condizione

successo

Page 11: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 11

espressione

condizione

Ramo 1

successo

Page 12: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 12

espressione

condizione

Ramo 1

successo insuccesso

Page 13: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 13

espressione

condizione

Ramo 1 Ramo 2

successo insuccesso

Page 14: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 14

Sintassi di if…else

if (espressione) istruzione1 else istruzione2

dove espressione è una qualsiasi

espressione C++ e istruzione1(2) sono una istruzioni singole o sequenze di istruzioni racchiuse tra { e }.

Page 15: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 15

Semantica di if…else

• Viene valutata l'espressione tra parentesi:– Se il valore è non nullo viene eseguita

l'istruzione1 e non viene eseguita l'istruzione2

– Se invece il valore è nullo l'istruzione1 non viene eseguita e viene eseguita l'istruzione2.

Page 16: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 16

Esempi

:if ( x != 0 ) {y = y / x;x = x - 1;

} else {x = 25;y = y / x;

}:

Page 17: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 17

:if ( x != 0 ) {y = y / x;x = x - 1;

} else {

x = 25;y = y / x;

}:

Page 18: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 18

::

if ( x >y ) x = y - 6 ;else y = x + 6;:

Corretto ma di difficile lettura: quando si legge la riga dell'if non ci si aspetta che ci sia un seguito…

Page 19: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 19

::

if ( x > 0 ) { x = x + 25;y = y / x; }else x = x +1;

::

Page 20: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 20

::

if ( x != 0 ) y = y / x;else {

x = 25;y = y / x;}

:

Page 21: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 21

Esempio di programma#include<iostream.h>int main( ){ int x, y, small, large; cout << "Inserire due numeri” << endl; cin >> x >> y; if (x > y){

large = x;small = y;

} else {large = y;small = x;}cout<<"in ordine crescente:"

<<small<<" "<<large<<endl;return 1;

}

Page 22: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 22

if... else annidati

• Nei costrutti più complessi, in cui si vogliano porre delle condizioni all'interno di un if…else, si pone il problema di associare correttamente l'else ad un if.

• La regola è che ogni else è associato al più vicino if che lo preceda, sempre che questo non sia già stato associato ad un altro else.

Page 23: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 23

Esempio:

Quanto vale y dopo l'esecuzione di questo blocco di istruzioni, dato x = 4.5?

y = 3;if (x > 4) if (x > 5) if (x > 6) y = 3;else y = 4;else y = 5;

Page 24: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 24

Utilizziamo l'incolonnamento per visualizzare I diversi blocchi logici:

y = 3;

if (x > 4)

if (x > 5)

if (x > 6) y = 3;

else y = 4;

else y = 5;

sono tutte istruzioni singole e quindi le parentesi graffe non sono necessarie, ma aiutano!

Page 25: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 25

y=3;if (x > 4) { // vero per x=4.5 if (x > 5) { // falso per x=4.5 if (x > 6) { y = 3; } else { y = 4; } } else { // eseguito se x <= 5 y = 5; // per x=4.5 y=5 ! }}

Page 26: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 26

Visibilità di un identificatore

• Un blocco di codice è il codice contenuto all'interno di una coppia di parentesi graffe: {…}.

• La visibilità (scope) di un identificatore è data dal codice che lo dichiara e dalle istruzioni successive all'interno del più piccolo blocco contenente la dichiarazione: l'identificatore è valido (visibile) solo in questa parte del codice.

Page 27: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 27

Esempi:

{ int x ;x = 5;cout << x << endl;

}

Page 28: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 28

{ int x, y;y = x = 25;{ double z;

z = 20;}

cout<< x + y <<endl;}

Page 29: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 29

{ int x, y;y = x = 25;

{ double z;z = x + y;

}cout<< x + y << z <<endl; //errore!}

Page 30: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 30

espressione

condizione

Page 31: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 31

espressione

condizione

Caso 1

Page 32: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 32

espressione

condizione

Ramo 1

Caso 1

Page 33: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 33

espressione

condizione

Ramo 1

Caso 1Caso 2

Page 34: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 34

espressione

condizione

Ramo 1

Caso 1Caso 2

Ramo 2

Page 35: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 35

espressione

condizione

Ramo 1

Caso 1Caso 2

Ramo 2

Caso 3

Page 36: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 36

espressione

condizione

Ramo 1

Caso 1Caso 2

Ramo 2

Caso 3

Ramo 3

Page 37: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 37

Sintassi di switch

switch(espressione) {case val1: istruzione1case val2: istruzione2:case valn: istruzionen

default: istruzione

}

Dove l'espressione assume valori interi (val1,… valn) e ogni istruzione può essere singola o composta da una sequenza di istruzioni.

Page 38: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 38

Semantica di switch

Nell'esecuzione dell'istruzione switch 1. Viene valutata l'espressione2. Il valore dell'espressione viene confrontato

con I diversi valori dei case. Se è uguale ad uno di questi viene eseguito il blocco istruzione ad esso associato.

3. Se il valore dell'espressione non coincide con nessuno dei valori previsti si esegue il blocco di istruzioni associato a default.NB: una volta trovato il caso giusto il programma esegue anche tutti i casi successivi!

Page 39: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 39

Esempio

int dato; cin >> dato;

switch(dato) {case 5: cout<< "dato == 5";case 4: cout<< "dato == 4";default:

cout<< "dato diverso da 4 o 5 \n";}

Se dato==6 viene eseguita solo la stampa di default, se è 4 vengono eseguite quelle del case 4 e del default, se è 5 vengono eseguite tutte!

Page 40: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 40

break

Se si inserisce un break alla fine di ogni blocco istruzioni si ovvia al problema precedente:

int dato; cin >> dato;

switch(dato) { case 5: { cout<< "dato == 5"; break ; } case 4: { cout<< "dato == 4"; break ; } default: cout<< "dato diverso da 4 o 5 \n";

}

Page 41: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 41

else if

L'uso di switch con break corrisponde in definitiva a un uso di if…else if…else:

if(dato ==5) { cout<< "dato == 5"; } else if(dato==4) { cout<< "dato == 4"; } else { cout<< "dato diverso da 4 o 5 \n"; }

Page 42: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 42

Preprocessore

• È possibile inserire delle scelte anche a livello del preprocessore, tipicamente per definire quali parti di codice vadano compilate e quali no.

• Ricordando che tutte le direttive del preprocessore iniziano con il simbolo # vediamo alcuni esempi.

Page 43: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 43

define

• Con l'istruzione #define NOMEVAR si dichiara una variabile al preprocessore• Con l'istruzione #define NOMEVAR valore le si assegna un valore• Con l'istruzione #undef NOMEVAR la si cancella completamente

Page 44: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 44

define

• Le variabili per il processore possono essere definite anche esternamente, quando si invochi il preprocessore (o il preprocessore + compilatore + ...)

g++ -DNOMEVAR programma.cc g++ -DNOMEVAR=valore programma.cc

Page 45: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 45

ifdef

• Per mettere nello stesso file sorgente del codice che è diverso a seconda del calcolatore utilizzato si procede generalmente così

#ifdef PCWINDOWS blocco di codice per PC con Windows #else codice per tutti gli altri #endif

Page 46: Istruzioni di selezione (If/else/switch). Lab.Calc. AA2005/062 espressione.

Lab.Calc. AA2005/06 46

ifndef

• Tutti gli header file iniziano con #ifndef NOME_NON_AMBIGUO#define NOME_NON_AMBIGUOE finiscono con #endif• La prima istruzione verifica che

NOME_NON_AMBIGUO non sia stato definito da nessuno, altrimenti vuol dire che il file è già stato incluso e che non serve, anzi potrebbe essere nocivo, includere nuovamente il suo contenuto.