Si vogliono stampare su schermo i numeri interi da 10 a 50. In Java si potrebbe fare un programma con una linea per ogni valore di da 10 a 50, ossia un programma di questo genere:
class Interi { public static void main(String[] args) { System.out.println("10"); System.out.println("11"); System.out.println("12"); ... System.out.println("50"); } }
Come è facile immaginare, il programma completo Interi.java in cui ci sono tutte le istruzioni al posto dei puntini ... è piuttosto lungo. Se si pensa a quando potrebbe essere lungo un programma che stampa i numeri interi da -400 a +23000, risulta evidente che questo tipo di programmi sequenziali non è fattibile.
In Java esistono delle istruzioni composte, dette istruzioni di ciclo, che permettono di ripetere una stessa istruzione per più volte. Questo è utile per esempio nel caso della stampa dei numeri interi, in cui vogliamo ripetere molte volte la istruzione di stampa.
Una tipica istruzione di ciclo è il for. Iniziamo dando una versione semplificata.
for( variabile=valore1; variabile<=valore2; variabile=variabile+1 ) { istruzione1 istruzione2 ... }
Questa istruzione composta viene detta ciclo for. Le istruzioni dentro il blocco (istruzione1, istruzione2, ecc.) vengono eseguite una prima volta con variabile=valore1, una seconda volta con variabile=valore1+1, una terza volta con variabile=valore1+2, ecc. fino a che non si arriva alla esecuzione con variabile=valore2, e a questo punto l'esecuzione del ciclo finisce, cioè si passa ad eseguire la prima instruzione che sta fuori dal ciclo.
Riconsideriamo ora il programma di stampa di interi da 10 a 50. Il problema si risolve con una operazione di stampa che viene ripetuta per ogni numero intero da 10 a 50. In altre parole, si può pensare a ripetere la singola istruzione
System.out.println(i);
una volta con i=10, una volta con i=11, una volta con i=12, ecc fino all'ultima volta con i=50. Questo è chiaramente equivalente al problema di partenza. Inoltre, è esattamente il tipo di problema che si risolve con un ciclo for: la ripetizione di una stessa istruzione con valori crescenti di una variabile. Dal momento che la variabile che deve cambiare valore è i, e deve andare da 10 a 50, un programma complessivo che usa il ciclo for è il seguente InteriFor.java.
/* Stampa i numeri interi da 10 a 50. */ class InteriFor { public static void main(String[] args) { int i; for(i=10; i<=50; i=i+1) { System.out.println(i); } } }
Nel caso ci fossero dubbi sulla interpretazione dei cicli for, un meccanismo che permette di chiarire in che modo vengono eseguite le istruzioni è quello di scrivere esplicitamente il ciclo per esteso. Si parte da un generico ciclo for:
for( variabile=valore1; variabile<=valore2; variabile=variabile+1 ) { istruzione1; istruzione2; istruzione3; }
Per semplicità si considerano solo tre istruzioni. Per definizione, le istruzioni interne al ciclo vengono eseguite una volta con variabile=valore1, una volta con variabile=valore1+1, ecc. Quindi, per definizione, si può pensare al ciclo di sopra come al programma senza cicli di sotto:
variabile=valore1; istruzione1; istruzione2; istruzione3; variabile=valore1+1; istruzione1; istruzione2; istruzione3; variabile=valore1+2; istruzione1; istruzione2; istruzione3; ... variabile=valore2; istruzione1; istruzione2; istruzione3;
Il programma di sotto, per poter essere effettivamente scritto ed eseguito, richiede tutte le istruzioni scritte per esteso: non si possono lasciare i puntini ... per indicare le istruzioni in mezzo. Questo procedimento di scrivere per esteso il ciclo conviene solo per capire cosa viene effettivamente fatto da un ciclo, mentre non è conveniente programmare scrivendo i cicli per esteso.
Per esercizio, provare a seguire questo procedimento di scrittura esplicita del ciclo for sul programma InteriFor.java che stampa i numeri interi da 10 a 50 con un ciclo for.