7. Strutture di controllo
Ing. Simona Colucci
Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Sistemi Informativi
Indice
DEE - Politecnico di Bari
• Istruzioni di selezione
– Sostituibili dal costrutto switch
• Istruzioni cicliche (di iterazione)
– Sostituibili dal costrutto for e do-while
• Istruzioni di salto
– Codificate con il go-to, non utilizzabile nella programmazione
strutturata
Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Programmazione strutturata
TEOREMA DI BOHM-JACOPINI:
tutti i programmi possono essere scritti con
l’utilizzo delle sole strutture di controllo: sequenza,
selezione e iterazione (senza l’uso del salto goto)
Le strutture di controllo consentite sono quelle di
selezione(if-else) e iterazione (while)
Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Istruzioni di selezione:
il costrutto switch (1)
Sistemi Informativi
DEE - Politecnico di Bari
Switch:
– istruzione di selezione a più vie(se l’else non è uno solo)
– consente la scelta di un’istruzione tra altre sulla base del valore di una
particolare variabile o espressione
– Sintassi:
1. switch(CarattereLetto)
{
case 'A': case 'G': case 'H':
case 'F' :
}
printf ("Il carattere letto è A o G o H\n");
break;
printf ("Il carattere letto è F\n");
break;
2. switch(CarattereLetto)
{
case 'A': case 'G': case 'H':
case 'F' :
default:
}
printf ("Il carattere letto è A o G o H\n");
break;
printf ("Il carattere letto è F\n");
break;
printf ("il carattere letto è sbagliato\n");
break;
Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Il costrutto switch (2)
• L’istruzione break fa saltare le istruzioni dei successivi
rami case e fa eseguire l’istruzione immediatamente
successiva allo switch
• L’istruzione di default viene eseguita se la valutazione
dell’espressione determina un valore che non appartiene a
nessuno degli insiemi specificati nei vari case
• Buone regole per l’uso dello switch:
– I valori delle espressioni nelle clausole case devono essere costanti
e tutti diversi tra loro
– L’istruzione default assicura il trattamento completo dei diversi casi
– L’istruzione break nell’ultimo case non è strettamente necessaria
ma serve per eventuali estensioni del codice
Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Il costrutto switch (3)
switch
(Dipendente.Qualifica)
{
case CapoProgetto:
Dipendente.Retribuzione =
(Dipendente.Retribuzione * 11) / 10;
case Venditore:
break;
Dipendente.Retribuzione =
(Dipendente.Retribuzione * 12) / 10;
case Segretario:
}
break;
Dipendente.Retribuzione =
break;
(Dipendente.Retribuzione * 12) / 10;
Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
…
{
Il costrutto switch (4)
/* Programma Melodia dal tuo nome */
char
C;
int
resto;
printf ("Inserisci il primo carattere del tuo nome\n");
scanf (" %c", &C);
while (C != '#')
{
resto = C % 7;
switch (resto)
{
case 0: printf ("Il carattere %c corrisponde alla nota 'do'\n", C); break;
case 1: printf ("Il carattere %c corrisponde alla nota 're'\n", C); break;
…
case 6: printf ("Il carattere %c corrisponde alla nota 'si'\n", C); break;
}
printf ("Inserisci il prossimo carattere del tuo nome – # termina il programma");
scanf (" %c", &C);
}
}
Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Istruzioni cicliche: il ciclo for
Nei cicli a conteggio:
• Invece di:
VariabileDiConteggio = ValoreIniziale;
while
(VariabileDiConteggio <= ValoreFinale)
{
[Sequenza di istruzioni da ripetere];
VariabileDiConteggio = VariabileDiConteggio + 1;
}
• Usare:
for ( VariabileDiConteggio = ValoreIniziale;
VariabileDiConteggio <= ValoreFinale;
VariabileDiConteggio = Variabile di Conteggio + 1)
{
[Sequenza di istruzioni da ripetere];
}
Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Il ciclo for (2)
Sistemi Informativi
DEE - Politecnico di Bari
/* Programma InvertiSequenza */
#include <stdio.h>
#define LunghezzaSequenza 100
void
{
int
int
for
for
main ()
Contatore;
Memorizzazione[LunghezzaSequenza];
(Contatore = 0; Contatore < LunghezzaSequenza; Contatore++)
scanf ("%d", &Memorizzazione[Contatore]);
(Contatore = LunghezzaSequenza – 1; Contatore >= 0; Contatore––)
printf ("%d", Memorizzazione[Contatore]);
}
Due speciali operatori unari:
– Operatore di autoincremento: ++
– Operatore di autodecremento: - Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Il ciclo do-while (1)
• Invece di:
• Usare:
Contatore = 0;
scanf (" %c", &Dato);
Testo[Contatore] = Dato;
while (Dato != '%' && Contatore <
LunghezzaMassima)
{
Contatore = Contatore + 1;
scanf (" %c", &Dato);
Testo[Contatore] = Dato;
}
if (Contatore == LunghezzaMassima
&& Dato != '%')
printf ("La sequenza è troppo
lunga");
Contatore = 0;
do
{
scanf (" %c", &Dato);
Testo[Contatore] = Dato;
Contatore = Contatore + 1;
} while (Dato != '%' && Contatore
< LunghezzaMassima);
if (Contatore == LunghezzaMassima
&& Dato != '%')
printf ("La sequenza è
troppo lunga");
Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Il ciclo do-while (2)
Sistemi Informativi
DEE - Politecnico di Bari
• Differenze con il while:
– Il corpo del ciclo viene eseguito almeno una volta, anche se la
condizione non è verificata; nel while non viene eseguita
necessariamente
– Il do-while è preferibile al while se la condizione è su una variabile
da leggere nel ciclo stesso
• Rappresentazione
Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
L’istruzione goto
scanf ("%d"%d", &x, &y);
if (y == 0)
goto error;
printf ("%f\n", x/y);
...
error: printf ("y non può essere uguale a 0\n");
DA NON USARE NELLA PROGRAMMAZIONE STRUTTURATA
Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Le istruzioni break e continue (1)
Sistemi Informativi
DEE - Politecnico di Bari
• L’istruzione break provoca la fuoriuscita dal corpo di un ciclo o
da un’istruzione di switch
/* Ciclo infinito */
while
(true)
{
scanf ("%d%d", &x, &y);
if (x == 0)
/* Esce dal ciclo di lettura se x è uguale a 0 */
break;
printf ("%f\n", x/y);
}
/* break provoca l'esecuzione dell'istruzione che
segue questo commento */
Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Le istruzioni break e continue (2)
• L’istruzione continue provoca l’interruzione della corrente
iterazione del ciclo (solo while, do while o for) e il passaggio
all’iterazione successiva
/* Codice che elabora tutti i caratteri eccetto le lettere
minuscole e maiuscole */
for (i = 0; i < NumDati; i++)
{
scanf (" %c", &Dato);
if
((Dato >= 'A' && Dato <= 'Z') || (Dato >= 'a' && Dato <= 'z'))
continue;
/* Istruzioni che elaborano gli altri caratteri */
...
/* continue trasferisce qui il controllo perché possa iniziare la prossima iterazione
del ciclo. È importante notare che i++ viene eseguita anche in questo caso */
}
Fondamenti di Informatica
CDL in Ingegneria Gestionale(B) - A.A. 2010-2011