Accueil > Forum > > > > Blocage Arbre binaire - Lexique
Blocage Arbre binaire - Lexique
jeudi 5 mai 2011 à 19:53:01 |
Blocage Arbre binaire - Lexique

cedricg92
|
Bonjour,
Je dois faire un programme qui doit être capable de trier un texte dans lexique tel un dictionnaire en comptant les occurrences. Donc pour cela j'ai un programme en C sous Visual 2008, qui est composé de trois fonctions une de décomposition du texte, une autre d'enregistrement du mot dans le lexique et enfin une fonction d'affichage du lexique. Mon problème est que ma fonction d'enregistrement du mot fonctionne mal : elle enregistre bien le premier mot en pas a pas mais enregistre les suivants en écrasant le précédant. Si quelqu'un à le temps et la gentillesse de m'aider, je le remerciais par avance. Merci
Code C/C++ :
/**********************************/
/***************En-tête************/
/**********************************/
#include "stdio.h"
#include "ctype.h"
#include "stdlib.h"
#include "conio.h"
#include "string.h"
struct Arbre
{
char *Mot;
int NbOcc;
Arbre* SAG;
Arbre* SAD;
};
/**********Prototype****************/
void Split(char* Text, Arbre* &Lex);//Découpage du texte
void InsertWord(char *Mot, Arbre* &Lex);//Enregistrement du texte
void DrawLexique(Arbre* &Lex);//Affichage du texte
/**********************************/
/********Programme principale******/
/**********************************/
void main()
{
Arbre *Lexique = NULL;//Variable du lexique
Split("Ceci est un essai.",Lexique);//Appel de la fonction de découpage du texte
DrawLexique(Lexique);//Affichage du texte
getch();//Attente de l'utilisateur
}
/**********************************/
/*************Fonction*************/
/**********************************/
//Découpage du texte
void Split(char* Text, Arbre* &Lex)
{
char *P = Text;//Création d'une variable locale
int i=0;
char temp[32];//Buffer
while(true)//Boucle infinie
{
for(;!isalpha(P[i]);i++)//Boucle si il s'agit d'un caractère non alphabétique
if(P[i]==NULL)//Si c'est la fin de la chaine
return;//Arrête la fonction
for(int x=0; x<32;x++)//Boucle pour initialiser le buffer
temp[x] = NULL;
for(int x=0;isalpha(P[i]);i++)//Boucle si il s'agit d'un caractère alphabétique
{
temp[x]=P[i];//Enregistre dans le buffer
x++;
}
InsertWord(temp,Lex);//Enregistre dans le lexique
}
}
//Enregistrement du texte
void InsertWord(char *Mot, Arbre* &Lex)
{
if(!Lex)//Si le lexique n'existe pas
{
Arbre* nouveau = new Arbre;//Réserve de la mémoire pour la structure du mot
nouveau->Mot = new char[strlen(Mot)+1];//Réserve de la mémoire pour le mot
nouveau->Mot = Mot;//Enregustre le mot
nouveau->NbOcc = 1;//Initialise l'occurence
nouveau->SAD = NULL;//Initialise la branche de droite
nouveau->SAG = NULL;//Initialise la branche de gauche
Lex = nouveau;
return;//Sort de la fonction
}
if(Lex)//Si le lexique existe
{
if(strcmp(Mot,Lex->Mot)==0)//Si le mot existe
{
Lex->NbOcc++;//Incrémente l'occurence
return;//Sort de la fonction
}
if(strcmp(Mot,Lex->Mot)<0)//Si le mot se situe avant dans le dictionnaire par rapport au mot déjà enregistré
{
InsertWord(Mot,Lex->SAG);//Enregistre avant le mot
return;//Sort de la fonction
}
if(strcmp(Mot,Lex->Mot)>0)//Si le mot se situe après dans le dictionnaire par rapport au mot déjà enregistré
{
InsertWord(Mot,Lex->SAD);//Enregistre après le mot
return;//Sort de la fonction
}
}
}
//Affichage du texte
void DrawLexique(Arbre* &Lex)
{
if(Lex)//Si le lexique existe
{
printf("%d %s\n",Lex->NbOcc,Lex->Mot);//Affiche le premier enregistre
}
}
|
|
jeudi 5 mai 2011 à 21:20:05 |
Re : Blocage Arbre binaire - Lexique

Lucky92
|
Réponse acceptée !
Salut,
Ceci est une erreur classique :
Code C/C++ : nouveau->Mot = new char[strlen(Mot)+1];//Réserve de la mémoire pour le mot
nouveau->Mot = Mot;//Enregustre le mot
La seconde ligne ne copie pas une chaîne, mais copie un pointeur ; remplace la seconde ligne par :
Code C/C++ : strcpy( Mot , nouveau->Mot ) ;
@++;
|
|
jeudi 5 mai 2011 à 21:39:13 |
Re : Blocage Arbre binaire - Lexique

cedricg92
|
Ok merci c'était ça Merci!!!
Code C/C++ :
/**********************************/
/***************En-tête************/
/**********************************/
#include "stdio.h"
#include "ctype.h"
#include "stdlib.h"
#include "conio.h"
#include "string.h"
struct Arbre
{
char *Mot;
int NbOcc;
Arbre* SAG;
Arbre* SAD;
};
/**********Prototype****************/
void Split(char* Text, Arbre* &Lex);//Découpage du texte
void InsertWord(char *Mot, Arbre* &Lex);//Enregistrement du texte
void DrawLexique(Arbre* &Lex);//Affichage du texte
/**********************************/
/********Programme principale******/
/**********************************/
void main()
{
Arbre *Lexique = NULL;//Variable du lexique
Split("Ceci est un essai.",Lexique);//Appel de la fonction de découpage du texte
DrawLexique(Lexique);//Affichage du texte
getch();//Attente de l'utilisateur
}
/**********************************/
/*************Fonction*************/
/**********************************/
//Découpage du texte
void Split(char* Text, Arbre* &Lex)
{
char *P = Text;//Création d'une variable locale
int i=0;
char temp[32];//Buffer
while(true)//Boucle infinie
{
for(;!isalpha(P[i]);i++)//Boucle si il s'agit d'un caractère non alphabétique
if(P[i]==NULL)//Si c'est la fin de la chaine
return;//Arrête la fonction
for(int x=0; x<32;x++)//Boucle pour initialiser le buffer
temp[x] = NULL;
for(int x=0;isalpha(P[i]);i++)//Boucle si il s'agit d'un caractère alphabétique
{
temp[x]=P[i];//Enregistre dans le buffer
x++;
}
InsertWord(temp,Lex);//Enregistre dans le lexique
}
}
//Enregistrement du texte
void InsertWord(char *Mot, Arbre* &Lex)
{
if(!Lex)//Si le lexique n'existe pas
{
Arbre* nouveau = new Arbre;//Réserve de la mémoire pour la structure du mot
nouveau->Mot = new char[strlen(Mot)+1];//Réserve de la mémoire pour le mot
strcpy(nouveau->Mot,Mot);//Enregustre le mot
nouveau->NbOcc = 1;//Initialise l'occurence
nouveau->SAD = NULL;//Initialise la branche de droite
nouveau->SAG = NULL;//Initialise la branche de gauche
Lex = nouveau;
return;//Sort de la fonction
}
if(Lex)//Si le lexique existe
{
if(strcmp(Mot,Lex->Mot)==0)//Si le mot existe
{
Lex->NbOcc++;//Incrémente l'occurence
return;//Sort de la fonction
}
if(strcmp(Mot,Lex->Mot)<0)//Si le mot se situe avant dans le dictionnaire par rapport au mot déjà enregistré
{
InsertWord(Mot,Lex->SAG);//Enregistre avant le mot
return;//Sort de la fonction
}
if(strcmp(Mot,Lex->Mot)>0)//Si le mot se situe après dans le dictionnaire par rapport au mot déjà enregistré
{
InsertWord(Mot,Lex->SAD);//Enregistre après le mot
return;//Sort de la fonction
}
}
}
//Affichage du texte
void DrawLexique(Arbre* &Lex)
{
if(Lex)//Si le lexique existe
{
printf("%d %s\n",Lex->NbOcc,Lex->Mot);//Affiche le premier enregistre
}
}
|
|
vendredi 6 mai 2011 à 13:48:49 |
Re : Blocage Arbre binaire - Lexique

cedricg92
|
Voila le code est fini, cela est un vrai lexique.
Code C/C++ :
/**********************************/
/***************En-tête************/
/**********************************/
#include "stdio.h"
#include "ctype.h"
#include "conio.h"
#include "stdlib.h"
#include "string.h"
#include "texte.h"
struct Arbre
{
char *Mot;
int NbOcc;
Arbre* SAG;
Arbre* SAD;
Arbre* PRE;
};
/*************Prototype*************/
void Split(char* Text, Arbre* &Lex);//Découpage du texte
void InsertWord(char *Mot, Arbre* &Lex);//Enregistrement du texte
void DrawLexique(Arbre* &Lex);//Affichage du texte
/**********************************/
/********Programme principale******/
/**********************************/
void main()
{
printf("%s",Texte2);
Arbre *Lexique = NULL;//Variable du lexique
Split(Texte1,Lexique);//Appel de la fonction de découpage du texte
DrawLexique(Lexique);//Affichage du texte
getch();//Attente de l'utilisateur
}
/**********************************/
/*************Fonction*************/
/**********************************/
//Découpage du texte
void Split(char* Text, Arbre* &Lex)
{
char *P = Text;//Création d'une variable locale
int i=0;
char temp[32];//Buffer
while(true)//Boucle infinie
{
for(;!isalpha(P[i]);i++)//Boucle si il s'agit d'un caractère non alphabétique
if(P[i]==NULL)//Si c'est la fin de la chaine
return;//Arrête la fonction
for(int x=0; x<32;x++)//Boucle pour initialiser le buffer
temp[x] = NULL;
for(int x=0;isalpha(P[i]);i++)//Boucle si il s'agit d'un caractère alphabétique
{
if(P[i]<=90)
temp[x]=P[i]+32;
else
temp[x]=P[i];//Enregistre dans le buffer
x++;
}
InsertWord(temp,Lex);//Enregistre dans le lexique
}
}
//Enregistrement du texte
void InsertWord(char *Mot, Arbre* &Lex)
{
if(!Lex)//Si le lexique n'existe pas
{
Arbre* nouveau = new Arbre;//Réserve de la mémoire pour la structure du mot
nouveau->Mot = new char[strlen(Mot)+1];//Réserve de la mémoire pour le mot
strcpy(nouveau->Mot,Mot);//Enregustre le mot
nouveau->NbOcc = 1;//Initialise l'occurence
nouveau->SAD = NULL;//Initialise la branche de droite
nouveau->SAG = NULL;//Initialise la branche de gauche
Lex = nouveau;
return;//Sort de la fonction
}
if(Lex)//Si le lexique existe
{
if(strcmp(Mot,Lex->Mot)==0)//Si le mot existe
Lex->NbOcc++;//Incrémente l'occurence
if(strcmp(Mot,Lex->Mot)<0)//Si le mot se situe avant dans le dictionnaire par rapport au mot déjà enregistré
InsertWord(Mot,Lex->SAG);//Enregistre avant le mot
if(strcmp(Mot,Lex->Mot)>0)//Si le mot se situe après dans le dictionnaire par rapport au mot déjà enregistré
InsertWord(Mot,Lex->SAD);//Enregistre après le mot
}
}
//Affichage du texte
void DrawLexique(Arbre* &Lex)
{
Arbre* Temp = new Arbre;
Temp = Lex;
if(Lex)//Si le lexique existe
{
if(Temp->SAG)
DrawLexique(Temp->SAG);
printf("\t\t\t\t\t\t\t\t\t%d\t%s\n",Temp->NbOcc,Temp->Mot);
if(Temp->SAD)
DrawLexique(Temp->SAD);
}
}
|
|
Cette discussion est classée dans : arbre, texte, mot, lex, lexique
Répondre à ce message
Sujets en rapport avec ce message
editbox [ par flatou ]
je souhaite ajouter du texte a la suite dans un editbox. comme il y a bcp de texte dedans, la meilleure solution est de positionner le curseur a la fi
Enregistrer une ligne bien precise d'un texte [ par Slown ]
Bonjour. Je voudrais savoir, si il était possible de pouvoir enregistrer une ligne (ou un mot) bien precise d'un fichier. Je m'explique: J'ai obtenu
supprimer un mot d'un arbre en C [ par toto000 ]
Bonjour, J'ai un arbre ternaire de recherche et je voudrai supprimer un mot dans cet arbre.Voilà ce que j'ai fais mais ça ne marche pas pour tous les
Fichier texte [ par spike666 ]
Etant tres nul... et ne preférant pas chercher 3h des morceaux de codes pour finir sur un truc ki marchera pas je vais demander directement ce que je
Pointer dans arbre binaire [ par laurent57150 ]
Bonjour j'essaye d'ecrire un programme utilisant un arbre binaire!Le probleme c'est que pour remplir mon arbre j'utilise une fonction recursive mais a
arbre lexicographique [ par finoss ]
Bonjour,Je dois réalisé pour un projet un arbre lexicographique en C, j'ai réussi à faire le code pour importer les 16000 mots depuis un fichier texte
afficher les mots d'un fichier texte [ par cyrina84 ]
Bonjours à tous les developpeurs icic présent, J'ai un probleme que je souffre depuis 3jours et j'espere que vous m'aidiez. Donc voila J'ai fichier te
Instanciation JAVA (renommé et déplacé bar --> java) [ par baster200x ]
bonjour tout le monde, j'ai un petit problème .... ben j'ai réalisé un programme de tel façon il prend un texte à partir d'un TextArea [ String text =
Récupération d'un mot aléatoire depuis un fichier texte [ par Mornaloce ]
Bonjour à tous. Voilà je vous explique mon problème. J'aimerais faire un petit programme qui permet de récupérer un mot aléatoirement dans un fichier
Création d'un arbre n aire en C qui contient au début un élement spécial [ par meriem123435 ]
Bonjour ! Je veux créer un arbre n aire en c, qui contient comme tête un élément spécial genre '#'. J'ai déclaré ma structure comme suit : typedef st
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|