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?
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
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
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 !!!
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
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 !!???
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
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
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 strutturatiusando opportunamente le strutture di controllo