Decisioni e ancora decisioni

Contenuto del capitolo
  • Il terzo costrutto della programmazione - l'istruzione condizionale
  • Condizioni singole e multiple
  • Come si usano le espressioni booleane

Il terzo blocco elementare fondamentale è l'istruzione condizionale. Questo termine indica semplicemente la possibilità all'interno di un programma di eseguire una fra varie possibili sequenze di istruzioni a seconda del verificarsi di una qualche condizione.

Ai vecchi tempi della programmazione Assembler l'istruzione condizionale più semplice era il JUMP (salto, N.d.t.) che causava un vero e proprio salto ad un indirizzo di memoria specificato, che solitamente avveniva se il risultato della precedente operazione era zero. Programmi estremamente complessi venivano scritti utilizzando praticamente questa unica forma di istruzione condizionale, a dispetto delle affermazioni di Dijkstra sulle caratteristiche minime indispensabili per i linguaggi di programmazione.

Con l'avvento dei linguaggi di programmazione di alto livello comparve una nuova versione dell'istruzione JUMP, detta GOTO. Il BASIC in effetti dispone ancora dell'istruzione GOTO, come potete verificare provando il seguente frammento di programma:

10 PRINT "Si comincia alla linea 10"
20 J = 5
30 IF J < 10 GOTO 50
40 Print "Questa linea non viene scritta"
50 STOP

Noterete che anche nel caso di un programma cosí breve occorrono alcuni secondi per capirne il funzionamento. Il codice non ha una struttura, dobbiamo letteralmente immaginarla mentre lo leggiamo. Con programmi più lunghi questo diviene impossibile. Per questa ragione gran parte dei moderni linguaggi di programmazione non hanno istruzioni JUMP o GOTO, o quantomeno ne scoraggiano l'uso.

L'istruzione if

La più intuitiva delle istruzioni condizionali è il costrutto if, then, else. Questo segue la logica della frase in linguaggio comune in quanto if ("se", N.d.t.) una espressione booleana ha risultato "vero" then ("allora", N.d.t.) viene eseguito un dato blocco di istruzioni else ("altrimenti", N.d.t.) viene eseguito l'altro blocco.

In BASIC si presenta cosí:

PRINT "Si comincia da qui"
J = 5
IF J > 10 THEN
    PRINT "Questo non viene scritto"
ELSE
    STOP
END IF

Questo esempio dovrebbe essere più facile da capire di quello precedente basato sul GOTO. Naturalmente dopo la parola if possiamo mettere qualunque espressione purché il risultato abbia valore Vero o Falso, cioè sia di tipo booleano.

In Python l'esempio risulta assai simile:

import sys  # Serve solo per uscire dal programma
print "Si comincia da qui"
j = 5
if j > 10:
    print "Questo non viene scritto"
else:
    sys.exit()

È quasi identico, non è vero?

È possibile concatenare le istruzioni if/then/else annidandole una dentro l'altra; ad esempio:

# Si assume che larghezza sia stata definita in precedenza...
if larghezza == 100:
   area = 0 
else:
   if larghezza == 200:
      lunghezza = lunghezza * 2
   else:
      if larghezza == 500:
           larghezza = larghezza/10
      else:
           print "larghezza ha un valore non previsto!"

Nota: abbiamo usato == come operazione di verifica di uguaglianza in ogni istruzione if ed abbiamo usato = per assegnare valori alle variabili. L'uso di = al posto di == è uno dei più comuni errori di programmazione in Python. Fortunatamente Python avverte che c'è un errore di sintassi, ma potrebbe essere necessario esaminare attentamente la frase per individuare il problema.

Le espressioni booleane

Ricorderete che nel capitolo sui "Materiali" abbiamo fatto cenno al tipo di dato Booleano. Abbiamo detto che esso può assumere due soli valori: vero o falso. Raramente si creano variabili booleane, ma spesso si usano valori booleani temporanei usando espressioni. Un'espressione è un insieme di variabili e valori combinati fra loro mediante operatori per produrre un risultato. Nel seguente esempio:

if x < 5:
  print x

x < 5 è l'espressione. Le espressioni possono essere complesse quanto si vuole, purché producano un unico valore finale . Nel caso di istruzioni condizionali questo valore deve essere o vero o falso. Comunque la definizione di questi due valori varia da linguaggio a linguaggio. In molti linguaggi falso è equivalente a 0 o al valore "inesistente" (spesso indicato con NULL, Nil o None). Quindi una lista o una stringa vuota hanno valore falso in un contesto booleano. Questo significa che possiamo usare un ciclo while per processare una lista fino a che essa è vuota; ad esempio Python, QBASIC e Tcl adottano tutti questa convenzione per i valori booleani.

Le istruzioni condizionali in Tcl

L'istruzione if in Tcl è assai simile e si presenta cosí:

if {$x < 5} {
   puts $x
}elseif {$x == 5} {
   puts "E' 5!"
}else{
   puts "maggiore di 5"
}

Dovrebbe risultare facile da comprendere. Naturalmente le parti elseif ed else sono opzionali, ma probabilmente l'avrete già capito da soli.

Le istruzioni case

Una sequenza di istruzioni if/else/if/else... annidate è cosí comune che molti linguaggi forniscono un tipo speciale di istruzione condizionale per realizzarla. Questa viene spesso chiamata istruzione Case o Switch ed in Tcl si scrive cosí:

switch $larghezza {
    100 { set area 0} 
    200 { set lunghezza [expr {$lunghezza * 2}] }
    500 { set larghezza [expr {$larghezza / 2}] }
    }

Anche le versioni più moderne di BASIC hanno un'istruzione simile:

SELECT CASE larghezza 
 CASE 100
   LET area = 0
 CASE 200
   LET lunghezza = lunghezza * 2
 CASE 500
   LET larghezza = larghezza / 2
 ELSE PRINT "Larghezza non riconosciuta"
END SELECT

Python non ha un costrutto case esplicito, ma adotta un compromesso fornendo un costrutto più semplice, if/elseif/else:

if larghezza < 100:
   area = 0
elif larghezza < 200:
   lunghezza = lunghezza * 2
elif larghezza < 500:
   larghezza = larghezza/10
else:
   print "Il valore di larghezza e' troppo grande!"

Notate l'uso di elif ed anche il fatto che l'indentazione (cosí importante in Python) non cambia. È altrettanto importante notare che questa versione e quella riportata in un precedente esempio sono entrambe ugualmente valide, la seconda è solo un po' più facile da leggere se ci sono molte condizioni.

Anche il BASIC fornisce una versione leggermente più complicata di questa tecnica facendo uso di ElseIf...THEN usato esattamente allo stesso modo di elif in Python, ma viene impiegato raramente, dato che CASE risulta più facile.

Promemoria
  • Usate if/else come istruzioni condizionali.
  • La parte else è opzionale.
  • Le condizioni multiple possono essere rappresentate con i costrutti CASE o if/elif.
  • Le espressioni booleane producono un valore vero o falso.

Precedente  Successivo  Indice


Se avete domande o suggerimenti relativi a questa pagina mandate un e-mail all'autore: alan.gauld@yahoo.co.uk o al traduttore italiano: lfini@arcetri.astro.it