Posez votre question Signaler

Tri de tableau

yoman72 - Dernière réponse le 18 jun 2009 à 14:25
Bonjour,
J'aurais voulu savoir si quelqu'un pouvait m'aider!!!
Je voudrais faire un tri de tableau mais mes valeurs à l'intérieur de ce tableau son mis avec une structure de différents type. Voici ma structure :
//structure joueur
struct joueur {
char nom[20];
char prenom[10];
float classement;
};
et je voudrais trier mon tableau grâce au classement.
Merci d'avance pour vos réponse.
Lire la suite 

Tri de tableau »

8 réponses
Réponse
+0
moins plus
Salut,

Voici la méthode recommandée dans mon cours :
Une autre méthode de tri consiste à ranger les éléments un par un : on cherche le minimum dans le tableau, puis on échange sa valeur avec celle de la première variable du tableau, ensuite on recherche le minimum dans le tableau privé de sa première variable (puisqu'elle est bien triée), et on échange sa valeur avec celle de la deuxième variable du tableau, et ainsi de suite jusqu'à ce que le tableau soit entièrement trié.


Dans ton cas, le test se fait sur tablo[i].classement.
Tu dois aussi créer une variable "struct joueur temp" pour conserver les éléments dans une mémoire tampon pendant le classement.

Besoin de détails ?
Ajouter un commentaire
Réponse
+0
moins plus
Voilà ce que j'avais fait:
struct joueur temp[n]; //variable qui permet de ranger le tableau par classement
...
//Tri de mon tableau
i=0;
for(i=0;i<=x+1;i++)
{
if (joueur[i].classement>joueur[i+1].classement)
{
temp[i]=joueur[i+1];
joueur[i+1]=joueur[i];
joueur[i]=temp[i];
}
}

Donc si j'ai bien compris il faut que je le fasse comme sa :

i=0;
for(i=0;i<=x+1;i++)
{
if (joueur[i].classement>joueur[i+1].classement)
{
temp[i].nom=joueur[i+1].nom;
joueur[i+1].nom=joueur[i].nom;
joueur[i].nom=temp[i].nom;

/*etc*/
}
}

Or j'avais déjà essayer sa et il me mettait error de l-value
Pwoned - 18 jun 2009 à 11:07
heu...
Là, tu te compilque énormément la vie.

Je vais déjà te donner un code pour un tableau de long, ensuite on adaptera à tes structures...

long temp, rang;
for(i=0; i<tailletableau; i++)
{
temp = tab[i];
rang = i;
for(j=i+i; j<tailletableau; j++)
{
if(temp > tab[j]){temp = tab[j];rang = j;}
} //on a trouvé le plus petit nombre à stocker
tab[rang] = tab[i];
tab[i] = temp;
//le tableau est classé jusqu'à i, on continue le classement pour la suite du tableau
}

Pour ton cas, il faudra que temp soit de type struct joueur.
Ensuite, pour la recopie, je ne crois pas que structure1 = structure2 soit suffisant (à vérifier).
Donc recopie chaque élément de ta structure à chaque fois.
Pour la recopie des tableaux, il faut recopier chaque case au lieu de taper tableau1 = tableau2.
Ajouter un commentaire
Réponse
+0
moins plus
Ok, Merci pour ton aide je vais essayer sa tout de suite!!!
Ajouter un commentaire
Réponse
+0
moins plus
comment ca se fait que le tableau nom soit plus grand que le tableau prénom ??
généralement une personne est composé d'un nom et d'un prénom
Ajouter un commentaire
Réponse
+0
moins plus
Sa ne marche toujours pas donc je te file tout le programme pour que tu vois ce qui ne va pas car je cherche depui tout a l'heure et je pense qu'un avis extérieur me serait favorable.

Fichier header.h
#include <stdio.h>
#include <stdlib.h>


//structure joueur
struct joueur {
char nom[20];
char prenom[10];
long classement;
};

Fichier main.c
#include <stdio.h>
#include <stdlib.h>
#include "header.h"
#define n 40

struct joueur joueur[n];//variable joueur utilisée pour insérer la structure
struct joueur temp; //variable qui permet de ranger le tableau par classement
int i,j;
long rang;
int x;//variable du nbr de personnes inscrites au tournoi

int main()
{
//Explications règles
printf("\nCe petit logiciel vous permet, en rentrant simplement les joueurs et leurs classements,de créer un tournoi de tennis. \n");
printf("\n\nIl vous suffira juste de mettre les classements avec un point: 30.5 et pour les non classé de mettre 50\n\n\n");

//Nombres de personnes présentes au tournoi
printf("Combien aller vous rentrer de personnes?\n");
scanf("%i",&x);
printf("\nIl y a donc %i inscrit(s)\n",x);

//Boucle de saisi
for(i=0;i<=x+1;i++)
{
//Saisi des joueurs dans le tableau
printf("Veuillez saisir le nom du joueur.\n");
scanf("%s",&joueur[i].nom);
printf("Veuillez saisir le prenom du joueur.\n");
scanf("%s",&joueur[i].prenom);
printf("Veuillez saisir le classement du joueur.\n");
scanf("%f",&joueur[i].classement);

//Vérifications du joueur saisi
printf ("\nLe nom est %s\n",joueur[i].nom);
printf ("Le prenom est %s\n",joueur[i].prenom);
printf ("Le classemnet est %f\n\n",joueur[i].classement);
i++;
}

//Tri de mon tableau

for(i=0; i<x; i++)
{
temp.nom = joueur[i].nom;
rang = i;
for(j=i+i; j<x; j++)
{
if(temp.nom > joueur[j].nom){temp.nom = joueur[j].nom;rang = j;}
} //on a trouvé le plus petit nombre à stocker
joueur[rang].nom = joueur[i].nom;
joueur[i].nom = temp.nom;
//le tableau est classé jusqu'à i, on continue le classement pour la suite du tableau
}
return 0;
}
raleur - 18 jun 2009 à 14:17
temp.nom = joueur[i].nom;
Ce type d'affectation n'est pas autorisé, il me semble.
Essaye avec temp.nom[0] = joueur[i].nom[0]; temp.nom[1] = joueur[i].nom[1]; et ainsi de suite pour tout le tableau.

De plus, ici, tu ne change que les noms, mais les scores ne sont pas triés...
Quand au trie par nom, il faut utiliser strcmp, de string.h.

A la limite, tu peux trafiquer un peu en changeant ton tableau de structure en tableau de pointeur :
struct joueur **joueur;
joueur = malloc(n*sizeof(void*));
for(i = 0; i < x; i++)
joueur[i] = malloc(sizeof(struct joueur));

De cette manière, tu peux simplement échanger les cases de ton tableau pour tout reclasser.
Ton temp devient aussi un void* temp plutôt qu'une structure.


for(i=0; i<x; i++)
{
temp = joueur[i];
rang = i;
for(j=i+i; j<x; j++)
{
if(temp->classement > joueur[j]->classement){temp = joueur[j];rang = j;}
} //on a trouvé le plus petit nombre à stocker
joueur[rang] = joueur[i];
joueur[i] = temp;
//le tableau est classé jusqu'à i, on continue le classement pour la suite du tableau
}


Je vais essayer de te pondre un code correct, mais je n'ai pas de compilateur ici donc impossible de vérifier ce que je fais.
Pwoned - 18 jun 2009 à 14:25
Voila, essaye ça...
(tout dans le même fichier, ensuite tu verra pour améliorer, notamment en sécurisant les entrées)

#include <stdio.h>
#include <stdlib.h>

//structure joueur
typedef struct joueur {
char nom[20];
char prenom[10];
long classement;
} joueur;

int main()
{

joueur **joueur, *temp; //variable qui permet de ranger le tableau par classement
int i,j,rang,x;//variable du nbr de personnes inscrites au tournoi

//Explications règles
printf("\nCe petit logiciel vous permet, en rentrant simplement les joueurs et leurs classements,de créer un tournoi de tennis. \n");
printf("\n\nIl vous suffira juste de mettre les classements avec un point: 30.5 et pour les non classé de mettre 50\n\n\n");

//Nombres de personnes présentes au tournoi
printf("Combien aller vous rentrer de personnes?\n");
scanf("%i",&x);
printf("\nIl y a donc %i inscrit(s)\n",x);

joueur = malloc(x*sizeof(void*));
for(i = 0; i < x; i++)
joueur[i] = malloc(sizeof(struct joueur));

//Boucle de saisi
for(i=0;i<x;i++)
{
//Saisi des joueurs dans le tableau
printf("Veuillez saisir le nom du joueur.\n");
scanf("%s",&joueur[i]->nom);
printf("Veuillez saisir le prenom du joueur.\n");
scanf("%s",&joueur[i]->prenom);
printf("Veuillez saisir le classement du joueur.\n");
scanf("%f",&joueur[i]->classement);

//Vérifications du joueur saisi
printf ("\nLe nom est %s\n",joueur[i]->nom);
printf ("Le prenom est %s\n",joueur[i]->prenom);
printf ("Le classemnet est %f\n\n",joueur[i]->classement);
i++;
}

//Tri de mon tableau

for(i=0; i<x; i++)
{
temp = joueur[i];
rang = i;
for(j=i+1; j<x; j++)
{
if(temp->classement > joueur[j]->classement){temp = joueur[j];rang = j;}
} //on a trouvé le plus petit nombre à stocker
joueur[rang] = joueur[i];
joueur[i] = temp;
//le tableau est classé jusqu'à i, on continue le classement pour la suite du tableau
}
return 0;
}
Ajouter un commentaire
Ce document intitulé « tri de tableau » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook