Sei sulla pagina 1di 9

2

Esecuzione condizionale

Esecuzione condizionale
Ver. 2.4

Permette lesecuzione di un blocco di codice solo se si verifica una certa condizione SE (condizione vera) ALLORA esegui istruzioni
Falso
condizione

Vero

istruzioni Ramo else


2010 - Claudio Fornaro - Corso di programmazione in C

Ramo then

Costrutto if

Costrutto if

Sintassi (minimale): if (condizione) blocco istruzioni Parentesi necessarie prima e dopo condizione Non richiede il ; alla fine Il blocco istruzioni racchiuso da parentesi graffe, queste sono opzionali se composto da una sola istruzione (si indenti/rientri il codice del blocco) Come dopo tutte le parole chiave, dopo if generalmente si preferisce mettere uno spazio

Esempio Programma che chiede un numero e se positivo scrive positivo altrimenti nulla. scanf("%d", &n); if (n > 0) { printf("positivo\n"); F V } n>0 Le parentesi graffe sono opzionali in quanto il positivo blocco condizionato composto dalla sola printf

Costrutto if

Costrutto if-else

Esempio Programma che chiede un numero e se positivo scrive positivo altrimenti nulla, prima di uscire deve sempre scrivere FINE. scanf("%d", &n); if (n > 0) printf("positivo\n"); F V n>0 printf("FINE\n"); La seconda printf positivo non dentro il blocco e quindi viene eseguita FINE comunque

Per indicare il blocco da eseguire nel caso la condizione NON sia vera si usa la clausola else ( altrimenti), non richiede il ; alla fine Esempio Programma che chiede un numero, se positivo scrive positivo altrimenti non positivo scanf("%d", &n); if (n > 0) printf("positivo\n"); else printf("non positivo\n"); printf("FINE\n");
Nota: lultima printf non dentro il blocco e quindi viene eseguita sempre

Costrutto if-else

Selezione a pi rami

Il flow-chart corrispondente :
Falso Vero

n>0

non positivo FINE

positivo

richiesta quando si hanno pi di due casi che necessitano di elaborazioni diverse Esempio Programma che chiede un numero, se positivo scrive positivo, se negativo negativo, se zero nullo Soluzione 1 Si possono avere pi costrutti if completi in sequenza, ossia uno di seguito allaltro

10

Selezione a pi rami

Selezione a pi rami

Soluzione 1 - codice scanf("%d", &n); if (n > 0) printf("positivo\n"); if (n < 0) printf("negativo\n"); if (n == 0) printf("nullo\n"); printf("FINE\n");

n>0

positivo
F

n<0

Soluzione 2 Si utilizzano pi costrutti if annidati, ossia uno completamente dentro un ramo dellaltro (in questo esempio il blocco del ramo else contiene un altro costrutto if completo)

negativo
F

Efficiente perch le condizioni NON vengono valutate TUTTE

n=0

Inefficiente perch le condizioni vengono SEMPRE valutate TUTTE, anche quando non necessario (in questo esempio quando n > 0)

nullo FINE

11

12

Selezione a pi rami

Selezione a pi rami

Soluzione 2 Flow-chart
F
F

n>0

n<0

nullo

negativo

positivo

Soluzione 2 codice (1a forma) scanf("%d", &n); if (n > 0) printf("positivo\n"); else if (n < 0) printf("negativo\n"); else printf("nullo\n");

Costrutto if interno

FINE

printf("FINE\n"); Quando n > 0 non valuta laltro controllo

13

14

Selezione a pi rami

Corrispondenza dellelse

Soluzione 2 codice (2a forma, compatta) scanf("%d", &n); if (n > 0) printf("positivo\n"); else if (n < 0) printf("negativo\n"); else printf("nullo\n"); printf("FINE\n"); Nota: le keyword sono allineate, i blocchi sono allineati. Forma PREFERIBILE

Ogni else si riferisce sempre allultimo if Se necessaria una corrispondenza diversa, si usino le graffe per isolare il blocco interno: if (condizione1) { if (condizione2) blocco_then_IF2; } else blocco_else_IF1; Senza le graffe precedenti, lelse sarebbe associato allif interno e costituirebbe il blocco_else_IF2

15

16

Espressioni relazionali

Espressioni relazionali

Confrontano due valori I valori possono essere espressioni Se il risultato vero danno risultato 1 (non un generico valore diverso da 0), se falso danno 0 Operatori:
== != < <= > >= uguale diverso minore minore o uguale maggiore maggiore o uguale

Hanno priorit inferiore alle operazioni aritmetiche if (a-5 >= 12*x) ... prima calcola le espressioni a-5 e 12*x poi ne fa il confronto Hanno priorit maggiore degli operatori di assegnamento int x; x = 5 > 2; prima fa il confronto tra 5 e 2 poi ne assegna il risultato (1) a x

17

18

Valori logici

Operatori logici

Il valore 0 equivale a falso Ogni valore 0 equivale a vero Quindi nelle espressioni relazionali scrivere !=0 opzionale: if (trovato) ... equivale a if (trovato != 0) ... Conviene indicare il !=0 quando questo facilita la comprensione del programma (ci pensa eventualmente il compilatore a rimuoverlo per migliorare lefficienza)

Combinano valori logici (variabili o risultati di espressioni relazionali) Producono risultato 1 (non un generico valore diverso da 0) se il risultato vero, 0 se falso Operatori (in ordine di priorit decrescente):
! && || NOT, ha priorit superiore agli operatori relazionali e aritmetici if ( !(a>b) ) ... AND, ha priorit inferiore agli operatori relazionali e aritmetici if ( a>b && c!=0 ) ... OR, ha priorit inferiore agli operatori relazionali e aritmetici if ( a>b || c!=0 ) ...

19

20

Espressioni logiche

Valutazione minima di && e ||


Si possono usare le parentesi per cambiare lordine di valutazione delle operazioni Esempi

if ( a>b || c<d && a!=0 ) ... equivale a: if ( a>b || (c<d && a!=0) ) ... if (trovato == 0) ... equivale a: if ( !(trovato != 0) ) ... e quindi, essendo il !=0 sopprimibile, a: if (!trovato) ...

Gli operatori && e || vengono valutati sempre da sinistra a destra La valutazione delle espressioni termina non appena possibile stabilire se la condizione complessivamente vera o falsa:

Attenzione: errato scrivere una condizione come a < b < c, occorre spezzarla come a<b && b<c

if (cond1 && cond2 && cond3 && ...) ... Se cond1 falsa (0), non si valutano le condx successive e complessivamente la condizione d 0 (falso) if (cond1 || cond2 || cond3 || ...) ... Se cond1 vera (!=0), non si valutano le condx successive e complessivamente la condizione d 1 (vero)

21

22

Valutazione minima di && e ||

Selezione multipla

Questo comportamento utile per evitare che le condizioni successive vengano valutate (ed eseguite) quando le precedenti ad esse non sono soddisfatte, ad esempio nella seguente if (delta>=0 && sqrt(delta)>10) se delta<0 la seconda condizione non viene calcolata (darebbe errore) Gli operatori && e || inseriscono un sequence point tra le espressioni che collegano Quindi gli effetti collaterali degli operatori ++ e vengono portati a termine prima della valutazione della condizione successiva

Per seguire diversi (pi di 2) rami alternativi a seconda del risultato di ununica espressione si pu sempre utilizzare una serie di costrutti if annidati (o in cascata) Ma se i risultati dellespressione che indirizzano verso rami diversi sono valori costanti noti a priori, si pu utilizzare anche utilizzare il pi efficiente costrutto switch

23

24

Selezione multipla

Selezione multipla

Sintassi switch (espressione) { case risultato1: blocco1 case risultato2: blocco2 ... default: bloccodefault }

Funzionamento Viene calcolata lespressione e quindi il valore risultante cercato tra i vari risultatox, quindi:

se viene trovato un risultatox uguale al risultato dell espressione: il bloccox corrispondente viene eseguito altrimenti, se esiste il bloccodefault: questo viene eseguito altrimenti nessun blocco viene eseguito

25

26

Selezione multipla

Selezione multipla

Le varie parti sono le seguenti:

espressione un espressione che produce un risultato di tipo intero (char, short, int, long) risultatox sono valori interi costanti (numeri, #define, enum, non valori const) bloccox sono blocchi di codice (le parentesi graffe per i blocchi sono opzionali e in genere sono omesse)

Lordine in cui sono elencati i vari risultatox ininfluente, sia dal punto di vista dellesecuzione, sia da quello della performance (ossia i risultatox indicati allinizio dello switch non detto siano valutati prima dei successivi in elenco: indifinito) 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, vengono eseguiti in cascata (fall-through) anche tutti i blocchi successivi Esempio (scorretto) switch (cifra) { case 0: Cont0++; Se ad esempio cifra case 1: contiene il valore 1, Cont1++; case 2: vengono incrementati Cont2++; TUTTI i contatori, ... incluso Altro ed default: escluso Cont0 Altro++; }

Per eseguire il solo blocco corrispondente allespressione e poi uscire dallo switch si utilizza listruzione break collocata come ultima istruzione di ciascun blocco E buona norma aggiungere listruzione break anche nellultimo blocco, in modo che se si aggiungono successivamente altri rami questi siano gi terminati correttamente

Dopo aver visto i cicli:

Listruzione break in un blocco switch collocato dentro un ciclo, fa uscire soltanto dallo switch e NON anche dal ciclo

29

30

Selezione multipla

Selezione multipla

Esempio (corretto) switch (cifra) { case 0: Cont0++; break; case 1: Cont1++; break; case 2: Cont2++; break; ... default: Altro++; break; }

Lesecuzione in cascata indispensabile per associare pi risultatox allo stesso bloccox switch (cifra) { case 0: blocco vuoto senza break case 1: blocco vuoto senza break case 2: blocco vuoto senza break case 3: Cifre03++; break; default: Cifre49++; break; }

31

32

Esercizi
1.

Esercizi
5.

2.

3.

4.

Scrivere un programma che chieda due numeri da tastiera e dei due visualizzi il maggiore (es. se vengono inseriti 12 e 27 visualizza 27). Scrivere un programma che chieda un numero da tastiera e stampi sul video se pari o dispari (consiglio: calcolare il resto). Scrivere un programma che chieda tre numeri da tastiera e dei tre stampi il maggiore. Scrivere un programma che chieda tre numeri da tastiera e li stampi in ordine decrescente.

6.

Si vogliono dividere gli allievi di un corso in tre squadre denominate ROSSA, VERDE e BLU secondo il loro numero di matricola. Lassegnazione avviene con il seguente criterio: lallievo con matricola 1 va nella squadra ROSSA, quello con matricola 2 nella VERDE, quello con matricola 3 nella BLU, quello con matricola 4 nella ROSSA, quello con 5 nella VERDE ecc. Il programma deve chiedere il numero di matricola dellallievo e indicare a quale squadra assegnato. Usare il costrutto if. Come il precedente, utilizzare uno switch.

33

34

Esercizi
7.

Esercizi
Si scriva un programma che chieda i tre coefficienti a, b e c di unequazione di secondo grado e calcoli i valori delle soluzioni se questi sono reali; nel caso non lo siano deve semplicemente scrivere a video Valori non reali. 10. Un anno secolare (divisibile per 100) bisestile se divisibile per 400, un anno non secolare bisestile se divisibile per 4. Ad esempio lanno 1900 non era bisestile, il 1996 era bisestile, il 2000 lo era, il 2002 non lo era. Si scriva un programma che chieda allutente di introdurre lanno e indichi se bisestile.
9.

8.

Scrivere un programma che chieda da tastiera di introdurre un numero intero corrispondente ad un voto e stampi a video Insufficiente se inferiore a 18, Appena sufficiente (18), Basso (19-20), Medio (21-23), Buono (24-26), Alto (27-29), Massimo (30) Impossibile (tutti gli altri) Usare il costrutto if. Come il precedente, utilizzare uno switch.

Potrebbero piacerti anche

  • 24 Ricorsione
    24 Ricorsione
    Documento28 pagine
    24 Ricorsione
    openid_9xLqqfRO
    Nessuna valutazione finora
  • Puntatori - PoliTo
    Puntatori - PoliTo
    Documento14 pagine
    Puntatori - PoliTo
    Flavia Isernia
    Nessuna valutazione finora
  • 26 Adt
    26 Adt
    Documento8 pagine
    26 Adt
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 25 AlberiBin
    25 AlberiBin
    Documento5 pagine
    25 AlberiBin
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 11 File
    11 File
    Documento17 pagine
    11 File
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 17 Macro
    17 Macro
    Documento6 pagine
    17 Macro
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 21 LongJmp
    21 LongJmp
    Documento3 pagine
    21 LongJmp
    Riccardo Ricci
    Nessuna valutazione finora
  • 23 Liste
    23 Liste
    Documento10 pagine
    23 Liste
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 22 VarArgs
    22 VarArgs
    Documento3 pagine
    22 VarArgs
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 16 FileRandom
    16 FileRandom
    Documento5 pagine
    16 FileRandom
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 19 FunctPoint
    19 FunctPoint
    Documento7 pagine
    19 FunctPoint
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 10 Complementi 1
    10 Complementi 1
    Documento10 pagine
    10 Complementi 1
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 20 Complementi 2
    20 Complementi 2
    Documento6 pagine
    20 Complementi 2
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 18 DynAlloc
    18 DynAlloc
    Documento8 pagine
    18 DynAlloc
    Riccardo Ricci
    Nessuna valutazione finora
  • 15 Struct
    15 Struct
    Documento10 pagine
    15 Struct
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 14 Funzioni
    14 Funzioni
    Documento21 pagine
    14 Funzioni
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 05 Espressioni
    05 Espressioni
    Documento10 pagine
    05 Espressioni
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 09 Stringhe
    09 Stringhe
    Documento14 pagine
    09 Stringhe
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 07 Cicli
    07 Cicli
    Documento12 pagine
    07 Cicli
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 04 IOnumeri
    04 IOnumeri
    Documento7 pagine
    04 IOnumeri
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 12-Algoritmi Ordinamento
    12-Algoritmi Ordinamento
    Documento9 pagine
    12-Algoritmi Ordinamento
    Francesco Cds Caruso
    Nessuna valutazione finora
  • 08 VettMat
    08 VettMat
    Documento9 pagine
    08 VettMat
    Alessio Barile
    Nessuna valutazione finora
  • 03 Tipi
    03 Tipi
    Documento8 pagine
    03 Tipi
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 02 LinguaggioC
    02 LinguaggioC
    Documento3 pagine
    02 LinguaggioC
    openid_9xLqqfRO
    Nessuna valutazione finora
  • 01 PrimoEsper
    01 PrimoEsper
    Documento9 pagine
    01 PrimoEsper
    Riccardo Ricci
    Nessuna valutazione finora
  • 00 Programmazione
    00 Programmazione
    Documento6 pagine
    00 Programmazione
    Alessio Barile
    Nessuna valutazione finora
  • Seconda Prova - PNI (Matematica) 2009
    Seconda Prova - PNI (Matematica) 2009
    Documento2 pagine
    Seconda Prova - PNI (Matematica) 2009
    pacbard
    Nessuna valutazione finora
  • Pendolo Molla e Onde
    Pendolo Molla e Onde
    Documento2 pagine
    Pendolo Molla e Onde
    openid_9xLqqfRO
    Nessuna valutazione finora
  • Olimpiadi Berlino
    Olimpiadi Berlino
    Documento3 pagine
    Olimpiadi Berlino
    openid_9xLqqfRO
    Nessuna valutazione finora