Vai al contenuto
Leo

Parte II — Il flusso

Capitolo 7 — Prendere decisioni

Finora i nostri programmi eseguivano le istruzioni una dopo l'altra, sempre tutte, sempre nello stesso ordine. Ma un programma utile deve scegliere: se il voto è alto, promuovi; altrimenti, rimanda. Questo è il controllo di flusso, e il suo primo strumento è la condizione.

se, altrimenti se, altrimenti

La condizione più semplice è se: esegue un blocco di codice solo se qualcosa è vero. Spesso si accompagna ad altrimenti, che copre il caso contrario, e ad altrimenti se, per i casi intermedi:

Leo
variabile voto = 16
se voto >= 18 allora
    scrivi "Promosso"
altrimenti se voto >= 15 allora
    scrivi "Orale di recupero"
altrimenti
    scrivi "Respinto"
fine
Risultato
Orale di recupero

💡 L'idea — Il buttafuori all'ingresso

Una condizione è come il buttafuori davanti a un locale: controlla un requisito — hai l'età giusta? sei sulla lista? — e in base alla risposta ti manda di qua o di là. Il se è il primo controllo, gli altrimenti se sono i controlli successivi, e altrimenti è la porta che resta aperta per tutti gli altri.

La struttura si legge da sola. Leo controlla la prima condizione (voto >= 18): è falsa, perché 16 non è almeno 18. Passa alla seconda (voto >= 15): è vera, e allora esegue il suo blocco e salta tutto il resto. Se nessuna condizione fosse vera, scatterebbe altrimenti. Nota la forma: ogni condizione apre il blocco con allora, e un solo fine chiude l'intera catena. Puoi avere quanti altrimenti se vuoi, e sia altrimenti se sia altrimenti sono facoltativi.

🦁 Curiosità — Una frase quasi italiana

Il costrutto «se... altrimenti» è vecchio quanto la programmazione stessa: c'era già nei primissimi linguaggi degli anni Cinquanta, e da allora non se n'è più andato. Quello che cambia, da un linguaggio all'altro, è soltanto la forma. Leo ha scelto parole nostre, così che se voto >= 18 allora si legga quasi come una frase in italiano, al posto del classico if ... then inglese.

Due piccole comodità. Se allora è l'ultima cosa sulla riga, puoi anche ometterlo: la condizione va a capo da sola. E dentro la condizione di un se puoi scrivere = al posto di == per il confronto, perché lì non c'è ambiguità:

Leo
variabile risposta = "si"
se risposta = "si"
    scrivi "Evviva!"
fine
Risultato
Evviva!

(Fuori dalle condizioni, ricordiamolo, = assegna un valore e == confronta: sono due cose diverse. Dentro se e mentre, Leo accetta = come se fosse == per gentilezza, ma se vuoi puoi sempre scrivere ==.)

Confrontare e combinare

Le condizioni nascono da confronti. Gli operatori sono quelli attesi: == (uguale), != (diverso), <, <=, >, >=. A questi si aggiungono in (per cercare un elemento in una lista o un pezzo in un testo) ed è/non è (per confrontare con nulla).

Più confronti si combinano con gli operatori logici, scritti a parole: e (entrambi veri), o (almeno uno vero), non (nega). E Leo ha un paio di tocchi che rendono le condizioni quasi italiane:

Leo
variabile eta = 20
se eta >= 18 e eta < 65 allora
    scrivi "Adulto in età lavorativa"
fine
variabile x = 5
se 0 < x < 10 allora
    scrivi "x è tra 0 e 10"
fine
se non (x in [1, 2, 3]) allora
    scrivi "x non è tra i primi tre"
fine
Risultato
Adulto in età lavorativa
x è tra 0 e 10
x non è tra i primi tre

La riga 0 < x < 10 è esattamente ciò che scriveresti in matematica: Leo concatena i confronti e li interpreta come «x maggiore di 0 e minore di 10». Attenzione a non: vale solo per il valore subito dopo, quindi per negare un confronto intero servono le parentesi, come in non (x in [1, 2, 3]).

Un dettaglio che conta nei programmi seri: e e o si fermano appena conoscono il risultato. In a e b, se a è falso, b non viene nemmeno calcolato (tanto il risultato è già falso). Questo si chiama valutazione pigra e permette di scrivere condizioni come se lista ha elementi e lista[0] > 0 senza rischiare errori sul secondo pezzo.

Infine, una regola di Leo che fa da guardrail: in se e mentre sono ammessi solo vero e falso, non «qualcosa che assomiglia al vero». Per sapere se una lista è vuota non scrivi se lista ma se non vuota(lista). È una riga in più che toglie una categoria intera di malintesi.

Tanti casi: scegli

Quando uno stesso valore va confrontato con molte possibilità, una catena di altrimenti se diventa pesante. Per questi casi c'è scegli, più ordinato e più leggibile:

Leo
variabile voto = 7
scegli voto
    caso 10 allora
        scrivi "eccellente"
    caso 8, 9 allora
        scrivi "molto bene"
    caso 6..7 allora
        scrivi "sufficiente"
    altrimenti
        scrivi "da ripassare"
fine scegli
Risultato
sufficiente

Il valore dopo scegli si calcola una volta sola, poi si confronta con ogni caso: vince il primo che corrisponde. Ogni caso può essere un valore singolo, più valori separati da virgole (8, 9), un intervallo (6..7, estremi compresi) o una lista di alternative. L'altrimenti finale, facoltativo, cattura tutto ciò che non ha trovato posto. Puoi chiudere con fine o, se preferisci la chiarezza, con fine scegli: Leo controlla che corrisponda.

scegli è un ottimo esempio della filosofia del linguaggio: la stessa logica si potrebbe scrivere con tanti se, ma una forma dedicata, quando il caso lo chiede, rende l'intenzione evidente a colpo d'occhio.

Prova tu

  1. Scrivi un programma che chiede l'ora (un numero da 0 a 23) e saluta con «Buongiorno», «Buon pomeriggio», «Buonasera» o «Buonanotte» secondo la fascia oraria.
  2. Chiedi un voto da 1 a 10 e usa scegli per stampare il giudizio corrispondente (inventa tu i giudizi per i voti bassi).
  3. Scrivi una condizione che stampa «Numero valido» solo se un numero è compreso tra 1 e 90 e non è uno dei numeri [13, 17]. Prova diversi valori.