Aller au contenu

Tri d'un tableau de struc


Echap

Messages recommandés

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 10

typedef 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

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

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 :mdr:

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 ! :transpi:

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.htm

enfin 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 :roll:

tkt on va terminer le tri mème si il y a personne qui nous donne de l'aide :mdr:

Lien vers le commentaire
Partager sur d’autres sites

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...