Vai al contenuto
Leo

Parte II — Il flusso

Capitolo 8 — Ripetere

L'altra metà del controllo di flusso è la ripetizione. I computer sono instancabili: fanno la stessa cosa un milione di volte senza annoiarsi. Il nostro compito è dire cosa ripetere e quando fermarsi. Leo offre tre modi di ciclare, ciascuno con il suo carattere.

💡 L'idea — Giri di pista

Un ciclo è come correre dei giri attorno a una pista: ripeti sempre lo stesso percorso e, a ogni giro, controlli se è il momento di fermarti — hai finito i giri previsti, oppure è successo qualcosa che ti dice basta. Senza quel controllo continueresti a girare all'infinito.

mentre: finché una condizione regge

mentre ripete un blocco finché una condizione resta vera. Controlla la condizione prima di ogni giro; appena diventa falsa, esce.

Leo
variabile n = 3
mentre n > 0 fai
    scrivi "Manca {n}"
    n -= 1
fine
scrivi "Via!"
Risultato
Manca 3
Manca 2
Manca 1
Via!

Il blocco si apre con fai (che, come allora, puoi omettere se è l'ultima cosa sulla riga) e si chiude con fine. Attenzione a una cosa: dentro il ciclo deve succedere qualcosa che prima o poi renda la condizione falsa — qui n -= 1. Se te ne dimentichi, il ciclo gira per sempre. È il classico «ciclo infinito», e capita a tutti: se un programma sembra bloccato, è il primo sospetto.

🦁 Curiosità — Insapona, risciacqua, ripeti

C'è una classica battuta tra programmatori: le istruzioni sul flacone dello shampoo — «insapona, risciacqua, ripeti» — descrivono un ciclo infinito, perché non dicono mai quando smettere. Preso alla lettera, resteresti sotto la doccia per sempre. È esattamente l'errore di un mentre senza una via d'uscita: la morale è che ogni ciclo ha bisogno di un modo per fermarsi.

per ogni: scorrere una sequenza

Molto spesso non vuoi ripetere «finché», ma «per ciascun elemento» di una sequenza — una lista, un testo, un intervallo, le chiavi di un dizionario. Per questo c'è per ogni:

Leo
per ogni frutto in ["mela", "pera", "fico"] fai
    scrivi "Mi piace la {frutto}"
fine
per ogni i in 1..3 fai
    scrivi(i * i)
fine
Risultato
Mi piace la mela
Mi piace la pera
Mi piace la fico
1
4
9

A ogni giro, la variabile dopo per ogni (qui frutto, poi i) prende il valore dell'elemento successivo. Con un intervallo 1..3 ottieni il classico ciclo a conteggio. Dopo il nome va sempre in: se scrivi per sbaglio per ogni i da 1 a 3, Leo capisce l'intenzione e ti propone in 1..3.

per ogni sa anche scorrere due cose insieme. Su un dizionario prende chiave e valore; su una lista di coppie, i due elementi di ciascuna:

Leo
variabile capitali = {"Italia": "Roma", "Francia": "Parigi"}
per ogni paese, capitale in capitali fai
    scrivi "{capitale} è la capitale di {paese}"
fine
per ogni x, y in [[1, 2], [3, 4]] fai
    scrivi(x + y)
fine
Risultato
Roma è la capitale di Italia
Parigi è la capitale di Francia
3
7

ripeti: un numero fisso di volte

Quando vuoi solo ripetere n volte e non ti importa di un indice, ripeti è il più diretto:

Leo
ripeti 3 volte
    scrivi "Ciao!"
fine
Risultato
Ciao!
Ciao!
Ciao!

Nota che ripeti 3 volte non vuole né allora né fai: è già completo così. Esiste anche ripeti per sempre, per i cicli che vanno avanti finché non li fermi dall'interno — utile nei giochi e nei programmi interattivi.

Uscire e saltare: interrompi e continua

Dentro un ciclo hai due comandi per alterarne il corso. interrompi esce subito dal ciclo; continua salta al giro successivo senza eseguire il resto del blocco:

Leo
per ogni i in 1..100 fai
    se i % 2 == 0 allora
        continua
    fine
    se i > 9 allora
        interrompi
    fine
    scrivi(i)
fine
Risultato
1
3
5
7
9

Seguiamo il ragionamento: per ogni numero da 1 a 100, se è pari (continua) saltiamo; se ha superato il 9 (interrompi) usciamo del tutto; altrimenti lo stampiamo. Risultato: i numeri dispari da 1 a 9. Entrambi i comandi agiscono sul ciclo più interno, quello che li contiene direttamente.

Ripetere nel tempo: ogni

I cicli visti finora girano il più velocemente possibile. A volte, invece, vuoi che qualcosa accada a intervalli regolari mentre il tempo scorre — un orologio, un conto alla rovescia, l'aggiornamento di una schermata. Per questo c'è ogni:

Leo
variabile secondi = 0
ogni 1 secondo fai
    secondi += 1
    scrivi "{secondi}..."
    se secondi >= 3 allora
        ferma_temporizzatori()
    fine
fine
Risultato
1...
2...
3...

ogni 1 secondo esegue il blocco una volta al secondo. Il programma resta vivo finché c'è un temporizzatore attivo; qui lo fermiamo noi dopo tre giri con ferma_temporizzatori(). Esiste anche dopo, gemello di ogni, che esegue il blocco una sola volta, più tardi (dopo 3 secondi fai ... fine). Questi strumenti diventano centrali nei programmi con le finestre, dove li ritroveremo nella Parte V. Per ora ti basti sapere che esistono e che si misurano in secondi, millisecondi e minuti.

Prova tu

  1. Stampa la tavola pitagorica del 7 (da 7 x 1 a 7 x 10) con un per ogni su 1..10.
  2. Chiedi all'utente una parola e stampala lettera per lettera, una per riga, con per ogni lettera in parola.
  3. Usa un mentre per trovare il primo numero il cui quadrato supera 1000. (Suggerimento: parti da 1 e aumenta finché n * n non supera 1000, poi stampa n.)