Aide code mot anagramme

sahbibenayed Messages postés 10 Date d'inscription mardi 30 décembre 2008 Statut Membre Dernière intervention 21 juin 2010 - 30 déc. 2008 à 11:01
cs_goodboy21 Messages postés 29 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 11 avril 2010 - 30 déc. 2008 à 17:47
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);


}
A voir également:

2 réponses

sahbibenayed Messages postés 10 Date d'inscription mardi 30 décembre 2008 Statut Membre Dernière intervention 21 juin 2010
30 déc. 2008 à 14:42
bonjour;
es ce que quelqu'un peut m'aider pour le
do
while
dans le main ?
le programme fait de nouveau l'appel au fonction mais ca ne marche pas : pas d'attente des scanf :( je sais que ca parrait debutant un tel probleme mais je suis planté
0
cs_goodboy21 Messages postés 29 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 11 avril 2010
30 déc. 2008 à 17:47
pour commencer tu utilise mal ton char*p[100];
soit tu lui alloues de la mémoire comme ça: char*p=new char[10][100] qui te crée un tableau de 10 chaine de caractères dont chaque chaines contient 100 caractères. étant données que tu n'as pas l'air très à l'aise ac les pointeurs déclare le comme ceci char p[10][100].
ensuite pour connaitre la longueur d'une chaine utilise "strlen(..);
0
Rejoignez-nous