![]() |
Corso di programmazione in REXX - Lezione 5 - nozioni avanzate![]() |
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?" endNotate 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 ENDIl 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 . . ENDSe espressione risulta vera, tramite l'istruzione LEAVE esterno vengono immediatamente terminati entrambi i loop. |