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

Langage C++ Discussion :

Médiane de trois nombres


Sujet :

Langage C++

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut Médiane de trois nombres
    Salut,

    J'essaie, en C++, d'écrire une méthode pour trouver la médiane de trois nombres, le nombre compris entre les deux autres.

    J'ai d'abord fait ca, mais ca me semble trop simpliste :

    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
    double middle(double a,double b, double c){
        if(c>a){
             if(a<b){
                if(b<c) return b;
                else return c,
            }
            else{
                if(a<c) return a;
                else return c;
            }
        }
        else{
            if(a<b) return a;
            else return b;
        }
    }
    J'ai pris une feuille de papier, et j'ai donc fait ca, mais ca me semble assez difficile à lire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double middle(double a,double b, double c){
        double m = a < b ? ( b < c ? b : ( a < c ? c : a)) : ( a < c ? a : ( b < c ? c : b));
        return m;
    }

    Auriez vous une méthode moins lourde à lire? (bien sûre sans utiliser une quelconque librairie).

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 594
    Points
    188 594
    Par défaut


    Pourquoi pas mélanger les deux versions ? Par exemple, en virant également les else inutiles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double middle(double a,double b, double c){    if(c>a){
             if(a<b){
                return (b<c) ? b : c;
            }
            return (a<c) ? a : c;
        }
        return (a<b) ? a : b;}
    Une autre manière serait de trier le tableau et de renvoyer l'élément du milieu (ce qui se fait en deux coups de cuiller à pot avec la bibliothèque standard). Peut-être moins efficace (quoique… le compilateur pourra déterminer la taille du tableau à trier, peut-être ira-t-il jusqu'à éliminer l'appel au tri en sachant qu'il n'a que trois éléments à traiter ?).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    de tete :

    mediane(a,b,c) = min(max(a,b),max(b,c));

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    je te remercie, c'est effectivement plus facile à lire

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par Joel F Voir le message
    de tete :

    mediane(a,b,c) = min(max(a,b),max(b,c));

    ca ne marche pas avec les ordres suivants :

    a....c....b
    c....a....b

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2006
    Messages : 48
    Points : 97
    Points
    97
    Par défaut
    Intuitivement j'aurais dit min (a, max (b, c)) ou de façon équivalente max (a, min (b, c))

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par iNaKoll Voir le message
    Intuitivement j'aurais dit min (a, max (b, c)) ou de façon équivalente max (a, min (b, c))
    ta première proposition ne fonctionne pas avec l'ordre:
    a....b....c

    ta deuxième ne fonctionne pas avec:
    b....c....a

  8. #8
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    L'algo suivant - tiré du bouquin Element of Programming - devrait être correct (sauf si je me suis planté en le retranscrivant ). Il fait 2 + 2/3 comparaisons en moyenne contrairement aux autres algos présentés jusqu'ici qui en font 3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // précondition : a et b sont triés par ordre croissant
    double mediane_ab(double a, double b, double c)
    {
       if (c > b) return b;
       return max(a, c);
    }
     
    double mediane(double a, double b, double c)
    {
       if (b < a) return mediane_ab(b, a, c);
       return            mediane_ab(a, b, c);
    }

  9. #9
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par dourouc05 Voir le message


    Pourquoi pas mélanger les deux versions ? Par exemple, en virant également les else inutiles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double middle(double a,double b, double c){    if(c>a){
             if(a<b){
                return (b<c) ? b : c;
            }
            return (a<c) ? a : c;
        }
        return (a<b) ? a : b;}
    Une autre manière serait de trier le tableau et de renvoyer l'élément du milieu (ce qui se fait en deux coups de cuiller à pot avec la bibliothèque standard). Peut-être moins efficace (quoique… le compilateur pourra déterminer la taille du tableau à trier, peut-être ira-t-il jusqu'à éliminer l'appel au tri en sachant qu'il n'a que trois éléments à traiter ?).
    je remarque que si on a une égalité, par exemple dans l'ordre suivant :

    b....a=c

    ton code retournerait b au lieu de a ou c, donc je propose le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    double middle(double a,double b, double c){    
         if(c>=a){
             if(a<b){
                return (b<c) ? b : c;
            }
            return (a<c) ? a : c;
        }
        return (a<b) ? a : b;}

  10. #10
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par Arzar Voir le message
    L'algo suivant - tiré du bouquin Element of Programming - devrait être correct (sauf si je me suis planté en le retranscrivant ). Il fait 2 + 2/3 comparaisons en moyenne contrairement aux autres algos présentés jusqu'ici qui en font 3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // précondition : a et b sont triés par ordre croissant
    double mediane_ab(double a, double b, double c)
    {
       if (c > b) return b;
       return max(a, c);
    }
     
    double mediane(double a, double b, double c)
    {
       if (b < a) return mediane_ab(b, a, c);
       return            mediane_ab(a, b, c);
    }
    très bon ca, par contre pour le tester à la main ou essayer de le corriger c'est galère, mais sinon en terme de ligne de code et de rapidité c'est pas mal

  11. #11
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    J'ai assez confiance dans les algos d'AOP pour les résultats et pour leur efficacité.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. [Free Pascal] Produit de trois nombres positifs ou négatifs
    Par nadirmabed dans le forum Free Pascal
    Réponses: 17
    Dernier message: 18/01/2015, 08h38
  2. Comparaison de trois nombres en langage prolog
    Par pacopaco dans le forum Prolog
    Réponses: 1
    Dernier message: 27/09/2012, 07h36
  3. [WD-2010] [Nombres] Renvoyer le plus petit de trois nombres
    Par Corvvin dans le forum VBA Word
    Réponses: 5
    Dernier message: 21/10/2011, 16h29
  4. le plus grand de trois nombres
    Par nitch01 dans le forum Débuter
    Réponses: 8
    Dernier message: 04/12/2009, 19h30
  5. Algorithme pour trier trois nombres
    Par legosam dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 17/01/2005, 21h47

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