Corso di C con Linux

Strutture di controllo - Parte I

 

Ogni programma che si rispetti necessita, nella maggior parte dei casi, di dover intraprendere operazioni diverse a seconda del verificarsi o meno di determinate condizioni.
Ad es. se l’utente immette un valore non adeguato come risposta ad un prompt del programma, l’esecuzione può non poter procedere regolarmente e si deve prevedere un comportamento opportuno per ripristinare la correttezza delle informazioni, tipicamente riproponendo la richiesta o terminando il programma.
Per poter realizzare operazioni di questo tipo, il C offre diverse soluzioni.

Iniziamo ad esaminare la struttura di controllo condizionale più semplice, ovvero l’istruzione if, il cui uso è il seguente:

if (questa condizione è vera)
    esegui questa istruzione;

La parola chiave if indica che occorre eseguire un test sulla condizione racchiusa tra parentesi tonde; se la condizione è verificata bisogna eseguire l’istruzione indicata successivamente.
Esaminiamo ad es. il seguente codice:

if ( eta >= 100 )
    printf(“Complimenti %s!\n”, nome);
printf(“Attendere prego...\n”);

Se l’istruzione non è verificata, l’istruzione non viene eseguita e il controllo passa all’istruzione successiva all’if; nell’esempio precedente se l’età dell’utente è inferiore a 100 anni, allora non viene stampata la stringa con i complimenti e l’esecuzione passa direttamente alla stampa della stringa di attesa.

Se al verificarsi della condizione occorre eseguire più linee di codice, basta inserire un blocco di istruzioni (v. lezione 22), ad es. potremmo voler estendere l’esempio precedente nel seguente modo:

if ( eta >= 100 ) {
    printf(“Complimenti %s!\n”, nome);
    occupazione = “nonno”;
}
printf(“Attendere prego...\n”);

Più in generale può essere necessario intraprendere operazioni alternative, specificando le istruzioni da eseguire quando la condizione non è verificata.
In questo caso si può utilizzare la parola chiave else, che permette di costruire strutture di controllo del tipo:

if (questa condizione è vera)
    esegui questa istruzione;
else /* altrimenti */
    esegui quest’altra istruzione;

Ad es.:

if ( eta >= 18 )
    maggiorenne = TRUE;
else
    maggiorenne = FALSE;

Se le alternative da gestire sono più di due, è facile estendere l’uso di else, ricorrendo a strutture di tipo else-if del tipo:

if (questa condizione è vera)
    esegui questa istruzione;
else if (quest’altra condizione è vera)
    esegui quest’altra istruzione;
else
    esegui quest’altra istruzione;

Ad es.:

if ( a > 0 )
printf(“Risultato positivo!\n”);
else if ( a < 0 )
    printf(“Risultato negativo!\n”);
else
    printf(“Risultato nullo!\n”);

La condizione da verificare può essere un’espressione più o meno complessa, ottenuta concatenando più condizioni mediante gli operatori logici visti la scorsa lezione, ad es.:

if ( (a > 0) && (a % 2 == 0) )
printf(“Risultato positivo pari!\n”);

Si faccia molta attenzione quando si testa una condizione di uguaglianza.
Infatti un errore molto frequente, soprattutto agli inizi, è quello di scrivere un solo segno '=' invece di due, il che determina comportamenti “strani” difficili da individuare e correggere.
Il motivo principale è che in C non esiste il tipo booleano e il test della condizione è ritenuto vero se il valore dell'espressione è diverso da zero, falso se l'espressione è nulla.
Scriviamo il seguente programma:

#include <stdio.h>

int main (int argc, char *argv)
{
       int a;
       if ( a = 0 )
              a++;
       printf("a=%d\n", a);
       return 0;
}

Proviamo a compilarlo e notiamo che non ci viene segnalato dal compilatore alcun errore o avvertimento.
L'output di questo semplice esempio è:

a=0

Se scriviamo come condizione dell'if:

if ( a = 1 )

l'esecuzione del programma ci darà:

a=2

Questo dimostra che mentre nel primo caso non viene eseguito l'incremento di a, nel secondo caso invece, poiché l'espressione da testare ha valore diverso da 0, l'incremento viene effettuato.

Vedremo alcuni altri aspetti delicati che riguardano le strutture di controllo nella prossima lezione.

 

Torna all'indice Generale del corso di Corso di C con Linux di Software Planet