Echap Posté(e) le 11 juillet 2009 Partager Posté(e) le 11 juillet 2009 j'ai un petit problème de trie par age d'un tableau des employées voila mon code: #include<stdio.h>#include<conio.h>#define max 10typedef struct CITOYEN{char nom[10] ;char prenom[20];int cin[8];int jour[2];int mois[2];int annee[4];int numrue[5] ;char cite[15] ;char ville[20];int codp[10] ;}cit;int main(){int i,nbr1,nbr2;cit t[max] ;puts("remplissage du tableau");for(i=0;i<max;i++);{printf("donnez le nom :\n");scanf("%s",&t[i].nom);printf("donnez le prenom :\n");scanf("%s",&t[i].prenom);printf("donnez le num CIN :\n");scanf("%d",&t[i].cin);printf("donnez le jour de naissance :\n");scanf("%d",&t[i].jour);printf("donnez le mois de naissance :\n");scanf("%d",&t[i].mois);printf("donnez l'année :\n");scanf("%d",&t[i].annee);printf("donnez le numero de l'employé :\n");scanf("%d",&t[i].numrue);printf("donnez le city :\n");scanf("%s",&t[i].cite);printf("donnez la ville :\n");scanf("%s",&t[i].ville);printf("donnez le code postal :\n");scanf("%d",&t[i].codp);}int p = 0; // position de l'employé le plus âgéfor(i=0;i<max;i++) // voila le probème{nbr1= t[i].jour + 100 * (t[i].mois) + 10000 * (t[i].annee);nbr2 = t[i+1].jour + 100 * t[i+1].mois + 10000 * t[i+1].annee;if (nbr1 < nbr2){p= i+1;}else{p=i;}}[/color]getch();return(0);} merci d'avance Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 13 juillet 2009 Partager Posté(e) le 13 juillet 2009 1/ Avec des balises code, on verrait mieux ton code (relisez ce que vous postez bon sang) 2/ Quel est le problème exactement ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 14 juillet 2009 Partager Posté(e) le 14 juillet 2009 j'ai un petit problème de trie par age d'un tableau des employées voila mon code: personnellement, meme si je ne sais pas exactement se que tu cherche a faire, je vois 1 voir 2 soucis : le premier concerne ta boucle for avant le return 0 (quand tu incremente i a chaque fois que nbr1<nbr 2 - je suis partie du principe que ton calcul etait correcte, j'ai pas tester) for(i=0;i<max;i++) // voila le probème { nbr1= t[i].jour + 100 * (t[i].mois) + 10000 * (t[i].annee); nbr2 = t[i+1].jour + 100 * t[i+1].mois + 10000 * t[i+1].annee; if (nbr1 < nbr2) { p= i+1; } else { p=i; } } comme max vaut 10, tu a un tableau "t[10]" de type "cit" donc les indice de ton tableau vont de 0 à 9 or dans ta boucle va de 0 a (i<max) soit 9, donc tu fait bien 10 tour de boucle. le probleme concerne nbr2 : puisque au 10eme tour de boucle tu est a nbr2 = t[10].jour + 100 * t[10].mois + 10000 * t[10].annee; soit un indice de 1 element trop loin. et tu compare donc t[9] (le dernier element de ton tableau) avec rien. pour que ta boucle soit valide tu peut peut etre faire comme sa for(i=0;i<max-1;i++) // comme tu dit voila 1 pb ensuite 2 e souci eventuel, faire des tableau de int dans ta structure n'a pas grand interet a mon sens puisque de toute facon tu ne vas y stocker qu'un nombre, (un nombre age, un nb code postal, etc... et pas plusieur) donc de simple variables int suffirait (sa evitera de te bouffer de la memoire inutilement). enfin mais après c'est toi qui voit, un truc qui peut t'eviter de calculer tes nbr1 et nbr2, c'est d'entrer tes dates de naissance a l'anglaise sur une seul variable. exemple: int date_naiss=0 // pour une personne née le 12/10/1980 ont entre 19801012, plus le chiffre est petit plus la personne est vieille. a verifier que l'incrementation de p te renvoie bien ce que tu veut et la sa dépend de ce que tu attend... si j'ai fait une bourde quelque part merci me corriger Lien vers le commentaire Partager sur d’autres sites More sharing options...
Echap Posté(e) le 21 juillet 2009 Auteur Partager Posté(e) le 21 juillet 2009 puisque au 10eme tour de boucle tu est a nbr2 = t[10].jour + 100 * t[10].mois + 10000 * t[10].annee; soit un indice de 1 element trop loin. et tu compare donc t[9] (le dernier element de ton tableau) avec rien. je compare de 0 a 9 sinon de 1 a 10 pour que ta boucle soit valide tu peut peut etre faire comme sa for(i=0;i<max-1;i++) // comme tu dit voila 1 pb max = 10 soit x<max quel est la valeur sup de x ? bien sur 9 ,or i < max-1 c'est à dire que i <9 alors la valeur sup de x? bien sur que 8 donc x=8 la boucle fait de 0 à 8 il s'agit de 9 tour seulement ! ensuite 2 e souci eventuel, faire des tableau de int dans ta structure n'a pas grand interet a mon sens puisque de toute facon tu ne vas y stocker qu'un nombre, (un nombre age, un nb code postal, etc... et pas plusieur)donc de simple variables int suffirait (sa evitera de te bouffer de la memoire inutilement). jJe crois que votre méthode bouffe plus de la mémoire en plus comme ça je m'éloigne de but "tri d'une structure de données et si t'as pas lu sur les structure de données voila lien qui peut vous aidez http://www-ipst.u-strasbg.fr/pat/program/tpc.htmenfin mais après c'est toi qui voit, un truc qui peut t'éviter de calculer tes nbr1 et nbr2, c'est d'entrer tes dates de naissance a l'anglaise sur une seul variable. exemple: int date_naiss=0 // pour une personne née le 12/10/1980 ont entre 19801012, plus le chiffre est petit plus la personne est vieille. a verifier que l'incrementation de p te renvoie bien ce que tu veut et la sa dépend de ce que tu attend... si j'ai fait une bourde quelque part merci me corriger "nous/je suis la pour vous corriger et vous aussi tu me rappel de mes methode pour s'enfuire d'engrenages avec le prof de la programmation en classe si je trouve pas les solutions tkt on va terminer le tri mème si il y a personne qui nous donne de l'aide Lien vers le commentaire Partager sur d’autres sites More sharing options...
Spaz001 Posté(e) le 21 juillet 2009 Partager Posté(e) le 21 juillet 2009 Tu ne nous dis même pas quelle est la méthode de tri :/ Ca ressemble à du tri bulle ? int p = 0; // position de l'employé le plus âgé for(i=0;i<max;i++) // voila le probème { nbr1= t[i].jour + 100 * (t[i].mois) + 10000 * (t[i].annee); nbr2 = t[i+1].jour + 100 * t[i+1].mois + 10000 * t[i+1].annee; if (nbr1 < nbr2) { p= i+1; } else {p=i; } Plutôt int echange = 1; while(echange) { echange = 0; for(i=0; i < max-1; ++i) { nbr1= t[i].jour + 100 * (t[i].mois) + 10000 * (t[i].annee); nbr2 = t[i+1].jour + 100 * t[i+1].mois + 10000 * t[i+1].annee; if (nbr1 > nbr2) { cit swap = t[i]; t[i] = t[i+1]; t[i+1] = cit; echange = 1; } } } Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 21 juillet 2009 Partager Posté(e) le 21 juillet 2009 je compare de 0 a 9 sinon de 1 a 10 sinon ???? tu a vue un else... if quelque part ??? pour le reste : meme pas je répond. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.