bonjour,
je suis intéressé à programmer en Java la conversion d'une AFND (automate finie non deterministe)donné à AFD(automate finie deterministe) , je me trouve un peut bloquer dans la methode Transf_Afnd_Afd()) :
(l'affichage est juste seulement pour la premiere etat ,je pense qu'il faut une methode recursive) ,s'il ya une autre methode plus meilleur ou une idéé ca m'aide beaucoup
et merci d'avance.
voila un lien qui explique bien la conversion manuellement:
http://fastnet.univ-brest.fr/~gire/COURS/COMPIL_IUP/node205.html
voila mon code
class Afnd
{
////attributs
int nb_etat;//nombre d'etat
int nb_symb;//nombre de symboles
int nbe_atteindre;//nbre d'etat atteindre par un symbole
int num_etat;// numero d'etat
char sym='a';//symbole initialisé à 'a'
char tabS[];// tableau de symboles
int tabEat[];// tableau d'etat atteindre par un symbole
int tabNbat[];// tableau des nbre d'etat atteindre par un symbole
int tabEn[];//tableau d'etat d'automate fini non deterministe
int tabEf[];//tableau d'etat d'automate fini deterministe
int tabEs[];
//constructeur
Afnd(int nb_etat,int nb_symb)
{
this.nb_etat=nb_etat;
this.nb_symb=nb_symb;
tabS=new char[50];
tabEat=new int[100];
tabNbat=new int[1000];
tabEn=new int[1000];
tabEf=new int[1000];
tabEs=new int[1000];
}
//methode de construction d'une AFND
public void ConstructionAfnd()
{
int p=0;int l=0;
for(int j=0;j<nb_symb;j++)
{
for(int i=0;i<nb_etat;i++)
{
do
nbe_atteindre= ESBasique.litInt("de l'etat "+i+" combien d'etat vous pouvez atteindre avec le symbole "+sym);
while(nbe_atteindre>nb_etat);
tabNbat[l]=nbe_atteindre;
l++;
for(int k=0;k<nbe_atteindre;k++)
{
do
num_etat= ESBasique.litInt("vous pouvez atteindre l'etat: " );
while(num_etat>nb_etat);
tabEat[p]=num_etat;
p++;
}
}
tabS[j]=sym;
sym++;
}
}
// calculer les nombres des etats atteindre par tt les symboles
public int somme_Tab()
{
int s=0;
for(int i=0;i<nb_symb*nb_etat;i++)
{
s+=tabNbat[i];
}
return s;
}
//transformer Afnd à Afd
public void Transf_Afnd_Afd()
{
int r;
int m=0;
int l=1;
int v=0;
int p;
p=somme_Tab();
while(p!=0)
{
for(r=m;r<=m;r++)
System.out.print(tabEf[r]);
System.out.print(" |");
for(int j=0;j<nb_symb;j++)
{
int z=0;
for(int k=j*nb_etat;k<((j+1)*nb_etat)-1;k++)
{
tabEn[z]=z;
for(r=0;r<=m;r++,z++)
if(tabEf[m]==tabEn[z])
{
if(tabNbat[k]!=0)
{
l=0;
v=tabNbat[k];
for(int x=0;x<v;x++)
{
tabEs[l]=tabEat[x];
System.out.print(tabEs[l]);
System.out.print(",");
l++;
}
for(int i=0;i<=v;i++)
tabEf[i]=tabEs[i];
}
}
}
z++;
System.out.print("|");
}
System.out.print(" \n");
p--;
}
}
//afficher l'automate fini deterministe
public String toString()
{
String s=" ";
for(int i=0;i<nb_symb;i++)
s=s+" |"+tabS[i];
s=s+"\n";
return s;
}
}
class Afnd_afd
{
public static void main(String args[])
{
int nbe= ESBasique.litInt("\n donner le nombre des etats: ");
int nbs= ESBasique.litInt("\n donner le nombre des symnoles: ");
Afnd afn=new Afnd(nbe,nbs);
afn.ConstructionAfnd();
System.out.printf("l'automate fini deterministe est: \n "+afn.toString());
afn.Transf_Afnd_Afd();
}
}