• Non ci sono risultati.

Riepilogo strutture di controllo

N/A
N/A
Protected

Academic year: 2021

Condividi "Riepilogo strutture di controllo "

Copied!
9
0
0

Testo completo

(1)

Elementi di Informatica Prof. G.A. Di Lucca - Univ. del Sannio

1

Riepilogo strutture di controllo

Teorema di Bohm e Jacopini

Qualsiasi algoritmo può essere descritto usando solo tre tipi di strutture di controllo:

- una di sequenza - una di selezione - una di ciclo

Teorema di Bohm e Jacopini

Ad es.

la sequenza

solo la struttura if per la selezione

… problema: quante e quali “strutture di controllo” occorrono per descrivere un qualsiasi tipo di algoritmo?

(2)

Elementi di Informatica Prof. G.A. Di Lucca - Univ. del Sannio

3

Nella Programmazione strutturata è ammesso solo l’utilizzo di strutture di controllo one-in/one-out

Non è ammesso ‘entrare’ nella struttura o ‘uscire’ dalla stessa da punti diversi da quelli di in e di out

Una struttura di controllo può seguirne un’altra collegando il punto di out della prima a quello di in della seconda; in tal caso le strutture sono dette ‘in sequenza’

Una struttura di controllo può essere contenuta totalmente in un’altra ed in tal caso le strutture sono dette ‘innestate’

Le strutture di controllo non devono mai “intersecarsi”

Le strutture di controllo sono i “mattoncini” con cui costruire i programmi

La Programmazione strutturata

vero falso S0

C0

S2 S3

C1 S1

do S0 while (C0);

S1

if (C1) then S2 else S3 endif

Esempio:

Strutture in sequenza

(3)

Elementi di Informatica Prof. G.A. Di Lucca - Univ. del Sannio

5

if (C0) then

if (C1) then S1 else S2 endif

else

if (C2) then S3 else S4 endif

endif Esempio:

Strutture innestate

C0

C1

S1 S2

C2

S3 S4

Istruzioni NON strutturate

Istruzione di salto incondizionato goto goto <label>

dove label è una etichetta che individua una istruzione nel codice L’istruzione goto provoca il trasferimento incondizionato del flusso di controllo del programma all’istruzione identificata da label, saltando tutte le altre istruzioni comprese tra quella di goto e quella con la label indicata

E’ la principale fonte di non strutturazione dei programmi: il suo uso rende i programmi poco comprensibili, poco testabili e poco

manutenibili

NON DEVE MAI ESSERE USATA

(4)

Elementi di Informatica Prof. G.A. Di Lucca - Univ. del Sannio

7

/* Using goto */

#include <stdio.h>

main() {

int count = 1;

start: /* label */

if (count > 10) goto end;

printf("%d ", count);

++count;

goto start;

end: /* label */

printf(’%d\n’, count);

}

Notare come start: , end: e goto sono usate generando strutture NON 1-in/1out

Esempio di programma non strutturato con ‘goto’

start

count > 10

goto end printf ++count goto start

printf end vero

falso count = 1

l’istruzione “goto start” implica un ciclo (che però è di difficile individuazione), e l’istruzione “goto end” rappresenta l’uscita da tale ciclo

Esempio di programma non strutturato con ‘goto’

start

count > 10

goto end printf ++count goto start

printf end vero

falso

count = 1 Il flusso di controllo non è strutturato:

presenza di strutture NON one-in/one-out La struttura if ha due punti di uscita su due diverse istruzioni

ramo ‘falso’ della condizione e ‘goto end’

… il tutto per implementare un ciclo a condizione iniziale !!!

(5)

Elementi di Informatica Prof. G.A. Di Lucca - Univ. del Sannio

9

#include <stdio.h>

main() {

int count = 1;

while(count <= 10) {

printf("%d ", count);

++count;

}

printf(’%d\n’, count);

}

Lo stesso programma in forma strutturata

… one in / one out …

… molto più semplice e comprensibile !!!

count<= 10

printf (…) ++count

printf vero falso

Altre istruzioni NON strutturate

Istruzioni tipicamente usate all’interno di strutture cicliche per alterarne il flusso di controllo:

• break

provoca l’uscita immediata dal ciclo

• continue

fa riportare il flusso di controllo immediatamente all’inizio del ciclo senza che le istruzioni che la seguono siano eseguite

(6)

Elementi di Informatica Prof. G.A. Di Lucca - Univ. del Sannio

11

#include <stdio.h>

main() {

int x;

for (x = 1; x <= 10; x++) {

if (x == 5)

break; /* interrompe il ciclo se x == 5 */

printf("%d ", x);

}

printf("\n Ciclo interrotto per x == %d\n", x);

}

… esce anticipatamente dal ciclo quando x = 5 …

Esempio di uso dell’istruzione break in una struttura for

x=1

x++

x<=10

vero

falso

printf("%d\n",x)

printf(” Ciclo interrotto

….”)

x==5

falso

break

vero

#include <stdio.h>

main() {

int x;

for (x = 1; x <= 10; x++) {

if (x == 5) break;

/* interrompe il ciclo se x == 5 */

printf("%d ", x);

}

printf("\n Ciclo interrotto per x == %d\n", x);

}

Esempio di uso dell’istruzione break in una struttura for

Due punti di uscita dal ciclo for !!!

… one in / two outs !!???

(7)

Elementi di Informatica Prof. G.A. Di Lucca - Univ. del Sannio

13

#include <stdio.h>

main() {

int x;

for (x = 1; x < 5; x++) printf("%d ", x);

printf("\n Ciclo strutturato bene");

}

… one in / one out !!

x=1

x++

X<5

vero

falso

printf("%d\n",x)

printf("\n Ciclo strutturato bene")

Si può ottenere la stessa cosa senza break strutturando opportunamente

#include <stdio.h>

main() {

int x;

for (x = 1; x <= 10; x++) {

if (x == 5)

continue; /* salta le successive istruzioni tornando all’inizio del ciclo se x == 5 */

printf("%d ", x);

}

printf("\n Uso di continue per saltare la stampa del valore 5\n");

}

Esempio di Uso dell’istruzione continue in una struttura for

(8)

Elementi di Informatica Prof. G.A. Di Lucca - Univ. del Sannio

15

#include <stdio.h>

main() {

int x;

for (x = 1; x <= 10; x++) {

if (x == 5) continue;

/* salta le successive istruzioni tornando all’inizio del ciclo se x == 5 */

printf("%d ", x);

}

printf("\n Uso di continue per saltare la stampa del valore 5\n");

}

Uso dell’istruzione continue in una struttura for x=1

x++

x<=10

vero

falso

printf("%d\n",x)

printf(” Uso di continue ….”)

x==5

falso

continue

vero x++

Due punti di ritorno al ciclo for !!!

… two ins / one out !!??

#include <stdio.h>

main() {

int x;

for (x = 1;x <= 10;x++) {

if (x != 5) printf("%d ", x);

}

printf("\n per saltare la stampa del valore 5\n");

}

Si può ottenere la stessa cosa senza continue strutturando opportunamente ….

x=1

x++

x<=10

vero

falso

printf("%d\n",x)

printf(” per saltare la ….”)

x!=5

falso vero

(9)

Elementi di Informatica Prof. G.A. Di Lucca - Univ. del Sannio

17

Istruzioni NON strutturate

L’uso delle istruzioni NON Strutturate:

goto <label>

continue break

va sempre evitato ed in particolare l’istruzione goto <label>

NON

DEVE MAI ESSERE USATA E’ sempre possibile scrivere programmi strutturati

usando opportunamente le strutture di controllo

Riferimenti

Documenti correlati

– Se Body è composto da una sola istruzione si possono omettere le parentesi

Una struttura di controllo può seguirne un’altra collegando il punto di out della prima a quello di in della seconda; in tal caso le strutture sono dette ‘in sequenza’..

L’istruzione goto provoca il trasferimento incondizionato del flusso di controllo del programma all’istruzione identificata da label, saltando tutte le altre istruzioni comprese

• La condizione di mutua esclusione e’ l’unificazione dell’elemento da cancellare con la testa della lista dell’elemento da cancellare con la testa della lista. (cl1) delete1(T,

- Valutazione formale svolta dall’Agenzia nazionale per verificare il rispetto dei criteri di ammissibilità ed esclusione - valutazione qualitativa dei progetti coordinati

Le strutture di controllo sono costrutti sintattici di un linguaggio di programmazione che servono a specificare se, quando, in quale ordine e quante volte devono essere eseguite

Se expr coincide con uno dei pattern allora i corrispondenti comandi sono eseguiti. Se nessun pattern che coincide è trovato non accade

• Tuttavia, i salti condizionati (beq , bne) tipicamente non hanno grandi ampiezze (saltano a istruzioni vicine) perché il loro uso più frequente è nei cicli o nei