Un Approccio a Java: Il Ciclo While



Ciao a tutti e bentornati!

Dopo aver fatto una breve, ma corposa, introduzione sui cicli, andiamo oggi a vedere finalmente le prime implementazioni che utilizzano quello che abbiamo definito ciclo precondizionale.

In Java, come in molti altri linguaggi di programmazione, questo tipo di ciclo viene tradotto con il termine while, che in italiano può essere tradotto con "finchè, fino a quando".

Sintassi

Vediamo, prima di tutto, la sintassi di questo costrutto:

while (condizione) {
  /*Corpo del ciclo*/
}

La definizione sintattica concorda pienamente con la definizione teorica. Se ragioniamo sul fatto che le istruzioni vengono eseguite una dopo l'altra, riusciamo subito a capire che la condizione per cui il ciclo continua ad iterare viene controllata prima dell'esecuzione del corpo. Da qui, capiamo che stiamo avendo a che fare con un ciclo precondizionale.

Condizione o guardia del ciclo 

Vale la pena ribadire alcuni concetti fondamentali riguardanti le condizioni. 

É bene ricordare il fatto che, nel momento in cui ci si trova a dover fare dei controlli, si ha a che fare con elementi dell'algebra booleana. Proprio per questo motivo, valgono le regole che abbiamo definito precedentemente. 

Una nozione fondamentale da conoscere è che le iterazioni vengono eseguite per vero. Significa che i cicli continuano ad iterare sino a quando la condizione è vera. Quindi, ogni volta che scriveremo un ciclo, assumeremo che si continui ad eseguire sino a quando la guardia è vera.

Esempio 1: Stampa dei numeri da 0 a 10

Il primo semplice esempio che vale la pena vedere è il caso in cui vogliamo stampare i numeri da 0 a 10.

public class Main{
  public static void main(String[] args){
    int i = 0;
    while (i <= 10) {
      System.out.println(i);
      i++;
    }
  }
}

L'idea è quindi quella di dichiarare una variabile rappresentante il numero da stampare e di inizializzarla subito a 0.

Dopodichè, si vogliono stampare i numeri fino a dieci, quindi la condizione sarà i <= 10. Si deve quindi continuare ad iterare sino a quando la variabile i ha valore minore uguale di dieci. 

Il corpo del ciclo è relativamente semplice. É composto dall'istruzione per stampare la variabile i, e successivamente vi è l'incremento della variabile.

Un dettaglio alquanto importante è il fatto che anche il corpo del ciclo sia contenuto in una coppia di parentesi graffe. Java permette di omettere queste parentesi, a patto che il corpo del ciclo sia composto di una e una sola istruzione. Personalmente, evito sempre di farlo anche in un'ottica di futuro ampliamento del codice. Fino a quando il codice rimane così com'è, non vi sono problemi. I problemi iniziano ad insorgere quando va amplicato, dal momento in cui gli errori relativamente al posizionamento delle parentesi graffe sono alquanto comuni.

Esempio 2: Stampa di tutti i numeri pari fino ad un certo limite

Un altro esempio che vale la pena analizzare è la situazione in cui si vogliono stampare tutti i numeri pari da 0 sino ad un limite dato dall'utente.

Vediamo subito il codice.

public class Main{
  public static void main(String[] args){
    int i = 0;
    int limite = 100;
    while (i <= limite) {
      if(i%2 == 0){
        System.out.println(i);
      }
      i++;
    }
  }
}

In questo caso, la complessità di questo codice aumenta leggermente. Si nota infatti che è composto dall'incremento che avevamo già prima. É presente inoltre un if al suo interno. Implicitamente, capiamo che i vari costrutti possono essere annidati uno dentro l'altro.

L'idea alla base di questo esercizio è quella di scorrere tutti i numeri, e scegliere di volta in volta quali vadano stampati o no. A questo proposito vale la pena ricordare il significato della condizione all'interno dell'if. 

Scrivere i % 2 == 0 significa che stiamo controllando che il resto della divisione per due di i sia zero. Fondamentalmente, è il tipico controllo che effettuiamo per capire se un numero è pari o no. Al contrario, per controllare se volessimo stampare tutti i numeri dispari, dovremmo modificare l'if come segue:

if(i%2 == 1){
  System.out.println(i);
}

Questo perchè un numero dispari non è altro che un numero che, quando viene diviso per due, restituisce come resto 1.

Esempio 2: soluzione alternativa

Una soluzione alternativa e ben più semplice può essere la seguente:

public class Main{
  public static void main(String[] args){
  int i = 0;
  int limite = 100;
    while (i <= limite) {
      System.out.println(i);
      i=i+2;
    }
  }
}

Esempio 3: stampa di un rettangolo di *

Un terzo esempio che vale la pena vedere prevede la stampa di un rettangolo, composto interamente di *.

Non è un esempio che avrà un'utilità diretta durante le quotidiane esperienze di programmazione, ma ci aiuta a capire come è possibile annidare due cicli.

Come al solito, vediamo subito il codice per poi commentarlo.

public class Main{
  public static void main(String[] args){
    int base = 5;
    int altezza = 4;
    int i = 0;
    int j = 0;
    while(i < altezza){
      while(j < base){
        System.out.print("*");
        j++;
      }
      i++;
      j = 0;
    }
  }
}

Rispetto ai due esempi precedenti, questo codice all'apparenza è decisamente più complicato, ma vedremo insieme che non è così.

L'idea alla base è che possiamo assolvere questo semplice compito stampando una serie di linee composte di asterischi. In particolare, le linee saranno lunghe quanto la base, e il numero di linee da stampare è determinato dalla variabile altezza.

Per cui, ho scritto il ciclo più esterno, avente come condizione i < altezza, grazie al quale siamo in grado di iterare un numero di volte pari ad altezza. Questo ci serve per stampare le linee orizzontali.

Il ciclo più interno ha come condizione j < base, grazie al quale riusciamo a stampare una linea orizzontale di asterischi. Quindi, combinando questi due cicli, riusciamo a stampare una figura composta. 

L'output di questo programma, sarà il seguente: 

*****

*****

*****

*****

Conclusioni

Per studiare il comportamento del ciclo while ho fornito tre esempi piuttosto emblematici, che mostrano tre caratteristiche fondamentali di questo costrutto. 

Abbiamo visto un esempio basilare, dopodichè abbiamo analizzato come sia possibile creare cicli più complessi e infine, con l'ultimo esempio. 

Anche per questa volta è tutto. Come sempre, vi invito a sperimentare e fare testwink

 
 
Alessio Mungelli

Alessio Mungelli

Computer Science student at UniTo (University of Turin), Network specializtion, blogger and writer. I am a kind of expert in Java desktop developement with interests in AI and web developement. Unix lover (but not Windows hater). I am interested in Linux scripting. I am very inquisitive and I love learning new stuffs.

 
 
 

Articoli correlati

Un approccio a Java: I cicli - Introduzione

Ciao a tutti e bentornati! Sino ad ora, abbiamo parlato di variabili e di strutture di selezione, andando a considerare alcuni degli aspetti fondamentali di questi due concetti. Teoricamente, per…

Un approccio a Java: strutture di selezione - casi d'uso

Ciao a tutti e bentornati! Sino ad ora ci siamo preoccupati di fare una carrellata quanto più completa riguardo i concetti fondamentali di cui abbiamo bisogno per approcciarci all'utilizzo delle…

Un approccio a Java: operatori booleani

La volta precedente, abbiamo ampiamente parlato delle variabili booleane, cercando di delineare quali siano le principali operazioni che si possono effettuare proprio a livello pratico.  Di tutti i casi esaminati, non abbiamo…

Un approccio a Java: le variabili booleane

Ciao a tutti e bentornati! La volta precedente, ho fatto un'introduzione alle strutture condizionali, definendo il loro funzionamento. Prima di poter dare qualche esempio pratico, è necessario chiarire in che modo ci…

Un approccio a Java: strutture condizionali

Ciao a tutti e bentornati! Le volte precedenti abbiamo introdotto il concetto di variabile, tentando di definire alcuni concetti basilari a riguardo.  Alcune situazioni fanno però intuire come il solo concetto…

Un approccio a Java: Le variabili - caso d'uso

Ciao a tutti amici e bentornati! Dopo l'introduzione fatta sulle variabili, cerchiamo di analizzare alcune criticità che si possono presentare in situazioni alquanto comuni. Partiamo quindi analizzando degli esempi pratici.  Esempio 1: divisione…

Java Strutture Dati: Liste Concatenate

Con il 2020 andiamo ad esaminare un nuovo aspetto della programmazione: le strutture dati. Spesso capita a tutti di utilizzare strutture messe a disposizione dai vari linguaggi di programmazione. L'obiettivo sarà…

Java Algoritmi di Ordinamento: Selection Sort

Andiamo oggi ad analizzare in dettaglio un algoritmo di ordinamento non molto efficiente ma piuttosto utilizzato in diversi ambiti. Stiamo parlando del Selection Sort. Vediamo meglio in dettaglio. Intuizione L'idea alla base è quella…

Java algoritmi di ordinamento: Merge Sort

Andiamo oggi ad analizzare uno tra i migliori algoritmi di ordinamento: il Merge Sort. Detto anche algoritmo per fusione, fa parte della famiglia dei Divide and Conquer proprio come il Quick Sort. A differenza del…

Java algoritmi di ordinamento: Quick Sort

Bentornati in questa nostra panoramica sul mondo Java! Oggi andremo a parlare di un algoritmo di ordinamento tra i più celebri. Il Quick Sort. A differenza del precedentemente trattato Bubble Sort, Quick…

Come ridurre il consumo di memoria in Chrome

Google ha iniziato a testare una nuova funzione chiamata "Tab Freeze" che mira a ridurre il consumo di memoria in Chrome. Ed è interessante, perché il browser ormai consuma parecchie…

Come creare un aplicazione Vue.js in 5 minuti

Vue.js sta acquisendo sempre più popolarità, diventando un importante concorrente di framework come Angular o React.js. Come framework per i principianti, conquista i cuori dei giovani sviluppatori front-end e delle…

Utilizziamo i nostri cookie e quelli di terzi per migliorare i nostri servizi, compilare informazioni statistiche e analizzare le vostre abitudini di navigazione. Questo ci permette di personalizzare i contenuti che offriamo e di mostrarvi le pubblicità relative alle vostre preferenze. Cliccando su "Accetta tutto" acconsentite alla memorizzazione dei cookie sul vostro dispositivo per migliorare la navigazione del sito web, analizzare il traffico e assistere le nostre attività di marketing. Potete anche selezionare "Solo cookies di sistema" per accettare solo i cookies necessari al funzionamento del sito web, oppure potete selezionare i cookies che desiderate attivare cliccando su "Impostazioni". Tradotto con www.DeepL.com/Translator (versione gratuita)" o "Rifiuta".

Accetta tutti Solo cookies del sistema Configurazione