Stampa di numeri interi

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.