istruzioni di selezione (if/else/switch). lab.calc. aa2005/062 espressione

46
Istruzioni di selezione (If/else/switch)

Upload: domenico-berti

Post on 01-May-2015

218 views

Category:

Documents


0 download

TRANSCRIPT

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.