Corso di Informatica (Programmazione) Lezione 11 (19 novembre 2008) Programmazione in Java: controllo del flusso (iterazione) 1 Controllo del flusso Il controllo del flusso è l’esecuzione ordinata di una sequenza di istruzioni. Il controllo del flusso (che vediamo…) può essere: sequenziale esegue le istruzioni una alla volta nell’ordine in cui sono state scritte selezione (che abbiamo già visto…) esegue le istruzioni scelte tra almeno due possibilità iterazione esegue ripetutamente delle istruzioni finchè si verifica una certa condizione 2 Iterazione I costrutti di iterazione sono: while do-while for Un costrutto di iterazione ripete l’esecuzione di un blocco di codice finché si verifica una determinata condizione data da un’espressione booleana (che restituisce true quando la condizione è verificata e false in caso contrario) 3 Iterazione WHILE Il costrutto di iterazione while permette di eseguire ripetutamente un blocco di istruzioni while(<boolEXPR>){ <BLOCK>; } <instruction_afterWHILE>; ... dove <boolEXPR> è l’espressione booleana che valutata decide di iterare o meno l’esecuzione del blocco di istruzioni definito da <BLOCK>. Ogni volta che tutte le istruzioni di <BLOCK> vengono eseguite, si valuta nuovamente <boolEXPR> e si decide se rieseguire <BLOCK>. Non appena la valutazione di <boolEXPR> restituisce false, <BLOCK> viene saltato, il controllo diventa sequenziale e viene eseguita l’istruzione successiva 4 <instruction_afterWHILE>. Iterazione WHILE Quindi: <boolEXPR> determina la terminazione delle iterazioni e quindi l’uscita dal ciclo while all’interno di <BLOCK> ci deve essere qualche istruzione che, ad un certo punto, renda <boolEXPR> false e che interrompa quindi le iterazioni è possibile che <BLOCK> non venga eseguito nemmeno una volta (quando la prima valutazione di <boolEXPR> è false) 5 Iterazione WHILE (esempi) La stampa è: Esempio 1: 1 int x=1; 2 while(x <= 10){ 3 System.out.println(x); 5 x++; } 4 6 x++ è in questo caso l’istruzione che permette ad un certo punto di uscire dal ciclo while. Se non esistesse il numero delle iterazioni sarebbe infinito perché la condizione (x<=10) sarebbe sempre true 7 8 9 10 6 Iterazione WHILE (esempi) La stampa è: Esempio 2: 10 int x=10; 9 while(x > 0){ 8 System.out.println(x); x--; } 7 6 5 4 3 2 1 7 Iterazione WHILE (esempi) Esempio 3: int num=1; int somma=0; while(num <= 5){ somma=somma+num; Questo codice esegue la somma degli interi da 1 a 5 1+2+3+4+5 15 num++; } System.out.println(somma); La stampa è: 15 8 Iterazione WHILE (esempi) Esempio 4: int num=6; int somma=0; while(num <= 5){ somma=somma+num; num++; La condizione (num<=5) è false in quanto num è inizializzata a 6. In tale caso il blocco di codice del ciclo while non viene mai eseguito e quindi il contenuto della variabile somma rimane 0 (valore di inizializzazione) } System.out.println(somma); La stampa è: 0 9 Iterazione DO-WHILE Il costrutto di iterazione do-while permette di eseguire ripetutamente un blocco di istruzioni do{ <BLOCK>; } while(<boolEXPR>); <instruction_afterDOWHILE>; ... dove <boolEXPR> è l’espressione booleana che valutata decide di reiterare o meno l’esecuzione del blocco di istruzioni definito da <BLOCK>. Ogni volta che tutte le istruzioni di <BLOCK> vengono eseguite, si valuta nuovamente <boolEXPR> e si decide se rieseguire <BLOCK>. Non appena la valutazione di <boolEXPR> restituisce false, <BLOCK> viene saltato, il controllo diventa sequenziale e viene eseguita l’istruzione successiva 10 <instruction_afterDOWHILE>. Iterazione DO-WHILE Quindi: <boolEXPR> determina la terminazione delle iterazioni e quindi l’uscita dal ciclo do-while all’interno di <BLOCK> ci deve essere qualche istruzione che, ad un certo punto, renda <boolEXPR> false e che interrompa quindi le iterazioni <BLOCK> è eseguito almeno una volta in quanto la prima volta viene eseguito <BLOCK> e solo successivamente viene valutata <boolEXPR> 11 Iterazione DO-WHILE (esempi) Esempio 1: int num=1; int somma=0; do{ somma=somma+num; Questo codice esegue la somma degli interi da 1 a 5 1+2+3+4+5 15 num++; }while(num <= 5); System.out.println(somma); La stampa è: 15 12 Iterazione DO-WHILE (esempi) Esempio 2: int num=6; int somma=0; do{ somma=somma+num; L’istruzione somma=somma+num viene eseguita solo una volta e quindi il contenuto della variabile somma al momento della stampa a video è 6. num++; }while(num <= 5); System.out.println(somma); La stampa è: 6 13 Iterazione FOR Il costrutto di iterazione for permette di eseguire ripetutamente un blocco di istruzioni for(<init>; <boolEXPR>; <update>){ <BLOCK>; } <instruction_afterFOR>; ... dove <boolEXPR> è l’espressione booleana che valutata decide di reiterare o meno l’esecuzione del blocco di istruzioni definito da <BLOCK>. <init> è l’istruzione che viene eseguita una sola volta all’inizio (istruzione di inizializzazione) e <update> (istruzione di aggiornamento) è l’istruzione che viene eseguita al termine di ogni iterazione del blocco <BLOCK> e appena prima di rivalutare 14 <boolEXPR>. Iterazione FOR Il ciclo for funziona nel modo seguente: 1. viene eseguita <init> 2. viene valutata <boolEXPR>: a) se <boolEXPR> è true viene eseguito <BLOCK> b) se <boolEXPR> è false si esce dal ciclo for, il controllo ridiventa sequenziale e viene eseguita l’istruzione <instruction_afterFOR > 3. al termine dell’esecuzione di <BLOCK> (punto 2a), viene eseguita l’istruzione <update> 4. viene rivalutata <boolEXPR> e si ritorna al punto 2 15 Iterazione FOR Quindi: <boolEXPR> determina la terminazione delle iterazioni e quindi l’uscita dal ciclo for è l’istruzione <update> che, ad un certo punto, rende <boolEXPR> false e che interrompe quindi le iterazioni è possibile che <BLOCK> non venga eseguito nemmeno una volta (quando la prima valutazione di <boolEXPR> è false) 16 Iterazione FOR (esempi) La stampa è: Esempio 1: 1 int x; 2 for(x=1; x <= 10; x++){ 3 System.out.println(x); 4 5 } x=1 è l’istruzione di inizializzazione x++ è in questo caso l’istruzione di aggiornamento che permette ad un certo punto di uscire dal ciclo for 6 7 8 9 10 17 Iterazione FOR (esempi) La stampa è: Esempio 2: 10 int x; 9 for(x=10; x > 0; x--){ System.out.println(x); } 8 7 6 5 4 3 2 1 18 Iterazione FOR (esempi) Esempio 3: int num; int somma; for(num=1; num <= 5; num++){ somma=somma+num; } System.out.println(somma); Questo codice esegue la somma degli interi da 1 a 5 1+2+3+4+5 15 La stampa è: 15 19