La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

INFORMATICA Strutture iterative. © Piero Demichelis 2 Strutture iterative Si dice ciclo (loop) una sequenza di istruzioni che deve essere ripetuta più

Presentazioni simili


Presentazione sul tema: "INFORMATICA Strutture iterative. © Piero Demichelis 2 Strutture iterative Si dice ciclo (loop) una sequenza di istruzioni che deve essere ripetuta più"— Transcript della presentazione:

1 INFORMATICA Strutture iterative

2 © Piero Demichelis 2 Strutture iterative Si dice ciclo (loop) una sequenza di istruzioni che deve essere ripetuta più volte consecutivamente. Si consideri ad esempio il calcolo del fattoriale di un numero n > 0: n! = n (n - 1) (n - 2) 2 con il caso particolare 0! = 1. Sembrerebbe che basti una semplice assegnazione, ma se non si conosce a priori il valore di n, è impossibile scrivere listruzione che esegue il calcolo del fattoriale, poiché la formula contiene tanti fattori quanti ne indica n

3 © Piero Demichelis 3 Strutture iterative Proviamo a riscrivere la formula del fattoriale come: n! =(( (((1 2) 3) 4) (n - 1) n) Osservando la formula possiamo: ­attribuire ad una variabile fatt il valore 1, ­quindi moltiplicare fatt per 2 ed attribuire il risultato ancora ad fatt, ­poi fatt per 3 e così via fino a n

4 © Piero Demichelis 4 Strutture iterative L'algoritmo di soluzione può quindi essere formalizzato mediante un algoritmo iterativo: ­assegna il valore 1 a fatt; ­se n vale 0, hai finito; ­con k che varia da 1 a n con passo unitario esegui: moltiplica fatt per k ed attribuisci il risultato a fatt. Il prodotto fatt k viene eseguito n volte comè necessario. La scelta di algoritmi ciclici influenza spesso altri componenti del programma, come la base dati..

5 © Piero Demichelis 5 Strutture iterative Nel linguaggio C i cicli iterativi sono realizzati da tre costrutti: while : realizza il costrutto WHILE - DO; do – while : realizza il costrutto REPEAT - UNTIL; for : realizza il ciclo a contatore.

6 © Piero Demichelis 6 Istruzione while V F Sintassi: while ( ) Finché è vera esegue che può essere semplice o composta. I O

7 © Piero Demichelis 7 Istruzione while : osservazioni Il costrutto while realizza il costrutto while – do della programmazione strutturata. deve essere di tipo logico ed è ricalcolata ad ogni iterazione; se risulta falsa già alla prima iterazione non viene eseguita neppure una volta; se non diventa mai falsa non si esce mai dal loop! essendo una normale istruzione composta può contenere qualsiasi tipo di istruzione, in particolare altri while, dando origine (come per lif) a while annidati.

8 © Piero Demichelis 8 Istruzione while: esempio Leggere un numero intero N da tastiera, e calcolare la somma S dei primi N numeri interi. Pseudocodice: ­Legge N da tastiera; ­inizializza laccumulatore di risultato S a 0; ­inizializza un contatore indice a 1; ­finché indice <= N; aggiungi allaccumulatore S il valore di indice; aggiorna indice (ovvero incrementalo di 1); ­visualizza il risultato finale (valore di S).

9 © Piero Demichelis 9 Istruzione while: esempio #include main() { int N, indice, S; printf (\nIntroduci N: ); scanf (%d, &N); S = 0; /* inizializzazioni */ indice = 1; while (indice <= N) { S += indice; /* S S + indice: operazione iterativa */ indice++; /* aggiornamento condizione */ } printf (\nSomma = %d, S); /* output */ }

10 © Piero Demichelis 10 Esempio: calcolo del seno Calcolare la funzione seno x mediante lo sviluppo in serie sino quando i fattori sono > Osservando i singoli fattori dello sviluppo si può osservare che: con N che varia a passi di 2.

11 © Piero Demichelis 11 Esempio: calcolo del seno Il primo termine lo conosciamo allatto della lettura da tastiera del valore in radianti dellangolo. Tutti gli altri termini possono essere ricavati in successione a partire dal primo applicando la relazione che abbiamo trovato che lega un termine al successivo. Diagramma di flusso Start Legge il valore dellangolo x 1

12 © Piero Demichelis 12 Esempio: calcolo del seno 1 Inizializzazioni: n 1 termine x senx x termass | x | termass > soglia ? Calcola nuovo termine e lo somma a senx. n n+2 termass |termine| Falso Vero Visualizza senx Visualizza sin(x) Stop

13 © Piero Demichelis 13 Esempio: calcolo del seno #include const double soglia = ; main() { double x, senx, termine, termass, n; printf ("Angolo in radianti: "); scanf ("%lf ", &x); n = 1; termine = x; senx = x; if (x < 0) termass = - x; else termass = x; Inizializzazioni

14 © Piero Demichelis 14 Esempio: calcolo del seno /* Ad ogni ciclo calcola un nuovo contributo */ while (termass > soglia) { termine = - termine * (x * x) / ((n+1) * (n+2)); /* nuovo termine */ senx += termine; /* accumula in senx */ n += 2; /* aggiorna n */ if (termine < 0) /* aggiorna il valore assoluto di termine */ termass = -termine; else termass = termine; } printf ("\nIl seno di %lf e' %lf\n", x, senx); printf ("\nValore fornito dalla funzione di libreria: %lf\n", sin(x)); }

15 © Piero Demichelis 15 Istruzione for In altri linguaggi il costrutto for permette di eseguire una istruzione, semplice o composta, per un numero prefissato di volte (ciclo a contatore). Nel linguaggio C è più generale, al punto da poter essere assimilata ad una particolare riscrittura del costrutto while. Sintassi: for ( ; ; ) ;

16 © Piero Demichelis 16 Istruzione for è un'espressione logica; e sono invece espressioni di tipo qualsiasi. L'istruzione for opera secondo il seguente algoritmo: ­viene calcolata ; ­finché è vera (valore non nullo) ; viene eseguita ; viene calcolato.

17 © Piero Demichelis 17 Istruzione for Calcola lespressione Calcola lespressione Diagramma di flusso: I O F V

18 © Piero Demichelis 18 Istruzione for Di fatto il costrutto for è del tutto equivalente al seguente frammento di programma: while ( ) { } Poiché non vi sono restrizioni sulla da eseguire nel corpo del ciclo, questa può contenere a sua volta istruzioni for (for annidati ), o altri costrutti di controllo (if, while, switch, ecc.).

19 © Piero Demichelis 19 Istruzione for Problema: leggere da tastiera un valore intero N e un carattere carat, e visualizzare una riga di N caratteri carat ­esempio: N = 10, carat = * output ********** ­soluzione iterativa: ripeti N volte loperazione stampa carat ­ Programma: #include main() { int N, indice; char carat; printf ("\nIntroduci un carattere e un intero: "); scanf ("%c%d", &carat, &N); for (indice=0; indice

20 © Piero Demichelis 20 Istruzione for: esercizio Leggere da tastiera un numero intero N; successivamente leggere da tastiera N numeri interi, e calcolarne la media. Inoltre si controlli che ogni numero inserito sia compreso tra 0 e 30; in caso contrario, il numero deve essere ignorato. Al termine visualizzare la media dei soli valori validi. Analisi: ­Problema iterativo: si devono leggere N numeri da tastiera. ­Calcolo della media e controllo di ogni valore inserito (tra 0 e 30).

21 © Piero Demichelis 21 Istruzione for: soluzione Pseudocodice: ­Legge N da tastiera; ­Inizializza a 0 il totale (totale) ; ­Inizializza a 0 un contatore per i validi (cont_validi); ­Con un indice ind che va da 1 a N: legge un valore num da tastiera; Se num è 30 segnala che non è un valore valido e lo trascura, ­altrimenti : accumula num nel totale; incrementa di 1 cont_validi; ­Calcola la media (totale / cont_validi).

22 © Piero Demichelis 22 Istruzione for: soluzione #include main() { int num, ind, N, totale, cont_validi; clrscr(); totale = 0; cont_validi = 0; printf ("\nIntroduci N: "); scanf ("%d", &N);

23 © Piero Demichelis 23 Istruzione for: soluzione for (ind = 1; ind <= N; ind++) { /* per ogni valore introdotto */ printf ("\nIntroduci il valore di indice %d: ", ind); scanf ("%d", &num); if (num 30) /* controllo validità */ printf ("\nValore non valido"); else { totale += num; /* accumula num nel totale */ cont_validi++; } printf ("\nLa media è: %f\n", (float)totale/(float)cont_validi); }

24 © Piero Demichelis 24 Esercizio: generazione di un triangolo Realizzare un programma in grado di generare un triangolo di "*" sul video, le cui dimensioni (numero di righe su cui si sviluppa il triangolo) siano fornite da tastiera. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Poiché il video è composto da 80 colonne, sia 80 la dimensione massima.

25 © Piero Demichelis 25 Generazione di un triangolo: soluzione Una possibile organizzazione del programma potrebbe essere costituito dalla seguente struttura: ­controlla se il numero di colonne (calcolato in base al numero di righe) è < di 80; ­se nrighe è il numero di righe da stampare, per nrighe volte esegui: - scrivi un certo numero di spazi; - scrivi un certo numero di "*".

26 © Piero Demichelis 26 Generazione di un triangolo: soluzione Per la relazione tra il numero di spazi ed il numero di '*' si consideri la figura: 1 a riga * 2 a riga * * * 3 a riga * * * * * n a riga * * * * * * * N o spazi - nell'ultima riga se ne devono stampare 0, nella penultima 1, nella terzultima 2, ecc.: in una generica riga rigacorr saranno: nrighe - rigacorr; N o asterischi - nella prima riga se ne deve stampare 1, nella seconda 3, nella terza 5, ecc.: nella generica riga rigacorr saranno: (rigacorr*2) - 1.

27 © Piero Demichelis 27 Generazione di un triangolo: soluzione #include main() { int nrighe, ncolon, rigacorr, coloncorr; printf ( " \nNumero righe del triangolo: "); scanf ("%d", &nrighe); printf ("\n\n\n"); ncolon = nrighe * 2 - 1; /* calcola il numero di colonne */ if (ncolon >= 80) printf ( " \nErrore: troppe colonne!"); else {

28 © Piero Demichelis 28 Generazione di un triangolo: soluzione for (rigacorr = 1; rigacorr <= nrighe; rigacorr++) { for (coloncorr = 1; coloncorr <= (nrighe - rigacorr); coloncorr++) printf (" "); /* output degli spazi */ for (coloncorr = 1; coloncorr <= (rigacorr*2)-1; coloncorr++) printf ("*"); /* output degli asterischi */ printf ("\n"); /* output di new line: finita una riga! */ }

29 © Piero Demichelis 29 Istruzione do... while Sintassi: do while ( ) Ripeti, che può essere semplice o composta, finché è vera. I O F V

30 © Piero Demichelis 30 Istruzione do... while: osservazioni Listruzione do... while realizza il costrutto repeat - until della programmazione strutturata. deve essere di tipo logico ed è calcolata ad ogni iterazione; pertanto è sempre eseguita almeno una volta (anche se è subito falsa); se non diventa mai falsa non si esce mai dal loop! come per gli altri costrutti è una normale istruzione composta e può contenere qualsiasi tipo di istruzione o costrutto (altri while, if, switch, ecc.), dando origine a strutture annidate.

31 © Piero Demichelis 31 Istruzione do... while: esempio Calcolare il valore della serie armonica: terminando il calcolo quando un fattore contribuisce per meno di La serie armonica si trova in numerose applicazioni quale, ad esempio, il calcolo degli interessi composti.

32 © Piero Demichelis 32 Istruzione do... while: esempio #include const double soglia = ; main() { double y, termine; int n; y = 0.0; n = 1; do { termine = 1.0 / n; y += termine; n++; } while (termine > soglia); printf ("\nIl valore (trovato per n= %d) è: %lf ", (n-1), y); }


Scaricare ppt "INFORMATICA Strutture iterative. © Piero Demichelis 2 Strutture iterative Si dice ciclo (loop) una sequenza di istruzioni che deve essere ripetuta più"

Presentazioni simili


Annunci Google