Sei sulla pagina 1di 30

INFORMATICA

INFORMATICA Strutture condizionali

Strutture condizionali

Strutture condizionali

Strutture condizionali • Sono le istruzioni che rappresentano il ben noto costrutto IF – THEN –

• Sono le istruzioni che rappresentano il ben noto costrutto IF – THEN – ELSE della programmazione strutturata.

• In C, come peraltro in tutti gli altri linguaggi, è disponibile in tre forme:

- if

(then)

- if

(then)

else

- switch

(in altri linguaggi noto come CASE)

L’istruzione if

L’istruzione if • Permette di eseguire una istruzione, semplice o composta , in modo condizionato. Sintassi:

• Permette di eseguire una istruzione, semplice o composta, in modo condizionato. Sintassi:

if (espressione) istruzione ;

espressione è di tipo logico (variabile o espressione logica o espressione relazionale con risultato logico) e deve essere sempre racchiusa tra parentesi tonde; istruzione può essere semplice o composta (nel qual caso va racchiusa tra parentesi graffe).

• Pertanto, più comunemente, la forma è:

if ( espressione )

{

istruzione semplice o composta ;

}

L’istruzione if

L’istruzione if • Il significato è: valuta espressione e, se il risultato è vero, esegui istruzione

• Il significato è: valuta espressione e, se il risultato è vero, esegui istruzione, altrimenti ignorala e prosegui con l'istruzione immediatamente successiva all’if .

• Il fatto che espressione debba fornire un risultato di tipo logico significa solo che deve fornire un risultato intero!

• Si ricordi che in C89 il tipo logico è simulato dal tipo intero.

• In definitiva dunque per espressione è accettabile qualsiasi cosa fornisca un risultato intero: sarà interpretata come falsa se il suo valore risulta 0, vera se il suo valore risulta diverso da 0.

L’istruzione if

L’istruzione if • Il fatto che la valutazione della condizione si riduca in definitiva a un

• Il fatto che la valutazione della condizione si riduca in definitiva a un test per vedere se vale 0 oppure un valore intero diverso da 0 comporta che, se a è una variabile dichiarata intera (int oppure long int), le seguenti istruzioni:

- if ( a != 0 ) {

- if ( a ) {

siano assolutamente equivalenti. Infatti qualsiasi valore di a diverso da 0 rende la condizione vera in entrambi i casi.

Istruzione if

Istruzione if • Questo costrutto realizza la struttura IF – THEN della programmazione strutturata: l'unica

• Questo costrutto realizza la struttura IF – THEN della programmazione strutturata: l'unica differenza è l'assenza della parola chiave THEN qui sottintesa.

• Diagramma di flusso:

I

V espressione
V
espressione

F

della parola chiave THEN qui sottintesa. • Diagramma di flusso: I V espressione F O istruzione

O

istruzione

istruzione

istruzione
istruzione
istruzione
istruzione
della parola chiave THEN qui sottintesa. • Diagramma di flusso: I V espressione F O istruzione

© Piero Demichelis

6

Istruzione if: esempio

Istruzione if: esempio • Realizzare un programma che richieda da tastiera due numeri interi e visualizzi

• Realizzare un programma che richieda da tastiera due numeri interi e visualizzi sul monitor il massimo dei due.

• Il problema si può risolvere con un semplice if:

- Legge da tastiera i due numeri chiamandoli x e y;

- Ipotizzo che x sia il più grande;

- Se y è più grande di x allora scambio tra loro i valori di x e y;

- Stampa il valore di x (che contiene sicuramente il valor massimo).

• Per scambiare tra loro i valori di x e y:

- salvo il valore di x in una variabile di appoggio

- copio y in x (x y); - copio provv in y (y
- copio y in x
(x
y);
- copio provv in y
(y

provv).

(provv

x in una variabile di appoggio - copio y in x (x y); - copio provv

x);

Istruzione if: esempio

Istruzione if: esempio #include <stdio.h> main() { float x, y, provv; printf (“\nIntroduci due numeri reali:

#include <stdio.h>

main()

{

float x, y, provv;

printf (“\nIntroduci due numeri reali: "); scanf ("%f%f", &x, &y); if (y > x)

{

 

provv = x;

x = y;

y = provv;

}

x) {   provv = x; x = y; y = provv; } /* scambia x

/* scambia x e y tra loro

*/

printf ("\nIl maggiore è %f il minore è %f", x, y);

}

Osservazioni su if

Osservazioni su if • Attenzione a scrivere un’istruzione di questo tipo: if ( a = 0

• Attenzione a scrivere un’istruzione di questo tipo:

if ( a = 0 ) {

dove quasi certamente si intendeva porre la condizione di

a uguale a zero.

• Purtroppo la sintassi per realizzare quell’espressione relazionale è sbagliata (si doveva scrivere a == 0) ma l’istruzione in se è formalmente corretta per cui il compilatore non genera errore (al più qualche compilatore segnala un warning).

Istruzione if

else

Istruzione if else • Consente di eseguire una istruzione (semplice o composta ) oppure un'altra istruzione

• Consente di eseguire una istruzione (semplice o composta) oppure un'altra istruzione (anch’essa semplice o composta) a seconda del verificarsi o meno di una certa condizione.

• Sintassi:

if (espressione) istruzione 1; else istruzione 2;

espressione è una variabile logica o una espressione con risultato logico racchiusa tra parentesi tonde;

istruzione 1 e istruzione 2 possono essere semplici o composte (ovvero un gruppo di istruzioni racchiuse tra parentesi graffe).

Istruzione if

else

Istruzione if else • Più comunemente nei programmi si usa la forma estesa e più leggibile

• Più comunemente nei programmi si usa la forma estesa e più leggibile dell’istruzione:

if (espressione)

{

istruzione semplice o composta 1 ;

}

else

{

istruzione semplice o composta 2 ;

}

Istruzione if

else

Istruzione if else • Significato: valuta espressione e, se il risultato è vero, esegui istruzione 1

• Significato: valuta espressione e, se il risultato è vero, esegui istruzione 1 e ignora istruzione 2 , altrimenti

ignora istruzione 1 ed esegui istruzione 2.

• Questo costrutto realizza la struttura IF - THEN – ELSE della programmazione strutturata: anche in questo caso se ne differenzia per l’assenza della parola chiave THEN qui sottintesa.

• Poiché non esistono limitazioni a istruzione, queste possono contenere qualsiasi costrutto, compresi altri if (si parla allora di if annidati ).

Istruzione if

else

Istruzione if else Diagramma di flusso: I V espressione F istruzione 1 istruzione 2 O ©

Diagramma di flusso:

I V espressione
I
V
espressione

F

Istruzione if else Diagramma di flusso: I V espressione F istruzione 1 istruzione 2 O ©
istruzione 1

istruzione 1

istruzione 1
istruzione 1
istruzione 1
istruzione 1
istruzione 2
istruzione 2
istruzione 2

istruzione 2

istruzione 2
istruzione 2

O

Istruzione if else Diagramma di flusso: I V espressione F istruzione 1 istruzione 2 O ©

Istruzione if

else: esempio 1

Istruzione if else: esempio 1 • Realizzare un programma che richieda da tastiera due numeri interi

• Realizzare un programma che richieda da tastiera due numeri interi e visualizzi sul monitor il massimo dei due.

• Il problema si risolve con un if il caso x = y):

else (non considerando

- Legge da tastiera i due numeri chiamandoli x e y;

- Se x è più grande di y allora visualizza x ; altrimenti visualizza y.

Istruzione if

else: esempio 1

Istruzione if else: esempio 1 #include <stdio.h> main() { float x, y; printf (“\nIntroduci due numeri

#include <stdio.h>

main()

{

float x, y;

printf (“\nIntroduci due numeri reali: "); scanf ("%f%f", &x, &y); if (x > y) printf (“\nIl maggiore è: %f ”, x); else printf (“\nIl maggiore è: %f ”, y);

}

Istruzione if

else: esempio 2

Istruzione if else: esempio 2 • Realizzare un programma che calcoli quoziente e resto di due

• Realizzare un programma che calcoli quoziente e resto di due numeri interi positivi letti da tastiera e segnali errore se uno dei due è negativo (attenzione alla divisione per zero!).

• Pseudocodice:

- Legge i due numeri da tastiera e li chiama n1 e n2;

- Se n1 e n2 sono entrambi positivi e n2 è diverso da 0:

calcola il quoziente ( n1 / n2);

calcola il resto (n1 % n2);

visualizza quoziente e resto;

altrimenti

visualizza messaggio d’errore.

Istruzione if

else: esempio 2

Istruzione if else: esempio 2 #include <stdio.h> main() { int n1, n2, quoz, resto; printf ("\nIntrodurre

#include <stdio.h>

main()

{

int n1, n2, quoz, resto;

printf ("\nIntrodurre due numeri interi:

scanf ("%d%d", &n1, &n2);

if ((n1 >= 0)

&& (n2 > 0))

");

{

 

quoz = n1 / n2; resto = n1 % n2;

/*

oppure resto = n1 - (quoz * n2);

*/

printf (“\nQuoziente=

%d, resto=

%d\n", quoz, resto);

}

else

printf (“\nErrore nei dati");

}

Istruzione if

else: esempio 3

Istruzione if else: esempio 3 • Leggere due valori A e B, e calcolarne la differenza

• Leggere due valori A e B, e calcolarne la differenza in valore assoluto :

• Soluzione

#include <stdio.h> main()

D = |A-B|

{

 

int a, b, differenza;

printf (“\nIntroduci i 2 valori (a e b): “); scanf (“%d%d”, &a, &b); if (a >= b) differenza = a - b;

else

differenza = b - a; printf (“\nValore assoluto: %d”, differenza);

}

Istruzione if

else: osservazioni

Istruzione if else: osservazioni • L'istruzione che precede l' else deve essere chiusa normalmente con il

• L'istruzione che precede l'else deve essere chiusa

normalmente con il punto e virgola. L'else infatti fa parte

della struttura if

sintattica dell'istruzione che la precede, la quale deve avere quindi una chiusura regolare.

else e non entra in gioco nell'analisi

• Negli if annidati possono sorgere delle ambiguità. Ad esempio nel costrutto:

if (espressione 1) if (espressione 2) istruzione 1; else istruzione 2;

non è chiaro se l'else appartiene all'if più interno o più esterno.

• L'uso delle parentesi { e } può dirimere qualsiasi dubbio.

Istruzione if

else: osservazioni

Istruzione if else: osservazioni • La precedente istruzione può essere riscritta come: if (espressione 1) {

• La precedente istruzione può essere riscritta come:

if (espressione 1)

{

if (espressione 2)

istruzione 1;

else

istruzione 2;

}

• oppure:

if (espressione 1)

{

if (espressione 2) istruzione 1;

}

else istruzione 2;

else appartenente all’if interno

else appartenente all’if esterno

© Piero Demichelis

20

Istruzione if

else: osservazioni

Istruzione if else: osservazioni • Non conviene usare if annidati su troppi livelli: si introducono difficoltà

• Non conviene usare if annidati su troppi livelli: si introducono difficoltà in fase di test (debugging) e rallentamenti nell'esecuzione del programma.

• Inoltre sono da evitare istruzioni del tipo:

if (dato1 == dato2) flag = VERO; else flag = FALSO;

che possono essere sostituite più elegantemente dalle assegnazioni:

flag = (dato 1 == dato2);

Esempio: equazione di II grado

Esempio: equazione di II grado • L’applicazione classica della struttura if else è la soluzione completa

• L’applicazione classica della struttura if

else è la

soluzione completa dell’equazione di II grado.

• La soluzione è fornita da un costrutto if sono annidati altre strutture di tipo if risolvono i vari rami secondari.

else nel quale else e if che

• La soluzione deve tener conto di tutti i possibili casi che possono determinarsi nella soluzione (equazione impossibile, indeterminata, di I grado, ecc.).

Equazione di II grado

Equazione di II grado Legge i coefficienti a , b e c a = 0? si

Legge i coefficienti a, b e c

a = 0?

si b = 0?
si
b = 0?
no
no
no
no

delta = b*b – 4*a*c w = 2*a w1= -(b / w)

si b = 0? no no delta = b*b – 4*a*c w = 2*a w1= -(b

si

b = 0? no no delta = b*b – 4*a*c w = 2*a w1= -(b /

c = 0?

Equazione di I grado:

x= -(c / b)

si Equazione
si
Equazione
no
no

delta = 0?

no | delta| / w
no
| delta|
/ w

delta < 0?

si
si

Equazione

impossibile

indeterminata

Radice doppia x = w1

w 2 =

no
no

Radice reali:

x 1 = w 1 + w 2

x 2 = w 1 - w 2

si
si

Radice complesse coniugate: x = w 1

j w 2

Istruzione switch

Istruzione switch • Quando la condizione da imporre non è intrinsecamente binaria ma si deve distinguere

• Quando la condizione da imporre non è intrinsecamente binaria ma si deve distinguere tra più casi ed eseguire le istruzioni approppriate per ogni singolo caso, l‘if annidato può non essere più conveniente per complessità, leggibilità e, qualche volta, anche per tempo di esecuzione (valutazione di n condizioni).

• Per questi casi c‘è l'istruzione switch.

Istruzione switch

Istruzione switch Diagramma di flusso: I caso 1 caso n espressione caso 2 caso 3 istr.
Diagramma di flusso: I caso 1 caso n espressione caso 2 caso 3 istr. 1
Diagramma di flusso:
I
caso 1
caso n
espressione
caso 2
caso 3
istr. 1
istr. 2
istr. 3
istr. n
O

Istruzione switch

Istruzione switch • Sintassi: switch ( espressione ) { case <costante 1>: <istruzione 1> break;

• Sintassi:

switch (espressione)

{

case <costante 1>:

<istruzione 1>

break;

case <costante 2>:

<istruzione 2>

break;

[ default:

< istruzione default> ]

}

Istruzione switch

Istruzione switch - espressione : espressione a valore numerico di tipo int o char , ma

- espressione : espressione a valore numerico di tipo int o char, ma non float o double.

- <costante1>, <costante1>,

dell'espressione

sono costanti dello stesso tipo

- <istruzione 1>, <istruzione 2>,

(senza graffe!)

sono sequenze di istruzioni

• Significato:

- In base al valore di espressione, esegui le istruzioni del case corrispondente.

- Nel caso nessun case venga intercettato, esegui le istruzioni corrispondenti al caso default (se esiste).

Istruzione switch: osservazioni

Istruzione switch: osservazioni • I vari case devono rappresentare condizioni MUTUAMENTE ESCLUSIVE! • I vari case

• I vari case devono rappresentare condizioni

MUTUAMENTE ESCLUSIVE!

• I vari case vengono eseguiti in sequenza, uno dopo l’altro: per evitarlo è necessario interrompere il flusso usando l’istruzione break alla fine di ogni blocco di istruzioni (il flusso prosegue con la prima istruzione successiva alla switch).

• Se il blocco di default non è presente e nessun case viene soddisfatto, l’esecuzione procede con la prima istruzione che segue la switch.

Istruzione switch: esempio

Istruzione switch: esempio main() { int x; printf (“\nIntroduci un numero intero: “); scanf (“%d”,

main()

{

int x; printf (“\nIntroduci un numero intero: “); scanf (“%d”, &x); switch (x) { case 1:

printf(“\nHai introdotto 1“); break; case 2:

printf(“\nHai introdotto 2“); break; default:

printf(“\nHai introdotto un numero diverso da 1 e 2“);

}

}

Osservazioni su switch

Osservazioni su switch • I case possono essere indicati nell’ordine che si desidera e non in

• I case possono essere indicati nell’ordine che si desidera e non in ordine strettamente crescente o decrescente.

main() int x; printf (“\nIntroduci un numero intero: “); scanf (“%d”, &x); switch (x) { case 92:

{

printf(“\nHai introdotto 92“); break; case -14:

printf(“\nHai introdotto -14“); break; case 36:

printf(“\nHai introdotto 36“); }

}