Sei sulla pagina 1di 9

2

Esecuzione condizionale
 Permette l’esecuzione di un blocco di codice
solo se si verifica una certa condizione
Esecuzione condizionale  SE (condizione è vera)
ALLORA esegui istruzioni

Falso Vero
Ver. 2.4 condizione

istruzioni

Ramo “else” Ramo “then”


© 2010 - Claudio Fornaro - Corso di programmazione in C

3 4

Costrutto if Costrutto if
 Sintassi (minimale):  Esempio
if (condizione) Programma che chiede un numero e se è
blocco istruzioni positivo scrive “positivo” altrimenti nulla.
 Parentesi necessarie prima e dopo condizione scanf("%d", &n);
 Non richiede il ‘;’ alla fine if (n > 0)
{
 Il blocco istruzioni è racchiuso da parentesi printf("positivo\n");
graffe, queste sono opzionali se è composto F V
} n>0
da una sola istruzione (si indenti/rientri il
Le parentesi graffe sono
codice del blocco)
opzionali in quanto il positivo
 Come dopo tutte le parole chiave, dopo if blocco condizionato è
generalmente si preferisce mettere uno spazio composto dalla sola printf
5 6

Costrutto if Costrutto if-else


 Esempio  Per indicare il blocco da eseguire nel caso la
Programma che chiede un numero e se è condizione NON sia vera si usa la clausola
else ( “altrimenti”), non richiede il ‘;’ alla fine
positivo scrive “positivo” altrimenti nulla,
prima di uscire deve sempre scrivere “FINE”.  Esempio
Programma che chiede un numero, se positivo
scanf("%d", &n); scrive “positivo” altrimenti “non positivo”
if (n > 0) scanf("%d", &n);
printf("positivo\n"); if (n > 0)
F V
printf("FINE\n"); n>0 printf("positivo\n");
La seconda printf positivo
else
printf("non positivo\n");
non è dentro il blocco printf("FINE\n");
e quindi viene eseguita
FINE Nota: l’ultima printf non è dentro il blocco e quindi
comunque viene eseguita sempre

7 8

Costrutto if-else Selezione a più rami


 Il flow-chart corrispondente è:  È richiesta quando si hanno più di due casi
che necessitano di elaborazioni diverse
 Esempio
Falso Vero
n>0 Programma che chiede un numero, se
positivo scrive “positivo”, se negativo
non positivo positivo
“negativo”, se zero “nullo”
 Soluzione 1
FINE Si possono avere più costrutti if completi
in sequenza, ossia uno di seguito all’altro
9 10

Selezione a più rami Selezione a più rami


 Soluzione 1 - codice  Soluzione 2
scanf("%d", &n); F
n>0
V Si utilizzano più costrutti if annidati, ossia
if (n > 0)
positivo
uno completamente dentro un ramo dell’altro
printf("positivo\n"); (in questo esempio il blocco del ramo else
if (n < 0) F V contiene un altro costrutto if completo)
n<0
printf("negativo\n");
negativo
 Efficiente perché le condizioni NON vengono
if (n == 0)
valutate TUTTE
printf("nullo\n");
F V
printf("FINE\n"); n=0
 Inefficiente perché le condizioni nullo
vengono SEMPRE valutate
TUTTE, anche quando non è FINE
necessario (in questo esempio
quando n > 0)

11 12

Selezione a più rami Selezione a più rami


 Soluzione 2 – Flow-chart  Soluzione 2 – codice (1a forma)
scanf("%d", &n);
if (n > 0)
F V
n>0 printf("positivo\n");
F V else
n<0
if (n < 0)
nullo negativo
positivo
printf("negativo\n"); Costrutto
else if interno
printf("nullo\n");
FINE printf("FINE\n");
Quando n > 0 non valuta l’altro controllo
13 14

Selezione a più rami Corrispondenza dell’else


 Soluzione 2 – codice (2a forma, compatta)  Ogni else si riferisce sempre all’ultimo if
scanf("%d", &n);  Se è necessaria una corrispondenza diversa,
if (n > 0) si usino le graffe per isolare il blocco interno:
printf("positivo\n"); if (condizione1)
else if (n < 0) {
printf("negativo\n"); if (condizione2)
else blocco_then_IF2;
printf("nullo\n"); }
printf("FINE\n"); else
Nota: le keyword sono allineate, blocco_else_IF1;
i blocchi sono allineati. Senza le graffe precedenti, l’else sarebbe
Forma PREFERIBILE associato all’if interno e costituirebbe il
blocco_else_IF2

15 16

Espressioni relazionali Espressioni relazionali


 Confrontano due valori  Hanno priorità inferiore alle operazioni
 I valori possono essere espressioni aritmetiche
 Se il risultato è vero danno risultato 1 (non un if (a-5 >= 12*x) ...
generico valore diverso da 0), se falso danno 0 prima calcola le espressioni a-5 e 12*x
poi ne fa il confronto
 Operatori:
==  uguale  Hanno priorità maggiore degli operatori di
!=  diverso assegnamento
<  minore int x;
<=  minore o uguale x = 5 > 2;
>  maggiore
prima fa il confronto tra 5 e 2
>=  maggiore o uguale
poi ne assegna il risultato (1) a x
17 18

Valori logici Operatori logici


 Il valore 0 equivale a falso  Combinano valori logici (variabili o risultati di
 Ogni valore 0 equivale a vero espressioni relazionali)
 Producono risultato 1 (non un generico valore
 Quindi nelle espressioni relazionali scrivere
diverso da 0) se il risultato è vero, 0 se falso
!=0 è opzionale:
 Operatori (in ordine di priorità decrescente):
if (trovato) ...
!  NOT, ha priorità superiore agli operatori
equivale a relazionali e aritmetici
if (trovato != 0) ... if ( !(a>b) ) ...
 Conviene indicare il !=0 quando questo &&  AND, ha priorità inferiore agli operatori
relazionali e aritmetici
facilita la comprensione del programma (ci if ( a>b && c!=0 ) ...
pensa eventualmente il compilatore a ||  OR, ha priorità inferiore agli operatori
rimuoverlo per migliorare l’efficienza) relazionali e aritmetici
if ( a>b || c!=0 ) ...

19 20

Espressioni logiche Valutazione minima di && e ||


 Si possono usare le parentesi per cambiare  Gli operatori && e || vengono valutati sempre
l’ordine di valutazione delle operazioni da sinistra a destra
 Esempi  La valutazione delle espressioni termina non
 if ( a>b || c<d && a!=0 ) ... appena è possibile stabilire se la condizione è
equivale a:
if ( a>b || (c<d && a!=0) ) ... complessivamente vera o falsa:
 if (trovato == 0) ...  if (cond1 && cond2 && cond3 && ...) ...
equivale a: Se cond1 è falsa (0), non si valutano le condx
if ( !(trovato != 0) ) ... successive e complessivamente la condizione dà 0
e quindi, essendo il !=0 sopprimibile, a: (falso)
if (!trovato) ...  if (cond1 || cond2 || cond3 || ...) ...
 Attenzione: è errato scrivere una condizione Se cond1 è vera (!=0), non si valutano le condx
come a < b < c, occorre spezzarla come successive e complessivamente la condizione dà 1
a<b && b<c (vero)
21 22

Valutazione minima di && e || Selezione multipla


 Questo comportamento è utile per evitare che  Per seguire diversi (più di 2) rami alternativi a
le condizioni successive vengano valutate (ed seconda del risultato di un’unica espressione
eseguite) quando le precedenti ad esse non si può sempre utilizzare una serie di costrutti
sono soddisfatte, ad esempio nella seguente if annidati (o in cascata)
if (delta>=0 && sqrt(delta)>10)  Ma se i risultati dell’espressione che
se delta<0 la seconda condizione non viene indirizzano verso rami diversi sono valori
calcolata (darebbe errore) costanti noti a priori, si può utilizzare anche
 Gli operatori && e || inseriscono un sequence utilizzare il più efficiente costrutto switch
point tra le espressioni che collegano
 Quindi gli effetti collaterali degli operatori ++
e –– vengono portati a termine prima della
valutazione della condizione successiva

23 24

Selezione multipla Selezione multipla


 Sintassi  Funzionamento
switch (espressione) Viene calcolata l’espressione e quindi il valore
{ risultante cercato tra i vari risultatox, quindi:
case risultato1:  se viene trovato un risultatox uguale al risultato
blocco1 dell’ espressione:
case risultato2: il bloccox corrispondente viene eseguito
blocco2  altrimenti, se esiste il bloccodefault:
... questo viene eseguito
default:  altrimenti nessun blocco viene eseguito
bloccodefault
}
25 26

Selezione multipla Selezione multipla


 Le varie parti sono le seguenti:  L’ordine in cui sono elencati i vari risultatox è
 espressione è un espressione che produce un ininfluente, sia dal punto di vista
risultato di tipo intero (char, short, int, long) dell’esecuzione, sia da quello della
 risultatox sono valori interi costanti (numeri, performance (ossia i risultatox indicati all’inizio
#define, enum, non valori const) dello switch non è detto siano valutati prima
 bloccox sono blocchi di codice (le parentesi dei successivi in elenco: è indifinito)
graffe per i blocchi sono opzionali e in genere
sono omesse)
 Il ramo default è opzionale, in genere viene
collocato in fondo alla lista, ma per quanto
detto sopra non è importante sia collocato lì
 switch non deve essere terminato da ‘;’

27 28

Selezione multipla Selezione multipla


 Quando si entra ad eseguire un blocco,  Per eseguire il solo blocco corrispondente
vengono eseguiti in cascata (fall-through) all’espressione e poi uscire dallo switch si
anche tutti i blocchi successivi utilizza l’istruzione break collocata come
 Esempio (scorretto) ultima istruzione di ciascun blocco
switch (cifra) {
case 0:  E’ buona norma aggiungere l’istruzione
Cont0++;
Se ad esempio cifra break anche nell’ultimo blocco, in modo che
case 1: se si aggiungono successivamente altri rami
Cont1++; contiene il valore 1,
case 2: vengono incrementati questi siano già terminati correttamente
Cont2++; TUTTI i contatori,  Dopo aver visto i cicli:
...
incluso Altro ed L’istruzione break in un blocco switch
default:
Altro++; escluso Cont0 collocato dentro un ciclo, fa uscire soltanto
} dallo switch e NON anche dal ciclo
29 30

Selezione multipla Selezione multipla


 Esempio (corretto)  L’esecuzione in cascata è indispensabile per
switch (cifra) { associare più risultatox allo stesso bloccox
case 0:
Cont0++; switch (cifra)
break; {
case 1: case 0:  blocco vuoto senza break
Cont1++; case 1:  blocco vuoto senza break
break; case 2:  blocco vuoto senza break
case 2: case 3:
Cont2++; Cifre03++;
break; break;
...
default: default:
Altro++; Cifre49++;
break; break;
} }

31 32

Esercizi Esercizi
1. Scrivere un programma che chieda due 5. Si vogliono dividere gli allievi di un corso in
numeri da tastiera e dei due visualizzi il tre squadre denominate ROSSA, VERDE e BLU
maggiore (es. se vengono inseriti 12 e 27 secondo il loro numero di matricola.
visualizza 27). L’assegnazione avviene con il seguente
criterio: l’allievo con matricola 1 va nella
2. Scrivere un programma che chieda un squadra ROSSA, quello con matricola 2 nella
numero da tastiera e stampi sul video se è VERDE, quello con matricola 3 nella BLU,
pari o dispari (consiglio: calcolare il resto). quello con matricola 4 nella ROSSA, quello
3. Scrivere un programma che chieda tre numeri con 5 nella VERDE ecc.
da tastiera e dei tre stampi il maggiore. Il programma deve chiedere il numero di
matricola dell’allievo e indicare a quale
4. Scrivere un programma che chieda tre numeri squadra è assegnato. Usare il costrutto if.
da tastiera e li stampi in ordine decrescente. 6. Come il precedente, utilizzare uno switch.
33 34

Esercizi Esercizi
7. Scrivere un programma che chieda da tastiera 9. Si scriva un programma che chieda i tre
di introdurre un numero intero corrispondente coefficienti a, b e c di un’equazione di
ad un voto e stampi a video secondo grado e calcoli i valori delle soluzioni
“Insufficiente” se è inferiore a 18, se questi sono reali; nel caso non lo siano
“Appena sufficiente” (18), deve semplicemente scrivere a video
“Basso” (19-20), “Valori non reali”.
“Medio” (21-23), 10. Un anno secolare (divisibile per 100) è
“Buono” (24-26), bisestile se è divisibile per 400, un anno non
“Alto” (27-29), secolare è bisestile se è divisibile per 4. Ad
“Massimo” (30) esempio l’anno 1900 non era bisestile, il 1996
“Impossibile” (tutti gli altri) era bisestile, il 2000 lo era, il 2002 non lo era.
Usare il costrutto if. Si scriva un programma che chieda all’utente
8. Come il precedente, utilizzare uno switch. di introdurre l’anno e indichi se è bisestile.