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:
variabile voto = 16
se voto >= 18 allora
scrivi "Promosso"
altrimenti se voto >= 15 allora
scrivi "Orale di recupero"
altrimenti
scrivi "Respinto"
fineOrale 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, glialtrimenti sesono i controlli successivi, ealtrimentiè 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 allorasi legga quasi come una frase in italiano, al posto del classicoif ... theninglese.
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à:
variabile risposta = "si"
se risposta = "si"
scrivi "Evviva!"
fineEvviva!(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:
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"
fineAdulto in età lavorativa
x è tra 0 e 10
x non è tra i primi treLa 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:
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 sceglisufficienteIl 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
- 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.
- Chiedi un voto da 1 a 10 e usa
scegliper stampare il giudizio corrispondente (inventa tu i giudizi per i voti bassi). - 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.