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.
Configuration: Windows XP
Firefox 3.0.11

5 réponses

  1. 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
  2. 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
    1. 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
  3. yoman72
     
    Ok, Merci pour ton aide je vais essayer sa tout de suite!!!
    0
  4. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. 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
    1. 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
      1. 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