Michele Nappi [email protected] biplab.unisa · – it i d fi it è li it t t lt i il literazione...

29
FIL FIL FIL FIL Lezione 4: Istruzioni Lezione 4: Istruzioni Iterative… Iterative…. Michele Nappi Michele Nappi [email protected] [email protected] biplab.unisa.it biplab.unisa.it 20/10/2014 M. Nappi/FIL 1

Transcript of Michele Nappi [email protected] biplab.unisa · – it i d fi it è li it t t lt i il literazione...

FILFILFILFILLezione 4: Istruzioni Lezione 4: Istruzioni Iterative…Iterative…..

Michele NappiMichele [email protected]@unisa.it

biplab.unisa.itbiplab.unisa.itpp

20/10/2014 M. Nappi/FIL 1

La struttura di IterazioneLa struttura di Iterazione whilewhileLa struttura di Iterazione La struttura di Iterazione whilewhile

St tt di it i• Struttura di iterazione– Il programmatore specifica un’azione che deve essere eseguite finché una certa condizione è veraeseguite finché una certa condizione è vera

– Psuedocodice:Psuedocodice: Finché non ci sono più articoli nella mia lista della spesa Acquista il prossimo articolo e cancellalo dalla lista

• – Il ciclo while viene ripetuto finché la condizione non di t f ldiventa falsa

20/10/2014 M. Nappi/FIL 2

La struttura di IterazioneLa struttura di Iterazione whilewhile (cont )(cont )La struttura di Iterazione La struttura di Iterazione while while (cont.)(cont.)

E iEsempio:(calcola la prima potenza di 2 maggiore di 1000):gg )

int prodotto = 2;while ( prodotto <= 1000 )while ( prodotto <= 1000 )

prodotto = 2 * prodotto;printf(“la prima potenza di due maggiore di1000 è %d” d tt )1000 è %d”, prodotto);

20/10/2014 M. Nappi/FIL 3

Istruzioni di Controllo (cont.)

• Problema– Un college ha una lista di risultati di test (1 = promosso, 2 = bocciato) per 10 studenti Scrivere un programma che= bocciato) per 10 studenti. Scrivere un programma che analizza i risultati. Se più di 8 studenti sono stati promossi, visualizzare “Aumentare le tasse”

• Nota cheIl programma deve elaborare 10 risultati di test– Il programma deve elaborare 10 risultati di test

• Sarà usato un ciclo controllato da contatore– Due contatori possono essere usati

• Uno per il numeno di promossi, uno per il numero di bocciati– Ogni risultato di test è un numero (1 o 2)

• Se il numero non è un 1, assumiamo che è un 2

20/10/2014 M. Nappi/FIL 4

Istruzioni di Controllo (cont.)s u o d Co o o ( )

• Descrizione ad alto livelloA li i i lt ti d ll’ d id d bbAnalizzare i risultati dell’esame e decidere se debbano essere

aumentate le tasse scolastiche• Primo raffinamento

Inizializzare le variabiliPrendere in input 10 valutazioni della prova e contare le

promozioni e le bocciaturepromozioni e le bocciature Visualizzare un sommario dei risultati dell’esame e decidere se le

tasse scolastiche debbano essere aumentateR ffi I i i li l i bili• Raffinare: Inizializzare le variabiliInizializzare le promozioni a zero Inizializzare le bocciature a zeroInizializzare le bocciature a zero Inizializzare gli studenti a uno

20/10/2014 M. Nappi/FIL 5

Istruzioni di Controllo (cont.)s u o d Co o o ( )

• Raffinare: Prendere in input 10 valutazioni della prova e contare le promozioni e le bocciaturecontare le promozioni e le bocciatureFinchè il contatore degli studenti è inferiore o uguale a dieci

prendere in input il prossimo risultato d’esameSe lo studente è stato promossoSe lo studente è stato promosso

Aggiungere uno ai promossi altrimenti

Aggiungere uno ai bocciatigg gAggiungere uno al contatore degli studenti

• Raffinare: Visualizzare un sommario dei risultatiRaffinare: Visualizzare un sommario dei risultati dell’esame e decidere se le tasse scolastiche debbano essere aumentate

Visualizzare il numero delle promozioni Visualizzare il numero delleVisualizzare il numero delle promozioni Visualizzare il numero delle bocciature

Se più di otto studenti sono stati promossi Visualizzare il messaggio “aumentare le tasse

20/10/2014 M. Nappi/FIL 6

Istruzioni di Controllo (cont.)s u o d Co o o ( )

#include <stdio.h>int main(void) {{/* inizializza le variabili nelle dichiarazioni */ int promossi = 0, bocciati = 0, studenti = 1, risultato;/* elabora 10 studenti; ciclo controllato da un contatore */ while ( studenti <= 10 )while ( studenti <= 10 ) {

printf( ”\ninserisci risultato ( 1=promosso,2=bocciato ): " ); scanf( "%d", &risultato );

if ( i lt t 1 ) /* if/else nidificato nel while */if ( risultato == 1 ) /* if/else nidificato nel while */ promossi ++;else bocciati ++;

t d ti ++studenti ++;}printf( ”Promossi %d\n", promossi ); printf( ”Bocciati %d\n", bocciati );if ( i > 8 )if ( promossi > 8 ) printf( ”Aumenta le tasse\n" );return 0; /* chiusura con successo */}

20/10/2014 M. Nappi/FIL 7

La struttura di IterazioneLa struttura di Iterazione whilewhile (cont )(cont )La struttura di Iterazione La struttura di Iterazione while while (cont.)(cont.)Formulazione di un Algoritmi mediante Iterazione controllata da un contatore

• Iterazione controllata da un contatore– Il ciclo è ripetuto finché il contatore raggiunge un certo valore.– Iterazione definita: il numero di iterazioni è noto prima che il ciclo incominci la propria esecuzionepropria esecuzione– Esempio: Una classe di dieci studenti sostiene un esame. Avete a disposizione le votazioni (degli interi nell’intervallo da 0 a 100) per questo esame. Determinate la media della classe in questo esame.

• Pseudocodice:Inizializzare il totale a zeroInizializzare il contatore a unoFino a quando il contatore è minore o uguale di 10Prendere in input il prossimo votoAggiungere il voto al totaleAggiungere uno al contatoreAggiungere uno al contatoreImpostare il valore della la media uguale al totale diviso per dieciVisualizzare la media

20/10/2014 M. Nappi/FIL 8

La struttura di IterazioneLa struttura di Iterazione whilewhile (cont )(cont )La struttura di Iterazione La struttura di Iterazione while while (cont.)(cont.)#include <stdio.h>int main(void) {int contatore, voto, totale;float media;/* fase di inizializzazione */ totale = 0; contatore = 1;/* fase di elaborazione */ while (contatore <= 10 ) { printf( ”\nInserisci il voto: " ); scanf( "%d", &voto ); totale = totale + voto; /*totale+=voto*/contatore = contatore + 1; }/* fase di terminazione */ media = (float) totale / 10; printf( ”La media della classe è %f\n", media );return 0; /* indica che il programma è terminato con successo*/}

20/10/2014 M. Nappi/FIL 9

Formulazione degli Algoritmi con Processo Formulazione degli Algoritmi con Processo TopTop--Down per Raffinamenti Successivi Down per Raffinamenti Successivi

(Iterazione controllata da un Valore Sentinella)(Iterazione controllata da un Valore Sentinella)

Il problema può essere generalizzato:• Il problema può essere generalizzato:

Sviluppare il programma per il calcolo della media di una classe, cheelaborerà un numero arbitrario di votazioni ogni volta che ilelaborerà un numero arbitrario di votazioni ogni volta che ilprogramma sarà eseguito.

– Numero di studenti non noto in anticipo (iterazioni indefinite)– Come saprà il programma quando terminare l’immissione delle votazioni e calcolare e visualizzare la media della classe?

• Uso di un valore sentinella• Uso di un valore sentinella

– Detto anche valore di segnalazione o valore dummy (fittizio) o valore flag (bandiera)– Indica “la fine dell’immissione dei dati”.Indica la fine dell immissione dei dati .– Il ciclo termina quando viene immesso il valore sentinella– Il valore sentinella deve essere scelto in modo da non confondersi con un valore di input accettabile (come -1 in questo caso)

20/10/2014 M. Nappi/FIL 10

Formulazione degli Algoritmi con Processo Formulazione degli Algoritmi con Processo TopTop--Down per Raffinamenti Successivi Down per Raffinamenti Successivi

(Iterazione controllata da un Valore Sentinella) (Iterazione controllata da un Valore Sentinella) (cont.)(cont.)

• Tecnica top down per raffinamenti successivi• Tecnica top-down per raffinamenti successivi– Si comincia con una rappresentazione logica del top:Determinare la media della classe per il quiz– Si divide il top in una serie di attività più piccole e le si elenca– Si divide il top in una serie di attività più piccole e le si elencanell’ordine:Inizializzare le variabiliPrendere in input sommare e contare le votazioni dell’esamePrendere in input, sommare e contare le votazioni dell esameCalcolare e visualizzare la media della classe

• Molti programmi constano di tre fasip g– Inizializzazione: inizializza le variabili del programma– Elaborazione: prende i valori in input e modifica le variabili del programma di conseguenza– Terminazione: calcola e restituisce i risultati finali.

Ciò aiuta a dividere i programmi con il raffinamento top-down

20/10/2014 M. Nappi/FIL 11

Formulazione degli Algoritmi con Processo Formulazione degli Algoritmi con Processo TopTop--Down per Raffinamenti Successivi Down per Raffinamenti Successivi

(Iterazione controllata da un Valore Sentinella) (Iterazione controllata da un Valore Sentinella) (cont.)(cont.)• Raffiniamo la fase di inizializzazione Inizializzare le variabili

Inizializzare il totale a zeroInizializzare il contatore a zero

R ffi i P d i i t t l t i i d ll’• Raffiniamo Prendere in input, sommare e contare le votazioni dell’esamePrendere in input la prima valutazione (eventualmente il valore sentinella)Finché l’utente non immette il valore sentinellaAggiungere questa valutazione al totale correntegg g qAggiungere uno al contatore di valutazioniPrendere in input la prossima valutazione (eventualmente il valore sentinella)

Raffiniamo Calcolare e visualizzare la media della classe• Raffiniamo Calcolare e visualizzare la media della classe

Se il contatore non è uguale a zeroImpostare la media con il totale diviso per il contatorep pVisualizzare la mediaaltrimentiVisualizzare “Non sono state immesse valutazioni”

20/10/2014 M. Nappi/FIL 12

Formulazione degli Algoritmi con Processo Formulazione degli Algoritmi con Processo TopTop--Down per Raffinamenti Successivi Down per Raffinamenti Successivi

(Iterazione controllata da un Valore Sentinella) (Iterazione controllata da un Valore Sentinella) (cont.)(cont.)

while ( voto != 1 )while ( voto != -1 ) { totale = totale + voto; contatore = contatore + 1; printf( " Inserisci voto -1 per finire : " );

#include <stdio.h>int main() { printf( Inserisci voto, -1 per finire : );

scanf( "%d", &voto );}/* fase di terminazione */

float media; /* nuovo tipo di dato*/int contatore, voto, totale;/* fase di inizializzazione */

if ( contatore != 0 ) {media = ( float ) totale / contatore;printf( ”la media della classe è %.2f", media );

totale = 0; contatatore = 0;

/* fase di elaborazione */ )}elseprintf( ”Non è stato inserito alcun

voto\n" );

printf( ”Inserisci voto, -1 per finire: " );scanf( "%d", &voto );

return 0; /* indica che il programma è terminato con successo*/

}

20/10/2014 M. Nappi/FIL 13

}

IterazioneIterazioneIterazioneIterazioneL• Loop– Insieme di istruzioni che il computer esegue ripetutamente finché

una condizione risulta vera

• Iterazione controllata da un contatoreit i d fi it è li it t t lt i il l– iterazione definita: è esplicitato quante volte eseguire il loop

– Utilizzo di variabile di controllo per contare le iterazioni

• Iterazione controllata da una variabile di controllo– Iterazione Indefinita– Usata quando non è noto il numero di ripetizioni da eseguire– Il valore della variabile di controllo indica il test di fine iterazione

20/10/2014 M. Nappi/FIL 14

IterazioneIterazione ( t )( t )IterazioneIterazione (cont.)(cont.)

• Iterazione controllata da un contatore richiede

– nome di una variabile di controllo (o loop counter)nome di una variabile di controllo (o loop counter).

– valore iniziale della variabile di controllo– valore iniziale della variabile di controllo .

condizione che verifica il valore finale della variabile– condizione che verifica il valore finale della variabile di controllo (cioè se il loop deve continuare).

– incremento (o decremento) con il quale la variabile di controllo èmodificata ad ogni interazionedel loop.

20/10/2014 M. Nappi/FIL 15

g p

IterazioneIterazione ( t )( t )IterazioneIterazione (cont.)(cont.)

• Esempio: se p o

i t t 1 //i i i li iint counter =1; //inizializzazione while (counter <= 10) //condizione di iterazione {{printf( "%d\n", counter ); ++counter; //incremento }– int counter = 1; nomina counter, la dichiara come intero, alloca

spazio in memoria e la inizializza ad 1

20/10/2014 M. Nappi/FIL 16

Iterazione: l’istruzioneIterazione: l’istruzione forforIterazione: l istruzione Iterazione: l istruzione forfor• Formato del loop for

for (inizializzazione; TestLoop; incremento) Istruzione;

Variabile Incremento della

Esempio:

for(counter = 1; counter <= 10; counter++ )

di controllo variabile di controllo

for(counter 1; counter < 10; counter++ ) printf( "%d\n", counter );

– Stampa gli interi da 1 a 10p g

• Importanza della correttezza dell’espressione relazionale usata come condizione di continuazione del ciclo (nell’es. counter <= 10 )

• Le espressioni counter++ e ++counter sono equivalenti in questo caso

20/10/2014 M. Nappi/FIL 17

Iterazione: l’istruzioneIterazione: l’istruzione forfor ( t )( t )Iterazione: l istruzione Iterazione: l istruzione for for (cont.)(cont.)

• Formato del loop for

for(counter = 1; counter <= 10; counter++ ) printf( "%d\n", counter );

20/10/2014 M. Nappi/FIL 18

Iterazione: l’istruzioneIterazione: l’istruzione forfor ( t )( t )Iterazione: l istruzione Iterazione: l istruzione for for (cont.)(cont.)• Il loop for può essere realizzato in termini dell’istruzione

while :while :

inizializzazione; for (inizializzazione; TestLoop; incremento) while ( TestLoop){ istruzione;

o ( a a o e; es oop; c e e o)Istruzione;

s u o e;incremento;}

• Inizializzazione e incremento–Uso della virgola come separatore

for (i = 0, j = 0; j + i <= 10; j++, i++)printf( "%d\n", j + i );

20/10/2014 M. Nappi/FIL 19

p ( , j );

Iterazione: l’istruzioneIterazione: l’istruzione forfor (cont )(cont )Iterazione: l istruzione Iterazione: l istruzione for for (cont.)(cont.)

• Espressioni Aritmetiche– Inizializzazione, test di continuazione, e incremento possono

includere espressioni aritmetiche. Se x = 2 e y = 10yfor ( j = x; j <= 4 * x * y; j += y / x )

è equivalente aè equivalente a

for ( j = 2; j <= 80; j += 5 )

• "Incremento" può essere negativo (decremento)S il t t di ti i i i i l t è f l• Se il test di continuazione inizialmente è false– Il corpo del for non è eseguito– Il controllo continua con l’istruzione dopo il for

20/10/2014 M. Nappi/FIL 20

Il controllo continua con l istruzione dopo il for

Iterazione: l’istruzione Iterazione: l’istruzione for for (cont.)(cont.)Esempi di tili o di forEsempi di utilizzo di for

for(i = 1; i <= 100; i++)

for(i = 100; i >=1; i--)

/*stampa 7 14 21 70 77*// stampa 7, 14, 21,…,70, 77 /for(i = 7; i<=77; i+=7) printf(“%d”, i);

/*stampa 20, 18, 16, 14, …, 4, 2*/for(i = 20; i >=2; i-=2)printf(“%d”, i); p ( , );

for(j = 2; j <=20; j+=3) /*j assume valori 2, 5, 8, 11, 14, 17, 20*/

f) for(j = 99; j >=0; j-=11) /*j assume valori 99, 88, 77, 66, 55, 44, 33, 22, 11, 0*/

20/10/2014 M. Nappi/FIL 21

Esercizio su Esercizio su forforScrivere un programma che somma i primi n numeri pari

/* somma dei primi n numeri pari */#include <stdio.h>

int main(void){int sum = 0 n counter;int sum 0, n, counter;printf(”quanti numeri pari desideri sommare?:");scanf("%d", &n);for(counter = 1; counter <= n; counter ++)for(counter = 1; counter <= n; counter ++)sum += 2*counter;printf(“la somma dei primi %d numeri pari è %d”, n, sum);

t 0return 0;}

20/10/2014 M. Nappi/FIL 22

Iterazione Iterazione do/whiledo/while

d / hil è ’ lt i t i di it i• do/while è un’altra istruzione di iterazione– Simile alla struttura while

C di i di i ti i è ff tt t d h il b d– Condizione di ripetizione è effettuata dopo che il body del ciclo è stato eseguito

• Il corpo del ciclo è eseguito almeno una voltaIl corpo del ciclo è eseguito almeno una volta

• Formato: do {{

statement} while ( condizione );

– Meglio inserire le parentesi, anche se non è necessario

20/10/2014 M. Nappi/FIL 23

Iterazione Iterazione do/whiledo/while

• Esempio (sia counter = 1)

do { printf( "%d " counter );printf( "%d ", counter ); } }while (++counter <= 10);

– Stampa gli interi da1 a 1020/10/2014 M. Nappi/FIL 24

IterazioneIterazione do/whiledo/while (cont )Iterazione Iterazione do/while do/while (cont.)

#include <stdio h>#include <stdio.h>

int main()(){int counter = 1;

do {printf( "%d ", counter )p t ( %d , cou te )} while ( ++counter <= 10 );

t 0return 0;}

20/10/2014 M. Nappi/FIL 25

Le istruzioni break e continue

#include <stdio.h>int main() 1 2 3 4int main() { int x;

Si è usato break per interrompere il ciclo

for ( x = 1; x <= 10; x++ ) {

f ( )if ( x == 5 ) break; /* interrompe il ciclo solo se x == 5 */printf( "%d " x );printf( %d , x );

}printf( "\nSi è usato break per interrompere il ciclo\n" ); return 0;}

20/10/2014 M. Nappi/FIL 26

Le istruzioni break e continue (cont.)

• break– Causa un’uscita immediata da una struttura while, for,do/while o switchwhile, for,do/while o switch– L’esecuzione del programma continua con la prima istruzione successiva dopo la strutturaprima istruzione successiva dopo la struttura– Uso frequente di break

• Uscire da un loop• Skippare(saltare) la sezione restante di una struttura Skippare(saltare) la sezione restante di una struttura switch

20/10/2014 M. Nappi/FIL 27

Le istruzioni break e continue (cont.)

• continue– Salta le istruzioni che restano in un corpo di un while for o do/whiledi un while, for o do/while

• Esegue la successiva iterazione del loop

/– while e do/while• Il test di continuazione è valutato immediatamente

dopo l’esecuzione del continue– for

• Viene eseguito l’incremento, e successivamente il test di continuazione

20/10/2014 M. Nappi/FIL 28

Le istruzioni break e continue (cont.)

#include <stdio.h>int main() 1 2 3 4 6 7 8 9 10(){ int x;for ( x = 1; x <= 10; x++ )

1 2 3 4 6 7 8 9 10Si è usato continue per saltare la stampa di 5

for ( x 1; x 10; x ){

if ( x == 5 ) continue; /* salta il codice restante nel ciclo solo se x == 5 */continue; / salta il codice restante nel ciclo solo se x == 5 /printf( "%d ", x );

}printf( "\nSi è usato continue per saltare la stampa di 5\n" );printf( "\nSi è usato continue per saltare la stampa di 5\n" ); return 0; }

20/10/2014 M. Nappi/FIL 29