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 :

Question sur qsort()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut Question sur qsort()
    Bonjour tout le monde !

    Premier message pour ma part sur ce formidable site que j'ai parcouru de long en large !

    Alors voila, je souhaite faire un tri en utilisant Qsort, mais je n'arrive pas à le faire sur le champ que je souhaite ...

    Voici ma structure pour un étudiant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct
    {
        char matricule[25]; /* Matricule unique. */
        char nom[20];
        char prenom[20];
        Adresse adr;
        double tabCotes[5];
        double moyennePourcentage;
    }Etudiant;
    Celle pour l'auditoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct
    {
        int nbEtudiants;
        Etudiant classe[MAX_ETU];
        int compteurMatricule;
    }Auditoire;
    Et enfin, ma fonction qSort :
    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
    int fcomp (const void *a, const void *b)
    {
        const int *ia = (const int *)a;
        const int *ib = (const int *)b;
     
        return *ia - *ib;
    }
     
    void triSelectif(Auditoire *auditoireA)
    {
        int i;
        printf("%d", auditoireA->nbEtudiants); Sleep(1000);
        for(i = 0 ; i < auditoireA->nbEtudiants ; i++)
            qsort(&auditoireA->classe, auditoireA->nbEtudiants, sizeof(Auditoire), fcomp);
     
    }
    J'aimerai pouvoir faire un tri sur la moyennePourcentage, mais je n'arrive pas à accéder à ce champ, et ainsi la passer à qSort().

    Quelqu'un pourrait-il me fournir des conseils ?

    Bien à vous,

    Mornor.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Bonjour,
    Le tri se fait en utilisant fcomp(a, b), retournant un positif si a est avant b, un négatif s'il est apèrs et 0 s'ils sont équivalents pour le tri.

    ton fcomp retourne ceci:
    traitons a et b comme pointant vers des entiers, alors l'ordre entre les entiers est donné par leur différence (ce qui est globalement vrai pour des entiers).
    Il devrait plutot ressembler à
    traitons a et b comme pointant vers des etudiant, alors l'ordre est donné par l'ordre des moyennes.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut
    Merci beaucoup pour ta réponse !

    En somme, si j'ai bien compris, j'ai modifier mon code de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int fcomp (const void *a, const void *b)
    {
        const Etudiant *ia = (const Etudiant *)a;
        const Etudiant *ib = (const Etudiant *)b;
     
        return ia->moyennePourcentage - ib->moyennePourcentage;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void triSelectif(Auditoire *auditoireA)
    {
        int i;
        printf("%d", auditoireA->nbEtudiants); Sleep(1000);
        for(i = 0 ; i < auditoireA->nbEtudiants ; i++)
            qsort(auditoireA->classe, auditoireA->nbEtudiants, sizeof(Auditoire), fcomp);
     
    }
    Je pense que comme cela, le code fonctionne. Néanmoins, lors de l'affichage,
    il n'y a pas de tri effectif :
    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
    void afficherClasse(Auditoire auditoireA)
    {
        system("cls");
        printf("Affichage de la classe : \n\n");
        int i = 0;
        if(auditoireA.nbEtudiants != 0){
            for(i = 0 ; i < auditoireA.nbEtudiants ; i++)
            {
                printf("Etudiant %d : \n", i);
                afficherEtudiant(auditoireA.classe[i]);
                printf("\n");
            }
            system("pause");
        }
        else{
            printf("La classe est vide !\n\n");
            system("Pause");
        }
     
        afficherMenu(&auditoireA);
    }
    Est-ce ma méthode fcomp, ou bien la méthode d'affichage qui pose problème ?

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    juste une question, pourquoi trier le tableau autant de fois qu'il y a d'étudiants?

    Et dans le tri, ce serait plutot sizeof(Etudiant).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qsort(void *first_element_adress, int elements_count, int element_size, fcomp_t comparison).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    long tab[] = {5,3,7,2};
    qsort(tab, 4, sizeof (long), min);

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut
    Tout à fait, la boucle de tri, était un reste de mes précédents tests, elle n'a donc pas lieu d'être ici.

    J'ai fait les modifications nécessaire, mais je n'obtiens toujours pas de tri.
    Je n'arrive vraiment pas à comprendre d'ou viens ma faute.

    Le code me semble pourtant juste ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int fcomp (const void *a, const void *b)
    {
        const Etudiant *ia = (const Etudiant *)a;
        const Etudiant *ib = (const Etudiant *)b;
     
        return (ia->moyennePourcentage) - (ib->moyennePourcentage);
    }
     
    void triSelectif(Auditoire *auditoireA)
    {
        qsort(auditoireA->classe, auditoireA->nbEtudiants, sizeof(Etudiant), fcomp);
     
    }

  6. #6
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 785
    Par défaut
    Hello,

    Je ne sais pas ce que contient moyennePourcentage, mais je changerais en tout cas le return de la fonction en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return (ia->moyennePourcentage) > (ib->moyennePourcentage); // ou >=
    Edit: non, il faut tester ça toi-même (ce n'est pas un booléen qui doit être renvoyé). Mon idée est que moyennePourcentage est un double, et que la fonction va renvoyer du int. Alors si toutes le valeurs sont comprises entre 0. et 1., le retour sera toujours 0

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 21h49
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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