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'une structure à partir des noms


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 23
    Points : 15
    Points
    15
    Par défaut TRI d'une structure à partir des 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
     
    struct client
    {
    char nom[30];
    char prenom[30];
    int age;
    };
     
    //void tri()
    void main()
    {
    struct client *p;
    struct client tmp;
    int i,j;
     
     
    for (i=0;i<3;i++)
    {
    printf("Veuillez entrez le nom client n°%d:  ",i+1);
    gets(p[i].nom);
    }
     
     
      for(i=0;i<2;i++)
    	 for(j=i+1;j<3;j++)
    		if(strcmp(p[i].nom,p[j].nom)==0)
    		{ tmp=p[i];
    		  p[i]=p[j];
    		  p[j]=tmp;
    		}
     
    for (i=0;i<3;i++)
    {
    printf("%s ",(p+i)->nom);
    }
    getch();
     
    }
    salut à tous,

    je n'arrive pas à trier ma structure a partir du nom des clients j'y arrive a partir de l'age (donc a partir d'entier) mais impossible avec les noms. Je dois l'avoir dans mon cours mais qui n'est pas chez moi
    Donc si vous pouviez me dire pourquoi cela ne fonctionne pas (avant que je perde le peu de cheveux qu'il me reste ). Encore merci

  2. #2
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    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
     
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
     
    struct client
    {
    char nom[30];
    char prenom[30];
    int age;
    };
     
    void tri(struct client *,int);
    void main()
    {
     struct client *p;
     struct client tmp;
     int i,j;
     
     
     for (i=0;i<3;i++)
      {
       printf("Veuillez entrez le nom client n°%d:  ",i+1);
       gets(p[i].nom);
      }
     
    tri(p,3);
     
     for (i=0;i<3;i++)
      {
       printf("%s ",(p+i)->nom);
      }
     getch();
     
    }
     
     
    void tri(struct client *p,int l)
    {
     struct client tmp;
     int i,j;
      for(i=0;i<l-1;i++)
    	 for(j=i+1;j<l;j++)
    		if(strcmp(p[i].nom,p[j].nom)==0)
    		{ tmp=p[i];
    		  p[i]=p[j];
    		  p[j]=tmp;
    		}
     
    }
    Cette fois ci le tri dans une fonction, mais ca ne change strictement rien

  3. #3
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct client *p;
    struct client tmp;
    int i,j;
    
    
    for (i=0;i<3;i++)
    {
    printf("Veuillez entrez le nom client n°%d:  ",i+1);
    gets(p[i].nom);
    }
    Il manque l'allocation dynamique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    p=(struct client *)malloc(N* sizeof(client)); // réservation mémoire pour N structure client
    Ceci:
    peut être remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gets(*p.nom);
    gets(p->nom);

  4. #4
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    J'y pense maintenant aussi, il est préférable d'utiliser fgets() au lieu de gets(). Ainsi, tu définis un maximum de caractère à saisir pour ne pas dépasser l'allocation statique de ton buffer pour nom.

    Par contre, pour comparer deux chaines, tu dois être conscient que suite à une saisie avec fgets, le caractère '\n' est présent dans ta chaine.
    Voir ce lien pour le supprimer si cela s'avère utile:
    http://c.developpez.com/faq/c/?page=...hr_after_fgets

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Merci homeostasie pour tout ces réponses, mais j'aimerais savoir si l'on peut faire le tri sans toucher au malloc realloc etc. Mais plutot comme pour des int => (j'ai fait le programme ci dessous avec l'age pour donner un exemple)

    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
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
     
    struct client
    {
    char nom[30];
    char prenom[30];
    int age;
    };
     
    void tri(struct client *,int); 
    void main()
    {
    struct client p[3];
    int i;
     
     
    for (i=0;i<3;i++)
    {
    printf("Veuillez entrez l'age du client n°%d:  ",i+1);
    scanf("%d",&p[i].age);
    }
     
    tri(p,3);
     
     
    getch();
     
    }
     
    void tri(struct client *p,int l)
    {
    struct client tmp;
    int i,j;
      for(i=0;i<l-1;i++)
    	 for(j=i+1;j<l;j++)
    		if(p[i].age>p[j].age)
    		{ tmp=p[i];
    		  p[i]=p[j];
    		  p[j]=tmp;
    		}
      for(i=0;i<l;i++)
    	  printf("\n%d",p[i].age);
     
    }

    edit : je vais essayer de corriger ca. je poste dès que j'ai resolu

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Bon c'est résolu merci encore
    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
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    
    struct client
    {
    char nom[30];
    char prenom[30];
    int age;
    };
    
    void tri(struct client *,int);
    void main()
    {
    struct client p[3];
    int i;
    
    
    for (i=0;i<3;i++)
    {
    printf("Veuillez entrez le nom client n°%d:  ",i+1);
    gets(p[i].nom);
    }
    
    tri(p,3);
    
    
    
    getch();
    
    }
    
    
    void tri(struct client *p,int l)
    {
    struct client tmp;
    int i,j;
    
         for(i=0;i<l-1;i++)
    	 for(j=i+1;j<l;j++)
    		if(strcmp(p[i].nom,p[j].nom)>0)
    		{ tmp=p[i];
    		  p[i]=p[j];
    		  p[j]=tmp;
    		}
    
          for (i=0;i<3;i++)
    		{
    		printf("%s ",(p+i)->nom);
    		}
    }

    même prog sans fonction =>

    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
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    
    struct client
    {
    char nom[30];
    char prenom[30];
    int age;
    };
    
    
    void main()
    {
    struct client p[3];
    struct client tmp;
    int i,j;
    
    
    for (i=0;i<3;i++)
    {
    printf("Veuillez entrez le nom client n°%d:  ",i+1);
    gets(p[i].nom);
    }
    
    
      for(i=0;i<2;i++)
    	 for(j=i+1;j<3;j++)
    		if(strcmp(p[i].nom,p[j].nom)>0)
    		{ tmp=p[i];
    		  p[i]=p[j];
    		  p[j]=tmp;
    		}
    
    for (i=0;i<3;i++)
    {
    printf("%s ",(p+i)->nom);
    }
    getch();
    
    }

  7. #7
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    scanf("%d",&p[i].age);
    Je te conseille d'utiliser fgets au lieu de scanf ici aussi!

    A mes yeux, il est essentiel d'allouer la mémoire avec malloc (réservation mémoire) car risque que par la suite, tu écrives à des emplacements mémoires correspondant justement à tes données....et là, que cela soit pour l'age ou les noms, certains que ton tri déconnera!

  8. #8
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    ok merci du conseil j'y veillerais dans l'avenir. Mais pour le moment je veux me remettre au c tout petit doucement.

    ciao

  9. #9
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    que doit faire exactement ton tri?

    Est ce normal cette incrémentation de i qui se répercute ensuite dans ta première boucle for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(i=0;i<l-1;i++)
    	 for(j=i+1;j<l;j++)
    J'ai ajouté l'allocation dynamique, et la comparaison des chaines de noms fonctionne bien de mon côté.

  10. #10
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    oups désolé pour l'incrémentation de i, suis fatigué aujourd'hui....

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par jeff69
    je n'arrive pas à trier ma structure a partir du nom des clients
    Les tris se font avec qsort(), par exemple.

  12. #12
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Merci je ne connaissais pas qsort(), je vais me renseigner

  13. #13
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    A tout hasard, voici un code permettant de rassembler les mêmes noms d'une structure ensemble:

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    struct client
    {
       char nom[30];
       char prenom[30];
       int age;
    };
     
    int main(int argc, char *argv[])
    {
       struct client *p;
       struct client tmp;
       int i,j,index, N = 6;
     
       p = (struct client *)malloc(N* sizeof(*p)); // réservation mémoire pour N structure client
     
       for (i = 0; i < N; i++)
       {
         printf("Veuillez entrez le nom client n°%d:  ",i+1);
         fgets(p[i].nom, sizeof(p[i].nom), stdin); // je ne supprime pas le caractère '\n'
       }
     
       /*Initiliasations*/
       i = 0;
       j = 1;
       index = 1;
     
       /*Regrouper les mêmes noms ensembles*/
       while( i < N - 1)
       {
    	 while((strcmp(p[i].nom,p[j].nom))  && (j < N))   // chaines différentes
    	 { 
            j++;
    	 }
     
         if (j == N)  // nouveau nom à comparer
         {
            i = index; 
            j = i + 1;
            index++;
         }
         else        //permutation              
         {
            tmp = p[index];
            p[index] = p[j];
            p[j] = tmp;
            index++;
            j++;    
         } 
       }
     
       for (i = 0; i < N; i++)
       {
         printf("%s ",(p+i)->nom);
       }
     
       free(p);  
     
       system("PAUSE");	
       return 0;
    }

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

Discussions similaires

  1. [Débutant] créer une structure avec des tseries à partir d'Excel
    Par patrick revelli dans le forum MATLAB
    Réponses: 5
    Dernier message: 22/06/2015, 13h16
  2. Tri d'une HashMap à partir des clés
    Par Eithne dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 15/06/2011, 16h40
  3. Créer une liste à partir des noms des feuilles
    Par BOU59000 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 19/08/2008, 18h38
  4. Réponses: 6
    Dernier message: 04/02/2008, 13h18
  5. réafficher une image à partir des données recupérées
    Par vbcasimir dans le forum Langage
    Réponses: 3
    Dernier message: 04/10/2005, 10h50

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