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.
variabile n = 3
mentre n > 0 fai
scrivi "Manca {n}"
n -= 1
fine
scrivi "Via!"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
mentresenza 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:
per ogni frutto in ["mela", "pera", "fico"] fai
scrivi "Mi piace la {frutto}"
fine
per ogni i in 1..3 fai
scrivi(i * i)
fineMi piace la mela
Mi piace la pera
Mi piace la fico
1
4
9A 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:
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)
fineRoma è la capitale di Italia
Parigi è la capitale di Francia
3
7ripeti: un numero fisso di volte
Quando vuoi solo ripetere n volte e non ti importa di un indice, ripeti è il più diretto:
ripeti 3 volte
scrivi "Ciao!"
fineCiao!
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:
per ogni i in 1..100 fai
se i % 2 == 0 allora
continua
fine
se i > 9 allora
interrompi
fine
scrivi(i)
fine1
3
5
7
9Seguiamo 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:
variabile secondi = 0
ogni 1 secondo fai
secondi += 1
scrivi "{secondi}..."
se secondi >= 3 allora
ferma_temporizzatori()
fine
fine1...
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
- Stampa la tavola pitagorica del 7 (da
7 x 1a7 x 10) con unper ognisu1..10. - Chiedi all'utente una parola e stampala lettera per lettera, una per riga, con
per ogni lettera in parola. - Usa un
mentreper trovare il primo numero il cui quadrato supera 1000. (Suggerimento: parti da 1 e aumenta finchén * nnon supera 1000, poi stampan.)