Tri tableau de structures

sonic1ne Messages postés 8 Statut Membre -  
sonic1ne Messages postés 8 Statut Membre -
Bonjour, voici un code de gestion d'élèves et de leur moyennes. Le problème est que la fonction tri moyennes ne fonctionne pas. Est-ce que le code de tri est bien correct ? Merci pour vos réponses.

#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",&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", &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()
 {
    /* --- TRI du tableau --- */
    for (i = 0 ; i < NB_NOTES ; i++)
     {
       /* boucle inverse, d'inversion des cases */
       while ( (k > 0) && (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:

3 réponses

foufar
 
Modifier ta fonction comme cela :
void tri_tab()
{
/* --- TRI du tableau --- */
for (i = 0 ; i < NB_NOTES ; i++)
{
/* boucle inverse, d'inversion des cases */
while (k > 0)
{
if( (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");
}
0
sonic1ne Messages postés 8 Statut Membre
 
Merci foufar pour ta réponse mais ça ne marche toujours pas.

 
------------------------------------------------------------------
  -1- Saisie d'une liste d'élèves 
  -2- Affichage de la liste des noms, prénoms, âges et leurs notes
  -3- Affichage de la liste des noms, prénoms, âges et leurs moyennes
  -4- Affichage uniquement du tableau de moyennes
  -5- Affichage du tri du tableau de moyennes
  -0- Quitter
 --------------------------------------------------------------------
Choix :
1
Entrez un nom ( nom = "fin" pour terminer) :top
Entrez un prénom :bob
Entrez un âge :20
notes : 12
notes : 15
notes : 16
notes : 12
notes : 10

Entrez un nom ( nom = "fin" pour terminer) :tep
Entrez un prénom :greg
Entrez un âge :25
notes : 13
notes : 10
notes : 5
notes : 12.5
notes : 20

Entrez un nom ( nom = "fin" pour terminer) :tip
Entrez un prénom :denis
Entrez un âge :19
notes : 20
notes : 20
notes : 19
notes : 15
notes : 10

Entrez un nom ( nom = "fin" pour terminer) :tap
Entrez un prénom :sam
Entrez un âge :18
notes : 14.5
notes : 14
notes : 15
notes : 20
notes : 0

Entrez un nom ( nom = "fin" pour terminer) :tup
Entrez un prénom :lulu
Entrez un âge :23
notes : 20
notes : 11
notes : 12
notes : 15
notes : 20

Entrez un nom ( nom = "fin" pour terminer) :fin

 
------------------------------------------------------------------
  -1- Saisie d'une liste d'élèves 
  -2- Affichage de la liste des noms, prénoms, âges et leurs notes
  -3- Affichage de la liste des noms, prénoms, âges et leurs moyennes
  -4- Affichage uniquement du tableau de moyennes
  -5- Affichage du tri du tableau de moyennes
  -0- Quitter
 --------------------------------------------------------------------
Choix :
5
Les valeurs triées sont :
 13.00 12.10 16.80 12.70 15.60
0
foufar
 
Pourquoi tu as utiliser un tab de float pour la moyenne
0
sonic1ne Messages postés 8 Statut Membre
 
Bonjour foufar, pouquoi cette question ?
0