Trier tableau de struture

henrydessss Messages postés 12 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 9 octobre 2006 - 7 oct. 2006 à 16:05
henrydessss Messages postés 12 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 9 octobre 2006 - 9 oct. 2006 à 15:39
bonjour,
mon probleme :
j'ai une structure comme ceci :
struct repertoire{
    char *nom;
    char *prenom;
};
typedef struct repertoire Repertoire;
Repertoire contact[3];

puis :
strcpy(contact[0].nom,"bab");
strcpy(contact[1].nom,"baac");
strcpy(contact[2].nom,"abc");

peut importe le contenu des prenoms.
comment afficher chaque contact, par ordre alphabetique sur les noms?

j'y ai passé beaucoup de temps sans pouvoir y arriver.
pouvez vous m'aider ?

Bien à vous,
jb

on m'a dit : strcmp et qsort. mais je ne m'en sors pas, malgré que je connaisse 3 algo de tri : selection, insertion et a bulle.

16 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
7 oct. 2006 à 16:50
Faut pas s'embeter avec des théories de tri à la "é'(ù*.

Tu fais une fonction qui te retourne le plus petit des deux objets que tu envois en argument.

Trier un tableau de structure ou un tableau d'entier, c'est pareil. Juste la fonction "<" qui change.
0
henrydessss Messages postés 12 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 9 octobre 2006
7 oct. 2006 à 16:52
reponse convenable mais :
si dans une fonction, je change par exemple contact[3].nom et contact[1].nom, est ce que ca restera chang dans le retour à main?
oui oui, je pourrais tester de moi meme, mais ma machine sous environement unix n'est pas à ma porté pour la journée.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
7 oct. 2006 à 17:39
Mais t'as juste besoin d'une fonction genre:

bool IsInferior(const repertoire & _obj1,  const repertoire & _obj2);


et apres dans ta fonction, t'as juste a tester

if (! IsInferior(contact[1], contact[0]))

{

    tmp = contact[0];

    contact[0] = contact[1];

    contact[1] = tmp;

}
0
henrydessss Messages postés 12 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 9 octobre 2006
7 oct. 2006 à 18:03
tu sais, je suis debutant...
je comprends pas ceci :
repertoire &_obj1 (aindi que le suivant).
de plus, peut comparer contact[0] et contact[1] qui sont deux "structures" ?
aussi, tmp=contact[0] n'a aucun sens.
tmp=contact[0].nom en aurait, mais je devrais en faire autant pour le sprenom, email, adresse, etc... sachant que parfois, hors mis le nom, un champ peut etre vide.

en gros, imaginons, j'ai ceci :

Monsieur Y                  emaily
MonsieurX   prenomx   emailx   telephonex

j'aimerais au final avoir

MonsieurX   prenomx   emailx   telephonex
Monsieur Y                  emaily

soit contact[1].nom=MonsieurY contact[1].email=emaily
etc...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
7 oct. 2006 à 18:52
repertoire tmp = contact[0]; <= pk ca n'a aucun sens. Bien sur que si, ca copie l'objet dans un autre.


Voici le contenu de la fonction IsInferior:


bool IsInferior(const repertoire & _obj1,  const repertoire & _obj2)

{

    int resultat = strcmp(_obj1.nom, _obj2.nom);


    if (resultat < 0) return true;

    else if (resultat == 0)

    {

       if (strcmp(_obj1.prenom, _obj2.prenom) < 0) return true;

       else return false;

    }

    else return false;

}


Cad, si A et B sont deux objets répertoire. A est plus petit que B si
A.nom est plus petit que B.nom (ordre alphabétique) ou si A.nom et
B.nom sont égales, alors A et plus petit que B si A.prenom est
inférieur à B.prenom.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
7 oct. 2006 à 18:54
j'ai oublié de précisé, si tu programmes en C, il faut la déclaration suivante:

bool IsInferior(const repertoire _obj1,  const repertoire _obj2)

et non

bool IsInferior(const repertoire & _obj1,  const repertoire & _obj2)
0
henrydessss Messages postés 12 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 9 octobre 2006
8 oct. 2006 à 13:27
hum.

bon, j'ai pas bool.h peu importe, j'ai modifié votre code pour retourner un entier.

mais gcc me dit cela :

repertoire.c: Dans la fonction « IsInferior »:

repertoire.c:17: error: `_obj1' undeclared (first use in this function)


de meme pour _obj2

j'ai bien pris soin de mettre cette fonction en tete de mon code. il me
dit ca alors meme que je ne fais pas appel ) cette fonction. je n'ai
fais que la mettre dans le code.

j'aurais aimé chercher à resoudre ce probleme moi meme, mais je ne
connais pas DU TOUT ce genre de chose. j'ignorais la notation
"_quelquechose" et le reste, comme passer contact[i] en paramettre...
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 oct. 2006 à 14:52
Mais tu penses mal :) il faut penser en terme de "type" et "object". Tu
peux envoyer n'importe quel objet en argument, ya pas de limitation. Le
fait d'utiliser un tableau, ca change strictement rien.

contact[i] c'est un objet de type REPERTOIRE.


repartoire test;


test et contact[i] c'est exactement le meme type d'objet, aucune différence.


Ton probleme vient surement du fait que lorsque tu déclares la fonoction IsInferior, le type "repertoire" n'est pas définie.

Donc le plus simple est que tu déclares la structure avant la fonction.
0
henrydessss Messages postés 12 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 9 octobre 2006
8 oct. 2006 à 15:02
merci pour ces precisions sur le langage en question.

pour ce qui est de la solution, oui, j'avais pensé comme toi, mais un peu trop tard (une fois parti de chez moi).

je rectifierai le tir des que je serai sur ma machine, mais je pense que ca vient de là, oui.

merci encore. je viendrai ici pour signifier que le probleme est resolu si toute fois ce sera le cas:)
0
henrydessss Messages postés 12 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 9 octobre 2006
8 oct. 2006 à 15:43
beh nan, ca change rien, toujours la meme erreur. mais peu importe,
j'ai fais exactement pareil dans le corps de ma fonction. ca m'embete
mais j'ai jusqu'a vendredi  pour mettre le code au propre et
trouver une solution pour mettre ca dans une fonction a part, que je
puisse mettre ca aussi dans un fichier a part.

merci encore pour ton aide, ca m'a beaucoup appris :)
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 oct. 2006 à 18:02
Ya pas de quoi. Mais si ca marche tjs pas. Post ton code ici.
0
henrydessss Messages postés 12 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 9 octobre 2006
8 oct. 2006 à 18:27
je ne vais pas C/C tout mon code, mais voila en gros le probleme :



#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

int
main(int argc, char *argv[])
{
void inverser(repertoire obj1,repertoire obj2);
int i;
typedef struct repertoire
{
char *nom;
char *prenom;
} Repertoire;
Repertoire contact[2];
for(i=0;i<2;i++)
{
contact[i].nom=(char *)malloc(1024*sizeof(char));
contact[i].prenom=(char *)malloc(1024*sizeof(char));
}
strcpy(contact[0].nom,"Roquefere");
strcpy(contact[0].prenom,"Jean-Baptiste");
strcpy(contact[1].nom,"Descat");
strcpy(contact[1].prenom,"Annabelle");
//jusque la, pas le moindre probleme de compilation ou d'execution
inverser(contact[0],contact[1]);
}

void
inverser(repertoire obj1, repertoire obj2)
{
repertoire tmp;
tmp=obj1;
obj1=obj2;
obj2=obj1;
}


et voila le resultat de la compilation :
test.c: Dans la fonction « main »:
test.c:8: error: erreur de syntaxe before "obj1"
test.c: Hors de toute fonction :
test.c:30: error: erreur de syntaxe before "obj1"
test.c: Dans la fonction « inverser »:
test.c:32: error: `repertoire' undeclared (first use in this function)
test.c:32: error: (Each undeclared identifier is reported only once
test.c:32: error: for each function it appears in.)
test.c:32: error: erreur de syntaxe before "tmp"
test.c:33: error: `tmp' undeclared (first use in this function)
test.c:33: error: `obj1' undeclared (first use in this function)
test.c:34: error: `obj2' undeclared (first use in this function)
make: *** [test.o] Erreur 1

je sais, ca fait tres lourd a lire, je deteste copier/coller du code ou des resultats de mon shell, mais je crois que c'est quasiment indispensable ici.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
9 oct. 2006 à 00:27
Mais qu'est ce que c'est que ces déclarations de fonctions à l'interieur d'autre  fonction ?

Faut absolument apprendre les  bases du langage avant de se laisser dedans.


 typedef struct repertoire


  {


    char *nom;


    char *prenom;


  } Repertoire;


 void inverser(repertoire obj1,repertoire obj2);


int main(int argc, char *argv[])

{

  int i;

  Repertoire contact[2];


  for(i=0;i<2;i++)

    {

      contact[i].nom=(char *)malloc(1024*sizeof(char));

      contact[i].prenom=(char *)malloc(1024*sizeof(char));

    }


  strcpy(contact[0].nom,"Roquefere");

  strcpy(contact[0].prenom,"Jean-Baptiste");

  strcpy(contact[1].nom,"Descat");

  strcpy(contact[1].prenom,"Annabelle");

//jusque la, pas le moindre probleme de compilation ou d'execution

  inverser(contact[0],contact[1]);

}


void inverser(repertoire obj1, repertoire obj2)

{

  repertoire tmp;

  tmp=obj1;

  obj1=obj2;

  obj2=obj1;

}


Et ta fonction inverser ne fait rien du tout. Car tu passes tes
arguments par copie, et donc tu inverses des copies qui n'ont rien a
voir avec les objets que tu envois au début.


 void inverser(repertoire * obj1,repertoire * obj2)

{

  repertoire tmp;


  tmp=*obj1;


  *obj1=*obj2;


  *obj2=*obj1;

}


et l'appel du coup:

inverser(&contact[0], &contact[1]);


Si tu vois pas ce que sont ces étoiles. => google, tu trouveras des cours sur le C.
0
henrydessss Messages postés 12 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 9 octobre 2006
9 oct. 2006 à 07:15
oh que j'ai honte.
la declaration de ma fonction dans une autre est une erreur enorme de ma part. j'ai pour habitude de declarer dans un .h , pour dire que je sais bien entendu qu'il faut declarer hors de toute fonction.
pour le passage par valeur, aussi une erreur d'innatention. je sais ce que sont des pointeurs. nan, ne crois pas que je débute depuis hier, j'ai quand meme eu 200/200 en "programmation c" l'an passé en licence :)
cependant, oui, j'ignorais qu'on pouvait passer toutes sortes d'objet en paramettre, comme des structures.
merci encore. Résolu.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
9 oct. 2006 à 13:39
Mais le C c'est à jeté a la poubelle au profit du C++ :)


Aller bonne continuation.
0
henrydessss Messages postés 12 Date d'inscription jeudi 16 mars 2006 Statut Membre Dernière intervention 9 octobre 2006
9 oct. 2006 à 15:39
vas le dire au doyen de ma fac, ou a celui qui dit quelle matiere doit etre apprise en telle année...
0
Rejoignez-nous