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 :

switch et Partie entière


Sujet :

C#

  1. #1
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut switch et Partie entière
    Bonjour, j'ai un problème avec un switch qui doit me retourner une valeur entière selon un paramètre cylindree, mais malheureusement j'ai beaucoup de problemes avec mon switch :

    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
                    switch (cylindree)
                    {
                        case cylindree <= 125:
                            pf = 1;
                            break;
     
                        case 125 < cylindree <= 175:
                            pf = 2;
                            break;
     
                        case 175 < cylindree <= 250:
                            pf = 3;
                            break;
     
                        case 250 < cylindree <= 350:
                            pf = 4;
                            break;
     
                        case 350 < cylindree <= 500:
                            pf = 5;
                            break;
     
                        case cylindree >  500:
                            if(cylindree%500 == 0) 
                                pf = 5 + (Math.Truncate(cylindree - 500)/125);
                            else pf = 5 + (Math.Truncate(cylindree - 500) / 125) + 1; 
                            break;
                    }
    Math.Trauncate comment ca fonctionne ?

    normalement pour le calcul de la partie entiere, si la valeur apres le virgule est < 0.5 on arandit vers lla valeur avant le virgule sinon on arandit vers la valeur avant la virgule + 1 ???

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Euh... ta syntaxe pour le bloc switch est complètement fausse : tu ne peux pas mettre des conditions comme ça dans les case, ça doit être des valeurs, genre ça :
    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
    switch(cylindree)
    {
        case 50:
            ...
            break;
     
        case 125:
            ...
            break;
     
        case 500:
            ...
            break;
     
        default:
            ...
            break;
    }
    Mais évidemment dans ton cas ce n'est pas adapté, tu ne vas écrire un case pour chaque valeur possible... Dans un cas comme ça, utilise une série de if/else :
    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
    if (cylindree <= 125)
    {
        pf = 1;
    }
    else if (cylindree <= 175)
    {
        pf = 2;
    }
    else if (cylindree <= 250)
    {
        pf = 3;
    }
    ...
    else
    {
    ...
    }
    En ce qui concerne le Truncate : dans ton code tu l'appliques à cylindree - 500, et non à (cylindree - 500)/125. Les parenthèses sont mal placées.
    Truncate tronque un nombre décimal, c'est à dire que ça supprime la partie décimale, sans arrondir. Pour l'arrondi, utilise Math.Round

  3. #3
    Membre confirmé Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Par défaut
    Comme Tomlev le dit, tu ne peux pas mettre des conditions comme celles-là et non pas seulement dans les switch.

    Par exemple, ce code-là ne compile pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var a = 2;
    if (1 < a < 3)
    {
        // ...
    }
    Le langage interprète cette ligne comme la suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ((bool)(1 < a)) < 3
    // alors on ne peut vérifier si (true < 3)

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    mais non, mon but c'est de tronquer : (cylindree-500)/125

  5. #5
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Citation Envoyé par Msysteme
    mais non, mon but c'est de tronquer : (cylindree-500)/125
    Donc, en gros, tu veux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Math.Truncate((cylindree - 500)/125)
    Donc, ce que te disais tom

    Citation Envoyé par tomlev
    En ce qui concerne le Truncate : dans ton code tu l'appliques à cylindree - 500, et non à (cylindree - 500)/125. Les parenthèses sont mal placées.

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  6. #6
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    salut,

    pour tronquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (Math.Truncate((cylindree - 500)/125));
    tu tronquais cylindree-500 et ensuite tu divisais par 125. La division par 125 n'est pas souvent entière...
    n'est pas adapté dans ton cas à mon avis... Je m'explique :
    ça veut dire que la cylindrée est 500k ou k est un réel. si k = 0 tu vas la condition est bonne.
    Dans ton cas Math.Round(cylindrée/500); te donne le bon pf...

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Msysteme Voir le message
    normalement pour le calcul de la partie entiere, si la valeur apres le virgule est < 0.5 on arandit vers lla valeur avant le virgule sinon on arandit vers la valeur avant la virgule + 1 ???
    Citation Envoyé par Msysteme Voir le message
    mais non, mon but c'est de tronquer : (cylindree-500)/125
    Ben faudrait savoir... si tu veux tronquer, c'est Truncate, si tu veux arrondir c'est Round

  8. #8
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    le round il arandit au plus si la partie decimal > 0.5 sinon a la partie entiere de la valeure a arandir ???

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Msysteme Voir le message
    le round il arandit au plus si la partie decimal > 0.5 sinon a la partie entiere de la valeure a arandir ???
    oui, il arrondit à l'entier le plus proche

  10. #10
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754
    Par défaut
    il existe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Math.Round(cylindree, MidpointRounding.AwayFromZero);
    
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Math.Round(cylindree, MidpointRounding.ToEven);
    

  11. #11
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    voila ce que j'ai fait finalement :

    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
                if (gr.CodeCategorie == 1)
                {
     
                    if (cylindree <= 125)
                        pf = 1;
                    else if (125 < cylindree && cylindree <= 175)
                        pf = 2;
                    else if (175 < cylindree && cylindree <= 250)
                        pf = 3;
                    else if (250 < cylindree && cylindree <= 350)
                        pf = 4;
                    else if (350 < cylindree && cylindree <= 500)
                        pf = 5;
                    else
                    {
                        if ((cylindree - 500) % 125 == 0)
                            pf = 5 + (int)((cylindree - 500) / 125);
                        else pf = 5 + (int)((cylindree - 500) / 125) + 1;
                    }
                }
                else
                {
                    if (codeCarburant.Equals("DI"))
                        pf = (int)(Math.Truncate(cylindree * 0.00401 * paramM));
                    else
                        pf = (int)(Math.Truncate(cylindree * 0.00573 * paramM));
                }
     
                return pf;

  12. #12
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    Je crois que le math.truncate donne des résultats erronés, donc je veux essayé le round, mais j'ain pas compris le deuxieme parametre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Math.Round(cylindree, MidpointRounding.AwayFromZero);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Math.Round(cylindree, MidpointRounding.ToEven);
    ce que je veux moi c'est : a,bb

    si bb < 5 il doit me retourné a sinon il doit me retourné a + 1

    voilà ce que j'ai fait pour le truncate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pf = (int)(Math.Round(cylindree * 0.00401 * paramM / 30));

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Math.Truncate ne donne pas de "résultats erronés", il fait juste ce qu'il est supposé faire : tronquer la partie décimale

    Round fait exactement ce que tu cherches. Tu n'as pas besoin du 2e paramètre, utilise la surcharge avec un seul paramètre (comme tu as fait en fait)

  14. #14
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    ok; mais a quoi sert les deuxieme paramètre ? juste pour information ?

  15. #15
    Membre Expert Avatar de sisqo60
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2006
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 754

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Msysteme Voir le message
    ok; mais a quoi sert les deuxieme paramètre ? juste pour information ?
    C'est juste pour indiquer comment tu gères le cas où le premier paramètre est exactement à mi-chemin entre deux entiers. Par exemple 2.5 est à mi-chemin entre 2 et 3, ce paramètre permet d'indiquer si ça sera arrondi en 2 ou en 3. Pour tous les autres nombres ça n'a pas d'influence, par exemple 2.1 sera toujours arrondi en 2, et 2.8 sera toujours arrondi en 3.

  17. #17
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Par défaut
    merci beacoup, c'est un exemple trés clair

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

Discussions similaires

  1. partie décimale / partie entière
    Par NoBru dans le forum Access
    Réponses: 3
    Dernier message: 21/10/2005, 12h00
  2. Partie entière
    Par pmboutteau dans le forum ASP
    Réponses: 6
    Dernier message: 29/09/2005, 11h09
  3. UDF-Interbase qui renvoie la partie entière d'un décimal
    Par mondelphi dans le forum InterBase
    Réponses: 2
    Dernier message: 20/06/2005, 16h46
  4. partie entière supérieure
    Par pmboutteau dans le forum ASP
    Réponses: 3
    Dernier message: 10/03/2005, 10h31
  5. Fonction retournant la partie entière d'un nombre
    Par annedjomo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/11/2004, 15h58

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