Software in pratica – Parte 2 – Prendere decisioni

PRENDERE DECISIONI

Per effettuare operazioni differenti a seconda che si verifichi oppure no una certa situazione tutti i principali linguaggi prevedono l’uso dell’istruzione condizionale if (se). In poche parole senza questa istruzione sarebbe impossibile “guidare” i programmi, si potrebbero eseguire solo procedimenti sequenziali sempre uguali.

Lo statement (istruzione/parola riservata del linguaggio) if deve essere seguito dalla “domanda” che si pone al computer, a sua volta seguita dal simbolo : e da ciò che deve essere effettuato solo nel caso in cui la condizione si avveri. Il formato più semplice di una linea if è questo:

if condizione: istruzione

 

OPERATORI RELAZIONALI

Ogni condizione si costruisce con gli operatori relazionali (elencati di seguito) e può risultare solo vera o falsa (True o False):

>	     maggiore
< 	     minore
== 	     uguale
>= 	     maggiore o uguale
<= 	     minore o uguale
!= 	     diverso

Dopo questo, forse noioso, ma indispensabile elenco, ecco un piccolo esempio in cui viene chiesta in input una stringa, e vengono eseguite azioni differenti a seconda che essa corrisponda oppure no alla stringa di confronto (per funzionare la risposta in questo caso va inserita in maiuscolo, il computer fa solo confronti molto precisi, non date mai per scontato che possa conoscere significati e similarità a voi ovvi):


print("QUALE LINGUAGGIO STUDI?")
a = input()
if a == "PYTHON":  print("BENISSIMO")
if a != "PYTHON":  print("AGGIORNATI")

Il diagramma di flusso che rappresenta questo programma prevede anche il simbolo rombo, in cui si indicano internamente le condizioni da verificare e dal quale si diramano due possibili percorsi:

flowchart

Abbiamo detto che le condizioni possono risultare solo o vere o false, il computer nel valutare le if considera proprio questo valore di verità chiamato valore booleano (dall’algebra di Boole che ammette solo due possibili alternative). Potete provare a stampare sulla console qualche condizione per verificare il risultato che fornisce (le eventuali operazioni matematiche vengono eseguite per prime ed infine viene applicato l’operatore relazionale):


a = 500
print(a == 0)        # False
print(a < 500*2)     # True
print(4 > 10)        # False
print(a+a != a)      # True

 

OPERATORI LOGICI

Se volete valutare diverse condizioni assieme in un colpo solo, per verificare ad esempio se sono tutte contemporaneamente vere, oppure se lo è almeno una di esse, dovete usare gli operatori logici:

and	     e
or	     oppure
not	     non

Ecco un esempio che mostra come l’operatore and permette di verificare che due condizioni siano contemporaneamente vere per eseguire l’istruzione controllata da ogni riga if:


a = input("QUALE LINGUAGGIO STUDI? ")
b = input("CONTINUERAI A FARLO? ")
if a == "PYTHON"  and  b == "SI":  print("BENISSIMO")
if a == "PYTHON"  and  b != "SI":  print("BENE, MA CONTINUA")
if a != "PYTHON"  and  b == "SI":  print("BELLA BATTUTA!!!")

 

IF MULTIRIGA

La struttura condizionale if si usa generalmente in una forma più completa assieme allo statement facoltativo else, che identifica l’istruzione (o il blocco di istruzioni) da eseguire se la condizione dell’if risulta falsa (infatti else significa altrimenti). È fondamentale ricordare che tutte le istruzioni che compongono i blocchi da eseguire in caso di condizione vera o falsa, vanno scritte sfalsate (indentate) di 4 spazi verso destra. Questa spaziatura è la sola cosa che permette a Python di capire quali righe fanno parte di un blocco e quali no. Il blocco termina con la prima istruzione scritta non indentata rispetto alle precedenti.

La forma generale è la seguente:

if condizione:
    istruzione 1  # eseguite se condizione vera
    istruzione 2
    istruzione n
else:
    istruzione 1  # eseguite se condizione falsa
    istruzione 2
    istruzione n

Rappresentazione grafica:

flowchart if

Ecco quindi un altro piccolo esempio che utilizza l’ else e attende in input due numeri da confrontare tra di loro:


a = int(input())
b = int(input())
if a > b:
    print(a, "E` MAGGIORE DI", b)
else:
    print(a, "E` MINORE O UGUALE A", b)

Un altro esempio: pensate di voler stabilire se un certo anno è bisestile, sappiamo che gli anni bisestili sono quelli divisibili per 400, oppure quelli contemporaneamente divisibili per 4 ma non per 100, abbiamo dunque tre condizioni che stabiliscono che l’anno è bisestile se è vera la prima oppure se contemporaneamente sono vere la seconda e la terza:

condizione1 or (condizione2 and condizione3)

Per valutare le singole condizioni di divisibilità potete usare l’operatore matematico modulo per ottenere il resto di una divisione (se il resto vale zero l’anno è divisibile):


a = int(input("IMMETTI L'ANNO "))
if a%400 == 0  or  ( a%4 == 0  and  a%100 != 0 ):
    print("IL", a, "E` BISESTILE")
else:
    print("IL", a, "NON E` BISESTILE")

Nella seconda riga vengono calcolate per prime le operazioni matematiche, poi sono applicati gli operatori relazionali per stabilire la verità o falsità delle tre condizioni, ed infine con queste verità o falsità viene calcolato il risultato dell’espressione logica. Il risultato è un valore booleano True o False che viene testato dall’if.

L’operatore not come avrete intuito indica semplicemente il contrario di ciò che lo segue:

if not a == b   equivale a    if a != b

 

ANNIDAMENTO

Le istruzioni da eseguire sotto if o sotto else possono a loro volta essere altre if. In questo caso si parla di strutture condizionali annidate (nested), come nel prossimo esempio, in cui si vede tra l’altro come sarebbe più complesso il codice se non ci fossero gli operatori logici:


a = input("QUALE LINGUAGGIO STUDI? ")
b = input("CONTINUERAI A FARLO? ")
if a == "PYTHON":
    if b == "SI":
        print("BENISSIMO")
    else:
        print("BENE, MA CONTINUA")
else:
    if b == "SI":
        print("BELLA BATTUTA!!!")

È importantissimo rispettare le spaziature, gli if/else interni (quelli spostati a destra) rappresentano i blocchi di istruzioni dell’if/else esterno principale. A loro volta le singole istruzioni print sono i blocchi di istruzioni degli if interni (quindi vanno ulteriormente spostate a destra).

Ecco il diagramma di flusso di questo ultimo esempio:

flowchart

INDICE


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *