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 :

division de deux variables entières


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Par défaut division de deux variables entières
    Bonjour,

    J'ai un petit problème que je n'ai pas résolu. Le voici :

    J'ai un programme qui compte le nombre d'age de personne mineur (< 18 ans),
    d'age d'or (>55 ans), et des centenaires (>= 100 & < 120).

    La moyenne d'age est ensuite calculer et affiché.

    Je déclare des variables entières «compteur» pour les classes d'âge (mineur, age d'or, centenaire).

    Je déclare aussi une variable cumulateur qui additionne tous les âges dans le but de faire la moyenne de celles-ci à la fin. Cette moyenne est mise dans une variable de type float.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fMoyenne = iAgeTotal / (iMineur + iAgeOr + iCentenaire);
    Le problème, c'est que je n'ai pas le reste après la virgule!!!!

    Quelqu'un pourrait m'aider pour ceci?!??

    Merci!

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Le problème est simple.
    En C (et dans la plupart des langages de programmations) lorsqu'on divise une valeur entière par une autre valeur entière on a une division... Entière, le résultat est entier, il s'agit de la division euclidienne (a = bq + r --> a = b * (a / b) + (a % b)).
    Le seul moyen d'avoir une division réelle, c'est qu'au moins l'une des opérandes soit un réel, il faut donc faire un cast :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fMoyenne = iAgeTotal / (float)(iMineur + iAgeOr + iCentenaire);
    Un cast permet de changer le type d'une variable, ici l'addition deviendra donc un float, et la division sera donc une division réelle.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 14
    Par défaut
    Merci PsychoH13 pour ta réponse.

    Un de mes profs m'avais suggéré de mettre une variable de type float (ex: fAgeTotal), mais je trouve l'idée peu intéressante (étant donné que les données sont de type entière).

    J'ai essayé de plusieurs façons la position du (float).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fMoyenne = (float)( iAgeTotal / (iMineur + iAgeOr + iCentenaire);
    Ne fonctionne pas (sûrement parce que la division (entière) est fait avant la conversion).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fMoyenne =(float) iAgeTotal / (iMineur + iAgeOr + iCentenaire);
    semble être fonctionnel...

    Est-ce qu'il y a une meilleure position qu'une autre pour le float?

    Merci encore!

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    C'est clair que la première que tu proposes n'a aucun intérêt, en effet la division est déjà faite...
    Sinon tu peux mettre le float comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fMoyenne = (float)iAgeTotal / (float)((float)iMineur + (float)iAgeOr + (float)iCentenaire);
    Sur tous les casts que j'écris là, un seul suffit et quelque soit le cast que tu choisis de garder ça marchera, donc fais ton choix.

    En effet, quelque soit l'opération que tu fais, si l'une des variables est de type float et bien tu obtiendras un float.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PsychoH13 Voir le message
    En effet, quelque soit l'opération que tu fais, si l'une des variables est de type float et bien tu obtiendras un float.
    A un détail près (voir plus bas)

    Citation Envoyé par debian_seb Voir le message
    Merci PsychoH13 pour ta réponse.

    Un de mes profs m'avais suggéré de mettre une variable de type float (ex: fAgeTotal), mais je trouve l'idée peu intéressante (étant donné que les données sont de type entière).
    Tout à fait d'accord. Mais en fait il n'avait probablement pas envie de te parler du cast qui n'était pas encore prévu à ton niveau.

    Citation Envoyé par debian_seb Voir le message
    J'ai essayé de plusieurs façons la position du (float).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fMoyenne = (float)( iAgeTotal / (iMineur + iAgeOr + iCentenaire);
    Ne fonctionne pas (sûrement parce que la division (entière) est fait avant la conversion).
    Exact

    Citation Envoyé par debian_seb Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fMoyenne =(float) iAgeTotal / (iMineur + iAgeOr + iCentenaire);
    semble être fonctionnel...
    Encore exact

    Citation Envoyé par debian_seb Voir le message
    Est-ce qu'il y a une meilleure position qu'une autre pour le float?
    Aucune. L'important est de bien comprendre que dans une opération à 2 opérandes, l'opération est calculée dans le type le plus large présent. Si tu calcules un short et un long, tu obtiendras un long. Un float et un double te donneront un double.
    Ainsi si tu demandes
    float n = (float)3 / 2
    ou bien
    float n = 3 / (float)2
    Tu obtiendras 1.5 dans les deux cas.

    Mais dans une opération avec 3 opérandes ou plus, l'opération est décomposée en successions d'opérations de 2 opérandes où les calculs sont faits uniquement sur ces 2 opérandes.
    Ainsi si tu demandes
    float n=(float)5 + 3 / 2
    Le premier calcul sera d'abord 3 / 2 (priorité de la division) qui se fera dans le type le plus large de ces deux int, à savoir int. Et le résultat int 1 sera ajouté au float 5 donc tu obtiendras 6.0 ce qui n'est sûrement pas ce que tu souhaites.
    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]

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Oui je me suis mal exprimé, j'avais oublié de préciser que c'était grâce aux parenthèses que ça marchait dans tous les cas ici.

Discussions similaires

  1. division de deux variables
    Par sa7lia1990 dans le forum Débuter
    Réponses: 13
    Dernier message: 04/10/2012, 12h46
  2. Problème de syntaxe sur la division non arrondie de deux variables
    Par fuyo2004 dans le forum Général Python
    Réponses: 2
    Dernier message: 28/05/2010, 17h27
  3. division de deux variable.
    Par scoubi32006 dans le forum C++Builder
    Réponses: 2
    Dernier message: 09/02/2009, 11h33
  4. concaténer deux variables de type entière
    Par beegees dans le forum C
    Réponses: 22
    Dernier message: 02/11/2007, 12h52
  5. Concaténer deux variables ?
    Par glsn dans le forum ASP
    Réponses: 2
    Dernier message: 19/12/2003, 13h53

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