2015-09-26 1 views
2

Actuellement travaillant sur une affectation et un peu coincé. Nous devons convertir une température de Celsius en Fahrenheit. La réponse finale devrait produire un nombre à virgule flottante si la réponse est une décimale, ou un entier s'il s'agit d'un nombre entier. Je l'ai mis en place pour me donner le nombre à virgule flottante, mais quand j'entre un numéro, disons '98 .6 ', j'obtiendrai 37.00000 plutôt que 37. Été à lui pendant quelques heures essayant de le combattre par moi-même mais je Je suis à court d'idées. Merci pour l'aide!Comment faire une réponse un nombre flottant ou entier en fonction du nombre entré?

int main(void) 
{ 
    float ftemp; 
    float ctemp;  

     printf ("Enter a temperature in Fahrenheit: "); 
    scanf ("%f", &ftemp); 
    ctemp = (100.0/180.0) * (ftemp - 32); 
    printf ("In Celsius, your temperature is %f!\n", ctemp); 

    return 0; 
} 

Répondre

1

Vous imprimez votre numéro comme un flotteur, d'imprimer comme un entier:

printf ("In Celsius, your temperature is %d!\n", (int) ctemp); 

Il utilise le spécificateur de conversion d pour l'impression décimale et l'argument est casté en int comme %d nécessite une int.

2

Il n'y a vraiment pas un bon moyen de faire cela comme vous l'avez décrit. Ce que vous voulez vraiment, c'est une meilleure mise en forme des chaînes. Essayez d'utiliser %g au lieu de %f dans votre printf (par this post).

par exemple.

printf ("In Celsius, your temperature is %g!\n", ctemp); 

Maintenant, si vous êtes mordicus à obtenir pour utiliser un entier, le plus proche vous pouvez venir est avec:

int main(void) 
{ 
    float ftemp; 
    float ctemp; 
    int ctempi;  

    printf ("Enter a temperature in Fahrenheit: "); 
    scanf ("%f", &ftemp); 
    ctemp = (100.0/180.0) * (ftemp - 32); 
    ctempi = (int)ctemp; 
    if(ctemp == ctempi) { 
     printf("In Celsius, your temperature is %d\n", ctempi); 
    } else { 
     printf ("In Celsius, your temperature is %f!\n", ctemp); 
    } 

    return 0; 

}

+0

Cela a fonctionné parfaitement! Merci beaucoup! –

0

Une chose qui est difficile sur les nombres à virgule flottante c'est qu'ils ne sont pas exacts. Un nombre qui peut être exprimé en décimal sans répétition de chiffres peut avoir des chiffres répétés en binaire.

Vous devez donc vérifier si le résultat est un nombre entier, mais en raison de la nature imprécise du nombre à virgule flottante, quelque chose comme (1.0/3.0 * 3) == 1 peut donner une valeur false. Vous avez donc besoin de voir si c'est dans un certain seuil d'un nombre entier.

if (fabs(ctemp - roundf(ctemp)) < 0.0001) { 
    // result is close enough to an integer, so print as integer 
    printf ("In Celsius, your temperature is %d!\n", (int)ctemp); 
} else { 
    // result is not an integer, so print as a float 
    printf ("In Celsius, your temperature is %f!\n", ctemp); 
} 
+0

Merci beaucoup pour l'info. Pour ce dont j'ai besoin, je vais juste utiliser la méthode de Joshua, c'est assez proche de ce qui est attendu. Mais je garderai votre info et votre esprit et je la mettrai en signet pour une utilisation future, parce que je suis sûr que j'en aurai besoin. Je vous remercie! –

0

Lecture de l'entrée sous forme de chaîne et test de l'attribut entier.

#include <stdbool.h> 
#include <stdlib.h> 
#include <stdio.h> 

struct dual { 
    char type; 
    union { 
    int i; 
    float f; 
    } u; 
} dual_T; 

dual_T GetNumber(void) { 
    dual_T number; 
    float f; 
    char buf[100]; 
    if (fgets(buf, sizeof buf, stdin) == NULL) { 
    number.type = 'n'; 
    return number; 
    } 

    // test for float - sample code possibility 
    int n = 0; 
    sscanf(buf, "%f %n", &f, &n); 
    bool f_possible = n > 0 && *n == 0; 

    // test for int - sample code possibility 
    n = 0; 
    sscanf(buf, "%i %n", &number.u.i, &n); 
    bool i_possible = n > 0 && *n == 0; 

    if (f_possible) { 
    if (i_possible) { 
     // If fits as an `int`, go with `int` as likely higher precision. 
     if (f >= INT_MIN && f <= INT_MAX) { 
     number.type = 'i'; 
     return number; 
     } 
    } 
    number.type = 'f'; 
    number.u.f = f; 
    } else { 
    if (i_possible) { 
     number.type = 'i'; 
    } else { 
     number.type = 'n'; // none 
    } 
    } 
    return number; 
}