begin process at 2012 05 28 17:33:51
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

Blocage Arbre binaire - Lexique


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

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


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

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 : 1,654 sec (4)

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