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 à bulle dans une variable structurée


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 36
    Par défaut Tri à bulle dans une variable structurée
    Bonjour tout le monde,
    j'ai donc un petit programme de recensement:

    La structure est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct recensement recensement;
    struct recensement
    	{
    	int age;
    	char nom[30], prenom[30];
    	};
    ainsi que mon tri à bulle sur l'âge qui marche très bien:

    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
    void triParAge(recensement *personne, int index)
    {
     
    int en_desordre = 1, i = 0, j = 0;
    recensement tmp;
    	for (i =0; (i < index) && en_desordre; i ++)
    	{
    	en_desordre =0;
    	for (j = 1; j < index - i; j++)
    		{
    			if (personne[j].age < personne[j-1].age)
    			{
    			tmp = personne[j-1];
     
    			personne[j-1] = personne[j];
    			personne[j] = tmp;
    			en_desordre = 1;
    			}
    		}
    	}
    Merci google...

    J'ai tenté de faire la même méthode pour trier mes noms mais sans succès.

    Je pense que le fait que le nom et prenom sont des tableaux me perturbe quand même...

    Si quelqu'un pourrait me donner une petite piste ça serait vraiment sympa.

    Merci d'avance pour vos réponses.

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    Bonjour,

    La ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (personne[j].age < personne[j-1].age)
    Doit être remplacée par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (strcmp(personne[j].nom, personne[j-1].nom)
    (Je te laisse te référer à la doc sur http://www.cplusplus.com/reference/clibrary/cstring/ pour plus d'informations sur les fonctions de comparaisons de chaine).

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Simplement les fonctions strcmp et strncmp permettent de comparer deux chaines de caractères.

    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
    #include <string.h>
     
    void triParAge(recensement * personne, int index)
    {
        int en_desordre = 1, i = 0, j = 0;
        recensement tmp;
        for (i = 0; (i < index) && en_desordre; i++) {
            en_desordre = 0;
            for (j = 1; j < index - i; j++) {
                if (strcmp(personne[j].nom, personne[j-1].nom) < 1) {
                    tmp = personne[j-1];
     
                    personne[j-1] = personne[j];
                    personne[j] = tmp;
                    en_desordre = 1;
                }
            }
        }
    }

  4. #4
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Bonjour,

    pour le test sur les noms :

    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
     
    void triParAge(recensement *personne, int index)
    {
     
    int en_desordre = 1, i = 0, j = 0;
    recensement tmp;
    	for (i =0; (i < index) && en_desordre; i ++)
    	{
    	en_desordre =0;
    	for (j = 1; j < index - i; j++)
    		{
    			/*if (personne[j].age < personne[j-1].age)*/
                            if ( strcmp( personne[j].age, personne[j-1].age ) < 0 )
    			{
    			tmp = personne[j-1];
     
    			personne[j-1] = personne[j];
    			personne[j] = tmp;
    			en_desordre = 1;
    			}
    		}
    	}
    sinon pour qsort :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int comparator( void* elem1, void* elem2 )
    {
      recensement* e1;
      recensement* e2;
     
      e1 = (recensement*)elem1;
      e2 = (recensement*)elem2;
     
      return strcmp( e1->nom, e2->nom );
    }
     
    /* s utilise comme ca : */
    qsort( personne, index /* taille tableau quoi */, sizeof( *personne ), comparator );
    voila voila, bon courage

    [edit] hein, il dechire pas dvp.com, 3 reponses de qualities en quelques minutes

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 36
    Par défaut
    Merci beaucoup je vais plancher sur tout ça.

    Oui il déchire ce site!

    J'indiquerai le sujet résolu dès que ça marchera.

    Merci encore

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par viewtifulced Voir le message
    J'ai tenté de faire la même méthode pour trier mes noms mais sans succès.
    Puis je me suis renseigné sur qsort avec un problème quasiment identique au mien:
    Bah qsort(), c'est assez simple si on prend le temps d'apprendre à l'utiliser :

    http://emmanuel-delahaye.developpez.com/qsort.htm

    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
    66
    67
    68
    69
    70
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define N(a) (sizeof(a)/sizeof*(a))
     
    typedef struct recensement recensement;
    struct recensement
    {
       int age;
       char nom[30], prenom[30];
    };
     
    static void display (recensement const a[], size_t n)
    {
       size_t i;
       for (i = 0; i < n; i++)
       {
          recensement const *p = a + i;
          printf ("%-12s%-12s%3d\n", p->nom, p->prenom, p->age);
       }
       printf ("\n");
    }
     
     
    static int cmp_age(void const *a, void const *b)
    {
       recensement const *pa = a;
       recensement const *pb = b;
     
       return pa->age - pb->age;
    }
     
    static int cmp_nom(void const *a, void const *b)
    {
       recensement const *pa = a;
       recensement const *pb = b;
     
       return strcmp (pa->nom,pb->nom);
    }
     
    static int cmp_prenom(void const *a, void const *b)
    {
       recensement const *pa = a;
       recensement const *pb = b;
     
       return strcmp (pa->prenom , pb->prenom);
    }
     
    int main (void)
    {
       recensement a[] = {
          {39, "Simpson", "Homer"},
          {34, "Bouvier", "Marge"},
          {10, "Simpson", "Bartholomew"},
          {7, "Simpson", "Elisabeth"},
          {1, "Simpson", "Margaret"},
       };
     
       display (a, N (a));
       qsort (a, N (a), sizeof *a, cmp_nom);
       display (a, N (a));
       qsort (a, N (a), sizeof *a, cmp_prenom);
       display (a, N (a));
       qsort (a, N (a), sizeof *a, cmp_age);
       display (a, N (a));
     
       return 0;
    }
    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
     
    Simpson     Homer        39
    Bouvier     Marge        34
    Simpson     Bartholomew  10
    Simpson     Elisabeth     7
    Simpson     Margaret      1
     
    Bouvier     Marge        34
    Simpson     Bartholomew  10
    Simpson     Elisabeth     7
    Simpson     Margaret      1
    Simpson     Homer        39
     
    Simpson     Bartholomew  10
    Simpson     Elisabeth     7
    Simpson     Homer        39
    Simpson     Margaret      1
    Bouvier     Marge        34
     
    Simpson     Margaret      1
    Simpson     Elisabeth     7
    Simpson     Bartholomew  10
    Bouvier     Marge        34
    Simpson     Homer        39
     
     
    Process returned 0 (0x0)   execution time : 0.081 s
    Press any key to continue.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/01/2013, 08h38
  2. Tri dans une variable
    Par franpom dans le forum Langage
    Réponses: 3
    Dernier message: 18/08/2009, 17h02
  3. Réponses: 11
    Dernier message: 15/10/2008, 10h44
  4. Réponses: 6
    Dernier message: 24/07/2003, 12h39
  5. [langage] Extraire un block dans une variable multiligne
    Par |DUCATI| DesMo dans le forum Langage
    Réponses: 9
    Dernier message: 11/02/2003, 14h56

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