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 :

Aide tableau tri


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 68
    Points : 33
    Points
    33
    Par défaut Aide tableau tri
    Bonjour,

    Voici ce que j'aimerais faire, j'ai un tableau avec 5 colonnes et n lignes (l'utilisateur entre le nombre de lignes). j'aimerais pouvoir trier ce tableau par ordre décroissant avec pour priorité la 1ère colonne, puis la 2ème etc etc. c'est à dire que si dans la première colonne j'ai 3 valeurs identiques, le tri entre les 3 se fera sur la 2ème colonne et ainsi de suite.

    Je ne sais pas du tout par quoi commencer, est-ce que je déclare une structure de ligne pour mon tableau contenant mes 5 colonnes ?
    est-ce qu'il est possible de réaliser ce genre de tri ?

    je sèche totalement, je ne cherche pas le programme entier, je cherche simplement à démarrer de la bonne façon.

    Une idée ?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Bonjour,

    C'est un cas de figure typique des bases de données. Tu te trouves dans une situation où chaque ligne forme un n-uplet, ou « t-uple » chez les anglo-saxons, et donc concrètement un enregistrement indivisible.

    Si tu n'as pas envie de réécrire l'algorithme de tri toi-même, tu peux t'appuyer sur qsort(). Le plus simple consiste effectivement à déclarer une structure pour tes enregistrements. Ainsi, ton tableau sera unidimensionnel et le parcourir sera trivial. Tu n'auras plus, ensuite, qu'à écrire une fonction prenant en argument deux pointeurs distincts vers cette structure et comparer leurs éléments dans l'ordre qui t'intéresse. Tu passes cette fonction à qsort() et ton tableau sera trié comme tu le souhaites.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Rien de tel qu'un petit exemple pour comprendre ce que veut dire Obsidian !
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    // on aura ici un tableau de deux valeurs de type chaîne de caractères
    typedef struct my_struct
    {
        char *nom;
        char *prenom;
    } my_struct;
     
    // le tableau à trier
    my_struct tab[] =
    {
        {
            "blanc", "michel"
        },
        {
            "simon", "michel"
        },
        {
            "blanc", "gerard"
        }
    };
     
    // la fonction de tri
    int my_comp(void *arg1, void *arg2)
    {
        // on caste d'abord les arguments de la fonction dans le bon type
        my_struct *premier = (my_struct *) arg1;
        my_struct *second = (my_struct *) arg2;
     
        // je compare d'abord les noms
        int ret = strcmp(premier->nom, second->nom);
     
        // si ce sont les mêmes, je compare les prénoms
        if (ret == 0)
            ret = strcmp(premier->prenom, second->prenom);
     
        // je retourne le resultat de la comparaison
        return ret;
    }
     
    void affiche(my_struct *tab, size_t nbElem)
    {
        size_t n;
     
        for(n = 0; n < nbElem; n++)
            printf("%s %s\n", tab[n].nom, tab[n].prenom);
     
        puts("");
    }
     
    // dans le prog, j'affiche le tableau avant et après le tri
    int main(void)
    {
        affiche(tab, sizeof tab / sizeof *tab);
     
        // la fonction de tri a besoin de 4 arguments
        // le nom du tableau (logique)
        // sa taille en nombre d'éléments
        // la taille de chaque éléments du tableau
        // le nom de la fonction de tri
        qsort(tab, sizeof tab / sizeof *tab, sizeof *tab, my_comp);
     
        affiche(tab, sizeof tab / sizeof *tab);
     
        return 0;
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    D'un point de vue technique, tu as la réponse.
    Maintenant, d'un point de vue algorithmique, il est possible d'utiliser un tri stable et de faire un tri décroissant pour chaque clé, de la moins importante à la plus importante.
    Un tri est dit stable lorsque deux éléments égaux dans la liste initiale ne sont pas inversés après le tri. L'algorithme du quicksort n'est pas stable.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

Discussions similaires

  1. aide fonction tri heapsort (création du tas)
    Par Invité dans le forum C
    Réponses: 6
    Dernier message: 24/11/2009, 00h27
  2. tableau trié
    Par devdébuto dans le forum C
    Réponses: 3
    Dernier message: 07/11/2005, 18h00
  3. [Tableau][TRI] Tri d'un String[]
    Par zakir dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 17/03/2005, 17h31
  4. URGENt: recherche dans un tableau trié par ordre alphabetiqu
    Par JulPop dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/02/2005, 17h21

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