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 e else possono non esserci.

Prova tu

  1. Scrivi la funzione massimo che dà come risultato il massimo tra 2 numeri.
  2. Scrivi la funzione che, usando la funzione massimo, legge 2 numeri e stampa il maggiore dei due.
  3. Scrivi le funzioni min3 e max3 che restituiscono rispettivamente il minimo e il massimo tra 3 numeri.
  4. Scrivi la funzione ordina2 che dati due numeri li restituisce disposti in ordine, prima il più piccolo e poi il più grande.
  5. Scrivi la funzione ordina3, analoga alla precedente, ma che lavora su 3 numeri.
  6. 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.
  7. 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