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).
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:
"Bravo!"
"Bravissimo!"
"Sei proprio intelligente!!!"
SUGGERIMENTO: E' necessario aggiungere altre due istruzioni print
, facendo attenzione al
loro livello di indentazione.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.
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)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.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.
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!")
Gli if
possono essere annidati (uno dentro l'altro): in questo caso è necessario indentare
due volte. Ecco un esempio:
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.
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()
...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.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).
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ì:
Fine della lezione