Problème avec tri de tableau de chaine - Aidez-moi svp

Résolu
jaguar57 Messages postés 4 Date d'inscription vendredi 6 février 2009 Statut Membre Dernière intervention 6 février 2009 - 5 févr. 2009 à 11:04
jaguar57 Messages postés 4 Date d'inscription vendredi 6 février 2009 Statut Membre Dernière intervention 6 février 2009 - 6 févr. 2009 à 12:11
Bonjour,

Je viens demander de l'aide car j'ai un problème de compréhension de la fonction qsort avec un tableau de chaine fourni par un fichier txt.

Je m'explique :

J'ai une liste de mot dans un tableau que je veux trier alphabétiquement avec la fonction qsort mais je n'ay arrive pas. Voilà mon code :

J'espère que quelqu'un pourra m'aider.

Merci d'avance

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

#define MAXMOTS 100
#define LONGMOT 20

char dico[MAXMOTS][LONGMOT];
char mot[LONGMOT];
char *pmot;
char *a;

FILE *fd;

//declaration des fonctions
    short dichotomie(char dico[MAXMOTS][LONGMOT],char *mot,short nb_mot);
    int lecture(char tab[], int taille);

static int compare (void const *a, void const *b)    /* ----- a mon avis là il y a un problème */
{
   /* definir des pointeurs type's et initialise's
      avec les parametres */
   char const *const *pa = a;
   char const *const *pb = b;

   /* evaluer et retourner l'etat de l'evaluation (tri croissant) */
   return strcmp (*pa, *pb);
}

//Fonction principale
int main(int argc,char*argv[])
{
    int res,i;
   
    short nb_mot=0;
    char touche;
    char buf[30];
    int nb=0;
   
   
    //ouverture du dictionnaire
    //Test que le fichier dico s'ouvre bien
    if ((fd=fopen("dico.dat","a+")) == NULL)
    {
        fprintf(stderr,"\nImpossible d'ouvrir le fichier Dico, creation d'un nouveau Dico");
        exit(EXIT_FAILURE);
    }
    /*Puisqu'il est impossible d'ouvrir le fichier dico, la fin du programme permetra
    d'en créé un nouveau avec fopen("dico.dat","w")*/
    printf("Combien de mot, voulez-vous entrer ? ");
    scanf("%d",&nb);
   
    do
    {
        lecture(buf, sizeof(buf));
        strcpy(dico[nb_mot],buf);
       

        nb_mot++;
    } while(nb_mot<nb);

    /*tri en mémoire du tableau Dico*/
    qsort(dico,nb,sizeof(dico),compare);  /*------------------- et là aussii il y a un problème */
 

        for (i =0;i<nb_mot;i++)
                        fprintf(fd,"%s\n",dico[i]);
                    //Fermeture du fichier dico
                    fclose(fd);

       
        printf("Mot a rechercher : ");
        scanf("%s",mot);
       
                   
                system("pause");
                return 0;
}   
            //FONCTION DICHOTOMIE
            short dichotomie(char dico[MAXMOTS][LONGMOT],char *mot, short nb_mot)
            {
                //déclaration des variables
                int i=0,j=nb_mot,k,res;
                //Traitement
                while ((j-i)>1 && res!=0)
                {
                    k=(i+j)/2;
                    res=strcmp(dico[k],mot);
                    if (res>0)
                        j=k;
                    else
                        i=k;
                    /*ce if afin d'atteindre le mot du tableau dico[0]
                    puisque j-i ne peut qu'être strictement supérieur à 1*/
                    if (k==0 && res!=0)
                        res=strcmp(dico[0],mot);
                }
                //Affectation des valeurs retournées
                if (res!=0)
                    res=0;
                else
                    res=1;
                return res;
            }

           

            /*Fonction saisie des caractères */
int lecture(char tab[], int taille)
{
    char car; /*Initialisation des variables */
    int i = 0;
 
    /* on met le caractère tapé dans la variable car */
    car=getchar();   

    do {
    /* on place le caractere dans le tableau */
    tab[i++] = tolower(car);
    /* on continue jusqu'a fin du tableau ou caractere fin de ligne */
    } while ( (i<taille-1)&&( (car=getchar()) != '\n'));

    /* et on n'oublie pas le caractère de fin de chaine */
    tab[i] = '\0';

    if (car != '\n') {
    /* il faut vider le buffer car trop de caracteres ont ete saisis
       par l'utilisateur. Si on les laisse, ils seraient utilises
       par le prochain appel a saisieChaine.
    */
    while (getchar() != '\n')
        ;
    }
}

4 réponses

gaspos Messages postés 17 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 20 février 2009
5 févr. 2009 à 18:41
Bonjour,
sans lire très en détail ton code, je pense que les problèmes sont là où tu l'imagine :
Il faut que tu revoies l'usage de strcmp et de qsort !

voici un bout de code qui devrait t'aider :

int inf_string ( const void * a , const void * b )
    {
    return( strcmp( a,b ) > 0 ) ; // pas de cast / la valeur de retour de strcmp n'est pas ce que tu crois
    }


void test ()
    {
    #define MAXMOTS 100
    #define LONGMOT 20
    char dico[MAXMOTS][LONGMOT];



    // ici je n'utilise que les 5 premières lignes de ton tableau
    strcpy( dico [0],"comment" ) ;
    strcpy( dico [1],"allez" ) ;
    strcpy( dico [2],"vous" ) ;
    strcpy( dico [3],"les" ) ;
    strcpy( dico [4],"gars" ) ;

   // paramètres : teableau ; nombre de cases à trier ; taille des cases ; fonction qui teste l'inferiorité
    qsort( dico,5,LONGMOT,inf_string ) ;
    }

Hadrien
3
jaguar57 Messages postés 4 Date d'inscription vendredi 6 février 2009 Statut Membre Dernière intervention 6 février 2009
6 févr. 2009 à 08:41
Merci beaucoup pour cette aide
3
jaguar57 Messages postés 4 Date d'inscription vendredi 6 février 2009 Statut Membre Dernière intervention 6 février 2009
6 févr. 2009 à 09:16
Après test, c'est vrai que ton prog fonctionne en entrant les mots comme tu l'a fais mais dès que tu remplis le tableau au clavier le tri ne se fait pas correctement :

Merci pour ton aide

#include<stdio.h>
#include<conio.h>

#include<string.h>

int inf_string ( const void * a , const void * b )
    {
    return( strcmp( a,b ) > 0 ) ; // pas de cast / la valeur de retour de strcmp n'est pas ce que tu crois
    }

/*Fonction saisie des caractères */
int lecture(char tab[], int taille)
{
    char car; /*Initialisation des variables */
    int i = 0;
 
    /* on met le caractère tapé dans la variable car */
    car=getchar();   

    do {
    /* on place le caractere dans le tableau */
    tab[i++] = tolower(car);
    /* on continue jusqu'a fin du tableau ou caractere fin de ligne */
    } while ( (i<taille-1)&&( (car=getchar()) != '\n'));

    /* et on n'oublie pas le caractere de fin de chaine */
    tab[i] = '\0';

    if (car != '\n') {
    /* il faut vider le buffer car trop de caracteres ont ete saisis
       par l'utilisateur. Si on les laisse, ils seraient utilises
       par le prochain appel a saisieChaine.
    */
    while (getchar() != '\n')
        ;
    }
}

void main ()
    {
    #define MAXMOTS 100
    #define LONGMOT 20
    char dico[MAXMOTS][LONGMOT];
    char test[MAXMOTS][LONGMOT];
    char buf[MAXMOTS][LONGMOT];
    int i=0;
    int nb=0;
    short nb_mot=0;

    /* ici je n'utilise que les 5 premières lignes de ton tableau
    strcpy( dico [0],"comment" ) ;
    strcpy( dico [1],"allez" ) ;
    strcpy( dico [2],"vous" ) ;
    strcpy( dico [3],"les" ) ;
    strcpy( dico [4],"gars" ) ;*/
    printf("Combien de mots : ");
    scanf("%d",&nb);

    while(nb_mot<nb)
    {
        lecture(buf, sizeof(buf));               /*---------------------------J'entre mes mots de cette manière*/
        strcpy( dico [nb_mot],buf);            /*------------je copie ma saisie comme cela-----*/
        nb_mot++;
    }
   
   
   // paramètres : tableau ; nombre de cases à trier ; taille des cases ; fonction qui teste l'inferiorité
    qsort( dico,nb,LONGMOT,inf_string ) ; /*----le tri ne se fait pas correctement*/
  

    for(i =0;i<nb;i++)
    {       
        printf("%s\n",dico[i]);
    }
    system("pause");
    return 0;

    }
3
jaguar57 Messages postés 4 Date d'inscription vendredi 6 février 2009 Statut Membre Dernière intervention 6 février 2009
6 févr. 2009 à 12:11
MERCI POUR TOUT, j'ai enfin compris mon erreur

elle venait de la façon que j'entrai mes données. en effet avec un simple scanf, tout fonctionne bien.

MERCI MERCI MERCI
0
Rejoignez-nous