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 :

Problème pour une division


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Problème pour une division
    Bonjour,

    J'ai un petit souci avec mon code. Quand j'entre les valeurs du numérateur et du dénominateur, il ne m'affiche que 0.0000 pour fraction2 et 0 pour fraction3. Pourriez-vous m'aider car je ne comprends pas pourquoi il ne m'affiche pas 0.5000 quand j'entre 1 pour num et 2 pour déno.
    Voici l'énoncé de l'exercice :
    Écrivez un programme qui, après avoir obtenu deux entiers, numérateur et dénominateur
    d'une fraction, calcule sa valeur via une division réelle, puis via une division entière, et
    enfin affiche
    • les deux entiers sous la forme d'une fraction,
    • le premier résultat sous la forme d'un réel (4 décimales affichées) et
    • le deuxième résultat.
    À l'écran doit apparaitre, par exemple :
    Numérateur : 1
    Dénominateur : 4
    1/4 = 0.2500 = 0
    a. Tester avec différentes valeurs de manière à vérifier tous les types de cas
    possibles.
    b. Que produit votre programme si on obtient 0 comme dénominateur ?
    Modifier le programme de manière à ce qu'il affiche un message d'erreur
    compréhensible par n'importe quel utilisateur.

    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
     
    #include <stdio.h>
     
    void main(void)
    {
    	int num;
    	int déno;
    	float fraction2;
    	int fraction3;
    	printf("Numérateur :");
    	scanf_s("%d", &num);
    	getchar();
    	printf("Dénominateur :");
    	scanf_s("%d", &déno);
    	getchar();
    	fraction2 = num / déno;
    	fraction3 = num / déno;
    	printf("%d/%d = %.4f = %d", num, déno, fraction2, fraction3);
    }
    D'avance merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Tu utilises des int, des entiers. Donc la division effectuée est une division entière.
    Si tu veux un résultat flottant, utilise des flottants, float ou double.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Bonjour,

    Et une réponse qui résout le problème, qui est un exercice de cours ...
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réponse

    Mais quand je déclare mon fraction2 j'ai mis "float"
    C'est pour ça que je ne comprend pas pourquoi il ne fait pas ma division correctement

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Il faut au moins 1 opérande flottant pour que la division flottante soit effectuée.
    Tes 2 opérandes sont entiers, tu fais une division entière.
    Que tu stockes le résultat dans un float ne change pas ce fait.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Je n'ai rien dit, c'est réglé
    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
     
    #include <stdio.h>
     
    void main(void)
    {
    	double num;
    	double déno;
    	double fraction2;
    	double fraction3;
    	printf("Numérateur :");
    	scanf_s("%lf", &num);
    	getchar();
    	printf("Dénominateur :");
    	scanf_s("%lf", &déno);
    	getchar();
    	fraction2 = num / déno;
    	fraction3 = num / déno;
    	printf("%0.f/%0.f = %.4f = %d", num, déno, fraction2, fraction3);
    }
    Merci encore

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Des fois, il faut forcer un peu le C . La méthode extrême :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	int numerator;
    	int denominator;
    	float fraction;
     
    // ...
     
    	fraction = (float) (((float) numerator)/ ((float) denominator));

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par phaudez Voir le message
    Je n'ai rien dit, c'est réglé
    Pour les divisions peut-être. Mais même si tu penses avoir compris il reste quelques pièges subtils comme par exemple des calculs plus longs contenant un "float" mais se faisant quand-même en entier. Car une grosse opération est découpée en "n" petites et chaque "petite" est faite de façon indépendante du reste.
    Autrement dit, float f=0.5 + 5/2 te donnera 2.5 et non 3.0. Parce que la division étant prioritaire, elle se fait avant l'addition. Et comme elle ne contient que des entiers...

    Reste enfin le souci de la fonction main() qui n'est pas "void" mais "int".

    Citation Envoyé par foetus Voir le message
    La méthode extrême
    Le "trop" est l'ennemi du bien. Et en C plus que partout ailleurs.
    Passe encore que tu castes les deux opérandes alors qu'un seul aurait suffit. On peut mettre ça sous le coup d'une certaine volonté d'élégance et d'équilibre dans l'écriture de la division.
    Mais caster le résultat (qui est déjà "float") en "float" est vraiment..."trop". Et ces parenthèses en "trop" n'arrangent vraiment rien
    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]

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2019
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Sve@r Voir le message

    Pour les divisions peut-être. Reste encore le souci de la fonction main() qui n'est pas "void" mais "int".
    Je découvre seulement mes cours (en pleine session c'est pas très intelligent je sais)
    Du coup, pour l'instant je fais un peu le "singe" et copie ce que je vois... Pas la meilleure façon d'apprendre je sais...

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    il reste quelques pièges subtils
    Le plus subtil, ce sont les nombres qui n'existent pas en flottant

    J'ai eu récemment une question de ce style dans un test de recrutement avec un calcul erroné ... et il fallait s'en souvenir (et tu peux chercher longtemps parce que le code est valide)


    Citation Envoyé par Sve@r Voir le message
    Le "trop" est l'ennemi du bien. Et en C plus que partout ailleurs. ... Et ces parenthèses en "trop" n'arrangent vraiment rien
    Bof, je préfère blinder que dans X mois mon code ait un comportement bizarre parce que le compilateur a été un peu laxiste/ est exotique (entre autres)
    Dans ce cas, je ne vois pas trop le problème ... mais la lecture est pénible

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 19/02/2007, 00h20
  2. [MySQL] problème pour calculer âge - code erronné
    Par Christophe93250 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 12/02/2007, 18h54
  3. Problème pour une calculette
    Par Pyrhaa_666 dans le forum C
    Réponses: 5
    Dernier message: 13/07/2006, 19h47
  4. problème pour une calculatrice
    Par Anthobask dans le forum C
    Réponses: 4
    Dernier message: 19/12/2005, 21h11
  5. Problème avec une division
    Par ghan77 dans le forum Débuter
    Réponses: 3
    Dernier message: 08/12/2005, 10h50

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