2014-12-13 6 views
6

si suppone che questo programma per convertire i gradi Fahrenheit in gradi Celsius:"while?()" Funzione?

#include <stdio.h> 
int main() { 
    float fahrenheit, celsius; 
    int max, min, step; 

    max = 100; 
    min = 0; 
    step = 5; 

    fahrenheit = 0.0; 
    //celsius = (fahrenheit - 32.0) * 5.0/9.0; DOESN'T WORK HERE 

    printf("\n"); 
    printf("This program converts fahrenheit into celsius \n"); 

    while(fahrenheit <= max) { 
     celsius = (fahrenheit - 32.0) * 5.0/9.0; /* Works here */ 
     printf("%3.0f %6.2f\n", fahrenheit, celsius); 
     fahrenheit = fahrenheit + step; 
    } 
} 

Come ho notato nei miei commenti di origine, quando provo messo la formula per celsius nel corpo della funzione main(), ottengo -17.8 per ogni valore singolo fahrenheit. L'output è simile a questo:

0 -17.78 
5 -17.78 
10 -17.78 
15 -17.78 
20 -17.78 
25 -17.78 

e così via e così via. Tuttavia, quando inserisco la formula celsius nella funzione while(), ottengo i valori Celsius corretti per ogni valore Fahrenheit. È così:

0 -17.78 
5 -15.00 
10 -12.22 
15 -9.44 
20 -6.67 

Perché succede?

Ecco il codice che non funziona. È identico al codice sopra, tranne per la posizione della formula celsius. (Almeno, penso che sia.)

#include <stdio.h> 
//this program is supposed to convert fahrenheit into celsius 
int main() { 
    float fahrenheit, celsius; 
    int max, min, step; 

    max = 100; 
    min = 0; 
    step = 5; 

    fahrenheit = 0.0; 
    celsius = (fahrenheit - 32.0) * 5.0/9.0; 

    printf("\n"); 
    printf("This program converts fahrenheit into celsius \n"); 

    while(fahrenheit <= max) { 
     printf("%3.0f %6.2f\n", fahrenheit, celsius); 
     fahrenheit = fahrenheit + step; 
    } 
} 
+7

'while' non è una funzione; è una parola chiave che specifica un particolare tipo di affermazione. Il codice nella tua domanda funziona correttamente. Dobbiamo vedere il codice che * non * funziona. –

+0

@KeithThompson Ha fornito il codice che non funziona: lo stesso codice, ma il codice di conversione viene spostato fuori dal ciclo. – fuz

+0

@FUZxxl: Sì, ha modificato la domanda dopo il mio commento. –

risposta

7

Quando si imposta un valore a una variabile, il valore effettivo è calcolato, e quindi memorizzato nella variabile. È necessario non memorizzare una formula per la variabile, tuttavia. Così, quando si esegue

celsius = (fahrenheit - 32.0) * 5.0/9.0; 

fuori del ciclo while, utilizza il valore corrente di fahrenheit (che è 0,0), e calcola il valore per celsius, che è -17,78.

All'interno loop while, anche se fahrenheit modifiche celsius no, perché non ci sono istruzioni all'interno del ciclo while per cambiare effettivamente il valore della variabile. Questo è il motivo per cui è necessario spostare l'istruzione nel ciclo while per assicurarsi che il valore celsius venga aggiornato ogni volta che il valore fahrenheit cambia.

-2

Non si può pretendere il valore di fahrenheit per cambiare al di fuori del ciclo come si sta convertendo un unico valore:

(-32.0) * 5.0/9.0 = -17.8 (every time) 

L'unica volta che il valore con il cambiamento è che se si cambia il valore di fahrenheit stessa. Al di fuori del ciclo. Questo non succede

Inoltre, confrontare unocon uno float non è mai una buona idea. Il motivo è che un numero in virgola mobile, memorizzato nel formato a virgola mobile a precisione singola IEEE-754 non è una rappresentazione esatta del valore fornito per la memorizzazione. (Ad esempio 32.2 non vengono memorizzati in formato virgola mobile come esattamente 32,2) Anche se è possibile fare un confronto relativo:

while(fahrenheit <= max) 

E 'meglio la pratica di fare:

int i = 0; 
for (i = 0; i < max; i+=5) { 
    fahrenheit += (float)i; 
    celsius = (fahrenheit - 32.0) * 5.0/9.0; 
... 

State cambiando fahrenheit qui all'interno del loop e puoi quindi aspettarti che il valore di celsius cambi di conseguenza.

Per quanto riguarda il confronto in virgola mobile, è necessario leggere The Floating-Point Guide - What Every Programmer Should Know .... Il problema è che non stai confrontando ciò che pensi di essere.

+6

dovrebbe essere un commento –

+1

C scriverà 'i' in un float in ogni caso, in' (i - 32.0) '. – yellowantphil

+0

Sì, sono ben consapevole della promozione e dello standard, ma essere esplicito per l'enfasi dell'apprendimento non fa mai male. –

2

Questo perché è un ciclo utilizzato per ripetere un blocco di codice.

Se si mette celsius = (fahrenheit - 32.0) * 5.0/9.0; /* Works here */ di fuori del blocco di mentre sarà iterare solo una volta (e che sta per essere quando fahrenheit = 0.0), ma se si mette celsius = (fahrenheit - 32.0) * 5.0/9.0; /* Works here */ all'interno del blocco di mentre celsius cambierà il suo valore come Fahrenheit fa, mentre la condizione fahrenheit <= max è vera.

+0

Cosa intendi per 'bucle'? – b4hand

+0

Significa loop ... Ho pensato che potesse essere detto anche in inglese, mi sono sbagliato. – OiciTrap

+0

minore nit: il ciclo continuerà a scorrere su fahrenheit da 0 a 100, non solo una volta, semplicemente non stamperà un risultato diverso – kdopen

2

Il codice:

celsius = (fahrenheit - 32.0) * 5.0/9.0; 

assegna la variabile celsius con (fahrenheit - 32.0) * 5.0/9.0

cui si chiama il codice al di fuori del ciclo while, Fahrenheit è 0 così celsius diventa -17,78

Se si mette la codice all'interno del ciclo while, riassegna Celsius ogni volta che il ciclo si blocca. Fahrenheit cambia all'interno di questo ciclo in modo che ogni volta che viene eseguito il ciclo while, sia Fahrenheit che Celsius saranno diversi se si riassegna Celsius con celsius = (fahrenheit - 32.0) * 5.0/9.0; all'interno del ciclo while.

3

Benvenuti in SO. State venendo alle prese con una delle dichiarazioni di controllo del flusso di base presenti in ogni linguaggio di programmazione.

In sostanza, qualsiasi programma per computer è una sequenza di istruzioni e si può prevedere che il computer li esegua uno alla volta dall'alto verso il basso della pagina.

Logicamente, ciò significa che ogni istruzione viene eseguita una sola volta, a meno che non ci sia un modo per dire al programma di "tornare indietro" e fare qualcosa di nuovo. Questo è ciò che fa l'istruzione while (non è una funzione). In inglese un while (di solito chiamato while loop) fa qualcosa di simile

if a condition is true 
    execute some instructions 
    go back and check the condition and keep looping 
else 
    continue after the loop 

Così, il vostro ciclo principale ha un gruppo di istruzioni che vengono eseguiti solo una volta (ogni cosa prima del while).

Quindi le istruzioni all'interno del ciclo while vengono ripetute con fahrenheit assumendo un valore diverso ogni volta attraverso il ciclo: 0, 5, 10, 15, ..., 95, 100. Quando si aggiungono 5 l'ultima volta , fahrenheit ha il valore 105, in modo che il programma esce dal ciclo e continua (in questo caso, che termina la funzione main() e uscire dal programma.

Se avete la celsius calcolo all'esterno del ciclo, accade solo una volta. Poi ogni volta attraverso il ciclo stampa il valore calcolato - anche se fahrenheit è in continua evoluzione.

Quando si mo Il calcolo all'interno del ciclo while, celsius viene ricalcolato su ogni passaggio attraverso il ciclo, utilizzando il nuovo valore di fahrenheit e quindi producendo risultati diversi.

Spero che questo aiuti