Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 20 di 43
  • livello principiante
Indice lezioni

Gestire il flusso: le istruzioni condizionali

Gestiamo il flusso di esecuzione del codice attraverso alcune istruzioni condizionali (If...then)
Gestiamo il flusso di esecuzione del codice attraverso alcune istruzioni condizionali (If...then)
Link copiato negli appunti

Durante l'esecuzione del codice, è possibile modificarne il percorso di esecuzione
tramite istruzioni condizionali o cicliche.

Le istruzioni condizionali ci permettono di effettuare delle scelte tra differenti
strade da seguire per proseguire nell'esecuzione del codice.

Le istruzioni cicliche ci permettono di  ripetere alcune istruzioni o gruppi di
istruzioni  più volte senza la necessità che queste vengano scritte nel codice
tante volte quante devono essere eseguite.

L'Object Pascal dispone di due tipi di istruzioni condizionali e tre tipi di istruzioni
cicliche che sono rispettivamente: istruzione IF, CASE, REPEAT, FOR, WHILE.

Le istruzioni condizionali

Le istruzioni condizionali presenti in Object Pascal sono due: IF, CASE.

La prima istruzione consente di effettuare una scelta in base ad una espressione
condizionale e permette di scegliere tra due blocchi di istruzioni da eseguire.
L'espressione condizionale che definisce il blocco da eseguire deve restituire
necessariamente un valore booleano: vero o falso. Questo ci fa capire anche perchè questa
istruzione ci permette di scegliere solamente due strade da seguire.

La sintassi dell'istruzione IF è la seguente

If Espressione then

BloccoEspressioneVera

else

BloccoEspressioneFalsa

Per blocco ovviamente si intende un insieme di istruzioni racchiuse tra le parole
chiave Begin..End, ma potrebbe anche trattarsi di una sola istruzione ed in tal caso l'uso
delle parole chiave Begin..End sarebbe facoltativo. Una importante precisazione va fatta
per quanto riguarda la riga di codice che precede la parola ELSE; questa infatti non deve
mai terminare con il punto e virgola (;). La ragione di ciò sta nel fatto che il punto e
virgola indica la fine di una istruzione di codice ed in questo caso l'istruzione
comprende anche la parola ELSE percui il punto e virgola andrà inserito solamente alla
fine dell'istruzione condizionale. Qualora si inserisse il punto e virgola prima della
parola ELSE, il compilatore lo segnalerebbe in fase di compilazione del codice.

N.B.

All'interno del blocco di codice del ramo THEN, tutte le istruzioni devono terminare
con il punto e virgola!

Vediamo degli esempi per chiarire le idee

If A < B then

Begin

A := A + 1;

B := B - 1;

End //Notate la mancanza del punto e virgola

Else

Begin

B := B + 1;

A := A - 1;

End;

If A < B then

Scrivi('A è minore di B')

Else

Scrivi('A è maggiore di B');

Il ramo ELSE è facoltativo quindi potremmo avere istruzioni IF con solamente il ramo
THEN.

If A < B then

A := A + 1;

Si possono avere anche istruzioni IF nidificate che possono portare qualche difficoltà
in più. Un esempio di istruzione IF nidificata potrebbe essere la seguente

If A > B then

If A < 4 then

Scrivi('A è maggiore di B e minore di 4')

Else

Scrivi('A è maggiore di B ma maggiore di 4');

Non c'è alcun segnale che indichi al compilatore come considerare i blocchi di
istruzioni all'interno di questo costrutto. Il codice precedente infatti potrebbe essere
interpretato in due modi differenti

If A > B then [If A < 4 then
Scrivi('A è maggiore di B e minore di 4') Else
Scrivi('A è maggiore di B ma maggiore di 4')];

oppure

If A > B then [If A < 4 then
Scrivi('A è maggiore di B e minore di 4')] Else
Scrivi('A è maggiore di B ma maggiore di 4');

Il compilatore segue sempre la divisione dell'istruzione nel primo modo.

Per evitare problemi con le istruzioni IF nidificate è consigliabile racchiudere in
blocchi Begin..End il codice da eseguire, come è stato evidenziato in precedenza con le
parentesi quadre. Nel primo caso avremmo

If A > B then

Begin

If A < 4 then

Scrivi('A è maggiore di B e minore di 4')

Else

Scrivi('A è maggiore di B ma maggiore di 4')

End;

nel secondo

If A > B then

Begin

If A < 4 then

Scrivi('A è maggiore di B e minore di 4')

End

Else

Scrivi('A è maggiore di B ma maggiore di 4');

Ovviamente il codice può essere indentato come si vuole, potrebbe anche essere scritto
tutto su una linea ma per motivi di leggibilità l'indentazione del codice che trovate in
queste lezioni è quella da me utilizzata nel codice che scrivo normalmente e ritengo che
sia sufficientemente leggibile.

L'istruzione CASE si differenzia dalla precedente istruzione poichè permette di
scegliere tra più di due blocchi di codice. Ciò è dettato dal fatto che che
l'espressione condizionale è di tipo ordinale e quindi potrò seguire tante strade
differenti quanti sono i valori del tipo ordinale.

La sintassi dell'istruzione CASE è la seguente

Case EspressioneOrdinale of

Caso1 : BloccoIstruzioni1;

Caso2 : BloccoIstruzioni2;

Caso3 : BloccoIstruzioni3;

...

CasoN : BloccoIstruzioniN;

Else

BloccoIstruzioniCasoGenerale;

End;

Occhio al tipo di espressione che deve essere di tipo ordinale quindi non possiamo
utilizzare tipi string come espressioni condizionali per l'istruzione CASE come
accade per alcuni altri linguaggi.

Funzionalmente, l'esecuzione dell'istruzione CASE provoca un salto alla riga di codice
contente alla sinistra dei due punti il valore restituito dall'espressione condizionale.
Ad esempio

Case N of //dove N contiene il valore 3

1 : ...;

2 : ...;

3 : Begin //Questo è il codice che verrà eseguito

...

End;

4 : ..;

Else

Scrivi('Valore non valido');

End;

Se il valore restituito dall'espressione condizionale non è presente nella lista di
valori dell'istruzione CASE, viene eseguito il codice contenuto nel ramo ELSE. Ciò è
utile per gestire tutti i casi che non rientrano nell'elenco fornito nell'istruzione come
visto nell'esempio precedente.

Anche nell'istruzione CASE il ramo ELSE è facoltativo ma in caso di omissione, bisogna
fare attenzione al valore assunto dall'espressione condizionale specificata; qualora il
valore restituito da questa non fosse presente nella lista dei valori possibili,
l'esecuzione del codice continuerebbe dall'istruzione immediatamente successiva
all'istruzione CASE.

L'istruzione CASE è equivalente ad un condizionale IF annidato

Come valori alla sinistra dei due punti possono essere specificati anche elenchi di
valori

Case N of

1, 2, 4 : ...;
//Blocco di istruzioni valido per il valori 1, 2, e 4

3 : ...;

5 : ..;

End;

oppure

Case N of

1..4 : ...;
//per tutti quei valori che cadono nell'intervallo 1-4
//estremi compresi

5 : ...;

End;

Ti consigliamo anche