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

Algorithmes et structures de données Discussion :

Verification de valeur suivant 4 conditions, boucle if pas une bonne idée ?!


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Points : 56
    Points
    56
    Par défaut Verification de valeur suivant 4 conditions, boucle if pas une bonne idée ?!
    Bonjour,

    j'ai un tableau de variable X qui varient sur [a,b], pour chacune de ces variable X(i) je veux faire un check sur la valeur et la changer suivant 4 cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Si X(i)<a1 alors X(i)=0
    Si a1<X(i)<a2 alors X(i)=1
    Si a2<X(i)<a3 alors X(i)=2
    Si a3<X(i)<b alors X(i)=3
    Il me semble qu'une boucle "if" n'est pas une bonne solution dans ce cas. Alors quel est la bonne option ?

    Merci a vous.

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour,

    la réponse n'est-elle pas dans la question ? Tu fabriques une fonction f telle que f(Xi)= 0 1 2 ou 3 suivant les ai, a et b.
    Mais on a du mal à placer tes ai. Sont-ils entre a et b ?
    Tes conditions sont-elles dans l'ordre d'exécution ? Je veux dire que, si ton Xi vérifie la première et la quatrième, alors le résultat sera-t-il 0 ou 3 ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour,

    la réponse n'est-elle pas dans la question ? Tu fabriques une fonction f telle que f(Xi)= 0 1 2 ou 3 suivant les ai, a et b.
    Mais on a du mal à placer tes ai. Sont-ils entre a et b ?
    Tes conditions sont-elles dans l'ordre d'exécution ? Je veux dire que, si ton Xi vérifie la première et la quatrième, alors le résultat sera-t-il 0 ou 3 ?
    Ma question se pose sur le moyen de faire la selection, je peux bien sur le faire avec if, et des elseif, mais je pense qu'il y a plus malin, qu'utiliser des if.

    Oui les ai sont dans [a,b].

    Un X(i) ne peut verifier qu'une seule condition.

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Je ne parlais pas de fonction "informatique" mais de fonction numérique.
    Après, ce n'est pas vraiment une question algorithmique mais plus une question de langage.

    En C++, tu ferais un truc comme resultat=(Xi>a1)+(Xi>a2)+(Xi>a3);.

    Tu peux aussi penser à la fonction de Heaviside, la partie entière, etc pour obtenir le même but.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 057
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 057
    Points : 9 396
    Points
    9 396
    Par défaut
    Il y a plein de solutions.
    Plusieurs SI qui se suivent , ou une instruction Switch ( C.A.D. SELON ... ) , peu importe.

    MAIS,
    la solution que tu proposes au départ va parfois provoquer des erreurs.
    Selon les valeurs de a1 et a2, ta suggestion pourra marcher parfaitement , ou donner n'importe quoi.

    Le risque, c'est que la première ligne modifie la valeur de X(i) ... et du coup, la 2ème ligne modifie à nouveau la valeur de X(i).

    Si on veut rester sur un modèle qui ressemble à ce que tu proposes, voici une première version :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Y = X(i)
    Si X(i)<a1 alors Y=0
    Si a1<X(i)<a2 alors Y=1
    Si a2<X(i)<a3 alors Y=2
    Si a3<X(i)<b alors Y=3
    X(i) = Y

    Ou encore, si tu construis une FONCTION ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Si X(i)<a1 alors renvoyer 0
    Si a1<X(i)<a2 alors renvoyer 1
    Si a2<X(i)<a3 alors renvoyer 2
    Si a3<X(i)<b alors renvoyer 3
    renvoyer X(i)
    Autre point de détail.
    Dans ces 2 exemples, on a des inégalités strictes. Je pense qu'il faut des inégalités 'larges' et des inégalités strictes.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Je lis la discutions en survole et je vois que qu'aucun d'entre vous ne place de "sinon"else
    Car l'idée est bien de faire un switch en fonction de la valeur de X(i). La sélection étant une plage de valeur et non des valeurs exacte le switch n'est pas le plus facile à mettre en place.

    Le principal problème du pseudo code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Y = X(i)
    Si X(i)<a1 alors Y=0
    Si a1<X(i)<a2 alors Y=1
    Si a2<X(i)<a3 alors Y=2
    Si a3<X(i)<b alors Y=3
    X(i) = Y
    Est que l'on va réalisé les 4 tests de manières systématique, il serai déjà plus propre d'avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Si X(i)<a1 alors Y=0
    Sinon et Si a1<X(i)<a2 alors Y=1
    Sinon et Si a2<X(i)<a3 alors Y=2
    Sinon et Si a3<X(i)<b alors Y=3
    X(i) = Y
    Il serai donc possible de directement faire l'affectation (Car, on ne relit pas la valeur de X(i) une fois l'affectation réalisé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Si X(i)<a1 alors X(i)=0
    Sinon et Si a1<X(i)<a2 alors X(i)=1
    Sinon et Si a2<X(i)<a3 alors X(i)=2
    Sinon et Si a3<X(i)<b alors X(i)=3
    Cela peut-être aussi simplifié à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Si X(i)<a1 alors X(i)=0
    Sinon et Si X(i)<a2 alors X(i)=1
    Sinon et Si X(i)<a3 alors X(i)=2
    Sinon et Si X(i)<b alors X(i)=3
    Si on on accepte que les valeur ax soient incluses dans la tranche supérieur.
    Note : Le code d'origine ne modifie pas la valeur si X(i) est égal à ax, normal ? Je suppose qu'il est aussi normal de ne pas avoir d'affectation si X(i) <b ?

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par DJEcalcul Voir le message
    Bonjour,

    j'ai un tableau de variable X qui varient sur [a,b], pour chacune de ces variable X(i) je veux faire un check sur la valeur et la changer suivant 4 cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Si X(i)<a1 alors X(i)=0
    Si a1<X(i)<a2 alors X(i)=1
    Si a2<X(i)<a3 alors X(i)=2
    Si a3<X(i)<b alors X(i)=3
    Il me semble qu'une boucle "if" n'est pas une bonne solution dans ce cas. Alors quel est la bonne option ?

    Merci a vous.
    Un moyen simple plus formel :

    2 tableaux inflimit et suplimit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    inflimit[4] = { -DBL_MAX, a1, a2, a3 }
    suplimit[4] = { a1, a2, a3, b }
     
    for ( i = 0 ; i < N ; i++ )
       for ( j = 0 ; j < 4 ; j++ )
          if ( X[i] > inflimit[j] )
             if ( X[i] < suplimit[j] )
               {
                ...
               }
    On economise au moins 1 test par point.. (bon, normalement l'echec du premier test entraine qu'on ne ferait pas le second dans un "ET"), mais c'est surtout que c'est generalisable...


    PS: cependant, en optimisation reelle, c'est reperdu si on fonctionne avec des indices (a cause du calcul d'adresses). Il vaut mieux alors utiliser des pointeurs sur les 3 tableaux...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. [Débutant] Récupération d'une valeur suivant différentes conditions
    Par Estelle0611 dans le forum VB.NET
    Réponses: 24
    Dernier message: 03/03/2015, 14h43
  2. [XL-2010] Somme de valeur suivant condition sur cellule
    Par EricBOG dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 16/07/2013, 11h30
  3. Réponses: 3
    Dernier message: 15/06/2007, 12h06
  4. [Etat] nombre de valeurs suivant critère
    Par bigounet dans le forum IHM
    Réponses: 4
    Dernier message: 01/03/2006, 11h47
  5. [langage] condition de sortie d'une boucle
    Par perlaud dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2004, 10h25

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