IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Tri dans un tableau de structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 11
    Par défaut Tri dans un tableau de structure
    Bonjour, je voudrais trié un tableau de moyenne inclus dans un tableau de structure mais apparement le codage que j'ai fait n'a pas l'air de fonctionner. Ma question est : est-ce que l'on peut effectuer un tri dans un tableau de structure de la même manière que dans un tableau simple ?
    merci pour vos réponses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    #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;                                                           */
    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;
     
      struct etudiant contenue ; 
      int termine ;
      termine = 0;
                                                       */
      while ( ! termine )
       {
         printf( "Entrez un nom ( nom = \"fin\" pour terminer) :" );
         scanf( "%s", contenue.nom );
     
         termine = (( strcmp( contenue.nom, "fin" ) ) == 0 );
     
         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 : ");
     
               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");
    }
    /* ------------------------------------------------- */

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    "tempo" en variable globale?

    Hérésie! Crimethink!!

    Sinon: Ton tri n'inverse apparemment que les moyennes, au lieu d'inverser les structures elles-mêmes.
    Fais-toi une fonction d'inversion dédiée.

    ...Sinon, tu peux carrément éviter tout cela et utiliser la fonction qsort(). Il te suffit de lui passer un pointeur vers une fonction qui fait la comparaison...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sonic1 Voir le message
    Bonjour, je voudrais trié un tableau de moyenne inclus dans un tableau de structure mais apparement le codage que j'ai fait n'a pas l'air de fonctionner. Ma question est : est-ce que l'on peut effectuer un tri dans un tableau de structure de la même manière que dans un tableau simple ?
    Oui ou presque ...

    http://emmanuel-delahaye.developpez....Page8#LXXXVIII

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 11
    Par défaut re
    Medinoc, merci pour ta remarque sur la variable tempo, je ne suis qu'un autodidacte dans le marasme du C. Suite à ta réponse, j'ai étudié la fonction qsort, et, malgré le fait que j'en comprend le principe, je t'avoue ne pas savoir comment l'implenter dans mon code. Quand à la fonction dédiée, je ne sais pas par ou commencer .

    Emmanuel Delahaye, merci pour l'info sur ton site. J'ai testé le code de tri de structure et celui sur les réels. Comme pour médinoc par rapport à la fonction qsort, il me semble qu'il faudrait que je modifie tout mon code afin d'utiliser des pointeurs de structures, et ça, je ne maitrise pas encore . Si je pouvais avoir un ptit exemple m'indiquant la bonne marche à suivre je serais sympa et ça m'aiderais à avancé dans mon apprentissage. Merci.

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sonic1 Voir le message
    Emmanuel Delahaye, merci pour l'info sur ton site. J'ai testé le code de tri de structure et celui sur les réels. Comme pour médinoc par rapport à la fonction qsort, il me semble qu'il faudrait que je modifie tout mon code afin d'utiliser des pointeurs de structures, et ça, je ne maitrise pas encore . Si je pouvais avoir un ptit exemple m'indiquant la bonne marche à suivre je serais sympa et ça m'aiderais à avancé dans mon apprentissage. Merci.
    Tout est expliqué dans l'article. Tu fais un tableau de structures, et tu passes :
    - l'adresse du premier élément du tableau
    - le nombre d'éléments
    - la taille d'un élément
    - l'adresse de la fonction de comparaison.

    Fait de ton mieux (même à part) et poste ton code si tu as un problème.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/02/2007, 16h16
  2. [Tableaux] question recherche et tri dans un tableau
    Par nicopoal dans le forum Langage
    Réponses: 7
    Dernier message: 25/01/2007, 16h41
  3. [Tableaux] Tri dans un tableau
    Par ssebuser dans le forum Langage
    Réponses: 11
    Dernier message: 12/12/2006, 20h29
  4. Tri dans un tableau et indices
    Par size_one_1 dans le forum C
    Réponses: 10
    Dernier message: 16/05/2006, 00h17
  5. Réponses: 9
    Dernier message: 13/02/2006, 08h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo