|
Corso di programmazione in REXX - Lezione 5 - nozioni avanzate
Alessandro Cantatore
|
Annidamento di più istruzioni IF
. . .
if tempo = "bello" then do
if campo = "libero" then
say "andiamo a giocare a pallone?"
else
say "andiamo a fare una passeggiata?"
end
else do
if giocatori = 2 then
say "giochiamo a scacchi?"
else
say "giochiamo a poker?"
end
Notate come le varie istruzioni sono state indentate per rendere più
comprensibile il programma.Il seguente diagramma di flusso rappresenta la logica di esecuzione:
![]() Se si fosse usato SELECT al posto delle istruzioni IF annidate, sarebbe stato necessario usare più volte anche l'operatore logico &:
. . .
select
when tempo = "bello" & campo = "libero" then
say "andiamo a giocare a pallone?"
when tempo = "bello" & campo \= "libero" then
say "andiamo a fare una passeggiata?"
when tempo \= "bello" & giocatori = 2 then
say "giochiamo a scacchi?"
otherwise
say "giochiamo a poker?"
end /* select */
Sebbene entrambi le versioni diano lo stesso risultato, la versione
con gli IF annidati è molto più comprensibile e più efficiente
essendo necessarie meno comparazioni che nella versione che usa SELECT.L'uso di SELECT è invece senz'altro preferibile quando non siano presenti delle scelte dipendenti tra loro (come nel caso dei due IF dipendenti dal risultato di if tempo = "bello"), ma solo scelte da valutare contemporaneamente tra diverse possibili condizioni.
Uso di DO...END per evitare ambiguità
if tempo = "bello" then
if campo = "libero" then
say "andiamo a giocare a pallone?"
else
say "dobbiamo mettere l'impermeabile?"
Usando DO...END è invece possibile modificare il flusso di
esecuzione ottenendo il risultato desiderato e rendendo anche più
leggibile il programma:
if tempo = "bello" then do
if campo = "libero" then
say "andiamo a giocare a pallone?"
end
else
say "dobbiamo mettere l'impermeabile?"
Le istruzioni THEN e ELSE devono essere seguite da
un'istruzione: non è sufficiente un semplice carattere di punto e virgola.
if tempo = "bello" then
if campo = "libero" then
say "andiamo a giocare a pallone?"
else
nop
else
say "dobbiamo mettere l'impermeabile?"
L'istruzione ITERATE
DO variabile = espressione_i BY delta TO espressione_t
istruzione1
istruzione2
IF espressione THEN DO
istruzione3
istruzione4
ITERATE
END
istruzione5
istruzione6
END
Il seguente diagramma di flusso mostra il funzionamento di ITERATE.
![]()
Istruzioni DO composite /* POSIZ.CMD */ /* uso: posiz(stringa, testo) */ /* controlla gli argomenti immessi */ if arg() \= 2 then /* se non ci sono 2 argomenti */ return /* restituisce "" */ if arg(1, "O") then /* se il secondo argomento è */ return /* nullo restituisce "" */ /* assegna gli argomenti alle variabili stringa e testo */ parse arg stringa, testo /* calcola la massima posizione possibile per la stringa */ maxpos = length(testo) - length(stringa) + 1 /* cerca "stringa" in "testo" */ do risultato = 1 to maxpos, until substr(testo, risultato, length(stringa)) = stringa end /* restituisce la posizione di "stringa" o "0" nel caso */ /* questa non sia presente in testo */ if risultato > maxpos then risultato = 0 return risultatoLa funzione ARG() viene usata per controllare la validità degli argomenti. Nel loop è presente prima la parte relativa al contatore (risultato = 1 to maxpos) poi, (notate la virgola usata per spezzare un'unica espressione su due righe), tramite la funzione SUBSTR() viene verificato se la porzione di testo che comincia ad una distanza di risultato dall'inizio di testo e lunga quanto stringa sia uguale a stringa. Nel caso ciò si verifichi, il loop viene interrotto in quanto la condizione del UNTIL diventa vera e la funzione può quindi restituire il risultato. Nel caso la condizione di UNTIL non venga mai soddisfatta il loop verrà interrotto dal contatore quando risultato sarà diventato maggiore di maxpos.
Annidamento di loop DO esterno = 1 . . . ENDQuesto equivale ad un DO FOREVER. Per uscire da un determinato loop è sufficiente specificare il suo nome dopo l'istruzione LEAVE:
DO esterno = 1
.
.
DO interno = 1
.
.
IF espressione THEN
LEAVE esterno
.
.
END
.
.
END
Se espressione risulta vera, tramite l'istruzione LEAVE esterno
vengono immediatamente terminati entrambi i loop.
|