Per quanto riguarda i cicli, Kotlin offre per lo più due alternative:
- il ciclo while, che ripete l'esecuzione di un blocco di codice finchè una determinata condizione booleana rimane vera (valore logico true);
- il ciclo for, che viene interpretato per lo più come un for-each, in quanto destinato all'iterazione su strutture dati.
Uno dei tipici utilizzi del ciclo while
sfrutta una variabile come contatore:
var contatore=1
while (contatore<10)
{
println(contatore)
contatore++
}
Questo primo esempio stamperà a video una sequenza di numeri da 1 a 9.
È contemplata anche la forma del do...while, che permette di eseguire una iterazione del blocco di codice e solo successivamente verificare la condizione: in questo tipo di ciclo, l'iterazione verrà eseguita sicuramente almeno una volta. Ad esempio, il seguente ciclo while parte da una premessa falsa - la
condizione che impostiamo non è soddisfatta in partenza - e pertanto non eseguirà nemmeno un'iterazione:
var contatore=1
while (contatore>10)
{
println(contatore)
contatore++
}
Un'analoga implementazione mediante do...while, al contrario, eseguirà prima il blocco di codice, stampando il valore 1, per poi arrestarsi alla prima verifica della condizione:
do
{
println(contatore)
contatore++
}
while (contatore>10)
Il ciclo for
permette di attraversare qualsiasi struttura iterabile. In questo esempio, iteriamo su una stringa e stampiamo in output solo le sue lettere maiuscole:
val s="Giovanni e Elisa sono andati a Roma per Natale"
for (x in s)
{
if (x.isUpperCase())
println(x)
}
Verranno stampate, su righe separate, le lettere 'G', 'E', 'R' e 'N', le uniche che hanno restituito true per la funzione isUpperCase
. Un uso molto comune riguarda l'iterazione su un range di valori:
ciò rappresenta un'alternativa all'uso del while
con contatore. Con il seguente esempio eseguiamo un ciclo che calcola il fattoriale di un numero: ad ogni iterazione il nuovo valore verrà moltiplicato per il totale sinora ottenuto:
val valore=5
var totale=1
for (i in 1..valore)
{
totale*=i
}
println("Fattoriale di ${valore} equivale a ${totale}")
Anche in Kotlin sono disponibili le parole chiave break e continue, che permettono, rispettivamente,
di interrompere ed uscire dal ciclo, e interrompere l'iterazione corrente saltando direttamente a quella successiva. Proviamo break
creando un "sommatore
interattivo", che continua a sommare valori immessi in input finchè non viene scritta la parola "fine",
indifferentemente con lettere maiuscole o minuscole:
var totale=0
while(true)
{
print(">> ")
val numero=readLine()
if (numero?.toLowerCase().equals("fine"))
break
totale+= numero?.toIntOrNull()?: continue
}
println("Totale ottenuto è ${totale}")
Con readLine()
richiediamo un numero di volta in volta e verifichiamo se la sua conversione in minuscolo equivale a "fine": se è così, usiamo il break
per uscire dal ciclo; altrimenti, proseguiamo ed eseguiamo la somma. In un esercizio simile è importante evitare eccezioni qualora
il valore immesso non sia un numero. A tale scopo, ci vengono incontro il metodo toIntOrNull
, che
restituisce null
se la conversione non è possibile, e l'operatore Elvis (?:
) che, in caso di nullità,
esegue il continue
.
Nella prossima lezione metteremo in pratica i concetti appena visti, imparando ad utilizzarli con gli array.