Variabili e Costanti Logiche in Fortran
Gli operatori logici in Fortran sono fondamentali per il controllo del flusso di esecuzione e la valutazione delle condizioni nei programmi.
Esistono operatori relazionali, che confrontano valori numerici o di carattere, e operatori logici, che elaborano espressioni booleane. La comprensione di questi strumenti è essenziale per scrivere codice efficace e privo di errori.
In questa lezione vedremo le costanti logiche, le variabili booleane, gli operatori relazionali e logici, le tabelle della verità e l'uso dei valori logici nelle istruzioni di input e output.
Costanti e Variabili Logiche
Come accennato nell'introduzione, la maggior parte delle strutture di controllo in Fortran si basa su valori logici.
Prima di analizzare queste strutture, è importante comprendere i tipi di dati logici che le regolano. Iniziamo con le costanti logiche e le variabili logiche.
Il tipo di dato logico può assumere solo due valori possibili: TRUE o FALSE.
Una costante logica può essere espressa nei seguenti modi:
.TRUE.
.FALSE.
I punti all'inizio e alla fine sono obbligatori per distinguerli dai nomi delle variabili.
Le seguenti dichiarazioni non sono valide:
TRUE ! (Manca il punto - sarebbe interpretato come nome di variabile)
.FALSE ! (I punti non sono bilanciati)
Le costanti logiche sono raramente utilizzate direttamente, ma le espressioni logiche e le variabili logiche sono comunemente impiegate per controllare il flusso di esecuzione di un programma.
Variabili Logiche
Una variabile logica è una variabile che può contenere un valore di tipo logico (.TRUE.
o .FALSE.
).
Si dichiara utilizzando il tipo LOGICAL
, come segue:
LOGICAL :: var1 [, var2, var3, ...]
Questa dichiarazione deve essere posizionata dopo lo statement PROGRAM
e prima della prima istruzione eseguibile del programma.
Esempio di dichiarazione di variabili logiche:
PROGRAM esempio
LOGICAL :: test1, test2
! ...
! (Segue il codice eseguibile)
END PROGRAM esempio
Assegnazioni e Calcoli Logici
Analogamente ai calcoli aritmetici, i calcoli logici vengono eseguiti tramite un'istruzione di assegnazione, che ha la seguente sintassi:
variabile_logica = espressione_logica
L'espressione a destra del segno =
può essere una combinazione di:
- Costanti logiche (
.TRUE.
o.FALSE.
) - Variabili logiche
- Operatori relazionali o logici, che combinano valori logici e restituiscono un risultato booleano.
Gli operatori relazionali possono essere applicati a dati numerici, carattere o logici, e restituiscono sempre un valore logico. Viceversa, gli operatori logici operano su valori logici e restituiscono un risultato booleano.
Operatori Relazionali
Gli operatori relazionali operano su due operandi numerici o di tipo carattere e restituiscono un valore logico, determinando se la relazione tra i due valori è vera o falsa. Per questo motivo, sono detti relazionali in quanto mettono in relazione due quantità.
La forma generale di un'espressione relazionale è:
Dove:
e sono espressioni aritmetiche, variabili, costanti o stringhe di caratteri è uno degli operatori logici relazionali elencati nella tabella seguente:
Stile moderno | Stile tradizionale | Significato |
---|---|---|
== |
.EQ. |
Uguale a |
/= |
.NE. |
Diverso da |
> |
.GT. |
Maggiore di |
>= |
.GE. |
Maggiore o uguale a |
< |
.LT. |
Minore di |
<= |
.LE. |
Minore o uguale a |
Esistono due forme di ciascun operatore relazionale:
- Forma moderna (introdotta in Fortran 90): Utilizza simboli simili a quelli adoperati in matematica (
==
,>=
,<=
); - Forma tradizionale: Usa sigle con punti (
.EQ.
,.GE.
,.LE.
).
Si possono usare entrambe le forme in Fortran, ma la forma moderna è preferita nei nuovi programmi.
Se la relazione tra gli operandi è vera, l'operazione restituisce .TRUE.
; altrimenti restituisce .FALSE.
.
Vediamo qualche esempio di applicazione degli operatori relazionali:
Operazione | Risultato |
---|---|
3 < 4 |
.TRUE. |
3 <= 4 |
.TRUE. |
3 == 4 |
.FALSE. |
3 > 4 |
.FALSE. |
4 <= 4 |
.TRUE. |
'A' < 'B' |
.TRUE. |
L'ultima espressione è .TRUE.
perché le lettere vengono valutate in ordine alfabetico (in realtà vengono valutate in ordine lessicografico, un concetto che studieremo nelle prossime lezioni).
Attenzione agli operatori relazionali
Non confondiamo l'operatore di uguaglianza ==
con l'operatore di assegnazione =
.
==
confronta due valori e restituisce.TRUE.
o.FALSE.
.=
assegna un valore a una variabile.
Questo errore è molto comune tra i programmatori principianti.
Precedenza degli Operatori Relazionali
Gli operatori relazionali vengono valutati dopo gli operatori aritmetici.
Ad esempio, le seguenti espressioni sono equivalenti:
7 + 3 < 2 + 11
(7 + 3) < (2 + 11)
Entrambe restituiscono .TRUE.
perché prima vengono eseguite le somme e poi viene valutata la relazione <
.
Se il confronto avviene tra numeri interi e reali, Fortran converte automaticamente l'intero in un valore reale prima di eseguire la comparazione.
! .TRUE. (L'intero viene convertito a reale prima del confronto)
4 == 4.
Tuttavia, confrontare numeri con caratteri non è consentito e causerà un errore di compilazione:
! Errore: confronto illegale tra numero e carattere
4 <= 'A'
Operatori Logici
Gli operatori logici operano su uno o più operandi logici, restituendo un risultato booleano.
Esistono quattro operatori binari e un operatore unario:
- Operatori binari:
.AND.
,.OR.
,.EQV.
,.NEQV.
- Operatore unario:
.NOT.
La forma generale di un'operazione logica binaria è:
Dove:
e sono espressioni logiche, variabili o costanti. .op.
è uno degli operatori combinatori della seguente tabella:
Operatore | Funzione | Definizione |
---|---|---|
l1 .AND. l2 |
AND logico | Restituisce .TRUE. se entrambi gli operandi sono .TRUE. |
l1 .OR. l2 |
OR logico | Restituisce .TRUE. se almeno uno degli operandi è .TRUE. |
l1 .EQV. l2 |
Equivalenza logica | Restituisce .TRUE. se entrambi gli operandi sono uguali (entrambi .TRUE. o entrambi .FALSE. ) |
l1 .NEQV. l2 |
Disuguaglianza logica | Restituisce .TRUE. se uno degli operandi è .TRUE. e l'altro è .FALSE. |
.NOT. l1 |
Negazione Logica | Restituisce .TRUE. se l1 è .FALSE. , e viceversa |
I punti all'inizio e alla fine dell'operatore sono obbligatori.
Le operazioni logiche possono essere rappresentate con tabelle di verità.
l1 |
l2 |
l1 .AND. l2 |
l1 .OR. l2 |
l1 .EQV. l2 |
l1 .NEQV. l2 |
---|---|---|---|---|---|
.FALSE. |
.FALSE. |
.FALSE. |
.FALSE. |
.TRUE. |
.FALSE. |
.FALSE. |
.TRUE. |
.FALSE. |
.TRUE. |
.FALSE. |
.TRUE. |
.TRUE. |
.FALSE. |
.FALSE. |
.TRUE. |
.FALSE. |
.TRUE. |
.TRUE. |
.TRUE. |
.TRUE. |
.TRUE. |
.TRUE. |
.FALSE. |
l1 |
.NOT. l1 |
---|---|
.FALSE. |
.TRUE. |
.TRUE. |
.FALSE. |
Precedenza degli Operatori Logici
Gli operatori logici vengono valutati dopo gli operatori aritmetici e relazionali.
L'ordine di esecuzione è il seguente:
- Prima vengono valutate tutte le operazioni aritmetiche.
- Poi vengono valutati gli operatori relazionali (
==
,/=
,>
,>=
,<
,<=
). - Gli operatori
.NOT.
vengono valutati per primi tra quelli logici. - Segue
.AND.
, eseguendo le operazioni da sinistra a destra. .OR.
viene valutato dopo.AND.
, sempre da sinistra a destra..EQV.
e.NEQV.
sono gli ultimi ad essere valutati.
Come nelle operazioni aritmetiche, le parentesi possono essere usate per modificare la precedenza.
Vediamo qualche esempio.
Supponiamo di avere le seguenti variabili logiche:
LOGICAL :: log1, log2, log3
log1 = .TRUE.
log2 = .TRUE.
log3 = .FALSE.
Vediamo il risultato di alcune operazioni logiche:
Espressione logica | Risultato |
---|---|
.NOT. log1 |
.FALSE. |
log1 .OR. log3 |
.TRUE. |
log1 .AND. log3 |
.FALSE. |
log2 .NEQV. log3 |
.TRUE. |
log1 .AND. log2 .OR. log3 |
.TRUE. |
log1 .OR. log2 .AND. log3 |
.TRUE. |
.NOT. (log1 .EQV. log2) |
.FALSE. |
Un dettaglio fondamentale da tenere a mente è che le operazioni logiche non possono essere eseguite su dati numerici o di tipo carattere.
Ad esempio, il seguente codice causerà un errore di compilazione:
4 .AND. 3 ! Errore
Valori logici nelle istruzioni di input e output
Se una variabile logica viene utilizzata in un'istruzione READ
, il valore di input deve essere:
.TRUE.
o.FALSE.
(formato standard)- Una stringa che inizia con "T" o "F" (ad esempio,
"T"
viene convertito in.TRUE.
,"F"
in.FALSE.
)
Qualsiasi altro valore causerà un errore di runtime.
Se una variabile logica viene utilizzata in un'istruzione WRITE
, il valore stampato sarà:
"T"
se la variabile è.TRUE.
"F"
se la variabile è.FALSE.
Ad esempio:
LOGICAL :: flag
flag = .TRUE.
WRITE (*,*) flag ! Stampa "T"
Utilizzo delle variabili e delle espressioni logiche
Le variabili ed espressioni logiche non sono quasi mai il risultato finale di un programma, ma sono essenziali per il controllo del flusso di esecuzione.
La maggior parte delle strutture di controllo in Fortran si basa su valori logici, quindi dobbiamo essere in grado di leggere e scrivere espressioni logiche per comprendere il funzionamento dei programmi.
Approfondiremo ulteriormente queste strutture nelle prossime lezioni.
In Sintesi
In questa lezione abbiamo studiato che:
- Le costanti logiche in Fortran possono assumere solo i valori
.TRUE.
e.FALSE.
, e devono includere i punti iniziale e finale. - Le variabili logiche contengono valori booleani e vengono dichiarate con lo statement
LOGICAL
. - Gli operatori relazionali confrontano valori numerici e caratteri, restituendo
.TRUE.
o.FALSE.
a seconda della relazione espressa. - Gli operatori logici includono
.AND.
,.OR.
,.EQV.
,.NEQV.
e l'operatore unario.NOT.
. - L'ordine di valutazione degli operatori segue una gerarchia precisa, con
.NOT.
valutato per primo e.EQV.
/.NEQV.
per ultimi. - Le tabelle di verità descrivono il comportamento degli operatori logici, evidenziando le combinazioni di valori di input e il loro risultato.
- Le variabili logiche possono essere utilizzate in input e output, accettando stringhe che iniziano con "T" o "F" e stampando
"T"
o"F"
nei risultati. - Gli operatori logici non possono essere applicati a dati numerici o carattere, e il loro uso errato genera errori di compilazione.