Lezione 5
Condizioni - If Then – Case Of
Durante la scrittura del nostro codice ci saranno delle situazioni che richiedono il confronto di due variabili o valori per determinare se far eseguire o meno una certa istruzione...
È l’ora di vedere all’opera alcune parole chiave fondamentali.
If Then
L’istruzione If (se) è una delle più usate e più o meno note in qualsiasi linguaggio di programmazione, la sintassi può variare, ma il concetto resta sempre lo stesso.
If Pippo > Paperino Then FaiQuesto ();
Ipotizzando Pippo e Paperino come variabili numeriche le mettiamo a confronto con If: Se Pippo è maggiore di Paperino allora verrà richiamata la procedure FaiQuesto()! Se invece fossero uguali o Paperino fosse maggiore, allora il programma non eseguirà alcun comando.
Si può anche richiamare una funzione direttamente con If , per confrontarne il risultato o per valutarne il valore. Ipotizza di avere una funzione che ti risponde se in quel momento è Mattina oppure no:
If Mattina(Now)=True Then ShowMessage('Buongiorno');
{Now è la funzione interna di Lazarus che ci ritorna data e ora correnti}
In questo caso la funzione risponde che adesso è Mattina e noi diamo il buongiorno all’utente, ma se fosse pomeriggio, sera o notte? L’utente non riceverebbe alcun saluto.
Tutto Chiaro?
Adesso vogliamo dare un saluto adeguato all’utente e dobbiamo scegliere tra Mattina e sera... Come facciamo?
Ipotizziamo di avere una funzione che ci risponde 1 per dire mattina e 2 per la sera… Possiamo usare la struttura If Then Else (Se Allora Altrimenti):
If MomentoDelGiorno(Now) = 1 Then
ShowMessage('Buongiorno')
Else If MomentoDelGiorno(Now) = 2 Then
ShowMessage('Buonasera');
Così se è mattino o sera sappiamo come salutare l’utente…
Già, ma se è notte? Ancora niente saluto?
Possiamo fare così:
If MomentoDelGiorno(Now) = 1 Then
ShowMessage('Buongiorno')
Else If MomentoDelGiorno(Now) = 2 Then
ShowMessage('Buonasera')
Else
ShowMessage('Buonanotte');
Come vedi, se non è Mattina o Sera potrà essere solo notte, giusto?
Quindi le istruzioni ci dicono: se la funzione MomentoDelGiorno(Now) ci ritorna 1 è mattino altrimenti se ritorna 2 è sera altrimenti è notte!
Ora potremmo aver bisogno di differenziare tra il pomeriggio e la sera, ma il concetto resta lo stesso, è solo un esempio…
Fai un po’ di pratica con l’istruzione If Then, poi aggiungi anche Else e Else If.
Buon Divertimento
Istruzione Case of
Adesso dobbiamo fare questo confronto tra molteplici possibilità e la struttura If Then Else potrebbe risultare poco elegante e troppo macchinosa…
Che si fa?
Si usa l'istruzione Case of, in questo modo:
Case MomentoDelGiorno(Now) of
1: // ha ritornato 1
ShowMessage('Buongiorno');
2: // ha ritornato 2
ShowMessage('Buonasera');
else // non ha ritornato né 1 né 2
ShowMessage('Buonanotte');
end;
Case of ci rende il codice più comprensibile e più semplice da leggere e non ha limiti nel numero di possibili risposte che la funzione o il valore messo a confronto potrebbe ritornare, queste vengono messe in ordine, e il programma eseguirà solo le linee di codice relative al caso più opportuno. Se nessuno di questi casi si verifica, l’istruzione Else farà compiere ciò che sarà necessario...
Esercitati con l’istruzione Case of, prova anche usando Else e buon divertimento!
Approfondimenti
Potresti aver notato che nel blocco di istruzioni if then else il punto e virgola è solo alla fine del blocco, perché?
Perché in effetti quel blocco è una sola istruzione molto lunga e non deve essere terminata dal “;” fino a che non sarà necessario. Potresti anche, se hai fatto un po’ di prove, aver visto che se devi far eseguire più di un comando in una determinata circostanza, il debugger ti blocca e ritorna un errore.
Ti è successo? Perfetto, vediamo come fare per eseguire più istruzioni in un blocco if o case of. Il funzionamento è lo stesso per entrambe le istruzioni, ecco come fare:
Case MomentoDelGiorno(Now) of
1:
begin
ShowMessage('Buongiorno');
Form1.Color := clWhite;
end;
2:
ShowMessage('Buonasera');
else { qua il “;” non va messo perché Else è ereditato da if, vedi l’esempio successivo per capire}
ShowMessage('Buonanotte');
end;
Come vedi, nel caso 1 ci sono due istruzioni, quindi dobbiamo specificare dove inizia l’elenco delle istruzioni da eseguire e dove finisce, ecco allora begin e end;
Anche qui, il begin non è seguito dal “;” ma questo è presente alla fine di ogni istruzione e dopo end, proprio per far capire a Lazarus dove inizia e dove finisce il blocco di istruzioni da eseguire nel caso che la risposta sia 1.
Gli altri casi non hanno begin end; perché eseguono una sola istruzione.
Più chiaro adesso?
Per If è la stessa cosa
If MomentoDelGiorno(Now) = 1 Then
begin
ShowMessage('Buongiorno');
Form1.Color := clWhite;
end
Else If MomentoDelGiorno(Now) = 2 Then
ShowMessage('Buonasera')
Else
ShowMessage('Buonanotte');
Adesso il punto e virgola non è presente dopo end… Perché?
Semplice, perché l’istruzione If non termina in quel punto.
Ricordi? Tutta l’istruzione If è un unico blocco e potresti scriverla su un solo rigo ma viene spezzata su più righe per renderla più facilmente leggibile.
Perfetto, ora sbizzarrisciti facendo qualche test!