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 :

indexer des mots


Sujet :

C

  1. #1
    Membre confirmé Avatar de Gobelins
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Décembre 2007
    Messages : 171
    Par défaut indexer des mots
    Bonjour,

    Voici un texte, je voudrais écrire un code en C, qui affiche par exemple que le mot vraiment se situe en ligne 2, c'est-à-dire , vraiment : [2]. Je pense l'écrire avec structure et typedef, je voudrais bien une assistance pour bien m'éclairer, voire comprendre et toute suggestion est la bien venue. Merci

    Un programme qui tourne bien, c'est un plaisir, mais un
    programme qui marche mal ou pas du tout, c'est vraiment
    une (grosse) frustration. La solution c'est de le coder par
    petits bouts, en testant progressivement chaque expression
    pour avoir la certitude qu'elle retourne bien la valeur
    attendue, avant de s'en servir dans une expression plus
    large, autrement dit une "instruction" du programme. On
    teste alors chaque instruction avec le contexte voulu, ce
    qui, progressivement, garantit le bon fonctionnement global.

    Pour les autres mots, l'éxecution du programme donne ce résultat.

    alors : [8]
    attendue : [6]
    autrement : [7]
    avant : [6]
    avec : [8]
    avoir : [5]
    bien : [1, 5]
    bon : [9]
    bouts : [4]
    ce : [8]
    certitude : [5]
    chaque : [4, 8]
    coder : [3]
    contexte : [8]
    dit : [7]
    expression : [4, 6]
    fonctionnement : [9]
    frustration : [3]
    garantit : [9]
    global : [9]
    grosse : [3]
    instruction : [7, 8]
    large : [7]
    mal : [2]
    marche : [2]
    petits : [4]
    plaisir : [1]
    programme : [1, 2, 7]
    progressivement : [4, 9]
    qu'elle : [5]
    retourne : [5]
    s'en : [6]
    servir : [6]
    solution : [3]
    testant : [4]
    teste : [8]
    tourne : [1]
    tout : [2]
    valeur : [5]
    voulu : [8]
    vraiment : [2]

    Cordialement

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Salut et bienvenue sur developpez.com


    Ce que tu peux éventuellement envisager, serait une liste doublement chaînée (pour rester dynamique) qui comprend pour chaque noeud une chaîne de caractère correspondant à un mot et un tableau d'entiers pour son numéro de ligne ... tu peux par la suite pousser le vice en ajoutant un entier pour sa position dans la ligne, etc...
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    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
    esrt-ce normal que un (entre autres) ne figure pas dans la liste ou cela implique t-il une analyse grammaticale du texte ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    Salut et bienvenue sur developpez.com
    serait une liste doublement chaînée
    Pourquoi double?

    un entier pour son numéro de ligne ...
    Une liste d'entier pour pouvoir afficher :
    programme : [1, 2, 7]
    Cela signifie aussi qu'il faut, avant un ajout, que tu cherche si le mot a déjà été ajouté ou non. Si oui tu mets seulement à jour sa liste d'entier (correspondant aux lignes).

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    En première approximation, on y arrive avec un simple tableau de char *. Quand on y réfléchi on s'aperçoit que le nombre de lignes n'est pas connu d'avance donc notre tableau doit être dynamique. En redimensionne le tableau après chaque saisie réusiie d'une ligne.
    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
    char **pLignes = NULL, ligne[100];
    size_t nbLignes = 0, longueur, i;
    void * p = NULL;
     
    ...
     
    while ((longueur = strlen(saisir_chaine(ligne, sizeof(ligne)))) > 0)
    {
        p = realloc(pLignes, (nbLignes + 1) * sizeof(char *));
        if (p != NULL)
        {
            pLignes = p;
            i = nbLignes++;
     
            if ((pLignes[i] = malloc(longueur + 1)) != NULL)
                strcpy(pLignes[i], ligne);
    	else
                delete_lignes(pLignes, nbLignes);
        }
        else
            delete_lignes(pLignes, nbLignes);
    }
    Pour trouver toutes les lignes qui contiennent un mot on parcours le tableau pLignes à la recherche de ce mot (on pourra utiliser strstr par exemple), on affiche la position chaque fois qu'on a trouvé.

  6. #6
    Membre confirmé Avatar de Gobelins
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Décembre 2007
    Messages : 171
    Par défaut indexe des mots
    Bonsoir, je ne sais pas comment programmer avec les listes doublement chainées. J'ai trouvé des exemples sur les listes doublement chainées, mais ils traitent seulement comment ajouter, supprimer , trier etc, des éléments. Ce bout de code sert à quoi ? car il est incomplet. Ajoutez ce qui manque entre NULL; et while, SVP.
    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
     
    char **pLignes = NULL, ligne[100];
    size_t nbLignes = 0, longueur, i;
    void * p = NULL;
     
    ...
     
    while ((longueur = strlen(saisir_chaine(ligne, sizeof(ligne)))) > 0)
    {
        p = realloc(pLignes, (nbLignes + 1) * sizeof(char *));
        if (p != NULL)
        {
            pLignes = p;
            i = nbLignes++;
     
            if ((pLignes[i] = malloc(longueur + 1)) != NULL)
                strcpy(pLignes[i], ligne);
    	else
                delete_lignes(pLignes, nbLignes);
        }
        else
            delete_lignes(pLignes, nbLignes);
    }
    Voici un code mais en C++ qui sert à trouver une chaîne de caractères donnée dans un fichier quelconque, et indique sa position à chaque fois que celle-ci apparaît dans ce dernier. je voudrais le transformer en C.

    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    // Fichiers d'en-tête //
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <fstream>
    #include <iostream>
     
    // Définition du flux d'entrées-sorties utilisé pour le fichier sur lequel on travaille //
    fstream stream("C:\\Documents and Settings\FERRAOUN\Mes documents\Informatique\Python\indexe-moi.txt", ios::in|ios::out);
    // Définition des variables utilisées //
    char quit;
    int pos=0;
    char donnees[256][500];
    int recurmot[1000];
     
    // Cette fonction sert à déterminer la position prise par une chaîne de //
    // caractère donné dans un fichier quelconque, chaque fois que celle-ci apparaît. //
    bool verif( const char* mot) {
    int ligne=0, rep=0;
    bool etat=false;
    // Les instructions présentes dans la boucle ci-dessous se réalisent tant que //
    // le premier caractère de la ligne du fichier n'est pas nul //
    while (donnees[0][ligne]!=NULL) {
    int indice=0;
    // Idem mais pour le dernier caractère d'une ligne quelconque //
    while (donnees[indice][ligne]!=NULL) {
    int compte= 0; int taille=0;
    // Mise en place d'un compteur : la boucle fonctionne tant que le nombre //
    // total de caractères inclus dans la chaîne de caractères définie auparavant //
    // n'est pas atteint //
    while(compte!=strlen(mot)) {
    // Eviter les erreurs dues à la présence du caractère nul //
    if (donnees[indice+compte][ligne]!=NULL) {
    // Si les caractères du fichier et de la chaîne recherchée sont identiques //
    if (donnees[indice+compte][ligne]==mot[compte]) taille++;
    }
    compte++;
    }
    // Si la chaîne de caractères recherchée est trouvée dans le fichier : //
    // - Renvoyer la valeur "true" //
    // - Enregistrer les différentes positions de la chaîne de caractères //
    if (taille==strlen(mot)) {
    etat=true;
    recurmot[rep++]=ligne;
    recurmot[rep++]=indice;
    }
    indice++;
    }
    ligne++;
    }
    return etat;
    }
    // Fonction "main" -> Fonction principale //
    int main(void) {
    int k=0;
    bool test;
    // Tant que la fonction get() ne retourne pas l'élément EOF (End Of File) // //
    while (stream.get()!=EOF) {
    // Changer la position du pointeur sur le flux d'entrée-sortie du fichier //
    stream.seekg(pos);
    char *lecture = new char[256];
    // Mettre les caractères de la ligne lue dans la chaîne de caractères "lecture" //
    // Délimitation par défaut de la fonction getline() : le caractère '\n' //
    stream.getline(lecture, 256);
    int i=0;
    // Remplir la double matrice de caractères "données" avec sa consoeur "lecture" //
    while(lecture[i]!=NULL) {
    donnees[i][k]=lecture[i];
    i++; pos++;
    }
    // Affecter le caractère '\n' à la fin de "données" //
    donnees[i++][k]='\n';
    k++; pos++;
    // Vider la matrice "lecture" et libérer ainsi de l'espace en mémoire //
    delete[] lecture;
    }
    // Afficher "donnees" à l'écran //
    k=0;
    while(donnees[0][k]!=NULL) {
    int i=0;
    while(donnees[i][k]!=NULL) {
    cout<<donnees[i][k];
    i++;
    }
    k++;
    }
    cout<<endl;
    // Définir la chaîne de caractères recherchée //
    const char* inter = "rep";
    int nb = strlen(inter);
    // Appel à la fonction "test" //
    test = verif(inter);
    if (test) cout<<"Les positions de la chaine de caracteres (x, y) dans le fichier sont : "<<endl;
    for(int i=0; i<1000; i++) {
    // Ne pas afficher de caractères nuls sinon risques d'erreurs //
    if (!((recurmot[i]==NULL)&&(recurmot[i+1]==NULL))) {
    cout<<recurmot[i]<<" ";
    }
    }
    cout<<endl;
    // Afficher la chaîne de caractères juste dessous sa position respective dans le fichier //
    int xdonnees, ydonnees;
    int i=0;
    while(!((recurmot[i]==NULL)&&(recurmot[i+1]==NULL))) {
    ydonnees = recurmot[i];
    xdonnees = recurmot[i+1];
    for(int j=0; j<nb; j++) {
    cout<<donnees[xdonnees][ydonnees];
    xdonnees++;
    }
    // Eliminer les chaînes de caractères trouvées de "données" //
    while(donnees[xdonnees][ydonnees]!=NULL) {
    donnees[xdonnees-nb][ydonnees] = donnees[xdonnees][ydonnees];
    xdonnees++;
    }
    // Remplir le reliquat restant de "donnees" avec le caractère nul //
    xdonnees-=nb;
    for(int j=0; j<nb; j++) {
    donnees[xdonnees][ydonnees]=NULL;
    xdonnees++;
    }
    cout<<" ";
    i+=2;
    }
    cout<<endl;
    k=0;
    // Afficher ensuite le résultat obtenu //
    while(donnees[0][k]!=NULL) {
    int i=0;
    while(donnees[i][k]!=NULL) {
    cout<<donnees[i][k];
    i++;
    }
    k++;
    }
    cout<<endl;
    // Quitter le programme en appuyant sur la touche 'q' //
    while (quit!='q') cin>>quit;
    stream.close();
    }

  7. #7
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Gobelins Voir le message
    Ce bout de code sert à quoi ? car il est incomplet. Ajoutez ce qui manque entre NULL; et while, SVP.
    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
     
    char **pLignes = NULL, ligne[100];
    size_t nbLignes = 0, longueur, i;
    void * p = NULL;
     
    ...
     
    while ((longueur = strlen(saisir_chaine(ligne, sizeof(ligne)))) > 0)
    {
        p = realloc(pLignes, (nbLignes + 1) * sizeof(char *));
        if (p != NULL)
        {
            pLignes = p;
            i = nbLignes++;
     
            if ((pLignes[i] = malloc(longueur + 1)) != NULL)
                strcpy(pLignes[i], ligne);
    	else
                delete_lignes(pLignes, nbLignes);
        }
        else
            delete_lignes(pLignes, nbLignes);
    }
    Il sert à te montrer les principes de base utilisés dans la création dynamique d'un tableau à deux dimensions. Il est censé être complété par ... toi! Je parie que tu n'as même pas cherché à comprendre. Dans ce cas t'es tout simplement foutu. Si tu trouves que c'est trop difficile, commence d'abord avec un tableau statique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char t[NLIGNES][LIGNEMAX]
    Dans cet exemple, t est un tableau de NLIGNES lignes, une ligne étant un tableau de LIGNEMAX chars (caractère de fin de chaîne inclus). Tu demandes à l'utilisateur d'entrer tout au plus NLIGNES lignes (une ligne ne doit pas dépasser LIGNEMAX caractères ...). fgets permet de saisir une ligne de manière simple et sécurisée.

    Pour chercher une chaîne dans une chaîne, on peut utiliser la fonction strstr déclarée dans string.h. Donc pour trouver toutes les lignes dans lesquelles apparaît un mot donné, on parcourt toutes les lignes du tableau puis on affiche le numéro de celles qui contiennent ce mot.

    Un petit conseil en guise de conclusion, commence toujours par des choses simples, c'est facile de compliquer petit à petit après. Voilà, t'as tout ce qu'il faut maintenant.

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Gobelins Voir le message
    Voici un code mais en C++ qui sert à trouver une chaîne de caractères donnée dans un fichier quelconque, et indique sa position à chaque fois que celle-ci apparaît dans ce dernier. je voudrais le transformer en C.
    On ne transforme pas un code, la meilleure école est encore de penser un algorithme soi-même et de l'implémenter, là si le code C++ tu le comprend pas et si en plus tu comprend pas le C++ arrêt les frais illico presto ! D'autant plus que le code que tu montre est presque illisible, pas d'indentation rien du tout.

    Si on prend de notre temps pour te guider et te donner des pistes, ce n'est surement pas pour qu'à côté tu essaye de repomper un code qui plus est en C++, ca c'est de la fénéantise rien de plus !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. Changer le style des mots indexés ?
    Par lavernose dans le forum Word
    Réponses: 7
    Dernier message: 08/10/2009, 08h35
  2. Problème dans l'indexation des mots
    Par makounet dans le forum Word
    Réponses: 4
    Dernier message: 08/04/2008, 18h57
  3. indexation fulltext des mots avec un trait d'union
    Par andraz dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 12/03/2007, 16h46
  4. Au sujet des mots de passe
    Par FranT dans le forum Langage
    Réponses: 6
    Dernier message: 17/09/2002, 22h16

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