Tri dans un tableau de structure

cs_sonic1 Messages postés 3 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 15 mars 2009 - 14 mars 2009 à 19:11
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 16 mars 2009 à 01:54
Bonjour, ma question serait de savoir si on peut trier un tableau de structures de la même manière qu'un tableau simple. Voici un code ou j'essaie de trier un tableau de moyenne dans un tableau de structure mais ça ne fonctionne pas. Est-ce quelqu'un peut me donner une indication. Merci.

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

/* --- déclaration des constantes --- */ 
#define TAILLE_NOM 10 
#define TAILLE_PRENOM 2*TAILLE_NOM 
#define NB_NOTES 5 /* nombre de notes par étudiants */
#define MAX 25 /* nombre de notes pour tous les étudiants */
#define MAX_ETUDIANTS 50

/* --- declaration du type etudiant --- */
    struct etudiant {
            char nom[TAILLE_NOM]       ;
            char prenom[TAILLE_PRENOM] ;
            float notes[MAX];
            float moyennes[MAX/NB_NOTES];
            float somme;
            int age;
        } ;

/* --- variables globales --- */
int nbeleves = 0; /* variable qui va servir à mémoriser le nombre d' */
/* eleves                                                            */
int i, j, k,l;
float tempo;
struct etudiant tab_eleves[MAX_ETUDIANTS];

/* --- procédures et fonctions --- */
void saisie_eleves();
void affichage1();
void affichage2();
void moyennes();
void tri_tab();

int main(void)
{
  int choix = -1 ; 
 
  /* -- boucle d'affichage du menu -- */ 
  while (choix != 0 )
  {
     printf(" \n------------------------------------------------------------------\n");
     printf("  -1- Saisie d'une liste d'élèves \n");
     printf("  -2- Affichage de la liste des noms, prénoms, âges et leurs notes\n");
     printf("  -3- Affichage de la liste des noms, prénoms, âges et leurs moyennes\n");
     printf("  -4- Affichage uniquement du tableau de moyennes\n");
     printf("  -5- Affichage du tri du tableau de moyennes\n");
     printf("  -0- Quitter\n");
     printf(" --------------------------------------------------------------------\n");
     printf("Choix :\n");
     scanf("%d",&amp;choix);
     
     /* -- selecteur : appel des procedures -- */
     switch (choix)
     {
       case 1 : saisie_eleves();
                break ;

       case 2 : affichage1();
                break ;

       case 3 : affichage2();
                break;

       case 4 : moyennes();
                break;
                
       case 5 : tri_tab();
                break;

       case 0 : printf("Au revoir \n");
                break ;

       default: printf("Erreur de saisie\n");
                break;                   
     }
  }
  
  printf( "\n" );
  
  return EXIT_SUCCESS;
}    
 
void saisie_eleves()
{  i 0,j 0, k = 0;

  /* déclaration d'une variable struct qui prend les champs nom, */
  /* prénom, âge, notes, somme et moyennes pour tab_eleves ().     */
  struct etudiant contenue ; 
  int termine ;
  termine = 0;
  
  /* boucle de saisie qui démarre si l'entrée du champ nom est dif-*/
  /* -férent de 0                                                  */
  while ( ! termine )
   {
     printf( "Entrez un nom ( nom = "fin" pour terminer) :" );
     scanf( "%s", contenue.nom );
 
     /* fonction strcmp qui comparaît le nom entré et le mot fin   */     termine (( strcmp( contenue.nom, "fin" ) ) 0 );
 
     /* si la saisie est différente de 0 représenté par le mot fin */
     /* on demande le reste des informations                       */
     if ( ! termine )
      {
        printf( "Entrez un prénom :" );
        scanf( "%s", contenue.prenom );
 
        printf( "Entrez un âge :" );
        scanf( "%d", &amp;contenue.age );

        contenue.somme = 0;

        for( j = 0;j < NB_NOTES; j++ ) 
         {
           printf("notes : ");
           /* à chaque entrée, case suivante */
           scanf("%f",contenue.notes+j); 
           /* calcul des 5 1eres notes entrées et dont la somme est affe- */
           /* -ctée au champ somme de la variable contenue                */
           contenue.somme += contenue.notes[j]; 
    
           /* tous les NB_NOTES lues au clavier, on calcule leur moyenne  */
           if ((j+1)%NB_NOTES == 0) 
            {
              contenue.moyennes[(j+1)/NB_NOTES - 1] = contenue.somme/NB_NOTES;
              contenue.somme = 0;
            }
          }
         /* affectation du contenu de la variable struct au tableau */
         /* tab_eleve[] déclaré en variable globale                 */
         tab_eleves[nbeleves] = contenue ;
         nbeleves++ ;
      } /* fin de la 1ere condition if */
     printf( "\n" );
   } /* fin de la boucle while */
   /* on met a jour la variable de controle du tableau */
}

/* --- fonction affichage nom, prénom, âge et nombre de notes --- */
void affichage1()
{
  int i;
    printf( "\n----- Virification saisie ------\n" );

    for ( i = 0; i < nbeleves; i++ )
    {
        printf( "\neleve %2d : ", ( i + 1 ) );
        printf( "%10s %10s ", tab_eleves[i].nom, tab_eleves[i].prenom );
        printf( "%2d \n", tab_eleves[i].age );
        printf( "\nNotes :" );
        for ( j = 0; j < NB_NOTES; j++ )
            printf( "%6.2f", tab_eleves[i].notes[j] );  
 
        printf( "\n" );
    }
}
    
/* --- fonction affichage nom, prénom et moyenne --- */
void affichage2()
{
    printf( "\nNoms, prénoms et moyennes :\n" );
   
    for (i = 0; i < nbeleves; i++)
    {
        printf("\n%10s %10s %6.2f\n", tab_eleves[i].nom, 
        tab_eleves[i].prenom, tab_eleves[i].moyennes[k]);
    }
}
    
/* --- fonction affichage tableau des moyennes --- */
void moyennes()
{
   printf("\nTableau des moyennes :\n");
   for (i = 0; i < NB_NOTES; i++)
   printf("\n%6.2f\n", tab_eleves[i].moyennes[k]);
}
 void tri_tab()
 {
     float tempo;
    /* --- TRI du tableau --- */
    for (i = 0 ; i < NB_NOTES ; i++)
     {
       /* boucle inverse, d'inversion des cases */
       while ( (k > 0) &amp;&amp; (tab_eleves[i].moyennes[k] < tab_eleves[i].moyennes[k-1]) )
       {
         tempo = tab_eleves[i].moyennes[k-1] ;
         tab_eleves[i].moyennes[k-1] = tab_eleves[i].moyennes[k];
         tab_eleves[i].moyennes[k--] = tempo;
       }
     } 
    printf("Les valeurs triées sont :\n");
    for (i = 0 ; i < NB_NOTES ; i++)
    printf("%6.2f", tab_eleves[i].moyennes[k]);
    printf("\n");
}
/* ------------------------------------------------- */  
A voir également:

4 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
14 mars 2009 à 23:11
Il ne faut pas oublier de copier l'ensemble des données : voilà par exemple une fonction qui échange deux éléments d'un tableau.

struct _M{...};
struct _M Array[N_MAX];

void _Swap(int i,int j) // échange des éléments i et j
{
   _M Buffer;
   memcpy(&Buffer,Array+i,sizeof(_M));
   memcpy(Array+i,Array+j,sizeof(_M));
   memcpy(Array+j,&Buffer,sizeof(_M));
   return;
}
0
Rejoignez-nous