Trier un tableau de stucture en c

peli20 Messages postés 3 Date d'inscription samedi 23 janvier 2010 Statut Membre Dernière intervention 5 juin 2011 - 23 janv. 2010 à 20:10
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011 - 24 janv. 2010 à 13:35
salut, j ai un petit probleme en c ,j espere que vous m aidiez..
bon, j essaie d elaborer un programme faisant la gestion des contact,
le remplissage est fait, l affichage aussi, mais lorsq je veux tirer le tableau des contact selon l ordre croissant des noms j ai des problemes,
en execution ce q j obtient, c est la permutation des nom et nom pas la permutation de toute la structure, voici mon code:(merci pour l aide )

#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;
}

}

}
}
[code=cpp]
/code

1 réponse

uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
24 janv. 2010 à 13:35
Salut,

Déjà de gros problèmes de base dans ton code.
- (*variable).attribut est équivalent à variable->attribut, donc par exemple (*(e+i)).date_naissance devient (e+i)->date_naissance (c'est quand même plus lisible).
- dans saisir(), tu alloues mal la mémoire : la première fois tu alloues une zone de même taille que ta chaine saisie (en oubliant le +1 pour le \0 !), mais les autres fois, tu alloues une zone toujours de même taille que la première, parce-que tu oublies de recalculer la taille des chaines saisies (strlen()). Et sizeof(char) vaut toujours 1.
Donc pour commencer, ta structure est mauvaise dès le début de ton programme.

Ensuite, c'est évident que seul le nom est interverti, et non pas la structure, puisque dans ta fonction trier_nom(), tu n'intervertis que le nom de tes structures...
Pour ce genre de manipulation, je te conseillerais d'utiliser une liste chainée. C'est quand même beaucoup plus simple.


Cordialement, uaip.
0
Rejoignez-nous