Libro 1 – Capitolo 5 – Le strutture cicliche

Indice degli Argomenti

Introduzione

Quando all’interno di un algoritmo sorge la necessità di ripetere una sequenza di operazioni più volte, si ricorre alle strutture cicliche. Un ciclo per definizione è una sequenza di passi di un algoritmo che viene ripetuta un certo numero di volte. Il numero delle ripetizioni, è detto anche numero di iterazioni. Esistono varie strutture cicliche condizionate e iterative. Nel primo caso il numero delle iterazioni è condizionato ovvero vi è una condizione di selezione binaria che determina il numero delle iterazioni. Nella struttura ciclica iterativa vi è sempre un numero prefissato di iterazioni. In entrambe le tipologie di ciclo deve essere sempre dichiarata una variabile che svolga il controllo del ciclo ovvero su il suo valore si decide se continuare o meno il ciclo (nel caso di struttura ciclica condizionata) o come contatore delle iterazioni nel caso della struttura iterativa.
Struttura con condizione iniziale: In questo caso la condizione è inserita all’inizio del ciclo; se si verifica la stesa si passa all’esecuzione del corpo del ciclo ovvero delle istruzioni da ripetere, altrimenti si esce eseguendo la prima istruzione fuori dal ciclo.
Struttura con condizione alla fine: In questo caso la condizione è dopo il corpo del ciclo e se essa p falsa si ritorna a ripetere il corpo del ciclo, altrimenti si esce.
Nel primo caso (condizione iniziale) se la condizione non si verifica il ciclo non viene eseguito neanche una volta, mentre nel secondo caso almeno una volta il corpo del ciclo deve essere eseguito.

Strutture cicliche condizionali

La struttura generale del ciclo con condizione iniziale è:

Struttura ciclica while in pseudocodice:
Mentre (condizione)
 Istruzione 1
 istruzione 2
Fine mentre
 istruzione 3

In pseudocodifce:

Mentre (condizione)
istruzione 1
istruzione 2
Fine Mentre
Istruzione 3

Nel caso di ciclo con condizione in coda la struttura è generale:

In pseudocodice:
Ripeti
Istruzione 1
Istruzione 2
Finché (condizione)
Istruzione 3

In Pseudocodifica è:

Ripeti
Istruzione 1
Istruzione 2
Finché (Condizione)
Istruzione 3

La differenza sostanziale fra le strutture cicliche condizionali, risiede nelle modalità con i quali è eseguito il corpo del ciclo.
Infatti nella struttura ciclica con condizione iniziale (pre condizionale), se la condizione è falsa il corpo del ciclo non viene eseguito.
Invece nella struttura ciclica con condizione finale (post-condizionale), la ripetizione è eseguita almeno una volta proprio perchè la verifica della condizione avviene, dopo il corpo del ciclo.

Esercizio: Eseguire la somma dei numeri naturali partendo da 1 fino a che la somma non supera 100 e comunicare il risultato raggiunto.La tabella dati è:

UsoNomeTipo
LavoroContIntero
OutputSommaIntero

Non sono presenti dati di input, poiché i numeri sono generati dal ciclo, mediante l’incremento della variabile contatore. Il flow chart per risolvere il problema è:

Struttura ciclica iterativa

In questo ciclo il numero delle iterazioni o ripetizioni e prefissato e gestito da un contatore detto di “ciclo” il quale parte da un valore iniziale e arriva ad un valore ripetendo il corpo del ciclo. La struttura in linguaggio naturale si traduce nel seguente modo:

Per contattore ciclo= valore iniziale a valore finale esegui
istruzione 1
istruzione 2
istruzione 3
….
Fine ciclo.

Il flow chart che rappresenta la struttura ciclica iterativa è questa sotto riportata:

Schema ciclo for
per contatore = valore iniziale fino valore finale con passo fai:
istruzione 1
istruzione 2
fine fper
istruzione 3

Per l’uso di questa struttura ciclica iterativa è necessario dichiarare una variabile contatore che conti il numero di ripetizioni.
E’ possibile in alcuni linguaggi di programmazione utilizzare una variabile contatore come un enumeratore per selezionare dei valori non semplicemente numerici.
Alcuni esempi di intervalli validi per un ciclo iterativo detto anche ciclo “for” sono;

k=1…20 passo 1

k=20 a 1 passo -1

k=-10..10 passo 2 -10,-8,-6,….,0,—.20

carattere= “a” …”z” (questo se supportato dal linguaggio di programmazione)

giorni = lunedì … venerdì ( con dati di tipo enumerativo o insieme sempre in base al linguaggio).

Un primo esercizio


Come esempio si può pensare al seguente problema calcolare la media dei primi 20 numeri interi. I dati del problema sono:

UsoNomeTipo
Lavoroiintero
LavoroSommaintero
OutputMediaReale


Dati Input non ve ne sono in quanto i numeri vengono calcolati automaticamente
Dati interni contatore del ciclo di tipo intero di nome i; somma di tipo intero;
Dati Output media che è di tipo reale.
Pertanto l’algoritmo sulla base dei dati del problema è medainte il flow chart:
Un altro problema potrebbe essere: Calcolare la media dei numeri dispari contenuti nei primi 100 numeri. I dati del problema sono gli stessi dell’esempio precedente e pertanto l’algoritmo diventa:

Algoritmo risolutivo del problema

In questo caso il paso del ciclo iterativo è di 2 e parte da 1; in questo modo i numeri dispari sono selezionati dal ciclo.
Come si può notare sono bastate due modifiche per risolvere il problema. Il ciclo iterativo si adatta a tutti quei problemi in cui il numero delle ripetizioni è già prefissato. Il passo 3 rappresenta la definizione del ciclo ovvero chi è il contatore quante sono le iterazioni.

Strutture cicliche nidificate


E’ possibile realizzare anche delle strutture cicliche a più livelli dette nidificate come ad esempio:

Ciclo 1
Ciclo 2
Corpo ciclo 2
Fine ciclo 2
Istruzione 1
Istruzione 2
…..
Fine Ciclo 1

Tutte le istruzioni comprese fra “Ciclo 1” e “Fine ciclo 1” sono il corpo del primo ciclo che a sua volta contiene il ciclo 2 e delle istruzioni. Supponiamo a tal scopo di voler risolvere il problema:
Stampare a video i multipli di 2,3,4,5,6,7,8,9,10 dei primi 500 numeri. in questo algoritmo si utilizza proprio una struttura ciclica a due livelli che può essere svolta sia con strutture cicliche condizionate, che attraverso delle strutture iterative.
I dati del problema sono solo interni in quanto attraverso i cicli calcoliamo e selezioniamo i multipli prima di 2, poi di 3, poi di 4, e così via. Pertanto avremo due dati interni che sono i e k di tipo intero. L’algoritmo si può pertanto impostare in questo modo:

UsoNomeTipo
Lavoroi,kintero
LavoroSommaintero
OutputMediaReale

L’algoritmo risolutivo utilizza un doppio ciclo “for” ed è:

AAlgoritmo risolutivo del problema.

La codifica in linguaggio naturale è:
Inizio
Scrivi “Stampa dei multipli di 2,3,4,5,6,7,8,9,10”
Per i=2 a 10 esegui
Per k= 1 a 500 esegui
k=i*k
se k<= 500 allora
scrivi k
fine ciclo 2
fine ciclo 1
Fine


In questo problema è stato modificato l’indice k per selezionare i multipli di k. La condizione mi tiene conto del fatto che quando il valore del numero k è maggiore di 500 non si deve stampare nulla e si aspetta la fine del ciclo per passare all’individuazione dei multipli successivi.

Algoritmi con Strutture cicliche condizionali

All’inizio del capitolo sono state presentate le strutture cicliche condizionali, molto utili quando il ciclo deve essere interrotto al verificarsi di una condizione. Immaginiamo ad esempio, un inserimento dati ripetuto da parte dell’utente. Ad esempio un inserimento di prodotti con i relativi dati; l’utente conferma ad ogni iterazione se continuare l’inserimento. Questo tipo di ciclo è denominato “Ciclo a rottura di codice” molto utilizzato quando occorre caricare ed elaborare grandi quantità di dati. Nel capitolo 6, ove saranno esaminate le strutture dati quali gli array, sarà affrontato in modo chiaro questa tipologia di ciclo.
Come esempio di esercizio risolviamo il problema:

Sommare dei numeri inseriti in Input, l’operazione di somma è interrota quando è raggiunto o superato un valore prefissato, visualizzare il risultato raggiunto e quanti numeri sono stati sommati..
La tabella dati è pertanto

UsoNomeTipo
InputXIntero
InputsIntero
OutputContIntero
OutputSommaIntero

Il valore x è il numero inserito di volta in volta da tastiera, s è il valore prefissato, cont è la variabile che conterrà il numero di dati inserito (i nostri numeri), somma è il risultato.
L’algoritmo può essere risolto con struttura ciclica pre-condizionale, o post-condizionale.
L’algoritmo risolto con la ripetizione indefinita pre-condizionale è:

Diagramma di flusso  del problema.