Tri de tableau
yoman72
-
Pwoned -
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.
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:
- Tri de tableau
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Logiciel tri photo - Guide
- Imprimer un tableau excel - Guide
5 réponses
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 ?
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 ?
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
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
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.
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.
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
généralement une personne est composé d'un nom et d'un prénom
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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;
}
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;
}
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.
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.
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;
}
(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;
}