Tri d'un tableau de struct

Fermé
peli20 - 23 janv. 2010 à 20:30
 peli20 - 25 janv. 2010 à 18:14
Bonjour,
salut j ai un programme pr la gestion des contact , comm vs le verrez dans le code source , il s agit d'un tableau de structure, qu il faut trier selon l'ordre croissant des noms, lors de l execution, ce que j obtient c est la permutation des nom sans la permutation de la structure.. voici le code:


#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<conio.h>

typedef struct dat{
int jour;
int mois;
int annee;
}DATE;



typedef struct cont{

char *cin;
char *nom;
char*prenom;
char*adresse;
char *gsm;
char*tel;
char*fax;
DATE date_naissance;
char*mail1;
char*mail2;
}contact;

void saisir(contact*,int);
void afficher(contact*,int);
void trier_nom(contact *,int );
void trier_birth(contact *,int);

main()
{
contact*e;
int n,i,l;

printf("entrer nbre de contact \n");
scanf("%d",&n);
e=(contact*)malloc(n*sizeof(contact));
saisir(e,n);
trier_nom(e,n);

//trier_birth(e,n);
afficher(e,n);

getch();

}

void saisir(contact *e,int n)
{ char s[20];
int i,l;


for(i=0;i<n;i++)
{printf("cin no°:%d ",i);
scanf("%d",&((e+i)->cin)); //printf("\n");

printf("le nom:"); scanf("%s",s);
l=strlen(s);
(e+i)->nom=(char*)malloc(l*sizeof(char));
strcpy((e+i)->nom ,s);//printf("\n");


printf("le prenom:"); scanf("%s",s);
(e+i)->prenom=(char*)malloc(l*sizeof(char));
strcpy((e+i)->prenom ,s);

printf("l'adresse:");scanf("%s",s);
(e+i)->adresse=(char*)malloc(l*sizeof(char));
strcpy((e+i)->adresse ,s);

printf("le gsm:");scanf("%s",s);
(e+i)->gsm=(char*)malloc(l*sizeof(char));
strcpy((e+i)->gsm ,s);

printf("tel:");scanf("%s",s);
(e+i)->tel=(char*)malloc(l*sizeof(char));
strcpy((e+i)->tel ,s);

printf("le fax:");scanf("%s",s);
(e+i)->fax=(char*)malloc(l*sizeof(char));
strcpy((e+i)->fax ,s);

printf("mail1:");scanf("%s",s);
(e+i)->mail1=(char*)malloc(l*sizeof(char));
strcpy((e+i)->mail1 ,s);

printf("mail2:");scanf("%s",s);
(e+i)->mail2=(char*)malloc(l*sizeof(char));
strcpy((e+i)->mail2 ,s);



printf("le jour :\n"); scanf("%d",&e[i].date_naissance.jour);
printf("le mois :\n"); scanf("%d",&e[i].date_naissance.mois);
printf("le annee :\n"); scanf("%d",&e[i].date_naissance.annee);


}
}

void afficher(contact *e,int n)
{ int i;


for(i=0;i<n;i++)
{ printf(" %d \n",(*(e+i)).cin);
printf(" %s \n",(*(e+i)).nom);
printf(" %s \n ",(*(e+i)).prenom);
printf(" %d \n",(*(e+i)).adresse);
printf(" %s \n",(*(e+i)).gsm);
printf(" %s \n ",(*(e+i)).tel);
printf(" %d \n",(*(e+i)).fax);
printf(" %s \n",(*(e+i)).mail1);
printf(" %s \n",(*(e+i)).mail2);

printf(" %d%d%d \n ",(*(e+i)).date_naissance.jour,(*(e+i)).date_naissance.mois,(*(e+i)).date_naissance.annee);



printf(" \n\n");
}
}



//le tri par nom
void trier_nom(contact *e,int n )
{
char*p;
int i;
int j;
for (i=0; i<n ; i++)
{
for(j=i+1; j<n ; j++)
{
if(strcmp(e[i].nom,e[j].nom)>0)
{
p=e[i].nom;
e[i].nom=e[j].nom;
e[j].nom=p;
}

}

}
}
A voir également:

2 réponses

Garby Messages postés 133 Date d'inscription samedi 7 octobre 2006 Statut Membre Dernière intervention 28 juin 2023 16
25 janv. 2010 à 16:19
Bonjour,

Je n'ai pas épluché ton code en détail mais dans la permutation de ta fonction de tri, tu pointes effectivement sur les noms et non sur les structures.

Il y a plus de 15 ans que je n'ai pas écrit une ligne de C, les indirections ne sont plus très claires pour moi mais dans le principe voici ce qu'il faut écrire :

if(strcmp(e[i].nom,e[j].nom)>0)
{
p=e[i];
e[i]=e[j];
e[j]=p;
}

p n'étant plus un char* mais du type de ta structure (ou un pointeur sur ta structure... comme dit précédemment, ca n'est plus très clair pour moi...)
Le test se fait sur le nom de ton contact mais ce sont les structures entières que l'on permute.

Garby.
0
merci bien pour votre aide, mais ça a n'a pas marché, j ai eu de problème de compilation..
0
merciiiiiiiiiiiii...j ai reussi enfin, l erreur d la compilation j l ai detectée...
votre correction etait bonne..maintenant j ai un autre problème..lorsque je saisi l'adresse et le fax du contact,
j ecris par exemple "hhh" et ce que j obtient lors de l affichage d c q javais saisis ce sont des nombres et non pas la chaine de caractere que j avais saisi :-S
0
Garby Messages postés 133 Date d'inscription samedi 7 octobre 2006 Statut Membre Dernière intervention 28 juin 2023 16
25 janv. 2010 à 17:22
Pour l'adresse et le fax, remplace le %d par un %s dans tes printf... :-)

Bon courage.

Garby
0
c etait vraiment bete de ma part... merci bien pour l'aide!
0
maintenant j essai d'elaborer le meme programme, mais cette fois-ci en triant les prenoms, ce que j ai fais c est le mm programme que le tri pour les nom, mais lors de l execution du nouveau programme, un probleme se deroule, j ai un message "tri_prenom.exe ne fonctionne pas"!! par contre le programme utilisant le tri par nom fonctionne tres bien... vous croyez que c est du a quoi??
0
Garby Messages postés 133 Date d'inscription samedi 7 octobre 2006 Statut Membre Dernière intervention 28 juin 2023 16 > peli20
25 janv. 2010 à 18:05
pas simple la programmation... ;-)

Alors, la seule chose à changer pour le tri sur les prénoms c'est la ligne de test de la fonction de tri
if(strcmp(e[i].nom,e[j].nom)>0)
à remplacer par
if(strcmp(e[i].prenom,e[j].prenom)>0)
mais ça, je pense que tu l'as fait.

Si l'erreur est à l'exécution et non à la compilation, regarde déjà du côté de tes données. As-tu des caractères accentués dans tes chaînes de caractères ? ils peuvent parfois poser problème.
Et puis sinon, tu dois très certainement avoir un débuger dans ton environnement de développement...
0
peli20 > Garby Messages postés 133 Date d'inscription samedi 7 octobre 2006 Statut Membre Dernière intervention 28 juin 2023
25 janv. 2010 à 18:14
en ce qui concerne strcmp, j ai fait le changement adecuat, ...j essaierai une autre fois, peut etre il ya un boucle infini quelquepart..
0