fondamenti di informatica i cdl in ingegneria elettronica - a.a. 2006-2007 cdl in ingegneria...

17
7. Strutture di controllo 7. Strutture di controllo Ing. Simona Colucci

Upload: gianmarco-pizzi

Post on 01-May-2015

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

7. Strutture di controllo7. Strutture di controllo Ing. Simona Colucci

Page 2: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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

Page 3: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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)

Page 4: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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;

}

Page 5: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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)

Page 6: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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)

Page 7: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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)

Page 8: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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];

}

Page 9: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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: - -

Page 10: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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 */…

Page 11: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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)

Page 12: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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)

Page 13: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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");

Page 14: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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)

Page 15: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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

Page 16: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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 */

Page 17: Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2006-2007 CDL in Ingegneria Elettronica - A.A. 2006-2007 7. Strutture di controllo Ing

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)