Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... ·...

36
Capitolo IV La struttura dei Programmi

Transcript of Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... ·...

Page 1: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Capitolo IV

La struttura dei Programmi

Page 2: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Costrutti condizionali

• consentono di subordinare l'esecuzione di una certa operazione al verificarsi o meno di una specificata condizione

Page 3: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Costrutti condizionali

• Selezione tra più alternative

Page 4: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Costrutti condizionali

• I costrutti di selezione consentono di esprimere l’esecuzione condizionale di una o più istruzioni (semplici o strutturate)

• Esistono tre diverse istruzioni di selezione:– if … then …;

– if … then … else;

– case … of;

Page 5: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Costrutti condizionali

• Le Istruzioni di selezione sono caratterizzate dalla presenza di una condizione di selezione:

– La condizione di selezione è di tipo booleano per i costrutti if … then e if … then … else;

– Per il costrutto case … of la condizione di selezione è funzione del valore assunto da un’espressione solitamente intera.

Page 6: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Predicati ed Operatori Booleani

• Gli operatori relazionali in C:

>, >=, <, <=, ==, !=

• Gli operatori logici in C:

!, &&, ||

• In C i predicati composti vengono valutati da sinistra verso destra, la valutazione si blocca non appena si determina la verità o la falsità dell’intera espressione

Page 7: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

IF…THEN…

• Consente di esprimere l’esecuzione condizionata di una sola istruzione (semplice o strutturata)

• Si presenta nella forma: if espressione then istruzione

• La sua semantica è: se espressione è vera esegui l’istruzione istruzione altrimenti esegui l’istruzione immediatamente successiva alla if then nel flusso di esecuzione

R

Ist.

VF

Page 8: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

IF… THEN…• La sintassi C non prevede la parola chiave then

nell’espressione del costrutto if … then …

if (condizione){istruzione_1;istruzione_2;…………………………..istruzione_n;

}

• In C una espressione è vera se restituisce un valore != da 0, questa proprietà consente di adottare tecniche di codifica estremamente compatte:

if (espressione != 0) if (espressione)

Page 9: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

IF … THEN … ELSE …

• Consente di esprimere l’esecuzione condizionale di una tra due possibili istruzioni (semplici o strutturate)

• Si presenta nella forma:

if (espressione) then istruzione_1 else istruzione_2

• La sua semantica è: se espressione è vera esegui istruzione_1altrimenti esegui istruzione_2 quindi esegui l’istruzione immediatamente successiva il costrutto if then else

R

ist_1ist_2

VF

Page 10: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

IF … THEN … ELSE

• La sintassi C non prevede la parola chiave then nell’espressione del costrutto if …

then … else:if (espressione) {

istruzione_t1;………………………………istruzione_tn;

} else {istruzione_e1;…………………………….istruzione_en;

}

Page 11: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

IF … THEN … ELSE …

• In C esiste una versione “estesa” del costrutto if then else, l’istruzione else if, che consente di realizzare in maniera estremamente compatta selezioni di plurime:

if (espressione-1)istruzione_1;

else if (espressione-2)istruzione_2;

………………………else

istruzione_n;

• Le espressioni condizionali del costrutto else if vengono valutate nell’ordine in cui si presentano

• Se una di esse risulta vera l’istruzione ad essa associata viene eseguita e la catena viene terminata;

• l’ultimo else gestisce la condizione “nessuna delle precedenti”

Page 12: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Esempi

• Esempio 1:if ( a == b ) {

x = 0;y = 1;

}elsex = 1;

y = 0;

• Esempio 2:if ( a == b ) {

x = 0;y = 1;

}else {x = 1;y = 0;

}

Page 13: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

CASE … OF• Consente di esprimere la selezione tra n>2 istruzioni

• Si presenta nella forma:case ev1: istruzione_1v2: istruzione_2…………………vn: istruzione_ndefault: istruzione

end

• La sua semantica è: se e è uguale a v1 esegui istruzione_1; altrimenti se e è uguale a v2 esegui a istruzione_2;……;altrimenti se e è uguale a vn esegui istruzione_n; se nessuna delle relazioni precedenti è verificata allora esegui istruzione

Page 14: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

CASE … OF

• In C il costrutto case of è implementato per mezzo dell’istruzione switch

• Esempio:switch (espressione){case espr-cost1: istruzione_1case espr-cost2: istruzione_2…………………………………………………………………………default: istruzione

}

• Ogni caso di esecuzione è etichettato da un insieme di costanti intere o di espressioni costanti

• Poiché i casi servono solo come etichette, l’esecuzione delle istruzioni associate ad uno di essi è seguita dall’esecuzione sequenziale dei casi successivi

• Nel caso si voglia evitare questa esecuzione sequenziale è necessario inserire un’istruzione esplicita di uscita break

Page 15: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Esempi

• Esempio 1:switch (c) {

case „0‟: case „1‟:a = 1;break;

case „2‟:a = 2;break;

}

• Esempio 2:switch (c) {

case „0‟: case „1‟:a = 1;

case „2‟:a = 2;

}

Page 16: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Costrutti Iterativi

• prescrivono di ripetere l'esecuzione di una o più operazioni; tale ripetizione viene sospesa al verificarsi di un evento

Page 17: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

I costrutti iterativi - 1

• I costrutti di iterazione consentono di realizzare cicli di elaborazione

• I costrutti di iterazione sono caratterizzati da una relazione R di terminazione che controlla la fine del ciclo

• Esistono tre diversi costrutti iterativi:– while do

– repeat until

– for

Page 18: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

I costrutti iterativi - 2While do

• E’ un costrutto iterativo a condizione iniziale

• Si presenta nella forma:

while condizione do

istruzione

• Implica l’esecuzione di istruzione zero o più volte

• L’istruzione interna la ciclo può essere semplice o strutturata

• L’esecuzione ha luogo quando condizione è vera termina quando condizione è falsa

cond

ist

f

v

Page 19: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

I costrutti iterativi - 3While do

• La sintassi del ciclo while do in C è:while (espressione)

istruzione

• Esempi:– while (i <= n) i = i+1;

– while ( a != -1) {

cout << “a = “ << a <<“\n”;

cout << “Inserisci un numero: “;

cin >> b;

a = a –b;

}

Page 20: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

I costrutti iterativi - 4Repeat Until

• E’ un costrutto iterativo a condizione finale

• Si presenta nella forma:repeat

istruzione

until condizione

• Implica l’esecuzione di istruzione una o più volte

• L’istruzione interna la ciclo può essere semplice o strutturata

• L’esecuzione ha luogo quando condizione è falsa e termina quando condizione è vera

cond

ist

f v

Page 21: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

I costrutti iterativi - 5Repeat Until

• La sintassi del ciclo repeat until in C è:do

istruzionewhile (condizione);

• In C il senso del test è invertito rispetto alla definizione formale del costrutto repeat until: l’istruzione istruzione viene ripetuta se condizione e vera; il ciclo ha termine quando condizione diviene falsa

• Esempio:do {cout << “a = “ << a <<“\n”;cout << “Inserisci un numero: “;cin >> b;a = a –b;

} while (a != -1);

Page 22: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

I costrutti iterativi - 6For

• Il ciclo for è un ciclo a conteggio, può essere usato quando è noto in anticipo il numero di iterazioni da compiere

• Il ciclo for è caratterizzato da una variabile di conteggio che assume una progressione di valori opportunamente definita

• Il ciclo for si presenta nella forma:for i = vi to vf do

istruzione

– vi è il valore iniziale assunto dalla variabile di conteggio i

– vf è il valore finale assunto dalla variabile di conteggio i

Page 23: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

I costrutti iterativi - 7For

• La sintassi C del costrutto for è:for (espr_1; espr_2; espr_3)

istruzione

• Le tre espressioni del ciclo for possono essere di qualsiasi tipo

• In generale espr_1 e espr_3 sono degli assegnamenti o delle chiamate a funzione, mentre espr_2 è una espressione relazionale (condizione di terminazione)– nel caso si tralasci espr_2 sarà necessario forzare l’uscita dal ciclo

Page 24: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

I costrutti iterativi - 8

For

• Esempio:int i;float a;for (i = 0; i<=9; i++) {cout << “Inserisci un valore: “;cin >> a;cout << a << “^2 = “<< a*a <<endl;

}

• Esempio:for (i = 0; (i <= 9) && (a != -1); i++) {cout << “a = “ << a <<“\n”;cout << “Inserisci un numero: “;cin >> b;a = a –b;

}

Page 25: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

I costrutti iterativi - 9

• Talvolta può essere utile uscire da un ciclo senza controllare, all’inizio o alla fine del dell’iterazione, la condizione di terminazione (in contrasto con i principi alla base della programmazione strutturata !)

• In C può essere usata allo scopo l’istruzione break, già introdotta nel descrivere il costrutto switch, che consente l’uscita incondizionata da un ciclo for, while o do

• Nel caso l’istruzione break sia utilizzata in una struttura innestata di cicli essa provoca l’uscita dal ciclo più interno che la contiene

Page 26: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

I costrutti iterativi - 10• I C esiste una ulteriore istruzione in grado di modificare il

flusso di un ciclo: l’istruzione continue

• L’istruzione continue forza l’inizio dell’iterazione successiva di un for, di un while o di un do

• Esempi:

for (i = 0; i <= n; i++) {

cin >> a;

if (a < 0) break;

……

}

for (i = 0; i <= n; i++) {

cin >> a;

if (a < 0) continue;

……

}

Page 27: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Equivalenza ed Equivalenza Funzionale

• Si dicono equivalenti due programmi che evocano le stesse sequenze di esecuzione.

• Sono invece funzionalmente equivalenti due programmi che, sollecitati nello stesso modo, producono lo stesso risultato. – Si noti che due programmi equivalenti sono anche

funzionalmente equivalenti, mentre non è vero, in generale, che due programmi funzionalmente equivalenti sono anche equivalenti

• L'equivalenza funzionale è utile per comprendere le differenze tra le varie strutture di controllo e per giustificare da un punto di vista pratico la necessità di costrutti simili.

Page 28: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Esempio di Equivalenza Funzionale

• I due programmi producono lo stesso risultato se le due variabili sono positive– il prodotto di x per y

• I due programmi producono risultati diversi negli altri casi – la somma e la divisione se sono entrambe negative, la somma o il prodotto e il prodotto e il

rapporto se il loro segno è discorde

• L'equivalenza funzionale si riferisce così ad un ben preciso insieme di valori di ingresso – nel caso delle variabili x e y entrambe positive i due programmi sono funzionalmente

equivalenti, mentre non lo sono negli altri casi

Page 29: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Costrutti di selezione Funzionalmente Equivalenti

• è sempre possibile ricondurre un costrutto

if-then-else ad una sequenza di soli if-then

if (condizione)

then azione 1

else azione 2;

if (condizione)

then azione 1;

if (not condizione)

then azione 2

Sono anche equivalenti?Perché no?

Page 30: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Strutture funzionalmente equivalenti al CASE

• La struttura case, che prescrive la valutazione di una espressione (anche detta selettore) e la scelta dell'azione a cui è stato associato il valore ottenuto da tale valutazione, può essere ricondotta ad un insieme di if disposti l'uno dentro l'altro

case (espressione) of

a :

azione 1;

b :

azione 2;

c :

azione 3

end;

if (espressione=a)

then azione 1

else

if (espressione=b)

then azione 2

else

if (espressione=c)

then azione 3;

Page 31: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

CASE (2)

• non vale il passaggio inverso: ossia non è detto che una struttura di if-then-else nidificati (inseriti uno dentro l'altro) è esprimibile con un case

if (espressione 1)

then azione 1

else

if (espressione 2)

then azione 2

else

if (espressione 3)

then azione 3;

Page 32: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

While e Repeat

• E’ sempre possibile ricondurre l'una all'altra. – While:

• prima viene valutata la condizione e dopo c’è l'esecuzione delle azioni qualora il valore ottenuto sia vero. Il ciclo termina quando la condizione diventa falsa.

• il ciclo non avviene se la condizione è falsa la prima volta che è calcolata.

– Repeat• Prima c’è l'esecuzione delle azioni e, dopo, la valutazione della

condizione • Le azioni vengono eseguite almeno una volta. • La ripetizione delle azioni termina quando la condizione diventa vera.

• Si noti che, in entrambi casi, quando il ciclo ha avuto inizio, si deve far in modo che le azioni eseguite ad ogni ripetizione alterino le variabili presenti nella condizione se si vuole che il ciclo termini.

Page 33: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

While e repeat (2)

Page 34: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

For

• la struttura ciclica è riconducibile ad una iterativa, e di conseguenza anche all'altra.– un ciclo iterativo prescrive la ripetizione di azioni un numero di volte fissato a

priori e determinato dal fatto che una variabile detta contatore di ciclo, a partire da un valore iniziale raggiunge un valore finale o per valori crescenti (indicato dal to) o decrescenti (indicato dal downto).

Page 35: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Regole di trasformazione dei

costrutti iterativi

• do whiledo

istruzione;

while (condizione);

• forfor (i = 0; i <= n;

i++) {

istruzione;

}

• whileistruzione;

while (condizione)

istruzione;

• whilei = 0;

while (i <= n) {

istruzione;

i++;

}

Page 36: Capitolo IV - wpage.unina.itwpage.unina.it/roberta.presta/EI/EI_2013_L10,L11_STRUTTURA_DEI... · sinistra verso destra, la valutazione si blocca non ... ontrollare, all’inizio o

Regole di trasformazione dei

costrutti iterativi

• whilewhile (condizione){

istruzione;

}

• forfor (i = 0; i <= n;

i++) {

istruzione;

}

• do whileif (condizione)

do {

istruzione;

} while (condizione);

• do whilei = 0;

do

istruzione;

i++;

}while (i < n);