Automata Finito Determinista en C
Short Description
Download Automata Finito Determinista en C...
Description
Automata Finito Determinista en C++
En esta ocacion les traigo la implementacion de un AFD en lenguaje C++, primeramente una breve
definicion
de
lo
que
es.
Un autómata finito determinista es una quíntupla que denotaremos de manera genérica por
M=(Q,Σ,q0,δ,F)
donde:
Q es un conjunto finito cuyos elementos llamaremos estados.
Σ es un alfabeto que llamamos alfabeto de entrada.
q0∈Q es un estado señalado que llamamos estado inicial.
F es un subconjunto de Q no vacío, cuyos elementos llamamos estados finales.
δ es una aplicación de Q×Σ→Q , que llamamos función de transición.
Para la implementacion se utiliza una matriz de transicion convirtiendo los simbolos y letras del alfabeto en indices de la matriz donde los estados son las FILAS y los simbolos son las COLUMNAS,
por
ejemplo:
Tenemos un afabeto Σ = {a, b, c}, entonces en la matriz de transicion tomara la letra 'a' como indice
0
,
letra
'b'
indice
1
y
letra
'c'
indice
2
Lo mismo seria para el alfabeto, pero alli no interesa que letra representa si no cuantos estados tiene y cual es su estado inicial y cuales son sus estados finales. En el programa que
implemente solo pedira eso cantidad de estados y pregunta por el estado inicial y los finales.
El
programa
esta
dividido
1. 2.
en
Menu
de
3
Ingresar Verificar
opciones automata
de
3.
palabra Salir
Ingresar automata: Tendremos que ingresar la cantidad de simbolos y la cantidad de estados. luego tendremos que ingresar los simbolos del alafabeto, los estados los genera solo no es necesario ingresarlo. Seguidamente tendremos que ingresar la matriz de transicion donde no olvidemos que remplazamos los nombres de los estados por numero que serian los indices.
Alli tenemos un ejemplo, donde s1 tomaria el valor de 0 y s2 el valor de 1y asi tendriamos que ingresarlo en el programa cuando pida la matriz.
Seguidamente tenemos que indicar cual es el estado inicial, supongamos que fuese S1entonces tendriamos que ingresar 1 ó 2 si fuese S2 lo mismo seria para los estados finales.
Verificar palabra: Es la parte donde probramos nuestro automata, tendremos que ingresarla de acuerdo a nuestro alfabeto de simbolos de ingresamos en la parte de "ingresar automata".
Finalmente les dejo el codigo implementado en C++, lo hize lo mas entendible posible.
#include #include #include struct lista_elementos { int estado; struct lista_elementos *a; struct lista_elementos *b; }; typedef struct lista_elementos nodo; void crear(nodo *q0,nodo *q1,nodo *q2,nodo *q3, nodo *actual, nodo *anterior); void mostrar(nodo *pt,nodo *pt2,int j,char i); main() { nodo *q0,*q1,*q2,*q3,*actual,*anterior; int j=0,i=0,tamano=0,novalido=0; char cadena[100]; actual=(nodo*)malloc(sizeof(nodo)); q0=(nodo*)malloc(sizeof(nodo)); q1=(nodo*)malloc(sizeof(nodo)); q2=(nodo*)malloc(sizeof(nodo)); q3=(nodo*)malloc(sizeof(nodo)); crear(q0,q1,q2,q3,actual,anterior); printf("\n\n\n\t AFD Que no acepte las subcadenas aa y bb\n\n");
printf(" Ingrese Cadena: "); gets(cadena); tamano = strlen(cadena); while (i < tamano && novalido==0){ j=i+1; switch(cadena[i]){ case 'a': if(actual->a==NULL){ anterior=q0; actual=anterior->a; mostrar(anterior,actual,j,cadena[i]); }else{ anterior=actual; actual=anterior->a; mostrar(anterior,actual,j,cadena[i]); } break; case 'b': if(actual->b==NULL){ anterior=q0; actual=anterior->b; mostrar(anterior,actual,j,cadena[i]); }else{ anterior=actual; actual=anterior->b; mostrar(anterior,actual,j,cadena[i]);} break; default: novalido=1; break; } i++; } if(actual->estado==1||actual->estado==4||novalido==1){ printf("\n\n\t ------------------------- "); printf("\n\t --- Cadena Rechazada! --- \n"); printf("\t ------------------------- \n\n"); } else{ printf("\n\n\t ------------------------ "); printf("\n\t --- Cadena Aceptada! --- \n"); printf("\t ------------------------ \n\n"); } getchar(); } void crear(nodo *q0,nodo *q1,nodo *q2,nodo *q3,nodo *actual, nodo *anterior) { q0->a=q2; q0->b=q1; q1->a=q2; q1->b=q3; q2->a=q3;
q2->b=q1; q3->a=q3; q3->b=q3; q0->estado=1; q1->estado=2; q2->estado=3; q3->estado=4; actual->a=NULL; actual->b=NULL; anterior->a=NULL; anterior->b=NULL; } void mostrar(nodo *pt,nodo *pt2, int j,char i) { int fuente=0,destino=0; fuente=pt->estado;destino=pt2->estado; fuente=fuente-1;destino=destino-1; printf("\n\n Movimiento: %d",j); printf(" Para el simbolo: %c",i); if(j==0){ printf("\n\n\t Desde el Inicio");} else{ printf("\n\n\t Del Estado: q%d",fuente); printf("\t A el Estado: q%d",destino); } }
View more...
Comments