Operare scelte¶
Come eseguire diverse porzioni di codice a seconda del risultato di un’espressione, come usare l’istruzione di scelta o di selezione.
I programmi e le funzioni scritti finora eseguono tutte le istruzioni che vengono scritte, ma i linguaggi di programmazione danno anche la possibilità di eseguire un gruppo di istruzioni o un altro in base a determinate condizioni. Permettono cioè di descrivere algoritmi che svolgono il seguente compito:
se è vera una certa condizione
esegui qualcosa
altrimenti
esegui qualcos'altro
Il principale comando che permette di operare delle scelte è if
e la sua
sintassi è una delle seguenti.
if <condizione>:
<istruzioni>
oppure:
if <condizione>:
<istruzioni 1>
else:
<istruzioni 2>
Nel calcolo dell’area del triangolo dati i lati, la formula di Erone funziona solo se il triangolo può essere costruito. In ogni triangolo un lato non può essere maggiore della somma degli altri due né minore della loro differenza. Queste due affermazioni vengono dette disuguaglianze triangolari. Se i lati non rispettano le disuguaglianze triangolari allora la funzione termina con un errore infatti, in questo caso, l’espressione all’interno della radice assume valore negativo.
È possibile modificare la funzione in modo che restituisca un
valore particolare nel caso i tre numeri non possano essere le misure dei lati
di un triangolo. Possiamo quindi modificare la funzione erone
in modo che
controlli che ogni lato sia minore della somma degli altri due.
Calcoliamo quindi le somme delle coppie di lati e confrontiamole con
il terzo lato; se tutti questi confronti danno esito positivo calcoliamo l’area,
altrimenti restituiamo il valore None. La funzione erone()
può essere
scritta così:
def erone(lato1, lato2, lato3):
"""Restituisce l'area di un triangolo dati i tre lati
utilizzando la Formula di Erone."""
if (lato3<=lato1+lato2 and
lato2<=lato1+lato3 and
lato1<=lato2+lato3):
p=(lato1+lato2+lato3)/2.
return (p*(p-lato1)*(p-lato2)*(p-lato3))**0.5
else:
return None
Ora scriviamo una funzione che legga dall’utente la lunghezza dei tre lati del triangolo e ne stampi l’area:
def areatriangolo():
"""Calcolo dell'area con la formula di Erone."""
# Inserimento dati
print "Area del triangolo"
lato1=float(raw_input("primo lato = "))
lato2=float(raw_input("secondo lato = "))
lato3=float(raw_input("terzo lato = "))
# Calcolo
area=erone(lato1, lato2, lato3)
# Visualizzazione risultati
if area!=None:
print "area = %s" % area
else:
print "Nessun triangolo può avere questi tre lati!"
Proviamo la funzione nella shell
con diversi valori degli argomenti.
Affrontiamo un altro problema. Proviamo a scrivere una funzione che riceva 2 numeri e dia come risultato il più piccolo. Con un linguaggio quasi naturale: i due numeri sono n1 e n2:
se n1 è minore di n2
allora il risultato è n1
altrimenti il risultato è n2
La traduzione in Python è abbastanza semplice e viene lasciata al lettore.
Riassumendo
È possibile, in base a una condizione eseguire delle istruzioni o delle altre.
Questa struttura di controllo si chiama “selezione”.
La sintassi dell’istruzione
if
è:if <condizione1>: <istruzioni 1> [elif <condizione2>: <istruzioni 2> [...]] [else: <istruzioni 3>]
Le parentesi quadre indicano porzioni facoltative di codice.
Le clausole
elif
eelse
possono non esserci.
Prova tu
- Scrivi la funzione massimo che dà come risultato il massimo tra 2 numeri.
- Scrivi la funzione che, usando la funzione massimo, legge 2 numeri e stampa il maggiore dei due.
- Scrivi le funzioni min3 e max3 che restituiscono rispettivamente il minimo e il massimo tra 3 numeri.
- Scrivi la funzione ordina2 che dati due numeri li restituisce disposti in ordine, prima il più piccolo e poi il più grande.
- Scrivi la funzione ordina3, analoga alla precedente, ma che lavora su 3 numeri.
- Riscrivi la funzione che calcola il coefficiente angolare di una retta, dati 2 punti, considerando anche il caso in cui i due punti abbiano la stessa ascissa.
- Scrivi una funzione che “forza” un valore all’interno di un massimo e un minimo: taglia(50, 68, 100)->68; taglia(50, 27, 100)->50