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 :

Comparaison particuliere


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut Comparaison particuliere
    Bonjour,

    J'ai deux tableaux 'tab' et 'ret'
    chaque case de ces deux tableaux contient une chaine de caractère.
    par exemple le contenu des cases de 'tab' respectivement :
    case1 contient "nom prenom age"
    case2 contient "nom age"
    .....
    prenom nom
    nom age
    nom prenom age
    nom emploi
    age emploi
    prenom age emploi
    nom age emploi
    nom prenom emploi
    nom prenom age emploi

    le contenu des cases de 'ret' respectivement :
    case1 contient "nom"
    ....
    nom
    prenom
    age
    emploi
    age nom
    nom age prenom
    nom emploi
    age emploi
    nom prenom emploi
    [
    Le résultat souhaité sera stocké dans un tableau 'resultat' qui a deux cases dans ce cas car on ne sait pas sa taille on priori:

    prenom age emploi
    nom age emploi
    nom prenom age emploi

    Je voulais obtenir dans le tableaux ''resultat' les cases qui appartient 'tab' à n'appartient pas au 'ret' mais en tenant compte de deux choses:
    - l'ordre des mots dans la chaine de caractère pas d'importance c'est dire :
    "nom prenom age" de tableau 'tab' c'est la même que "nom age prenom" du tableau 'ret'
    Ces deux chaines sont les mêmes et donc on ne met pas la chaine "nom prenom age" dans le tablaeu 'resultat'.

    - Aussi, l'inclusion c'est à dire:
    si j'ai une chaine de 'tab' inclut dans une chaine de 'ret' alors ces deux chaines sont égales.
    par exemple:
    "prenom nom" de tableau 'tab' c'est la même que "nom age prenom" du tableau 'ret'
    Ces deux chaines sont les mêmes et donc on ne met pas la chaine "prenom nom" dans le tablaeu 'resultat'.

    Je n'arrive pas à utiliser 'strcmp' ans ce cas pour faire la comparaison.
    Je souhaite que vous m'aidez.

    Merci.

  2. #2
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonjour,

    Bonjour,
    Je voulais appeler dans mon programme 'main.c' la fonction 'compare_tab' qui prend comme paramètre les deux tableaux de comparaison et leurs tailles. Cette fonction retourne le résultat.

    Voici mon essai:

    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
    char ** compare_tab(char **tab,int N,char **ret,int M)
    {
     
       int i,p;
        char **resultat;
     
     
           for(i=0;i<N;i++)
           {
     
             for (p=0; p < M; p++)
    	 {
    	  if (is_same(tab[i], ret[p]))
             }
            }
     
        return resultat;
    }
    Elle me manque la fonction 'is_same' qui permet de faire une comparaison entre deux chaine.

    Je souhaite que vous m'aidez.

    Merci.

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonjour,

    La valeur de retour est un tableau (resultat)où chaque case est une chaine de caractère. De plus ce tableau sera allouer dynamiquement car on ne sait pas sa taille en avance.

    J'ai proposé mon idée peut être est mauvaise.

    Que proposez vous ?

    Merci.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 42
    Par défaut
    Bonjour,
    si je comprends bien, un mot qui est dans la première chaîne de caratère mais pas dans la seconde veut dire que cette chaîne est différente ?

    Si oui, tu n'a plus qu'à selectionner tes mots et les vérifier avec l'autres chaînes.
    Regarde du coté de strtok()

    a+;

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonjour,

    si je comprends bien, un mot qui est dans la première chaîne de caratère mais pas dans la seconde veut dire que cette chaîne est différente ?
    Oui c'est une partie de test.
    La comparaison tient compte de deux choses:
    - l'ordre des mots dans la chaine de caractère pas d'importance c'est dire :
    "nom prenom age" de tableau 'tab_comb' c'est la même que "nom age prenom" du tableau 'tab_con'
    Ces deux chaines sont les mêmes et donc on ne met pas la chaine "nom prenom age" dans le tableau 'rets'.

    - Aussi, l'inclusion c'est à dire:
    si j'ai une chaine de 'tab_comb' inclut dans une chaine de 'tab_con' alors ces deux chaines sont égales.
    par exemple:
    "prenom nom" de tableau 'tab_comb' c'est la même que "nom age prenom" du tableau 'tab_con'
    Ces deux chaines sont les mêmes et donc on ne met pas la chaine "prenom nom" dans le tableau 'rets'.


    Voici mon propre code. Je voulais modifiez la solution ou lieu de faire '*** rets'(tableau de deux dimensions) alors on fait **rets(un simple tableau )de chaine de caractères car je vais faire une seule comparaison entre deux tableaux.
    Que proposez vous comme solution et modification à faire dans l'appel de fonction de comparaison et l'allocation de 'rets' et dans la fonction de comparaison de telle sorte que 'rets' soit un simple tableau de chaines de caractères ?


    Voici l'appel de cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char ***rets = NULL;
    rets = malloc (nbre * sizeof(char**));
    rets[0] = compare_files(tab_comb,nb_comb,tab_con,nb_con);

    Voici la fonction de comparaison :
    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
     
    /** Compare deux fichiers er renvoie le résultat de la comparaison */
     
    char ** compare_files(char **tab_comb,int nb_comb,char ***tab_con,int nb_con)
    {
     
     
    	int i,a, retsize = 0,index,p;
        char **ret = NULL,result[1024];
    	int size1;
     
    	for(i=0;i<nb_comb;i++)
    	     {
     
                a = 0;
     
          for (p=0; p <nb_con; p++)
    		{
     
    			if (is_same(tab_comb[i], tab_con[0][p], 0))
                    {
     
                        a = 1;
                        break;
                    }
     
    		} 
     
           if (!a)
                {
                    ret = xrealloc(ret, (++retsize) * sizeof(char*)); /* On alloue une case de plus au tableau de string, puis on ajoute la chaine à la fin du tableau */
                  	ret[retsize-1] = mstrndup(tab_comb[i], strlen(tab_comb[i]));
     
                }
    		}   
     
     
            ret = xrealloc(ret, (++retsize) * sizeof(char*)); /* On ajoute un dernier pointeur sur NULL pour savoir quand le tableau se termine */
            ret[retsize-1] = NULL;
     
     
     
        return ret;
    }
    Voici les autres fonctions utilisant par le code au dessus:
    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
     
    /** Teste le retour de realloc et quitte le programme si besoin */
    void * xrealloc(void * prec, size_t len)
    {
        void *ret = realloc(prec, len);
        if(!ret) /* Equivaut à if(ret == NULL) */
            exit(0);
        return ret;
    }
     
    /** Copie n caractère de str dans une nouvelle chaine alloué dynamiquement, et renvoie cette chaine */
    char * mstrndup(const char *str, size_t n)
    {
        char *ret = malloc((n+1) * sizeof(char));
     
        if (!ret)
            exit(0);
     
        strncpy(ret, str, n); /* Copie n caractère de str dans n */
        ret[n] = 0; /* 0 == '\0' */
        return ret;
    }
     
    /** Compte le nombre de mot dans str (un mot correspond à une suite de lettre et s'arrête dès qu'un caractère autre est rencontré */
    size_t count_word(const char *str)
    {
        size_t n = 0;
        int a;
     
        while (*str) /* Equivaut à while(*str != '\0') */
        {
            a = 0; /* Cette variable sert à indiquer si au moins une lettre a été trouvé (pour éviter les lignes vides) */
     
        while (!isspace((unsigned char) *str) && *str) str++, a = 1;
        if (a) n++;
    	while (isspace((unsigned char) *str) && *str) str++;
    	}
        return n;
    }
     
    /** copie les mots de la chaine str dans le tableau de chaine de caractère tab */
    void get_word(char **tab, const char *str)
    {
        const char* p = str;
        int a, i = 0;
        /* Le fonctionnement est le même que pour la fonction count_word mais ici on enregistre la chaien dans un tableau. On pourrait le faire en une seule
        fonction mais il faudrai à chaque fois réallouer de la mémoire et ce n'est pas très propre */
        while (*str)
        {
            a = 0;
            while (!isspace((unsigned char) *p) && *p) p++, a = 1;
            if (a)
                tab[i++] = mstrndup(str, p-str); /* Si on a trouvé un mot, on met dans tab[i] le mot (la suite de lettre trouvé) et on incrémente i.
                p-str correspond à la taille du mot, c'est l'adresse du caractère suivant le dernier caractère moins l'adresse du premier caractère */
     
    		 while (isspace((unsigned char) *p) && *p) p++;
            str = p;
        }
    }
     
    /** Compare deux tableaux de mots, renvoie 1 si ces tableaux sont identiques sans tenir compte de l'ordre ni du nombre de mot, 0 sinon (En fait, il renvoie 1
        si chaque ligne de t1 existe dans t2) */
    int compareline(char **t1, size_t size1, char **t2, size_t size2)
    {
        int ret = 1;
        size_t i, j;
        int a;
     
        /* Pour chaque ligne de t1, on compare avec chaque ligne de t2. Si à un moment on ne trouve pas la ligne, alors les tableaux ne sont pas identiques */
        for (i = 0; i < size1; i++)
        {
            a = 0;
            for (j = 0; j < size2; j++)
                if (!strcmp(t1[i], t2[j]))
                {
                    a = 1;
                    break; /* Dès que la ligne est trouvé, on peux arrêter de comparer pour cette valeur du tableau */
                }
     
            if (!a)
            {
                ret = 0;
                break; /* Dès qu'une ligne manque, on peux arrêter la comparaison */
            }
        }
        return ret;
    }
     
    /** Compare deux chaines de caractère, si comparesize vaut 1 alors la première doit contenir la seconde, et renvoie 1 si elles sont identiques sans tenir
        compte de l'ordre des mots */
    int is_same(const char *s1, const char *s2, int comparesize)
    {
        char **t1, **t2;
        size_t size1 = count_word(s1), size2 = count_word(s2);
     
        int ret = 0;
     
        if (!comparesize || (size1 > size2)) /* Si comparesize vaut 0, on ne compare pas la taille, si comparesize vaut 1 alors il faut que size1 > size 2 */
        {
            t1 = malloc(size1 * sizeof(char*));
            t2 = malloc(size2 * sizeof(char*));
     
            if (t1 && t2)
            {
                get_word(t1, s1);
                get_word(t2, s2);
     
                ret = comparesize? compareline(t2, size2, t1, size1) : compareline(t1, size1, t2, size2);
     
                free_tab(t1, size1), free_tab(t2, size2);
            }
            else
                exit(0);
        }
        return ret;
    }
    Je souhaite que vous m'aidez.

    Merci.

Discussions similaires

  1. comparaison de 2 dates
    Par eisti dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/08/2003, 11h33
  2. [langage] Comparaison de fichiers
    Par Jibees dans le forum Langage
    Réponses: 3
    Dernier message: 23/04/2003, 16h27
  3. Comparaison de fichier
    Par danzerg dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2003, 11h49
  4. Comparaison JBuilder avec Sun ONE Studio
    Par chichos dans le forum EDI et Outils pour Java
    Réponses: 4
    Dernier message: 13/11/2002, 15h08
  5. Comparaison d'un registre 8 bits avec une variable 32 bits
    Par tupperware dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 15/10/2002, 10h25

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