Rechercher : dans
Par :

Tri de tableau

Dernière réponse le 18 jun 2009 à 14:25:33 yoman72, le 18 jun 2009 à 10:03:07 
 Signaler ce message aux modérateurs

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.

Configuration: Windows XP
Firefox 3.0.11

Meilleures réponses pour « tri de tableau » dans :
Tri à bulles -récursivité- VoirVoici une procédure récursive qui permet de trier un tableau de n entiers en utilisant la méthode de tri à bulles : Procedure Tri_bulles (var t : TAB; n : integer); Var i, aux : integer; Function Trier (t : TAB; n : integer) : Boolean; ...
Pascal - Tri par insertion - Récursivité- VoirVoici une procédure récursive qui permet de trier un tableau de n entiers en utilisant la méthode de tri par insertion : Procedure Tri_Ins (Var t: TAB; n: integer); Var aux,i : integer; begin If n > 1 Then begin ...
Tri Shell -Recursive- VoirVoici une procédure récursive qui permet de trier un tableau de n entiers en utilisant la méthode de tri Shell : Procedure Tri_Shell_Rec (Var t: TAB; n,h : integer); Var aux,i : integer; begin If h > 0 Then Begin If n > h...
SQL - Tri VoirTri des résultats Il est possible en SQL d'organiser les résultats grâce à la clause ORDER BY. La clause ORDER BY est suivie des mots clés ASC ou DESC, qui précisent respectivement si le tri se fait de manière croissante (par défaut) ou...
Tableau de bord VoirNotion de tableau de bord Un tableau de bord est une représentation graphique synthétique d'un ensemble d'indicateurs donnant à un responsable tous les éléments lui permettant de prendre visuellement et rapidement des décisions. Compte-tenu de sa...

1

Pwoned, le 18 jun 2009 à 10:12:23

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 ?

Répondre à Pwoned

2

yoman72, le 18 jun 2009 à 10:20:12

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

Répondre à yoman72

3

Pwoned, le 18 jun 2009 à 11:07:24

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.

Répondre à Pwoned

4

yoman72, le 18 jun 2009 à 11:09:45

Ok, Merci pour ton aide je vais essayer sa tout de suite!!!

Répondre à yoman72

5

garion28, le 18 jun 2009 à 11:20:00

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

Répondre à garion28

6

yoman72, le 18 jun 2009 à 11:57:46

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;
}

Répondre à yoman72

7

raleur, le 18 jun 2009 à 14:17:44

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.

Répondre à raleur

8

 Pwoned, le 18 jun 2009 à 14:25:33

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;
}

Répondre à Pwoned
Collection CommentÇaMarche.net