Programmare in C – Looping: un esempio concreto

Guida C

Guida completa al linguaggio C – looping: un esempio concreto. Supponiamo di voler creare un programma che stampa una tabella di conversione fra gradi Fahrenheit e gradi Celsius.

Si può fare facilmente con un ciclo for o con un ciclo while.

#include <stdio.h>

int main()
{
    int a;
    a = 0;
    while (a <= 100)
    {
        printf("%4d gradi F = %4d gradi C\n",
            a, (a - 32) * 5 / 9);
        a = a + 10;
    }
    return 0;
}

Se si esegue questo programma, esso creerà una tavola di valori che parte da 0 gradi Fahrenheit e arriva fino a 100 gradi Fahrenheit. L'output sarà come questo:

0 gradi F = -17 gradi C
10 gradi F = -12 gradi C
20 gradi F = -6 gradi C
30 gradi F = -1 gradi C
40 gradi F = 4 gradi C
50 gradi F = 10 gradi C
60 gradi F = 15 gradi C
70 gradi F = 21 gradi C
80 gradi F = 26 gradi C
90 gradi F = 32 gradi C
100 gradi F = 37 gradi C
La tabella prevede che i gradi fahrenheit si incrementino di 10 in 10. Ma si può cambiare i valori di inizio e fine per realizzare una analoga tabella di conversione.

Se si vuole che i valori ottenibili siano più accurati, si possono usare valori a virgola mobile (float).

#include <stdio.h>
int main()
{
    float a;
    a = 0;
    while (a <= 100)
    {
        printf("%6.2f degrees F = %6.2f degrees C\n",
            a, (a - 32.0) * 5.0 / 9.0);
        a = a + 10;
    }
    return 0;
}

Si può notare che la dichiarazione della variabile a è stata cambiata in float e quindi il simbolo %f sostituisce il simbolo %d nell'istruzione printf. Inoltre, il simbolo %f viene utilizzato con una formattazione: il valore verrà stampato con 6 cifre prima del punto decimale e due cifre dopo la virgola.

Ora supponiamo di voler modificare il programma in modo che la temperatura di 98.6 venga inserita nella tabella nella posizione adeguata. Ossia, vogliamo che la tabella si incrementi ogni 10 gradi, ma vogliamo inoltre che la tabella includa una linea extra per i 98.6 gradi Farenheit, poiché questa è la normale temperatura corporea di un essere umano. Il seguente programma realizza quanto detto:

#include <stdio.h>

int main()
{
    float a;
    a = 0;
    while (a <= 100)
    {
        if (a > 98.6)
        {
            printf("%6.2f degrees F = %6.2f degrees C\n",
                98.6, (98.6 - 32.0) * 5.0 / 9.0);
        }
        printf("%6.2f degrees F = %6.2f degrees C\n",
            a, (a - 32.0) * 5.0 / 9.0);
        a = a + 10;
    }
    return 0;
}

Questo programma funziona se il valore finale è 100 ma se si cambia il valore finale in 200 noterete che il programma ha un bug, ossia un errore: stampa la linea 98.6 troppe volte. Possiamo risolvere questo problema in diverse maniere. Eccone una:

#include <stdio.h>
int main()
{
    float a, b;
    a = 0;
    b = -1;
    while (a <= 100)
    {
        if ((a > 98.6) && (b < 98.6))
        {
            printf("%6.2f degrees F = %6.2f degrees C\n",
                98.6, (98.6 - 32.0) * 5.0 / 9.0);
        }
        printf("%6.2f degrees F = %6.2f degrees C\n",
            a, (a - 32.0) * 5.0 / 9.0);
        b = a;
        a = a + 10;
    }
    return 0;
}

Approfondimenti ed esercizi

Provate a modificare il programma di conversione Fahrenheit/Celsius in modo che con una istruzione scanf possa accettare i valori di inizio, fine e di incremento.
• aggiungere una linea di intestazione alla tabella che viene stampata
• Provare a trovare una soluzione diversa per il bug risolto nell'esempio precedente
• creare una tabella che converta pounds in kilogrammi o miglia in chilometri

Errori in C da evitare
• mettere un simbolo = quando in realtà si deve utilizzare == in uno statement if o in uno statement while
• dimenticare di incrementare il contatore all'interno di un ciclo while. Se si dimentica di incrementare il contatore, si ottiene un loop infinito (ossia il ciclo non terminerà mai)
• Inserire accidentalmente un punto e virgola alla fine di un ciclo for o di uno statement if, perchè lo statement non ha alcun effetto. Per esempio:
for (x=1; x<10; x++);
printf("%d\n",x);
esegue sì il ciclo, ma durante il ciclo non stampa nulla.

STAMPA     Tags:,

Leave a Reply