Il ciclo while permette di ripetere un gruppo di istruzioni finché una condizione è vera. In questa lezione vediamo come funziona e risolviamo tre esercizi: contare le ripetizioni, calcolare una somma e leggere numeri fino a un valore di arresto.
Prerequisiti: variabili intere, confronti, selezione e input da console. Gli esempi sono programmi console completi in C# e possono essere eseguiti separatamente.
Come funziona il ciclo while
while (condizione)
{
// istruzioni da ripetere
}
Prima viene controllata la condizione. Se è vera, il programma esegue il corpo del ciclo e torna al controllo. Se è falsa, passa all’istruzione successiva al ciclo. Il corpo può quindi essere eseguito anche zero volte.
Per progettare il ciclo individua tre elementi: il valore iniziale delle variabili, la condizione di permanenza e le istruzioni che fanno avanzare l’elaborazione verso la conclusione.
Esercizio 1 — Stampare i numeri da 1 a 5
Consegna. Scrivi un programma che stampi i numeri interi da 1 a 5, uno per riga, usando un ciclo while.
Ragionamento. Il contatore parte da 1. Le istruzioni si ripetono finché il contatore è minore o uguale a 5. Dopo ogni stampa il contatore aumenta di uno.
using System;
class Program
{
static void Main()
{
int cont = 1;
while (cont <= 5)
{
Console.WriteLine(cont);
cont++;
}
}
}
Risultato atteso: 1, 2, 3, 4 e 5 su righe separate. Segui la tabella di traccia: il controllo finale su 6 serve a uscire dal ciclo.
| cont prima del controllo | cont <= 5 | Azione |
|---|---|---|
| 1 | Vero | Stampa 1, poi cont diventa 2 |
| 2 | Vero | Stampa 2, poi cont diventa 3 |
| 3 | Vero | Stampa 3, poi cont diventa 4 |
| 4 | Vero | Stampa 4, poi cont diventa 5 |
| 5 | Vero | Stampa 5, poi cont diventa 6 |
| 6 | Falso | Il ciclo termina |
Attenzione: il ciclo esegue cinque stampe, ma controlla la condizione sei volte. Se usassimo cont < 5, stamperemmo soltanto 1, 2, 3 e 4.
Esercizio 2 — Sommare i numeri da 1 a n
Consegna. Leggi un intero n compreso tra 0 e 10000. Calcola la somma dei numeri da 1 a n con un ciclo while. Per n uguale a zero, restituisci zero.
Ragionamento. Servono due variabili diverse: cont indica il numero corrente; somma conserva il totale. Il contatore parte da 1 e l’accumulatore parte da 0.
using System;
class Program
{
static void Main()
{
Console.Write("Inserisci n, da 0 a 10000: ");
if (!int.TryParse(Console.ReadLine(), out int n) ||
n < 0 || n > 10000)
{
Console.WriteLine("Valore non valido.");
return;
}
int cont = 1;
long somma = 0;
while (cont <= n)
{
somma = somma + cont;
cont++;
}
Console.WriteLine("Somma = " + somma);
}
}
A ogni ripetizione aggiungiamo il numero corrente alla somma. Poi incrementiamo il contatore. Usiamo long per l’accumulatore e limitiamo n per mantenere breve l’esecuzione dell’esempio.
Prove: n = 0 produce 0; n = 1 produce 1; n = 4 produce 10; n = 10 produce 55. Un valore negativo, un valore superiore a 10000 o un testo non intero viene rifiutato.
int.TryParse restituisce vero quando il testo rappresenta un intero valido per il tipo int. In caso contrario restituisce falso. Il punto esclamativo inverte il risultato. Il simbolo || esprime l’operatore logico OR.
Esercizio 3 — Contare e sommare fino allo zero
Consegna. Leggi una sequenza di numeri interi, anche negativi. Lo zero termina l’inserimento e non deve essere contato né sommato. Alla fine visualizza quanti numeri validi sono stati inseriti e la loro somma.
Ragionamento. Non conosciamo in anticipo quante letture eseguiremo. Usiamo un valore sentinella, lo zero, per comunicare la fine dell’inserimento. La variabile booleana continua controlla il ciclo.
using System;
class Program
{
static void Main()
{
int quanti = 0;
long somma = 0;
bool continua = true;
while (continua)
{
Console.Write("Numero intero (0 per terminare): ");
string testo = Console.ReadLine();
if (testo == null)
break;
if (!int.TryParse(testo, out int numero))
{
Console.WriteLine("Inserisci un numero intero valido.");
continue;
}
if (numero == 0)
{
continua = false;
}
else
{
quanti++;
somma = somma + numero;
}
}
Console.WriteLine("Numeri inseriti = " + quanti);
Console.WriteLine("Somma = " + somma);
}
}
Se il testo non è un intero valido, continue passa alla ripetizione successiva senza aggiornare contatore e somma. Se il flusso di ingresso termina, Console.ReadLine() restituisce null e break interrompe il ciclo.
Prove: la sequenza 4, -2, 7, 0 produce 3 numeri e somma 9. Inserendo subito 0 ottieni 0 numeri e somma 0. La sequenza 4, ciao, 0 produce un messaggio di errore, poi 1 numero e somma 4.
Il tipo long amplia l’intervallo disponibile per la somma, ma non lo rende infinito. Per questo esempio didattico usiamo sequenze brevi.
Errori comuni
Dimenticare l’incremento. Nel primo esercizio, senza cont++, il contatore resta uguale a 1 e il ciclo non termina.
Confondere contatore e accumulatore. quanti++ conta un elemento; somma = somma + numero aggiunge il suo valore.
Usare il limite sbagliato. Il confronto < esclude il limite; <= lo include.
Mettere un punto e virgola dopo while. In while (cont <= 5); il corpo è un’istruzione vuota. Le parentesi graffe successive non appartengono più al ciclo.
Contare la sentinella. Nell’ultimo esercizio il controllo su zero deve precedere gli aggiornamenti.
Prova da solo
Modifica il primo programma per stampare 5, 4, 3, 2, 1. Nel secondo somma soltanto i numeri pari da 1 a n. Nel terzo conta separatamente i valori positivi e quelli negativi.
Controllo dei risultati: per n = 6 la somma dei pari è 12. Per la sequenza 3, -1, -4, 8, 0 devi ottenere 2 positivi e 2 negativi.
Ripasso rapido
Quando viene controllata la condizione? Prima di ogni esecuzione del corpo. Il corpo viene sempre eseguito? No. Il while richiede sempre un contatore? No: può dipendere, per esempio, da un valore sentinella.
Approfondisci: iterazione precondizionale, pattern contatore e pattern accumulatore.
Continua con il percorso di programmazione ed esercizi: dalle variabili ai vettori e alla programmazione a oggetti.


