07: Cicli While e Do while

In questa sede descriveremo il funzionamento generale di alcuni costrutti tipici di qualsiasi linguaggio di programmazione che prendono il nome di cicli, soffermandoci in particolare sull’analisi del ciclo while e dell’analogo do…while.

Un ciclo non è altro che una serie di istruzioni che vengono ripetute un numero arbitrario di volte in base al verificarsi di certe condizioni logiche.
Partiamo subito con un esempio di ciclo while:

#include <stdio.h>

int i=0;
int n;
int somma=0;
float media=0;

int main()
{

printf("questo programma calcola la media di 5 numeri interi inseriti da tastiera\n");

while (i<5)                                 //condizione del while

{
  printf("inserisci un numero\n);           // istruzioni ...
  scanf("%d", &n);
                                             
  somma=somma+n;                            
  i=i+1;                                    //istruzione di incremento del contatore (OBBLIGATORIA) 

}

media=somma/i;
printf("la media è %f", media);
return 0;


}

il cui output e’ il seguente:
Screenshot 2015-11-16 18.08.35


L’istruzione while è nella forma:

while(condizione) { ..}

Nelle parentesi tonde va inserita una condizione di logica booleana, che può assumere valore vero oppure falso. Potete trovare maggiori informazioni qui. Nelle parentesi graffe invece vanno inserite le istruzioni che si vuole ripetere. Se all’esecuzione dell’istruzione while la condizione risulta vera, inizia l’esecuzione delle istruzioni contenute all’interno delle parentesi graffe. Arrivati all’ultima di queste istruzioni, viene ricontrollata la veridicità della condizione iniziale. Se questa risulta ancora vera le istruzioni del tra le parentesi graffe vengono ripetute un’altra volta, altrimenti il programma esce dal ciclo e prosegue con le istruzioni successive. Se alla prima esecuzione dell’istruzione while la condizione tra parentesi tonde risulta falsa, le istruzioni contenute nel ciclo non vengono mai eseguite. Al contrario se la condizione rimane sempre vera le istruzioni del ciclo verranno ripetute infinite volte: il programma entra in un ciclo infinito e non terminerà mai, perché rimanendo bloccato nel ciclo non potrà mai eseguire l’istruzione return che pone fine all’esecuzione della funzione main!
Per evitare questo dobbiamo scegliere delle condizioni da mettere tra parentesi tonde che siano ben costruite. Per chiarezza è bene sapere che il calcolatore sostituisce alla condizione inserita tra le parentesi una variabile booleana che vale 0 se la condizione è falsa, mentre vale 1 se è vera. Questo implica che se provassimo a scrivere un programma fatto in questo modo:

while (1)
{
    //istruzioni..
}

otterremo sicuramente un ciclo infinito.

Torniamo ora al programma iniziale: la variabile intera i ha funzione di contatore ovvero serve a controllare il numero di volte che vengono ripetute le istruzioni all’interno del ciclo while. All’inizio viene inizializzata a 0 (si noti che è molto importante la fase di inizializzazione in questo caso!) ed è usata nella condizione del ciclo. Arrivato all’istruzione while il calcolatore controlla che i sia minore di 5, e dato che questo è verificato può iniziare ad eseguire le istruzioni del ciclo la prima volta. L’ultima istruzione del ciclo è quella che serve ad incrementare il valore del nostro contatore i, in questo caso viene incrementato di 1. Quindi finita la prima esecuzione del ciclo i sarà uguale a 1. A questo punto il calcolatore torna indietro a verificare la condizione logica. Si noti che i parte dal valore 0 e non 1, questo implica che se vogliamo che il ciclo venga ripetuto 5 volte (e non 6) dobbiamo scrivere nella condizione i<5 piuttosto che i<=5.

Esiste un’altra versione simile del for in cui la condizione logica viene messa alla fine delle istruzioni del ciclo piuttosto che all’inizio; stiamo parlando del do..while, che ha la forma seguente:

do
{
//istruzioni

//istruzione di incremento del contatore
}
while(condizione)

In questo caso, al contrario del while semplice, le istruzioni all’interno del ciclo vengono sempre eseguite almeno una volta, e soltanto dopo averle eseguite viene controllata la condizione, che se risulta vera induce il calcolatore a ripetere le istruzioni tra le parentesi graffe un’altra volta.
I due costrutti while e do..while sono equivalenti, nel senso che si può scegliere di usare uno o l’altro a seconda dei gusti.
Come esercizio si può provare a riscrivere il programma iniziale che calcola la media di 5 numeri inseriti da tastiera usando il do..while.
Dovrebbe uscire un codice fatto più o meno in questo modo:


#include <stdio.h>

int i=0;
int n;
int somma=0;
float media=0;

int main()
{

printf("questo programma calcola la media di 5 numeri interi inseriti da tastiera\n");

do                              

{
  printf("inserisci un numero\n");           // istruzioni ...
  scanf("%d", &n);

  somma=somma+n;                            
  i=i+1;                                    //istruzione di incremento del contatore (OBBLIGATORIA) 

}
while(i<5);                                  //condizione

media=somma/i;
printf("la media e' %f", media);
return 0;


}

Anche per oggi è tutto, alla prossima!

Please follow and like us: