34
INFORMATICA Strutture iterative

5 Strutture Iterative

Embed Size (px)

Citation preview

Page 1: 5   Strutture Iterative

INFORMATICA

Strutture iterative

Page 2: 5   Strutture Iterative

2 © Piero Demichelis

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 l’istruzione che esegue il calcolo del fattoriale, poiché la formula contiene tanti fattori quanti ne indica n.

. . ........

Page 3: 5   Strutture Iterative

3 © Piero Demichelis

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.

...... . . ..... .

Page 4: 5   Strutture Iterative

4 © Piero Demichelis

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.

.

Page 5: 5   Strutture Iterative

5 © Piero Demichelis

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.

Page 6: 5   Strutture Iterative

6 © Piero Demichelis

Istruzione while

<condizione>

V

F

<istruzione>

• Sintassi:

while (<condizione>)<istruzione>

• Finché <condizione> è vera esegue <istruzione> che può essere semplice o composta.

I

O

Page 7: 5   Strutture Iterative

7 © Piero Demichelis

Istruzione while : osservazioni

• Il costrutto while realizza il costrutto while – do della programmazione strutturata.

• <condizione> deve essere di tipo logico ed è ricalcolata ad 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.

Page 8: 5   Strutture Iterative

8 © Piero Demichelis

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).

Page 9: 5   Strutture Iterative

9 © Piero Demichelis

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

}

Page 10: 5   Strutture Iterative

10 © Piero Demichelis

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.

3 5 7

sin3! 5! 7!

x x x

x x

. .

1 2

x xfatt fatt prec

N N

Page 11: 5   Strutture Iterative

11 © Piero Demichelis

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 flussoStart

Legge il valore dell’angolo x

1

Page 12: 5   Strutture Iterative

12 © Piero Demichelis

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

VeroVisualizza senx

Visualizza sin(x)

Stop

Page 13: 5   Strutture Iterative

13 © Piero Demichelis

Esempio: calcolo del seno#include <stdio.h>#include <math.h>const double soglia = 0.00005;

main(){double x, senx, termine, termass;int n;

printf (“\nAngolo in radianti: ");scanf ("%lf ", &x);

n = 1;termine = x;senx = x;if (x < 0) termass = - x; else termass = x;

Inizializzazioni

Page 14: 5   Strutture Iterative

14 © Piero Demichelis

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

Page 15: 5   Strutture Iterative

15 © Piero Demichelis

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

Page 16: 5   Strutture Iterative

16 © Piero Demichelis

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

Page 17: 5   Strutture Iterative

17 © Piero Demichelis

Istruzione for

Calcola l’espressione<inizializzazione>

<istruzione>

Calcola l’espressione<aggiornamento>

Diagramma di flusso:I

O<condizione> F

V

Page 18: 5   Strutture Iterative

18 © Piero Demichelis

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.).

Page 19: 5   Strutture Iterative

19 © Piero Demichelis

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

}

Page 20: 5   Strutture Iterative

20 © Piero Demichelis

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).

Page 21: 5   Strutture Iterative

21 © Piero Demichelis

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).

Page 22: 5   Strutture Iterative

22 © Piero Demichelis

Istruzione for: soluzione

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

main() { int num, ind, N, totale, cont_validi;

clrscr(); /* pulisce lo schermo in Turbo C */ printf ("\nIntroduci N: "); scanf ("%d", &N); totale = 0; cont_validi = 0;

Page 23: 5   Strutture Iterative

23 © Piero Demichelis

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

Page 24: 5   Strutture Iterative

24 © Piero Demichelis

Generazione di un Triangolo rettangolo

Realizzare un programma che legga da tastiera l’altezza di un triangolo rettangolo e lo disegni sul monitor nel modo seguente:

Introduci l’altezza: 7

****************************

Page 25: 5   Strutture Iterative

25 © Piero Demichelis

Generazione di un Triangolo rettangolo

#include <stdio.h>

main(){ int riga, colonna, alt;

printf (“\nIntroduci l’altezza: "); scanf ("%d", &alt);

for (riga = 1; riga <= alt; riga++) { for ( colonna = 1; colonna <= riga; colonna++)

printf ("*"); printf ("\n"); }}

Page 26: 5   Strutture Iterative

26 © Piero Demichelis

Generazione di un triangolo isoscele

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.

Page 27: 5   Strutture Iterative

27 © Piero Demichelis

Generazione di un triangolo isoscele

• 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 "*".

Page 28: 5   Strutture Iterative

28 © Piero Demichelis

Generazione di un triangolo isoscele

• 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.

Page 29: 5   Strutture Iterative

29 © Piero Demichelis

Generazione di un triangolo isoscele

#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 {

Page 30: 5   Strutture Iterative

30 © Piero Demichelis

Generazione di un triangolo isoscele

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

}

}

}

Page 31: 5   Strutture Iterative

31 © Piero Demichelis

Istruzione do ... while

• Sintassi:

do <istruzione>while (<condizione>)

• Ripeti <istruzione>,che può essere semplice o composta,finché <condizione> è vera.

<istruzione>

<condizione>

I

OF

V

Page 32: 5   Strutture Iterative

32 © Piero Demichelis

Istruzione do ... while: osservazioni

• L’istruzione do ... while realizza il costrutto repeat - until della programmazione strutturata.

• <condizione> deve essere di tipo logico ed è calcolata ad 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.

Page 33: 5   Strutture Iterative

33 © Piero Demichelis

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 applicazioni quale, ad esempio, il calcolo degli interessi composti.

1 1 112 3

y nn

Page 34: 5   Strutture Iterative

34 © Piero Demichelis

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