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 :

Tri d'un champ de structure


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Tri d'un champ de structure
    j'ai un tableau de structure étudiant qui contient 4 champs nom , prénom , moyenne et rang je vais insérer ce tableau plus tard dans un fichier le problème et le champs rang qu'il faut que je remplisse a partir du champs moyenne mais le plus important sans modifier la liste des étudiant donc le tableau va rester sans changement juste je vais associez a chaque étudiant son rang suivant sa moyenne j'ai pas trouvé de solution j’attends votre aides et merci d'avance

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Tu peux faire un vecteur de pointeurs d'étudiant puis tu utilises la fonction std::sort sur ton vecteur.

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonjour, il me semble que tu peux aussi t'amuser avec un std::set, qui prend un comparateur en argument.
    reste à écrire le comparateur convenablement: tri par moyenne, puis, en cas d'égalité, par nom
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Aller voici une façon de faire en C++11, juste pour le plaisir de m'exercer un peu. Tu devras probablement le traduire en C++03, ça t'entraîneras un peu !

    L'idée est la suivante : tu insères des éléments dans une std::map pour profiter de la propriété de tri de ce conteneur, puis tu lis le résultat obtenu pour attribuer les rangs. L'avantage de cette technique est que cela te permet d'éviter d'écrire un comparateur, ce qui est intéressant lorsque le comparateur n'a de sens que pour ce calcul de rang.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #include <iostream>
    #include <string>
    #include <vector>
    #include <map>
    #include <utility>
     
    struct guy
    {
        std::string name_;
        float mark_;
        unsigned int rank_ = 0;
     
        guy(std::string const & name, float mark) : name_(name), mark_(mark)
        {}
    };
     
    int main()
    {
        // Vector construction
        std::vector<guy> guys;
        guys.push_back(guy("Roger",16.0f));
        guys.push_back(guy("Marcel",10.0f));
        guys.push_back(guy("Robert",12.0f));
     
        // Rank computing
        {
            std::map<float, guy*> sorter;
            for(guy & current_guy : guys) {
                sorter.insert(std::make_pair(current_guy.mark_,&current_guy));
            }
            unsigned int rank = guys.size();
            for(std::pair<float,guy*> const & elem : sorter) {
                elem.second->rank_ = rank;
                --rank;
            }
        }
     
        // Displays the result 
        for(guy const & current_guy : guys) {
            std::cout << current_guy.name_ << " is ranked " << current_guy.rank_ << std::endl;
        }
     
    	return 0;
    }
    Ce code a un défaut : il ne gère pas les cas ou deux étudiants ont la même moyenne ! C'est facile à régler avec un multimap, mais multimap n'est pas dispo en C++03.
    Find me on github

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Voici une version avec un vector et une lambda qui gère le cas des moyennes égales entre étudiants:

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include <iostream>
    #include <string>
    #include <vector>
    #include <map>
    #include <utility>
    #include <algorithm>
     
    struct guy
    {
        std::string name_;
        float mark_;
        unsigned int rank_ = 0;
     
        guy(std::string const & name, float mark) : name_(name), mark_(mark)
        {}
    };
     
    int main()
    {
        // Vector construction
        std::vector<guy> guys;
        guys.push_back(guy("Roger",16.0f));
        guys.push_back(guy("JeanPaul",12.0f));
        guys.push_back(guy("Marcel",10.0f));
        guys.push_back(guy("Robert",12.0f));
     
        // Rank computing
        {
            std::vector<guy*> sorter;
            for(guy & current_guy : guys) sorter.push_back(&current_guy);
            std::sort(sorter.begin(), sorter.end(), [](guy* g1, guy* g2){ return g1->mark_ > g2->mark_; });
            float prev_mark = 0.f;
            unsigned int rank = 0;
            for(guy* pguy : sorter)
            {
                if(pguy->mark_ != prev_mark) ++rank;
                pguy->rank_ = rank;
                prev_mark = pguy->mark_;
            }
        }
     
        // Displays the result 
        for(guy const & current_guy : guys) {
            std::cout << current_guy.name_ << " is ranked " << current_guy.rank_ << std::endl;
        }
     
        return 0;
    }
    Find me on github

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    […]
    Ce code a un défaut : il ne gère pas les cas ou deux étudiants ont la même moyenne ! C'est facile à régler avec un multimap, mais multimap n'est pas dispo en C++03.
    Mais si ca existe… ce sont les unsorted_(multi)?(map|set) qui n'existent pas
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par leternel Voir le message
    Mais si ca existe… ce sont les unsorted_(multi)?(map|set) qui n'existent pas
    Exact, au temps pour moi Je suis trop pressé de ne vivre qu'en C++11
    Find me on github

Discussions similaires

  1. Tri sur deux champs en même temps
    Par Azharis dans le forum Access
    Réponses: 8
    Dernier message: 11/01/2006, 13h10
  2. tri sur des champs calculés
    Par Thib dans le forum Bases de données
    Réponses: 10
    Dernier message: 18/10/2005, 17h24
  3. [xslt] TRI d'un champs
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 15
    Dernier message: 26/08/2005, 17h01
  4. [Collection] Tris sur plusieurs champs
    Par partyboy dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 12/07/2005, 16h56
  5. tri avec les champs vides en dernier
    Par r-zo dans le forum Requêtes
    Réponses: 11
    Dernier message: 03/09/2003, 13h40

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