void main(void){
//declaracion de las variables//
int numfinal;
int i=0, v=0;
int estados, inicial, qtemp, var, var2;
int final[sizeof(int)]; //arreglo donde guardo los estados finales
bienvenida(); //imprimendo la bienvenida
getch(); //una tecla para continuar
system("cls");//limpiando lapantalla
cout<<endl<<" **********DEFINICION DE ESTADOS DEL DFA********* "<<endl;
while (estados <=0){//si introduzco un numero de estados negativos o cero me preguntara hasta que meta uno positivo
cout<<endl<<"Ingrese el numero de estados:";
cin>>estados;
}
//imprimiendo los estados //
cout<<endl<<"El numero de estados ingresado es de: "<<estados;
cout<<endl<<endl;
for(int j=0; j<=estados-1; j++){
cout<<"q["<<j<<"]"<<endl;
}
cout<<endl;
var=1;// ES FALSO
while(var==1){//mientras no ponga un estado valido la funcion me preguntara por el estado inicial
cout<<endl<<endl<<"Ingrese el estado inicial (debe encontrarse en su conjunto de estados):"<<" q ";
cin>>inicial;
auxi2=0;
comprobar_estados(estados, inicial); //comprobando si el estado es valido para los estados definidos
if(auxi2==0) //si esto es 0 es porque el estado introducido es correcto
var=0;// SE HACE VERDADERO
}
cout<<endl<<"cuantos estados finales desea definir? "<<endl;
cin>>numfinal;
while(v<numfinal){//introduciendo uno a uno los estados finales
var2=1;
while(var2==1){
cout<<endl<<"Ingrese su estado final (debe encontrarse en su conjunto de estados): "<<" q ";
cin>>final[v];
comprobar_estados(estados, final[v]);//comprobando el estado introducido que se encuentre en el arreglo de estados
if(auxi2==0)//de igual manera si es correcto este valor sera 0
var2=0;
}
v++;//pasamos a preguntar por el siguiente estado final
}
//imprimiendo los estados iniciales y finales
cout<<endl<<endl<<"El estado inicial escogido es: q["<<inicial<<"]";
cout<<endl<<"Estos son los estados finales escogidos : ";
for(int p=0; p<numfinal; p++){//recorriendo e imprimiendo estados finales
cout<<"q["<<final[p]<<"]"<<" ";
}
cout<<endl<<endl<<endl<<" Presione una tecla para continuar..."<<endl;
getch();
system("cls");
cout<<endl<<" ************DEFINICION DEL ALFABETO*********** "<<endl;
alfabeto = new char[i];
//este bucle estara repitiendose hasta entrar un alfabeto que no contenga simbolos repetidos//
auxi3=1;
while (auxi3==1){
auxi3=0;
cout<<endl<<endl<<"Ingrese un tras otro simbolos de su alfabeto sin repetir simbolos : ";
cin>>alfabeto;
i=strlen(alfabeto);
comprobar_alfabeto();//llamada a la funcion que revisa que el alfabeto este bien escrtio
}
//imprimiendo el alfabeto
cout<<endl<<" su alfabeto definido consta de "<<i<<" simbolos y estos son: "<<endl;
cout<<"{";
for (int z=0; z<i; z++)
cout<<alfabeto[z]<<",";
cout<<"}";
palabra = new char[longi];
delta= new int *[estados];
for( int r=0; r<estados;r++){ //inicializando la matriz delta donde se guardan los estados
delta[r]=new int [i];
}
cout<<endl<<endl<<endl<<"Presiones una tecla para continuar"<<endl;
getch();
system("cls");
llenadodelta(estados, i);//llamado a la funcion para llenar la funcion de transicion delta
char seguir='s';
while(seguir=='s'){ //este bucle realizara la prueba para tantas palabras como queramos siempre que queramos otra palabra
introducir_palabra(i); //llamado a funcion de introducir palabra
comprobar_palabra(i); //llamado a la funcion de comprobar palabra
cout<<"longitud de la palabra: "<<strlen(palabra)<<" palabra: "<<palabra<<endl;
longi=strlen(palabra);
qtemp=inicial;//qtemp es el que nos ira dando el valor del estado dentro de la matriz de transicion para cada simbolo de la palabra
for(int s=0; s<longi;s++){//recorriendo la palabra
for(int a=0; a<i; a++){ //recorriendo el alfabeto
if(palabra[s]==alfabeto[a]){//si encuentro el simbolo de la palabra en el alfabeto paro y ya tengo la posicion del simbolo en el alfabeto
break;
}
}//find del for de recorrido de alfabeto
cout<<"me estoy desplazando al estado q["<<qtemp<<"]["<<alfabeto[a]<<"] = "<<delta[qtemp][a]<<endl; //imprimendo el estado al cual se desplaza dentro de la matriz
qtemp=delta[qtemp][a];//qtemp pasa a tomar el nuevo valor
cout<<endl<<" presione una tecla para seguir con la transicion"<<endl;
getch();
}
//aqui pasamos a comprobar si el estado en que quedo qtemp pertence a algun estado final
for(int c=0; c<=numfinal-1;c++){//recorriendo los estados finales
if(qtemp==final[c]){//preguntando qtemp pertenece a alguno de los estados finales si es asi es aceptado
cout<<"LA PALABRA ES ACEPTADA POR EL DFA!!!!"<<endl<<"qtemp="<<qtemp<<" final="<<final[c]<<endl;
break;
}
else{//sino es asi y estoy en la ultima posicion de los estados finales quiere decir que el estado en que termino no es un estado final por lo tanto no es aceptado
if(c==numfinal-1)
cout<<"LA PALABRA NO FUE ACEPTADA POR EL DFA!!!"<<endl<<"qtemp="<<qtemp<<" final="<<final[c]<<endl;
}
}
cout<<endl<<"desea examinar otra palabra? "<<endl;//para examinar otra palabra
cin>>seguir;
}//fin del while
}