IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

expressions arithmétiques renvoyant zero


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 7
    Par défaut expressions arithmétiques renvoyant zero
    Bonjour,

    j'utilise la formule de conversion de degré fahrenheit en celsius, mais lorsque je l'applique à des tests, le programme me revoie toujours 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3
      4 void menu () {
      5
      6   printf ("\n");
      7   printf ("\t0-Convertisseur celsius\n");
      8   printf ("\t1-Convertisseur fahrenheit\n");
      9   printf ("\n");
     10   printf ("your choice ");
     11
     12 }
     13
     14 int main () {
     15 /////variables/////
     16   int reponse;
     17   float F=0,C=0;
     18
     19 ///////////////////
     20   menu();
     21   scanf ("%d", &reponse);
     22
     23   switch (reponse) {
     24
     25   case 0 :
     26     printf("entrez une valeur en fahrenheit ");
     27     scanf ("%f",&F);
     28     C = 5/9 * (F-32);
     29     printf ("C=%f \n",C);
     30     break;
     31
     32   case 1 :
     33     printf("entrez une valeur en celsius ");
     34     scanf ("%f",&C);
     35     F = ((9*C)/5)+32;
     36     printf ("F=%f \n",F);
     37     break;
     38
     39   default :
     40       break;
     41   }
     42
     43   return 0;
     44 }
     45
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3
      4 int main () {
      5
      6   float C=0, F=0;
      7
      8   printf("valeur en fahrenheit :");
      9   scanf("%f",&F);
     10
     11   C = 5/9*(F-32);
     12
     13   printf("C=%f \n", C);
     14
     15   return 0;
     16 }
    L'opération inverse fonctionne.

    Si l'un d'entre vous peux m'éclairer, çela serait sympa.
    Cordialement.

  2. #2
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 736
    Par défaut
    Bonjour.

    L'expression 5/9 est une division entière, ses opérandes et son résultat sont des entiers.
    Si c'était une division réelle, ça vaudrait 0.555…, mais en division entière il n'y a pas de chiffres après la virgule, c'est arrondi à 0.

    Donc pour avoir le résultat voulu, il faut changer l'une des opérandes en float, soit 5./9, 5/9. ou encore 5./9..

  3. #3
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Ou alors faire la division à la fin : C = (5*(F-32))/9;
    EDIT : ah non, le résultat attendu est un float. Donc "5." au lieu de "5" suffit.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Rob95 Voir le message
    Si l'un d'entre vous peux m'éclairer, çela serait sympa.
    Bonjour

    Ce qu'il faut bien comprendre dans les expressions, c'est que le calcul se fait non pas dans la globalité mais étape par étape selon les priorités des opérateurs et les parenthèses quand on veut modifier ces priorités. Et que chaque étape se fait dans le type le plus large des opérandes de l'étape (et non de l'expression)

    Donc dans 5/9 * (F - 32), et malgré le fait qu'il y ait du float dans l'expression, celle-ci ne se fait pas entièrement en float. La priorité des opérateurs et l'associativité de la division font que ça commence par calculer 5/9 avant de continuer. Et ce calcul n'utilisant que des int se fait dont en int.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Ce qui serait intéressant dans ce type d'exercice très simple, c'est d'essayer d'apporter un surplus de réflexion conceptuelle...

    Avoir une fonction qui pourrait s'exécuter de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = convert(value, C, F);
    avec les énumérations par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum unite {CELSIUS, FAHRENHEIT, ...};
    ça peut rendre quelque chose de sympa

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float convert(float value, unite start, unite end);
    c'est je trouve une signature explicite pour montrer quelle unité est convertie et en quoi.

    Maintenant le tout est de savoir comment parser une ligne de commande du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./convert -c 50.2 -f # convertir 50,2°C en Fahrenheit
    Exercice très sympa je trouve pour faire tout cela... La partie conception étant un travail censé être fait en amont du code à écrire.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Maintenant le tout est de savoir comment parser une ligne de commande du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./convert -c 50.2 -f # convertir 50,2°C en Fahrenheit
    Très (enfin relativement en fait) facilement avec la librairie getopt...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    En effet tout est relatif, je donnais là une idée qui me passe par la tête, mais d'autres solutions sont toutes aussi viables...

    La difficulté (c'est relatif) n'est pas dans le fait d'analyser une ligne de commande, mais ça reste un autre problème à résoudre auquel il faudra penser par la suite.

    getopt est en effet une bonne solution, mais on enlève la partie portabilité du code, je trouve cela un peu dommage, malgré que je pense que son code restera un code personnel utilisable sur un seul OS.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 7
    Par défaut
    Merci pour vos réponses !

    Concernant ta réponse fred, je ne savais pas que l'on pouvais ajouter des arguments à un exécutable en c, et je ne sais absolument pas comment faire.

    En tout cas vous avez sans doute résolu mon problème. Je n'avais pas pensé à faire une fonction, merci.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/05/2007, 11h02
  2. Réponses: 1
    Dernier message: 03/01/2007, 15h07
  3. Réponses: 1
    Dernier message: 09/12/2006, 10h13
  4. Parsing d'expressions arithmétiques
    Par Premium dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 23/08/2006, 15h09
  5. Evaluation d'une expression arithmétique
    Par MysticKhal_0 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 10/03/2006, 18h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo