Istruzione if (superiori)
Operatori di Confronto
[modifica]Gli operatori di confronto che servono per scrivere delle espressioni logiche (che hanno cioe' come risultati i valori booleani true e false) sono:
< minore <= minore o uguale > maggiore >= maggiore o uguale == uguale != non uguale, cioe' diverso, il ! ne indica negazione
quindi per sapere se la variabile z e' uguale a 5 si deve scrivere la seguente condizione z==5 , e' un doppio uguale perche' il singolo uguale e' invece l'operatore di assegnazione (che non serve per confrontare)
Istruzione if
[modifica]Non sempre e' possibile risolvere un problema usando soltanto istruzioni disposte sequenzialmente, alcune volte in base a una condizione si vuole eseguire in alternativa o un certo gruppo di istruzioni o un altro gruppo di istruzioni(diverse).
Ad esempio posso dire se marco ha più di 10 euro prima saluta gli amici poi compra della pizza altrimenti torna a casa e poi va a giocare a calcio.
Oppure possiamo dire se la merce acquistata ha un valore maggiore di 50 euro il negoziante fa uno sconto del 10% altrimenti uno sconto del 5%, in questo caso l'istruzione sconto del 10% e' in alternativa a quella dove lo sconto e' 5% e la scelta di quale sconto applicare dipende dalla condizione (spesa superiore a 50 euro)
L'istruzione per realizzare una scelta fra 2 blocchi di istruzioni e' l'istruzione if
Vediamo ora la sintassi dell'if ( la sintassi e' la regola grammaticale con cui impartiamo l'ordine ) :
if (condizione logica) {istruzione 1 caso vero; istruzione 2 caso vero; .... istruzione n caso vero; } else {istruzione 1 caso falso; istruzione 2 caso falso; .... istruzione m caso falso; }
Ad esempio posso scrivere
if (spesa>50) { percentualesconto=0.10; } else { percentualesconto=0.05; }
Guardando alla sintassi del comando si ha :
- che la condizione logica è una qualsiasi espressione che ha come risultato un valore booleano (cioè o true o false)
- poi c'e' un primo blocco d'istruzioni racchiuse fra parentesi graffe (quella di apertura allineata con quella di chiusura) che sono eseguite se la condizione logica e' true, questo blocco di istruzioni e' detto blocco istruzioni caso vero
- poi c'e' dopo l'else un secondo blocco d'istruzioni racchiuse fra parentesi graffe (quella di apertura allineata con quella di chiusura) che sono eseguite se la condizione logica e' false, questo blocco di istruzioni e' detto blocco istruzioni caso falso
- la parola if corrisponde all'italiano se ed è una parola riservata perche' indica un'istruzione
- la parola else corrisponde all'italiano altrimenti, e' una parola riservata ed usata insieme ad un if ( e quindi mai da sola)
possiamo riassumere dicendo che if-else funziona in questo modo:
se la condizione e' verificata esegui le istruzioni del blocco caso vero altrimenti quelle del blocco caso falso.
per rappresentare graficamente un if-else ho il seguente diagramma di flusso
ci sono delle varianti al comando , ad esempio può mancare la parte else , in questo caso si parla di if semplice (quello precedente e' detto invece if a 2 vie).La sintassi del if semplice e'
if (condizione logica) {istruzione 1 caso vero; istruzione 2 caso vero; .... istruzione n caso vero; }
ad esempio
if(a>4) { z=3; k=7; }
in questo caso solo se la condizione a>4 è verificata le istruzioni del blocco vero sono eseguite,e il diagramma di flusso e' il seguente
si nota che la struttura e' uguale a quella di prima ma non ci sono istruzioni da eseguire nel caso falso . Sia che ci sia l'esecuzione del blocco vero o sia che venga eseguito quello falso poi ci si ricongiunge in un punto e si prosegue con le istruzioni successive.
Se un blocco di istruzioni contiene una sola istruzione allora le graffe di quel blocco possono essere omesse, cioe' posso avere:
if (a<3) z=5; else { z=3; x=4; }
oppure
if (a<3) { z=7; x=8; } else z=5;
oppure
if (a<3) x=8; else z=5;
nel caso di if semplice si ha invece
if (a<3) x=8;
che possiamo scrivere anche su una sola riga
if (a<3) x=8;
Le istruzioni del blocco vero o falso possono essere qualsiasi , se le istruzioni di un blocco (vero o falso di un if) contengono a loro volta un'istruzione if si parla di istruzione if annidata, ad esempio
if(a>10) { z=7; if(a>70) {cout<<"a e' maggiore di 70; } else {cout<<"a e' compreso fra 10 e 70; } } else {cout<<"a minore di 10"; }
naturalmente nel comando precedente qualche graffa poteva essere omessa arrivando a:
if(a>10) { z=7; if(a>70) cout<<"a e' maggiore di 70; else cout<<"a e' compreso fra 10 e 70; } else cout<<"a minore di 10";
Qualche volta quando si usano degli if annidati si creano delle situazioni particolari
if(a>10) if(a>70) cout<<"a e' maggiore di 70; else cout<<"Ob-la-dì Ob-la-da";
in questo caso ho un solo else a quale if appartiene? in questo caso la regola vuole che l'if appartenga all'if più interno (cioe' al if(a>70) ), posso identare (spaziando) meglio il codice per evidenziare come l'istruzione vienen eseguita
if(a>10) if(a>70) cout<<"a e' maggiore di 70; else cout<<"Ob-la-dì Ob-la-da";
per ottenere l'effetto opposto bisogna giocare con le parentesi graffe, in modo da raggruppare in modo diverso le istruzioni, si ha allora
if(a>10) { if(a>70) cout<<"a e' maggiore di 70; } else cout<<"Ob-la-dì Ob-la-da";
Gli annidamenti del if danno luogo a delle strutture dette if-elseif del tipo
if(a==1) cout<<" e' 1"; else if (a==4) cout<<"e' 4"; else if((a==7) cout<<"e' 7"; else if(f((a==9) cout<<"e '9"; else if(a==12) cout<<"e '12"; else cout<<"diverso da 1 4 7 9 e 12";
in questo caso anche se l'identazione e' corretta perche' evidenzia la corretta struttura if else if, si preferisce ricompattarla per motivi di spazio nella seguente forma:
if(a==1) cout<<" e' 1"; else if (a==4) cout<<"e' 4"; else if((a==7) cout<<"e' 7"; else if(f((a==9) cout<<"e '9"; else if(a==12) cout<<"e '12"; else cout<<"diverso da 1 4 7 9 e 12";
che evidenzia che si ha un if multiplo che serve per gestire una serie di casi ( a pari a 1, a pari a 4 etc ) e la relativa azione intrapresa.
Nel C non esistono le variabili booleani, che sono state introdotte nel c++, nel c per rappresentare una variabile booleana (vero/falso) si usa un intero, se l'intero vale 0 la condizione e' falsa , se e' diverso da zero la condizione e' vera, quindi l'espressione logica (condizione) con i booleani può essere sostituita da una espressione che restituisce un intero
se z vale 10 e scrivo
if( z-6) cout<<"ciao"; else cout<<"bravo";
vedo sullo schermo comparire ciao perche' z-6 fa 4 e quattro e' un numero diverso da zero e quindi se interpretato come il risultato di una espressione logica si ha vero.