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 :

Condition if non pris en considération


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut Condition if non pris en considération
    Bonjour, j'ai créer une fonction qui me retourne soit 1 soit 0selon l'existence des parametres passés, cette fonction test s'il y a intersection ou inclusion entre les paramètres passés et les ligne d'une table :

    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
            public int isExist(int SN, int EN, char design)
            {
                int exist = 0;
     
                for (int i = 0; i < this.Count; i++)
                {
                    if (((SN <= this[i].EndNumber && SN >= this[i].StartNumber) ||
                        (EN <= this[i].EndNumber && EN >= this[i].StartNumber) ||
                        (this[i].StartNumber <= EN && this[i].StartNumber >= SN) ||
                        (this[i].EndNumber <= EN && this[i].EndNumber >= SN)) && this[i].Design.Equals(design))
                    {
                        exist = 1;
                    }
                }
                return exist;
            }
    le problème c'est que cette fonction ne prend pas la derniere condition en considération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    && this[i].Design.Equals(design)
    par exemple : si je donne : D 1 500 et dans la table il ya S 1 500, la fonction doit me retourné 0, ce qui permet d'insérer dans la table car S 1 500 # D 1 500, que pensez vous ?

  2. #2
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Msysteme Voir le message
    que pensez vous ?
    Que quand on a un if aussi maousse, on a intérêt à le découper

    Du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (gros machin de la mort avec des || de partout)
      if (autre gros bidule)
        ....
    Aussi, passe ton code en pas à pas, sélectionne une expression, rajoute un espion dessus, et tu verras sa valeur (ici true ou false) dans la fenêtre d'espion.

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    if (le gros machin de la mort avec les || de partout)
    exist=this[i].Design.Equals(design))?1:0 ;
    et verifier en debug!

  4. #4
    Expert éminent sénior

    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 : 46
    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
    Points : 12 465
    Points
    12 465
    Par défaut
    +1

    Sinon, moi, ton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     for (int i = 0; i < this.Count; i++) {
                    if ((this[i].EndNumber >= SN && SN >= this[i].StartNumber) ||
                         (this[i].EndNumber >= EN && EN >= this[i].StartNumber) ||
                         (EN >= this[i].StartNumber && this[i].StartNumber >= SN) ||
                         (EN >= this[i].EndNumber && this[i].EndNumber >= SN))
     
                        return this[i].Design.Equals(design) ? 1 : 0;
                }
    J'ajouterais une fonction, genre IsInBetween
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private bool IsInBetween (int val, int min, int max){
    return min <= val&& val<= max;
    }
    et ca ferait du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     for (int i = 0; i < this.Count; i++) {
                    if (IsInBetween(SN , this[i].StartNumber, this[i].EndNumber) ||
                       IsInBetween(EN , this[i].StartNumber, this[i].EndNumber) ||
                       IsInBetween(this[i].StartNumber, SN, EN) ||
                       IsInBetween(this[i].EndNumber , SN, EN))
                        return this[i].Design.Equals(design) ? 1 : 0;
                }

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    -1
    return this[i].Design.Equals(design) ? 1 : 0;
    pas de return si 0, il faut continuer la boucle

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Msysteme Voir le message
    Bonjour, j'ai créer une fonction qui me retourne soit 1 soit 0selon l'existence des parametres passés,
    Les booléens te posent un problème de conscience ?

  7. #7
    Expert éminent sénior

    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 : 46
    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
    Points : 12 465
    Points
    12 465
    Par défaut
    Citation Envoyé par Graffito Voir le message
    -1

    pas de return si 0, il faut continuer la boucle
    Vi, c'est vrai (pas vu )

    Ceci dit ,cui-la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (le gros machin de la mort avec les || de partout)
    exist=this[i].Design.Equals(design))?1:0 ;
    il est faux aussi

  8. #8
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    Mais normalement je dois vérifier si this[i].Design.Equals(design)) si oui je fais le test sinon j'incremente ma boucle, parce que si la ligne a controlé n'a pas la meme designation que celle dans la table je dois pas faire de test ?

    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
    public int isExist(int SN, int EN, char design)
            {
                int exist = 0;
     
                for (int i = 0; i < this.Count; i++)
                {
                    Console.WriteLine("Design " + this[i].Design + " EN " + this[i].EndNumber);
                    if (design.Equals(this[i].Design))
                    {
     
                        if (((SN <= this[i].EndNumber && SN >= this[i].StartNumber) ||
                            (EN <= this[i].EndNumber && EN >= this[i].StartNumber) ||
                            (this[i].StartNumber <= EN && this[i].StartNumber >= SN) ||
                            (this[i].EndNumber <= EN && this[i].EndNumber >= SN)))
                        {
                            exist = 1;
                        }
                    }
                    else
                        i++;
                }
                return exist;
            }
    Mais meme celle la ne donne pas de bons résultat ?

  9. #9
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Tu devrais commencer par supprimer ceci
    Parce qu'avec ça tu vas sauter un élément à chaque fois que le test sera faux. L'incrémentation du compteur est déjà faite un niveau de la boucle for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (int i = 0; i < this.Count; i++)
    Sinon, utilise plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    if (test)
    {
        exist = 1;
        break;
    }
    ...
    pour éviter des parcours inutiles. Une fois la variable à 1 rien ne peut la faire passer à 0, donc ça ne sert à rien de continuer.

  10. #10
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    ok, mais j'ai pas compris ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ..
    if (test)
    {
        exist = 1;
        break;
    }
    ...

  11. #11
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Aide-toi et la MSDN t'aidera ... Instruction break

  12. #12
    Membre éprouvé 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
    Points : 1 188
    Points
    1 188
    Par défaut
    salut, c'est bien normal qu'il ne rentre pas dans la deuxième condition :
    false && ? = false
    true || ? = true

    la deuxième condition n'est pas executée parce que la première est fausse, sachant que false ET un autre prédicat renvoie toujours false le compilateur optimise et n'execute pas le deuxième prédicat.

    cas concret, essaye de passer en pas à pas avec cet essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (testFaux() && testVrai())
    {
     
    }
    et ailleurs tu déclares les méthodes suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private bool testFaux()
    {
    return false;
    }
    private bool testVrai()
    {
    return true;
    }
    Tu verra que c'est tout à fait normal.
    Maintenant je suis assez d'accord avec les précédents message elle est plutot balèze ta fonction... et tu devrais certainement suivre les conseils qu'on t'a donné, ils sont importants

  13. #13
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par sisqo60 Voir le message
    cas concret, essaye de passer en pas à pas avec cet essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (testFaux() && testVrai())
    {
     
    }
    Petite précision : ca marche si on écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (testFaux() & testVrai())
    {
     
    }
    Avec un seul '&'; dans ce cas les deux membres sont évalués. (règle valable aussi pour le "|" et pour le "^"). (j'ai remarqué que pas mal de développeurs C# ignoraient cela, même des "pas débutants").

  14. #14
    Membre éprouvé 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
    Points : 1 188
    Points
    1 188
    Par défaut
    oui bien sur il fait un "et bit à bit". là c'est encore autrechose...
    Mais c'est certainement important de le rappeler.

  15. #15
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par sisqo60 Voir le message
    oui bien sur il fait un "et bit à bit". là c'est encore autrechose....
    Non, pas du tout, tu fais une confusion avec le C++. (et tu confortes ce que j'écrivais supra).

    En C#, les opérateurs n'opérent en "bit a bit" que sur des variables de type char, byte, int ou long, pas sur des variables bool (ça n'aurait aucun sens).

    La syntaxe "un seul &" (et "|", "^") sur des booléens n'est pas une opération bit-a-bit mais une opération booléenne sans optimisation de la part du compilo, entrainant une évaluation de tous les membres avant calcul du résultat.

  16. #16
    Membre éprouvé 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
    Points : 1 188
    Points
    1 188
    Par défaut
    discussion fort intéressante, mais tu devrais faire un petit post pour rappeler tout ça. et regarde par la même occasion http://msdn.microsoft.com/fr-fr/libr...1c(VS.80).aspx .

    C'est plus du tout en rapport avec le question de départ!

  17. #17
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par sisqo60 Voir le message
    Euh .. c'est exactement ce que j'écrivais.

    C'est plus du tout en rapport avec le question de départ!
    Peut être mais c'est en rapport avec ce qui était écrit trois poste plus haut.

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

Discussions similaires

  1. [CSS] style externe non pris en charge
    Par ravNin'- dans le forum Mise en page CSS
    Réponses: 21
    Dernier message: 26/10/2005, 00h22
  2. Accents non pris en compte dans les requêtes SELECT
    Par YanK dans le forum Requêtes
    Réponses: 1
    Dernier message: 30/08/2005, 10h57
  3. [event] keyListener non pris en compte
    Par pierre.zelb dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 03/08/2005, 08h35
  4. Réponses: 4
    Dernier message: 01/07/2005, 16h20
  5. [StringBuffer] Texte non pris en entier
    Par GLDavid dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 07/05/2004, 16h37

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