bonjour;
je travaille sur borland C++;
je souhaite coder un programme permattant de scanner une chaine de caractere, puis afficher dans chaque ligne les mots anagrammes, si un mot n'as pas de mots anagramme il sera affiché seul, chaque mot sera affiché une seule fois.
en faite j'ai deux probleme :
1
le code ne marche pas pour certains cas (je ne sais pas pourquoi) exemple "le bonjour le" ou "le el"
=> il y a un probleme si le dernier mot est anagramme.
2
le dernier do while ne marche pas :(
voici le code :
# include <stdio.h>
// fonction init permettant d'initaliser le tableau de pointeur par les mots separrés d'espace blanc
// et retourne le nombre de mot
int init (char T[], char *p[])
{
int i=0,j=1;
p[0]=T;
while (T[i] != '\0')
{
if (T[i] == ' ' && T[i+1] != ' ' && T[i+1] != '\0')
{
p[j]=T+i+1;
j++;
}
i++;
}
return j;
}
//fonction permettant d'afficher les mots pointés par le tableau de pointeur
void ecrire (char *p)
{
printf("\n");
while (*p!=' ' && *p!='\0')
{
printf("%c",*p);
p++;
}
}
//fonction permettant d'afficher un seul mot
int ecriremot (char x[], char *p[])
{
int i,j,trouve=0;
for (i=0;p[i]!='\0';i++)
{
if (p[i]==x)
trouve=1;
}
if (trouve==0)
for (j=0;x[j]!=' ' && x[j]!='\0';j++)
{
printf("%c",x[j]);
}
return trouve;
}
//fonction permettant d'ajouter l'@ d'un mot a la liste des mots deja traité
void ajoutmot(char x[], char *p[], int i)
{
p[i]=x;
p[i+1]='\0';
}
//fonction permettant d'assurer que chaque mot sera traité une seule fois sinon retourne 0
int dejavu(char x[], char *p[])
{
int trouve=0,i;
for (i=0;p[i]!='\0';i++)
{
if (p[i]==x)
trouve=1;
}
return trouve;
}
// fonction permettant de tester si deux mots ont la meme longeur
int longuer(char mot1[], char mot2[])
{
int memelonguer=0,i,j;
for (i=0;mot1[i]!=' '&&mot1[i]!='\0';i++);
for (j=0;mot2[j]!=' '&&mot2[j]!='\0';j++);
if (i==j)
return memelonguer=1;
else
return memelonguer;
}
//fonction permettant de degager le code ascii d'un mot et le mettre dans un tableau caractere par caractere
int flag(char mot1[],char mot2[])
{
int flag1[27],flag2[27];
int i;
int indexcaractere;
int anagramme=1;
for (i=0;i<27;i++) // initialisation des deux tableaux flag
{
flag1[i]=flag2[i]=0;
}
for (i=0;mot1[i]!=' ' && mot1[i]!='\0';i++) // remplissage du tableau flag1 par le nombre de lettre du mot1 selon l'index de chaque lettre
{
indexcaractere = mot1[i]-97;
flag1[indexcaractere]++;
}
for (i=0;mot2[i]!=' ' && mot2[i]!='\0';i++) // remplissage du tableau flag2 par le nombre de lettre du mot2 selon l'index de chaque lettre
{
indexcaractere = mot2[i]-97;
flag2[indexcaractere]++;
}
for (i=0;i<27;i++)
{
if (flag1[i]!=flag2[i])
anagramme=0;
}
return anagramme;
}
//fonction permettant d'afficher le mot anagramme
void anagramme(char chaine[],char *p[])
{
int i,j,l,k,g=0,ana,temp;
char *q[100];
q[0]='\0';
l=init (chaine,p);
printf("\n les motes de votre chaine : ");
for (i=0;i<l;i++)
{
ecrire (p[i]);
}
printf("\n\nles mots anagrammes :\n");
for (i=0;i<l-1;i++)
{
ecriremot (p[i],q);
for (j=i+1;j<l;j++)
{
k=longuer(p[i],p[j]);
ana=flag(p[i],p[j]);
temp=dejavu(p[i],q);
if (k&&!!ana)
{
if (temp==0) // pour ne pas inserer des espace vide au debut des mots non anagramme
printf(" ");
ecriremot (p[j],q);
ajoutmot(p[j],q,g);
g++;
}
}
if (temp==0)
printf("\n");
}
ecriremot (p[l-1],q); // cas dernier mot de la chaine n'est pas anagramme
printf("\n le nombre de mots : %d",l);
}
void lirechaine(char T[])
{
int i=0,k=0,j=1;
printf("\n entrer votre chaine \n");
do
{
scanf("%c",&T[k]);
k++;
}while (T[k-1] != '\n');
T[k]='\0';
}
void main()
{
int i;
char *x;
char chaine[100];
char *p[100];
do
{
lirechaine(chaine);
anagramme(chaine,p);
printf ("\n donner votre choix \n0 pour sortir\n1 pour repeter\n");
scanf("%d",&i);
}while (i==1);
}