1 / 32

INFORMATICA Strutture iterative

INFORMATICA Strutture iterative. 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

kirra
Download Presentation

INFORMATICA Strutture iterative

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. INFORMATICAStrutture iterative

  2. Strutture iterative • Si dice ciclo (loop) una sequenza diistruzioni 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 l’istruzione che esegue il calcolo del fattoriale, poiché la formula contiene tanti fattori quanti ne indica n. . . . .......

  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, • poifatt per 3 e così via fino a n. ..... . . . ..... .

  4. Strutture iterative • L'algoritmo di soluzione può quindi essere formalizzato mediante un algoritmoiterativo: • 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. 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. Istruzione while • Sintassi: while (<condizione>) <istruzione> • Finché <condizione> è vera esegue <istruzione> che può essere semplice o composta. I F <condizione> O V <istruzione>

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

  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 l’accumulatore di risultato S a 0; • inizializza un contatore indice a 1; • finché indice <= N; • aggiungi all’accumulatore S il valore di indice; • aggiorna indice (ovvero incrementalo di 1); • visualizza il risultato finale (valore di S).

  9. Istruzione while: esempio #include <stdio.h> 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. Esempio: calcolo del seno • Calcolare la funzione seno x mediante lo sviluppo in serie sino quando i fattori sono > 0.00005. • Osservando i singoli fattori dello sviluppo si può osservare che: • con N che varia a passi di 2.

  11. Esempio: calcolo del seno • Il primo termine lo conosciamo all’atto della lettura da tastiera del valore in radianti dell’angolo. • 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 dell’angolo x 1

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

  13. Esempio: calcolo del seno #include <stdio.h> #include <math.h> const double soglia = 0.00005; 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. 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. 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 (<inizializzazione>; <condizione>; <aggiornamento>) <istruzione>;

  16. Istruzione for • <condizione> è un'espressione logica; • <inizializzazione> e <aggiornamento> sono invece espressioni di tipo qualsiasi. • L'istruzione for opera secondo il seguente algoritmo: • viene calcolata <inizializzazione>; • finché <condizione> è vera (valore non nullo) ; • viene eseguita <istruzione>; • viene calcolato <aggiornamento>.

  17. Istruzione for I Diagramma di flusso: Calcola l’espressione <inizializzazione> F <condizione> O V <istruzione> Calcola l’espressione <aggiornamento>

  18. Istruzione for • Di fatto il costrutto for è del tutto equivalente al seguente frammento di programma: <inizializzazione> while (<condizione>) { <istruzione> <aggiornamento> } • Poiché non vi sono restrizioni sulla <istruzione> 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. 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 l’operazione “stampa carat ” • Programma: • #include <stdio.h> • main() { • int N, indice; • char carat; • printf ("\nIntroduci un carattere e un intero: "); • scanf ("%c%d", &carat, &N); • for (indice=0; indice<N; indice++) • printf ("%c", carat); /*senza ‘\n’ !!!!*/ • printf ("\n"); • }

  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. 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 è < 0 oppure > 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. Istruzione for: soluzione #include <stdio.h> #include <conio.h> main() { int num, ind, N, totale, cont_validi; clrscr(); totale = 0; cont_validi = 0; printf ("\nIntroduci N: "); scanf ("%d", &N);

  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 < 0 || 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. 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. Generazione di un triangolo: soluzione • Una possibile organizzazione del programma potrebbe essere costituito dalla seguentestruttura: • controlla se il numero di colonne (calcolato in base al numero di righe) è < di 80; • se nrighe è il numero di righe da stampare, per nrighevolte esegui: - scrivi un certo numero di spazi; - scrivi un certo numero di "*".

  26. Generazione di un triangolo: soluzione • Per la relazione tra il numero di spazi ed il numero di '*' si consideri la figura: 1a riga * 2a riga * * * 3a riga * * * * * na 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. Generazione di un triangolo: soluzione #include <stdio.h> 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. 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. Istruzione do ... while • Sintassi: do <istruzione> while (<condizione>) • Ripeti <istruzione>, che può essere semplice o composta, finché <condizione> è vera. I <istruzione> V <condizione> F O

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

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

  32. Istruzione do ... while: esempio #include <stdio.h> const double soglia = 0.00005; 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); }

More Related