begin process at 2012 05 29 20:43:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Compression, Split & Cryptage

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

jeudi 5 février 2009 à 11:04:21 | problème avec tri de tableau de chaine - Aidez-moi svp

jaguar57

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')
        ;
    }
}
jeudi 5 février 2009 à 18:41:38 | Re : problème avec tri de tableau de chaine - Aidez-moi svp

gaspos

Réponse acceptée !

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

vendredi 6 février 2009 à 08:41:51 | Re : problème avec tri de tableau de chaine - Aidez-moi svp

jaguar57

Réponse acceptée !
Merci beaucoup pour cette aide
vendredi 6 février 2009 à 09:16:46 | Re : problème avec tri de tableau de chaine - Aidez-moi svp

jaguar57

Réponse acceptée !
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;

    }
vendredi 6 février 2009 à 12:11:46 | Re : problème avec tri de tableau de chaine - Aidez-moi svp

jaguar57

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


Cette discussion est classée dans : mot, char, nb, res, dico


Répondre à ce message

Sujets en rapport avec ce message

Fatal signal: Segmentation Fault (SDL Parachute Deployed) [ par broks ] Je ne comprends vraiment pas pourkoa ca ne marche pas...C'est surement un probleme au niveau de la fonction saisi puisque je plante lorsque je dois sa aidez svp [ par bbmmouha ] jesuis un debutant en c++ et je doit fair un projet de motus et j ai fait ce travail mais il y a un probleme que j ai pas arrivé a le comprendre voila AIDE [ par alex64100 ] BOJOUR je dois coder un correcteUr d'orthographe mon code est truffé d'erreurs, j'ai du mal à les corriger svp aidez-moi #include #include #inclu Problème d allocation dynamique [ par Beqtb0x ] /*Bonjour a tous, je viens d'arriver sur ce site, je suis étudiant en première année d'informatique et j'ai un problème a un tp que même la prof n'est Problemes de conflit entre des constructeurs d'une meme Classe . [ par manyim ] J'ai des problemes de conflit avec des constructeurs d'une meme classe en C++ et j'utilise WinDevC++.à l'aide //Je suis entrain de construire une c compression lzw [ par walidomariouma ] bonjour j'ai des difficultés dans l'algorithme de LZW bon concernant la compression c'est bon ça marche. en fait j'ai pas pu faire une fct dans la par


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,042 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales