Tri d'un tableau de struct
peli20
-
peli20 -
peli20 -
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;
}
}
}
}
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:
- Tri d'un tableau de struct
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Imprimer un tableau excel - Guide
- Logiciel tri photo - Guide
2 réponses
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.
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.
Pour l'adresse et le fax, remplace le %d par un %s dans tes printf... :-)
Bon courage.
Garby
Bon courage.
Garby
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??
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...
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...
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