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 è:

a_1 \; op \; a_2

Dove:

  • a_1 e a_2 sono espressioni aritmetiche, variabili, costanti o stringhe di caratteri
  • op è 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
Tabella 1: Tabella degli operatori relazionali in Fortran

Esistono due forme di ciascun operatore relazionale:

  1. Forma moderna (introdotta in Fortran 90): Utilizza simboli simili a quelli adoperati in matematica (==, >=, <=);
  2. 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.
Tabella 2: Esempi di espressioni logiche con operatori relazionali

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).

Nota

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 è:

l_1 \; .op. \; l_2

Dove:

  • l_1 e l_2 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
Tabella 3: Tabella degli operatori logici in Fortran

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.
Tabella 4: Tabelle di verità per gli operatori logici .AND., .OR., .EQV. e .NEQV.
l1 .NOT. l1
.FALSE. .TRUE.
.TRUE. .FALSE.
Tabella 5: Tabella di verità per l'operatore logico unario .NOT.

Precedenza degli Operatori Logici

Gli operatori logici vengono valutati dopo gli operatori aritmetici e relazionali.
L'ordine di esecuzione è il seguente:

  1. Prima vengono valutate tutte le operazioni aritmetiche.
  2. Poi vengono valutati gli operatori relazionali (==, /=, >, >=, <, <=).
  3. Gli operatori .NOT. vengono valutati per primi tra quelli logici.
  4. Segue .AND., eseguendo le operazioni da sinistra a destra.
  5. .OR. viene valutato dopo .AND., sempre da sinistra a destra.
  6. .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.
Tabella 6: Esempi di espressioni logiche con operatori logici

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.