begin process at 2012 05 30 19:08:21
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

trier un tableau de stucture en c


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

trier un tableau de stucture en c

samedi 23 janvier 2010 à 20:10:08 | trier un tableau de stucture en c

peli20

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 C# :
[code=cpp]
[/code]
dimanche 24 janvier 2010 à 13:35:24 | Re : trier un tableau de stucture en c

uaip

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.


Cette discussion est classée dans : int, printf, scanf, char, contact


Répondre à ce message

Sujets en rapport avec ce message

concatenation [ par asmv ] //a partir d'elements de tableau 'int' transformes en 'char'//essai de concatenation qui ne fonctionne pas pourquoi ?//merci pour votre aide#include # Hachage fermé problème de lecture [ par mcflysupersonic ] Bonjour je suis nouveau sur le forum est ceci est ma première question donc j'espère que je ne me suis pas trompé d'endroit pour poster.Voilà j'ai un segmentation fault help [ par alabb ] aidez moi je suis un new bie, j'ai un segmentation fault a la fin du prog:si gagant apres avoir affiché WINNERsi perdant apres avoir affiché "votre s programme en C [ par graminach ] on a un pb pour la question 2b!le programme ne tourne pas en boucle et affiche meme en cas de valeur correcte erreurmerci d'avancehttp://www-ipst.u-st oh non!! [ par bako25 ] Le prog suivant  calcule le nombre des 'e' dans un paragraphe: #include #include< scanf / printf avec variable char [ par domcergyitin95 ] Bonjour, je début en C, et j'ai un problème que je n'arrive pas à résoudre, malgré que le reste du programme soit plus complexe et que ça tourne bie Débutant demande aide en C [ par juancho2786 ] Bonjour tout le monde. Je voulais vous demandez si mon code était correcte? et comment faire pour aller à la ligne après chaque enregistrement? Merci problem avec un char[] [ par kibab ] Bounour a vous tous, je suis nouveau de ce langage et je m'amuse à faire des épreuves diverses.Ici il y a un petit example mais jái un problem:#includ Lecture et ecriture sur fichier [ par developvbdebut ] Bonjour tout le mondeJe travaille sur la gestion des fichier en c.Mon livre n'explique pas clairement l'ectriture et la lecture dans les fichiers.Voic Ouvrir et afficher un fichier texte en C [ par AsM0DeUz ] 'lut Je m'initie actuellement au C. Apres avoir fait les exos les plus basiques ... je passe au basique niveau 2 J'ai ecris qques lignes pour afficher


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,889 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales