Corso di C con Linux

Strutture di controllo - Parte III

 

Prima di proseguire con le altre strutture di controllo, vediamo di chiarirci le idee sull’uso di switch per mezzo di alcuni esempi pratici.
Per cominciare compiliamo ed eseguiamo l'esempio seguente.

/*
 * File lez35_1.c
 */
#include <stdio.h>

int main() {
    char c = 'b';

    switch (c) {
       case 'a':
                  printf("Sono nel caso 'a'\n");
                  break;
        case 'b':
                  printf("Sono nel caso 'b'\n");
                  break;
        case 'c':
                  printf("Sono nel caso 'c'\n");
                  break;
    }
    return 0;
}

Cambiando il valore di inizializzazione della variabile c possiamo vedere in che modo cambia l’output del programma.
Per esercizio, provate anche ad eliminare i break alla fine di ogni case e a rieseguire il nuovo programma, scrivendo anche il corrispondente Makefile.

Sebbene possa apparire addirittura fastidiosa la necessità di dover riscrivere la parola chiave break alla fine di ogni case, si presentano spesso dei casi in cui questa caratteristica risulta molto utile, ad es. quando si vuole eseguire la stessa istruzione per valori differenti dell’espressione.


Ne è un esempio il programma seguente:

/*
 * File lez35_2.c
 */
#include <stdio.h>

int main() {
    int i = 3;

    switch (i) {
        case 1:
        case 3:
        case 5:
case 7:
        case 9:
                printf("i e' dispari e minore di 10\n");
break;
        case 0:
        case 2:
        case 4:
        case 6:
        case 8:
printf("i e' pari e minore di 10\n");
                break;
        default:
                printf("i e' maggiore o uguale a 10\n");
    }
    return 0;
}


Notiamo l'assenza di break dopo il caso default.
Come esercizio, provate ad estendere e modificare gli esempi precedenti con altre soluzioni, ad es. utilizzando il costrutto if invece della struttura switch.



Consideriamo adesso altre importanti strutture di controllo, che consentono di eseguire cicli di istruzioni (loop), ovvero di definire una sequenza di operazioni da effettuare un prestabilito numero di volte o finché non si verifica una determinata condizione.

In C, il costrutto fondamentale per i cicli è l’istruzione while, la cui forma è la seguente:

while (questa condizione è vera)
    esegui questa istruzione;


Si noti la forte somiglianza sintattica con il costrutto if.
Tuttavia esiste una differenza fondamentale: l’istruzione while continua ad eseguire l’istruzione corrispondente finché la condizione rimane verificata.
Quando la condizione è - o diventa - falsa, l’istruzione non viene più eseguita e il controllo passa alla prima istruzione che segue quella del ciclo while.

Ad es., il programma:

/*
 * File lez35_3.c
 */
#include <stdio.h>

int main() {
    int x = 3;

    while (x >= 0)
printf("x = %d\n", x--);
    printf("Fine\n");
}


produce sullo schermo il seguente output:

x = 3
x = 2
x = 1
x = 0
Fine

L'istruzione controllata da while può essere una singola linea di codice o un blocco di istruzioni racchiuse tra parentesi graffe:

while (questa condizione è vera)
    {
    istruzione_1;
    istruzione_2;
    ...
    istruzione_n;
    }

Grazie alle parentesi è possibile avere costrutti while annidati, come nel seguente esempio:

*
 * File lez35_4.c
 */
#include <stdio.h>

int main() {
    int x = 3;
    int y;

    while (x > 0)
        {       
        printf("x = %d\n", x--);
        y = 0;
        while (y <= 2) {
            printf("\ty = %d", ++y);
        }
        printf("\n");
    }
    printf("Fine\n");
}


Si noti che se la condizione è falsa la prima volta che viene valutata, le istruzioni del ciclo non vengono mai eseguite e il controllo salta direttamente all'istruzione successiva al while.

L'istruzione while è in grado di accettare anche espressioni, oltre che condizioni; in tal caso, quando l'espressione è un numero diverso da 0 è considerata vera e le istruzioni del ciclo vengono eseguite, quando vale 0 l'istruzione while termina.
Ad es. il ciclo del primo esempio può essere scritto correttamente anche in questa forma:

int x = 4;
while (x--)
    printf("x = %d\n", x);


Nella prossima lezione approfondiremo l'uso del ciclo while e conosceremo due importanti funzioni per leggere i caratteri da tastiera e scriverli su video.

 

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