Tri de tableau

yoman72 -  
 Pwoned -
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.
A voir également:

5 réponses

Pwoned
 
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 ?
0
yoman72
 
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
0
Pwoned
 
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.
0
yoman72
 
Ok, Merci pour ton aide je vais essayer sa tout de suite!!!
0
garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   407
 
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yoman72
 
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;
}
0
raleur
 
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.
0
Pwoned > raleur
 
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;
}
0