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 :

trier un tableau de structures


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    ecole superieure de technologie
    Inscrit en
    Novembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Maroc

    Informations professionnelles :
    Activité : ecole superieure de technologie
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 34
    Par défaut trier un tableau de structures
    bonsoir
    voila un code qui contient 3 fonctions :
    -fonction pour un remplir un tableau de structure
    -fonction pour trier ce tableau
    -fonction pour l'affichage
    voila ce que j'ai fait
    Code c : 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
    #include<stdio.h>
    #include<conio.h>
    struct etudiant{
           char nom[30] ;
           char prenom[30];
           int age ;
           char sexe[2] ;
           };
    void rem(struct etudiant *p , int *n){
         int i ;
     
         printf("entrez le nombre d'etudiants");
         scanf("%d",n);
         for(i=0 ; i<(*n) ; i++)
         {
                 printf("etudiant no : %d " , i+1);
                 printf("entrez le nom de cet etudiant");
                 scanf("%s",&(*(p+i)).nom);
                 printf("entrez le prenom de cet etudiant");
                 scanf("%s",&(*(p+i)).prenom);
                 printf("entrez l'age de cet etudiant");
                 scanf("%d",&(*(p+i)).age);
                 printf("entrez le sexe de cet etudiant F pour femme , H pour homme");
                 scanf("%s",&(*(p+i)).sexe);
                 }
                 }
    void tri(struct etudiant *p , int *n )
    {
         int i , j , posmax   ;
         struct etudiant per ;
         for(i=0 ; i<(*n)-1 ; i++)
         {
                 posmax=i ;
                 for(j=i+1 ; j<(*n) ; j++)
                 {
                           if((*(p+j)).age>(*(p+posmax)).age)
                           posmax=j ;
                           }
                  per=*(p+i) ;
                  *(p+i)=*(p+posmax) ;
                  *(p+posmax)=per ;
                  }
                  }
    void  affi(struct etudiant *p , int *n)
    {
          int i ;
          for(i=0 ; i<(*n) ; i++)
          {
                  printf("%s",(*(p+i)).nom);
                  printf("\n");
                  printf("%s",(*(p+i)).prenom);
                   printf("\n");
                  printf("%d",(*(p+i)).age);
                   printf("\n");
                  printf("%s",(*(p+i)).sexe);
                   printf("\n");
                  }
                  }
    int main(){
        struct etudiant t[100] ;
        int n ;
     
                 rem(t , &n) ;
                 tri(t , &n ) ;
                 affi(t , &n);
                 getch();
                 }


    - est ce que code la est suffisant .
    - je veux savoir s'il ya une methode plus élégante et plus professionelle pour traiter ce probleme . surtout au niveau de la fonction tri .

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Bonjour

    Avant de répondre à votre question, j'aimerais vous faire une remarque.
    Il faut que vous vous efforciez d’utiliser des noms de variables qui veulent dire quelque chose et quitte à ce qu'il y soit plus long. "rem" ou "affi" ça ne veut rien dire.

    Cela dit, il existe en effet un moyen qui est plus générique. Il faut simplement que vous passiez une fonction de comparaison en paramètre de la fonction qui renverra -1 si plus petit, 0 si égal ou 1 si plus grand (par exemple). De ce fait, vous ne devrez modifier que cette fonction si vous devez un jour changer ou ajouter un membre dans la structure ou encore changer la priorité qu'ont les membres pour le triage.

    Vous pouvez également faire une fonction de tri totalement générique en passant des void* en paramètre au lieu d'une structure bien définie.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Faire une fonction générique avec des void * ne me semble pas une bonne idée.

    Il faut savoir quel attribut comparer pour trier le tableau.
    Hors avec des pointeurs void *, comment savoir où se trouve cet attribut?

    Bien sûr, on pourrait passer un paramètre de plus pour déterminer le type de structure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    enum{"Etudiant", "Prof", "Autre"};

  4. #4
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Neckara, vous n'avez jamais donc codé une fonction générique en C (En contre partie vous pointez du doigt que mon explication était trop courte).

    En fait il faudra toujours passer la fonction de comparaison en paramètre mais elle aura ce prototype :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int comparaison(void*, void*);
    Il y aura un cast à l'intérieure de cette fonction.

    Mystère résolu

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par Trademark Voir le message
    Neckara, vous n'avez jamais donc codé une fonction générique en C (En contre partie vous pointez du doigt que mon explication était trop courte).

    En fait il faudra toujours passer la fonction de comparaison en paramètre mais elle aura ce prototype :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int comparaison(void*, void*);
    Il y aura un cast à l'intérieure de cette fonction.

    Mystère résolu
    J'ai déjà codé une petite fonction générique en C (des piles).
    J'ai lu un petit peu trop vite et je n'ai pas vu que tu passais la fonction de comparaison en paramètre.
    Mais je n'ai jamais voulu insinuer que votre explication était trop courte.
    Je voulais simplement dire qu'en passant juste un argument void *, la fonction ne pouvait pas savoir comment trié (je n'avais pas vu que vous transmettiez une fonction).

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Neckara Voir le message
    (je n'avais pas vu que vous transmettiez une fonction).
    regarde qsort ...

    c'est le plus efficace, et ça marche pour absolument tout et n'importe quoi

  7. #7
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Au niveau de la fonction rem :
    - vous devriez ajouter un paramètre qui donne le nombre max d'élèves que l'on peut entrer (100 dans votre cas) et vérifier que le n saisi ne dépasse pas cette limite.

    Au niveau de la fonction tri :
    - plus besoin de passer n en tant que pointeur
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct etudiant per ;
    ...
    per=*(p+i)
    J'ai toujours des doutes sur ça... Je pense qu'il faut plutôt faire un memcpy, pour copier tous le contenu d'une structure vers l'autre. Le C ne sait pas faire d'affectation d'objets autres que les types de bases.

    Au niveau de la fonction aff :
    - plus besoin de passer n en tant que pointeur

    Remarques générales (en plus de celles de trademark) :
    - l'indentation ne rend pas très bien
    - très subjectif, mais je préfère écrire "p[i].nom" que "(*(p+i)).nom"

    Concernant le tri, je me contenterais de faire fonctionner votre solution.
    Si votre exercice porte sur les structures, les tableaux, les algos de tri, c'est suffisant à mon goût.
    Si votre exercice porte sur de la conception, de la modularité, l'idée d'une fonction générique est effectivement une bonne piste d'amélioration.

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le C ne sait pas faire d'affectation d'objets autres que les types de bases.
    C'est faux, Il ne sait pas copier les tableaux, mais il sait parfaitement copier des structures par l'opérateur d'affectation =.

    les tableaux supportent les opérateurs & (adresse de) et sizeof , comme tous les objets en C
    Les structures supportent en plus l'opérateur = (simple)

    A noter que si le tableau est contenu dans une structure, copier la structure va copier le tableau dans la structure de destination.

    Sur la fonction de tri, ou elle fait partie d'un exercice " réaliser vous-même une fonction de tri" ou sinon, on peut utiliser la fonction standard de tri qsort()

  9. #9
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    J'aurai du me contenter de douter, au lieu de sortir un bêtise donc

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/02/2008, 13h46
  2. Trier/chercher dans un tableau de structure
    Par cata2 dans le forum MATLAB
    Réponses: 1
    Dernier message: 01/11/2007, 11h07
  3. Réponses: 3
    Dernier message: 29/01/2007, 15h10
  4. Trier un tableau de structures
    Par Yux dans le forum C
    Réponses: 7
    Dernier message: 05/11/2005, 17h28
  5. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51

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