You are on page 1of 5

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 autmata finito determinista es una quntupla que denotaremos de manera genrica por donde:

M=(Q,,q0,,F)

Q es un conjunto finito cuyos elementos llamaremos estados. es un alfabeto que llamamos alfabeto de entrada. q0Q es un estado sealado que llamamos estado inicial. F es un subconjunto de Q no vaco, cuyos elementos llamamos estados finales. es una aplicacin de QQ , que llamamos funcin de transicin.

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 1. 2. 3.

programa

esta

dividido Ingresar

en

Menu

de

opciones automata

Verificar

de

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 <stdlib.h> #include <stdio.h> #include <string.h> 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); } }

You might also like