fondamenti di informatica i cdl in ingegneria elettronica - a.a. 2006-2007 cdl in ingegneria...
TRANSCRIPT
7. Strutture di controllo7. Strutture di controllo Ing. Simona Colucci
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari IndiceIndice
• 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
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari Programmazione strutturataProgrammazione 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)
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari
Istruzioni di selezione:Istruzioni di selezione:il costrutto il costrutto switchswitch (1) (1)
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': printf ("Il carattere letto è A o G o H\n");
break;case 'F' : printf ("Il carattere letto è F\n");
break;}
2. switch(CarattereLetto){
case 'A': case 'G': case 'H': printf ("Il carattere letto è A o G o H\n");break;
case 'F' : printf ("Il carattere letto è F\n");break;
default: printf ("il carattere letto è sbagliato\n"); break;
}
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari
• 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
Il costrutto switch (2)Il costrutto switch (2)
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari
switch (Dipendente.Qualifica){
case CapoProgetto: Dipendente.Retribuzione =
(Dipendente.Retribuzione * 11) / 10;break;
case Venditore:Dipendente.Retribuzione =
(Dipendente.Retribuzione * 12) / 10;break;
case Segretario: Dipendente.Retribuzione =
(Dipendente.Retribuzione * 12) / 10;break;
}
Il costrutto switch (3)Il costrutto switch (3)
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari
… /* 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);
}}
Il costrutto switch (4)Il costrutto switch (4)
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari
Istruzioni cicliche: il ciclo forIstruzioni 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];
}
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari
Il ciclo for (2)Il ciclo for (2)
/* Programma InvertiSequenza */#include <stdio.h>#define LunghezzaSequenza 100 void main () {
int Contatore; int Memorizzazione[LunghezzaSequenza]; for (Contatore = 0; Contatore < LunghezzaSequenza; Contatore++)
scanf ("%d", &Memorizzazione[Contatore]); for (Contatore = LunghezzaSequenza – 1; Contatore >= 0; Contatore––)
printf ("%d", Memorizzazione[Contatore]); }
Due speciali operatori unari:– Operatore di autoincremento: ++– Operatore di autodecremento: - -
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari Il ciclo for (3)Il ciclo for (3)
/* Programma ContaCaratteri */#include <stdio.h>#define DimVettoreFrequenze 123 void main (){
char Dato, Cursore; int FrequenzaCaratteri[DimVettoreFrequenze];
/* Inizializzazione dell'array di conteggio FrequenzaCaratteri. Vengono prese in considerazione solo le lettere dell'alfabeto, poiché il programma viene
applicato a un testo costituito da parole */for (Cursore = 'A'; Cursore <= 'Z'; Cursore++)
FrequenzaCaratteri[Cursore] = 0; for (Cursore = 'a'; Cursore <= 'z'; Cursore++)
FrequenzaCaratteri[Cursore] = 0; scanf (" %c", &Dato);
/* Inizia la lettura del testo */…
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari
… /* Inizia la lettura del testo */
while (Dato != '#') {
/* Se il dato letto è uno spazio esso deve essere semplicemente ignorato */if (!(Dato == ' '))
/* Si verifica che il dato letto sia una lettera dell'alfabetoe non altro carattere non ammesso */
if (Dato < 'A' || Dato > 'z' || (Dato > 'Z' && Dato < 'a')) printf ("Il testo contiene dei caratteri non ammessi");
else FrequenzaCaratteri[Dato] = FrequenzaCaratteri[Dato] + 1;
scanf (" %c", &Dato); }…
Il ciclo for (4)Il ciclo for (4)
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari
…/* Stampa dei totali delle lettere maiuscole */
for (Cursore = 'A'; Cursore <= 'Z'; Cursore++) {
printf ("Il numero di volte in cui il carattere %c compare nel testo è: %d\n", Cursore, FrequenzaCaratteri[Cursore]);
}/* Stampa dei totali delle lettere minuscole */
for (Cursore = 'a'; Cursore <= 'z'; Cursore++) {
printf ("Il numero di volte in cui il carattere %c comparenel testo è: %d\n", Cursore, FrequenzaCaratteri[Cursore]);
}}
Il ciclo for (5)Il ciclo for (5)
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari Il ciclo do-while (1)Il ciclo do-while (1)
• Invece di:
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");
• Usare:
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");
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - 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
Il ciclo do-while (2)Il ciclo do-while (2)
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari L’istruzione gotoL’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
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari
Le istruzioni break e continue (1)Le istruzioni break e continue (1)
• 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 */
Sistemi Sistemi InformativiInformativiDEE - Politecnico di BariDEE - Politecnico di Bari
• 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 */
}
Le istruzioni break e continue (2)Le istruzioni break e continue (2)