7: LE ISTRUZIONI CONDIZIONALI: if, else, elif

IL CONTROLLO DI FLUSSO

Nelle lezioni precedenti abbiamo detto che un programma è una serie di linee di codice che vengono eseguite una dopo l'altra. Molte azioni della nostra vita quotidiana (e molti problemi che affidiamo al computer) richiedono però di prendere decisioni tra più alternative. Pensiamo per esempio ad un videogioco che simula un combattimento: l'intelligenza artificiale che guida il computer potrà decidere di attaccare (se ritiene di poterci battere) o ritirarsi (se pensa che noi siamo superiori). In caso di attacco dovrà decidere che tipo di armi usare, ecc.

Dal punto di vista del programmatore ciò vuol dire che è necessario scrivere del codice per tutte le alternative possibili (sia per l'attacco che per la ritirata), ma poi far eseguire al programma solo le linee "giuste", cosa che non è possibile con un'esecuzione puramente sequenziale (come abbiamo fatto finora).

I primi linguaggi di programmazione permettevano di saltare liberamente, sotto certe condizioni, da una riga all'altra del programma, ma questo generava dei programmi caotici e difficilmente leggibili. I linguaggi più moderni (come Python) adottano la programmazione strutturata: un programma è suddiviso in blocchi di codice che possono essere eseguiti, saltati o ripetuti molte volte. L'esecuzione dei blocchi è controllata da apposite istruzioni del linguaggio, che vengono dette istruzioni di controllo di flusso (in inglese: flow control).

L'ISTRUZIONE if

NUOVO PROGRAMMA: prova_if.py

Apriamo l'editor e scriviamo queste linee di codice. Notiamo che la linea 3 inizia 4 spazi più a destra delle altre: questa disposizione si chiama indentazione e viene usata moltissimo in tutti i linguaggi di programmazione: l'editor è già predisposto e per ottenerla basta premere il tasto Tab prima di scrivere la corrispondente linea. Attenti anche a non dimenticare i due punti alla fine della linea 2.


a = int(input("Scrivi un numero > 10 "))
if a > 10:
    print("Bravo!")
print("Ciao")

Proviamo ad eseguire il programma: la prima linea di codice ci chiede di inserire un numero maggiore di 10. Se inseriamo ad esempio 12 il programma ci risponderà con "Bravo!" e poi con "Ciao". Proviamo ora a lanciarlo un'altra volta, ma stavolta scriviamo 8: il programma scriverà solamente "Ciao".

L'istruzione if permette di eseguire o no un blocco di linee in base al risultato di un'espressione booleana: se essa è vera le linee vengono eseguite, altrimenti vengono saltate.

Python riconosce il blocco di istruzioni da eseguire o saltare proprio grazie all'indentazione: l'istruzione if a > 10: ha quindi il seguente significato: Python valuta l'espressione booleana a > 10; se essa è vera continua ad eseguire la linea successiva, altrimenti salta tutte le linee indentate fino a trovare una linea allo stesso livello di indentazione dell'if, e prosegue da questa (nel nostro esempio à la linea print("Ciao")).

Alcune puntualizzazioni sull'indentazione:

Vediamo qualche esempio:

ESERCIZIO 7.1: Modificare il programma prova_if: se scriviamo un numero maggiore di 10 deve scrivere (andando a capo)
"Bravo!"
"Bravissimo!"
"Sei proprio intelligente!!!"
SUGGERIMENTO: E' necessario aggiungere altre due istruzioni print, facendo attenzione al loro livello di indentazione.
SOLUZIONI

L'ISTRUZIONE else

Ritorniamo al nostro programma prova_if e modifichiamolo così:


a = int(input("Scrivi un numero > 10 "))
if a > 10:
    print("Bravo!")
else:
    print("Hai sbagliato!")
print("Ciao")

Proviamo di nuovo a lanciarlo ed a vedere cosa succede: questa volta il programma ci risponde anche nel caso in cui scriviamo un numero più piccolo di 10.

L'istruzione if ... else permette di eseguire due blocchi di codice in alternativa, in base al risultato di un'espressione booleana: viene eseguito il blocco if se l'espressione è vera, l'else se è falsa.

if ed else corrispondenti devono essere allo stesso livello di indentazione.

ESERCIZIO 7.2: Scrivere un programma pari_dispari.py che chieda all'utente di scrivere un numero e poi risponda "Il numero e' pari" oppure "Il numero e' dispari". SUGGERIMENTO: un numero è pari se diviso per 2 da resto 0, altrimenti è dispari: dobbiamo usare l'operatore ... vedi qui)
ESERCIZIO 7.3: Scrivere un programma scrivi_parola.py che chieda all'utente di scrivere una parola di 5 lettere e poi risponda "Bravo" o "Hai sbagliato!" come nel programma precedente. SUGGERIMENTO: dobbiamo immettere una stringa e sapere di quanti caratteri è composta ... vedi qui.
SOLUZIONI

L'ISTRUZIONE elif

Abbiamo infine l'istruzione elif (abbreviazione di else if) che permette di scegliere tra più di due alternative. Aggiungete queste linee di codice al programma:


a = int(input("Scrivi un numero > 10 "))
if a > 10:
    print("Bravo!")
else:
    print("Hai sbagliato!")
	
b = int(input("Ora scrivi un altro numero "))
if b > 0:
    print("Il numero e' positivo")
elif b == 0:
    print("Hai scritto zero")
else:
    print("Il numero e' negativo")
print("Ciao")

Quando dobbiamo scegliere tra più alternative dobbiamo cominciare con un if (più un'espressione booleana). Se l'espressione è vera Python eseguirà il relativo blocco di linee, altrimenti salterà all' elif successivo con un'altra espressione: se questa è vera eseguirà il blocco dell' elif, altrimenti salterà al prossimo elif, e così via.

E' importante capire che di tutto il blocco if ... elif ... elif ... viene eseguita una sola alternativa; l'ultima istruzione può essere un elif o un else: in quest'ultimo caso essa funzionerà da "raccoglitore" che comprende tutto ciò che non rientra nei casi precedenti.

NUOVO PROGRAMMA voti_py

media = float(input("Qual e' la media dei tuoi voti? "))
if media < 5:
    print ("AhiAhiAhi!")
elif media < 6:
    print ("Ti prenderai qualche debito!")
elif media < 7:
    print ("Ti sei salvato!")
elif media < 8:
    print ("Sei forte!")
else:
    print ("Sei un DIO!")

if ANNIDATI

Gli if possono essere annidati (uno dentro l'altro): in questo caso è necessario indentare due volte. Ecco un esempio:

NUOVO PROGRAMMA if_annidati.py

num = int(input("Scrivi un numero tra 0 e 20 "))
if num < 10:
    if num % 2 == 0:	# il numero da resto 0 se diviso per 2, quindi e' pari
        print ("Hai scritto un numero pari minore di 10")
	else:               # il numero e' dispari
	    print ("Hai scritto un numero dispari minore di 10")
else:
    if num % 2 == 0:
        print ("Hai scritto un numero pari maggiore di 10")
	else:
	    print ("Hai scritto un numero dispari maggiore di 10")

Notate che ci sono più coppie di if ... else "uno dentro l'altro" (le coppie corrispondenti si riconoscono perchè hanno lo stesso livello di indentazione); una cosa del genere può confondere un principiante: cerchiamo quindi di ricostruire il flusso del programma.

Supponiamo che all'input della riga 1 l'utente scriva 9: il programma prosegue con l'if della riga 2 che è vero. Entrerà quindi nel blocco indentato (riga 3) dove incontrerà un secondo if: quesa volta esso è falso, quindi salterà il primo blocco ed eseguirà il corrispondente blocco else alla riga 6. A questo punto salterà tutte le righe successive (l'else della riga 7 corrisponde all'if della 2) e terminerà. Cercate di ricostruire il flusso del programma negli altri tre casi possibili (numero pari < 10, numero pari ≥ 10, numero dispari ≥ 10), e poi provate il prossimo esercizio.

ESERCIZIO 7.4: PROGRAMMA ordinazioni.py
In un ristorante la pizza margherita costa 5 euro, la pizza con i funghi 6 euro, la pasta alla carbonara 7 euro, la pasta all'amatriciana 7.5 euro.
Scrivi un programma che:
Esempio di I/O (in blu le risposte dell'utente):
Vuoi la pasta o la pizza? pizza
Margherita o funghi? funghi
Costo: 6 euro
SUGGERIMENTO: questo esercizio è leggermente più difficile dell'esempio precedente, perchè dovete inserire correttamente (nella giusta posizione e con la corretta indentazione) anche altre due input() ...
ESERCIZIO 7.5 (più difficile)
Potete facilmente capire che il programma appena scritto funzione solo se l'utente scrive esattamente "pasta", "pizza", "amatriciana", ecc. Ad esempio provate a rispondere "pzza" alla prima domanda e guardate cosa succede (sapete dire perchè?). Per rendere il programma pià robusto sarebbe bene che rispondesse "Input scorretto" quando scriviamo qualche risposta sbagliata. Per fare questo dovete sostituire le tre coppie if ... else con tre terne if ... elif ... else dove, come vi ho detto, ò'ultimo else funziona un po' come una "scopa raccoglitrice" di tutte le risposte sbagliate.
SOLUZIONI
NUOVO PROGRAMMA equazioni_2g.py

A questo punto siamo pronti per qualcosa di un po' più impegnativo: un programma che risolve le equazioni di secondo grado (se non ricordate più come si fa guardate qui). Per prima cosa il programma deve chiedere all'utente i tre coefficienti a, b e c dell'equazione; a questo punto saremmo tentati di usare la nota formula risolutiva, ma incappiamo in una difficoltà: la formula contiene la radice quadrata del discriminante. Se esso è un numero negativo e cercassimo di calcolarne la radice Python ci darebbe un errore e il programma andrebbe in crash. Dopo aver calcolato il discriminante abbiamo quindi le tre alternative che si studiano comunemente a scuola: discriminante maggiore, minore o uguale a zero.

All'inizio del programma dobbiamo inserire questa istruzione che studieremo in seguito:


from math import *

essa serve per usare la radice quadrata che si scrive sqrt(a) (dall'Inglese square root).

ESERCIZIO 7.6 PROGRAMMA PASSO PASSO: eq_2_grado.py
Scrivere il programma a partire da questo schema:
  1. inserire l'istruzione indicata precedentemente
  2. chiedere di immettere i tre coefficienti a, b, c (numeri float)
  3. calcolare il discriminante, assegnandolo alla variabile delta
  4. se delta < 0 stampare un messaggio che dica che non ci sono soluzioni
  5. se delta == 0 stampare l'unica soluzione (attenzione! per trovarla non e' necessario usare tutta la formula ...)
  6. se delta > 0 stampare le due soluzioni (di nuovo: non usate tutta la formula: tenete presente che conosciamo gia' delta ...)
Esempio di I/O:
RISOLUZIONE DI UN'EQUAZIONE DI SECONDO GRADO
Immettere il coefficiente a 1
Immettere il coefficiente b 3
Immettere il coefficiente c 2
Ci sono due soluzioni:
x1 = -1.0
x2 = -2.0
ESERCIZIO 7.7 (PIU' DIFFICILE): Se siete riusciti a scrivere il programma potete modificarlo in modo che controlli, subito dopo l'immissione di a, b, c, se a == 0 (in tal caso l'equazione è di primo grado ed il tentativo di risolverla con la formula provocherebbe un errore). Prima di calcolare il delta cambiate così:
  1. se a == 0 stampare "l'equazione e' di primo grado e la soluzione e' ..."
  2. altrimenti procedere come sopra.
ATTENZIONE! dobbiamo indentare molte righe del programma già scritto: possiamo farlo selezionando tutte le righe che dobbiamo indentare e cliccando sul menu Format->Indent Region
SOLUZIONI

Fine della lezione