Cicli con decremento

Tutti i cicli visti fino ad ora consistevano nella ripetizione di istruzioni, con una variabile che assumeva valori crescenti. In particolare, ad ogni esecuzione delle istruzioni, questa variabile viene aumentata di 1. In alcuni casi, è invece necessario ripetere delle istruzioni decrementando una variabile ad ogni passo, per esempio se si vuole eseguire delle istruzioni mettendo prima x=100 poi x=99, ecc. Un altro caso che non si può fare con i cicli visti fino ad ora è quello in cui la variabile deve aumentare o diminuire di 10 ad ogni passo. Per questo genere di casi, occorre introdurre la struttura generica del ciclo for. Il generico ciclo for contiene come argomenti una istruzione, una condizione e un'altra istruzione:

for(istruzione1, condizione, istruzione2) {
  A
}

In questo schema, A è un blocco di istruzioni. La esecuzione di questo ciclo equivale alla seguente sequenza di istruzioni:

instruzione1;
if( condizione ) {
  A;
  istruzione2;
  if( condizione ) {
    A;
    istruzione2;
    ....

In altre parole, si esegue istruzione1 e si controlla la condizione. Se la condizione è verificata, si eseguono prima A e poi istruzione2, si verifica di nuovo la condizione e si ripete da capo. In altre parole, una volta eseguita istruzione1, si ripete la esecuzione di A e istruzione2, e questo viene ripetuto ancora e ancora se condizione è verificata. In italiano:

esegui instruzione1
se la condizione e' verificata
allora: -esegui A
        -esegui istruzione2
        -se la condizione e' verificata
         allora: .esegui A
                 .esegui istruzione2
                 .se la condizione e' verificata
                  ....

Si noti che non è sempre possibile scrivere esplicitamente il blocco di istruzioni condizionali che corrisponde a un ciclo for. Questa traduzione è utile nel caso in cui si abbia qualche dubbio sul comportamento di un certo ciclo for: in questo caso si può pensare di sviluppare la espansione in istruzioni condizionali (fino a un certo punto) per verificare se il comportamento del ciclo è quello previsto.

Con questa definizione, è facile realizzare dei cicli nei quali una variabile, invece di assumere valori crescenti, prende valori decrescenti. Per esempio, se si vogliono stampare i numeri interi da 100 a 0 in ordine decrescente (si parte da 100 e si arriva a 0), si può usare un ciclo for in cui la istruzione2 decrementa a ogni passo il valore di una variabile, come viene fatto nel programma ContaIndietro.java:

/*
  Stampa gli interi da 100 a 0 in ordine decrescente.
*/

class ContaIndietro {
  public static void main(String[] args) {
    int x;

    for(x=100; x>=0; x=x-1) {
      System.out.println(x);
    }
  }
}

Il ciclo questa volta contiene x=x-1 come seconda istruzione. Questo vuol dire che, ad ogni passo, il valore di i scende di uno. Si noti l'inversione della condizione: dal momento che occorre terminare il ciclo quando x raggiunge il valore 0, e x vale più di zero prima, la condizione che fa continuare ad eseguire il ciclo delve essere x>=0. Nel caso di cicli con incremento la condizione sarebbe stata, sempre nel caso in cui l'ultimo valore con cui eseguire il ciclo è 10, x<=10.

Esempio

Stampare i valori della funzione f(x)=x3-45 per x che vale 100, 90, 80, ..., -100, ossia valori che decrescono di 10 per volta, partendo da 100 e arrivando a -100. Si tratta chiaramente di un problema risolubile con un ciclo for in cui la variabile x parte da 100, viene decrementata di dieci ad ogni passo, e si continua ad eseguire un ciclo se x è maggiore o uguale a -100. Il ciclo for è simile al precedente, in cui la istruzione che viene eseguita per prima assegna 100 alla variabile x, la istruzione che viene eseguita ogni volta è il decremento di x, e la condizione è x>=-100. Il programma ValoriDecrescenti.java risolve questo problema.

/*
  Stampa i valori di una funzione con valori
  decrescenti dall'argomento.
*/

class ValoriDecrescenti {
  public static void main(String[] args) {
    int x,f;

    for(x=100; x>=-100; x=x-10) {
      f=x*x-10*x+50;
      System.out.println("Per x="+x+" la funzione vale "+f);
    }
  }
}

La istruzione che viene eseguita ad ogni passo è la istruzione x=x-10; che decremea il contenuto di x di 10.