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 :

Trier un tableau d'objets


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2
    Par défaut Trier un tableau d'objets
    Bonjour je veux une fonction qui trie et renvoie un tableau d'objets trié selon un de ses attributs..
    Voici mon code........

    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
    #ifndef PROCESSUS_H
    #define PROCESSUS_H
     
    #include <iostream>
    #include <stdlib.h>
    #include <vector>
     
    using namespace std;
     
    class Processus{
    	private:
    		int num;
    		int dureeEstime;
    		int dateArrive;
      		int dureeSej;
    		int dureeAtt;
    		int priorite;
    	public:
    		Processus(int a,int b,int c);
    		Processus();
    		void affiche();
    		void attribuerPriorite();
    		Processus * triProcessus(Processus procs[], int nbr);
     
    };
    #endif
    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
    Processus * Processus::triProcessus(Processus proc[], int nb){
    	Processus * process[nb] ;
    	int minarr , i, j;
    	for(i=0; i<nb; i++){
    		minarr = i;
    		for(j=i+1; j<nb ; j++){		
    			if(proc[j].dateArrive < proc[minarr].dateArrive){
    				minarr = j;
    			}
    		}
    		process[i] = new          Processus(proc[minarr].num,proc[minarr].dureeEstime,proc[minarr].dateArrive);
    	}
     
    	return *process;
    }

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    Au lieu d'envoyer un tableau d'objet, pourquoi ne pas envoyer un vector ?

    Pourquoi ne pas faire un petit tour sur cette page ?

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    De toutes façons:

    1- Un processus est, typiquement, quelque chose qui a sémantique d'entité, ce qui implique parce que tu ne peux jamais avoir deux processus qui peuvent avoir des valeurs strictement identique en mémoire au même instant (autrement, comment être sûr que tu modifies bel et bien le processus que tu crois modifier )

    Ce qui implique que tu peux envisager de trier tes processus selon différnts critères, mais qu'il n'y a strictement aucune raison d'implémenter un opérateur < "global" (les classes ayant sémantique d'entité ne sont pas comparables).

    2- Tu ne dois jamais donner la responsabilité du tri d'objets aux objets qui doivent être triés : c'est, systématiquement "autre chose" qui s'occupe de trier les objets, éventuellement, sur base de critères bien déterminés.

    3- Comme l'a si bien dit impero, tu devrais utiliser la classe std::vector pour maintenir tes (pointeurs vers les) différents objets.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Ce qui implique que tu peux envisager de trier tes processus selon différnts critères, mais qu'il n'y a strictement aucune raison d'implémenter un opérateur < "global" (les classes ayant sémantique d'entité ne sont pas comparables).
    Même si on veut donner une priorité aux processus ?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Rien ne t'empêche de les trier par priorité, mais ce n'est pas aux processus qu'il revient de faire ça, c'est au conteneur. Les processus doivent seulement soit exposer directement en lecture leur priorité, soit exposer une fonction comparePriority() (mais jamais compare() tout court).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par oodini Voir le message
    Même si on veut donner une priorité aux processus ?
    A ce moment là, ton processus (ou "autre chose", qui peut être externe à ton processus) dispose de l'information ad-hoc.

    Mais, si tu veux trier tes processus selon leur priorité, ce sera plus une fonction du genre lessByPriority ou toute autre que tu utiliseras

    Le propre de quelque chose qui est identifié de manière unique est de ne permettre que la comparaison des éléments qui le composent, quel que soit l'élément envisagé pour la comparaison.

    Le fait d'avoir un opérateur "<" (ou tout autre opérateur de comparaison possible) prend la sémantique de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tel (processus, dans le cas présent) est plus petit que tel autre.
    C'est très bien, mais plus petit selon quel critère

    Selon son identifiant unique

    Selon sa priorité

    Selon la durée depuis laquelle il s'exécute

    Il est impossible de le déterminer.

    Du coup, tu te trouves avec un opérateur qui risque d'être utilisé à mauvais escient parce que chacun "verra midi à sa porte" et qu'un développeur envisagera une solution et un autre envisagera une autre solution, quand il n'y en aura pas un qui considérera que c'est d'abord la priorité, puis la durée depuis laquelle le processus s'effectue

    Si tu ne peux pas assurer la sémantique d'un opérateur, le mieux est encore de ne pas définir cet opérateur, quitte à définir une fonction équivalente qui précise exactement ce qu'elle fait et dans quel ordre.

    Il faut bien comprendre qu'un opérateur n'est jamais qu'un "sucre syntaxique": une manière de laisser le développeur aller vers sa fainéantise naturelle
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Le fait d'avoir un opérateur "<" (ou tout autre opérateur de comparaison possible) prend la sémantique de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tel (processus, dans le cas présent) est plus petit que tel autre.
    C'est très bien, mais plus petit selon quel critère
    La question reste valable avec les sémantiques de valeur, à partir du moment où les données sont composées de plusieurs valeurs.

Discussions similaires

  1. Trier un tableau d'objets
    Par dubitoph dans le forum Langage
    Réponses: 1
    Dernier message: 22/12/2011, 12h10
  2. trier un tableau d'objets par ordre alphabétique
    Par lhapaipai dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/09/2010, 17h25
  3. [Tableaux] Trier un tableau d'objets
    Par mnem0 dans le forum Langage
    Réponses: 4
    Dernier message: 21/06/2007, 15h08
  4. [Tableaux] Trier un tableau d'objet
    Par boux2 dans le forum Langage
    Réponses: 5
    Dernier message: 02/05/2007, 09h12
  5. Réponses: 5
    Dernier message: 13/06/2006, 11h08

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