You are on page 1of 7

Autmata Finito Determinista Cdigo C++

En esta ocasin les traigo la implementacin de un AFD en lenguaje C++,


primeramente una breve definicin de lo que es.
Un autmata finito determinista es una quntupla que denotaremos de
manera genrica
por M=(Q,,q0,,F)
donde:

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 implementacin se utiliza una matriz de transicin convirtiendo los


smbolos y letras del alfabeto en ndices de la matriz donde los estados son
las FILAS y los smbolos son las COLUMNAS, por ejemplo:

Tenemos un alfabeto = {a, b, c}, entonces en la matriz de transicin


tomara la letra 'a' como ndice 0 , letra 'b' ndice 1 y letra 'c' ndice 2
Lo mismo seria para el alfabeto, pero all no interesa que letra representa si
no cuantos estados tiene y cul es su estado inicial y cules son sus estados
finales. En el programa que implemente solo pedir eso cantidad de
estados y pregunta por el estado inicial y los finales.
El programa est dividido en Men de 3 opciones
1. Ingresar autmata
2. Verificar de palabra
3. Salir
Ingresar autmata: Tendremos que ingresar la cantidad de smbolos y la
cantidad de estados. Luego tendremos que ingresar los smbolos del
alfabeto, los estados los genera solo no es necesario ingresarlo.
Seguidamente tendremos que ingresar la matriz de transicin donde no
olvidemos que remplazamos los nombres de los estados por nmero que
seran los ndices.

All tenemos un ejemplo, donde s1 tomara el valor de 0 y s2 el valor de 1y


as tendramos que ingresarlo en el programa cuando pida la matriz.
Seguidamente tenemos que indicar cul es el estado inicial, supongamos
que fuese S1entonces tendramos que ingresar 1 2 si fuese S2 lo mismo
seria para los estados finales.

Verificar palabra: Es la parte donde probamos nuestro autmata,


tendremos que ingresarla de acuerdo a nuestro alfabeto de smbolos de
ingresamos en la parte de "ingresar autmata".

Implementacin
/*
* C++ - Autmata Finito Determinista
* Copyright 2014 Martin Cruz Otiniano
* Descripcin: Ingresa autmata, verifica palabra
* Site: martincruz.me
*/

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <stdlib.h>
#define MAX 100
using namespace std;

void MostrarEstados(vector<int> v){


cout << "\n\n ESTADOS DEL AUTOMATA \n\n";
for(int i=0; i<v.size(); i++){
cout << " " << i <<" --> q" << v[i] << endl;
}
}

void IngresaAutomata(vector<int> &E, vector<char> &S, int T[MAX][MAX]){

int numE; // Numero de estados

int numS; // Numero de smbolos


char c;

// Generando estados
cout << "\n Cantidad de Estados: ";
cin >> numE;
for(int i=0; i<numE; i++){
E.push_back(i);
}

// Ingresando smbolos
cout << "\n Cantidad de Simbolos: "; cin >> numS;
cout << endl;
for(int i=0; i<numS; i++){
cout << "\t Simbolo " << i+1 << " : ";
cin >> c;
S.push_back(c);
}
sort(S.begin(),S.end()); // Ordenando smbolos

// Ingresando tabla de transiciones


cout << "\n INGRESE TABLA DE TRANSICIONES \n\n";
for(int i=0; i<numE; i++){
for(int j=0; j<numS; j++){
cout << "\t T["<<i<<"]["<<j<<"] : ";
cin >> T[i][j];
}
}

// Mostrando tabla de transiciones


cout << "\n\n TABLA DE TRANSICIONES \n\n";
for(int i=0; i<numE; i++){
for(int j=0; j<numS; j++){
cout << "\t" << T[i][j] << " ";
}
cout << endl;
}
}

void menu(){
cout << "\n\t\t AUTOMATA FINITO DETERMINISTA\n\n";
cout << "\t 1. Ingresar Automata \n";
cout << "\t 2. Verificar palabra
\n";
cout << "\t 3. Salir
\n";
cout << "\t Ingrese opcion: ";
}

bool VerificarPalabra(vector<int> w, int T[MAX][MAX], int q0, vector<int>qf){

int q, s;
q = q0;
bool EstadoVerificacion = false;

for(int i=0; i<w.size(); i++){

s = w[i];
q = T[q][s];
}

for(int i=0; i<qf.size(); i++){


if(q==qf[i]){
EstadoVerificacion = true;
break;
}
}
return EstadoVerificacion;
}

void ConvertirPalabra(string palabra, vector<char>S, vector<int>&w){

int i, k=0;

while(w.size()!=palabra.length()){
for(i=0; i<S.size(); i++){
if(palabra[k]==S[i]){
w.push_back(i);
}
}
k++;
}
}
/*
Funcion Principal
--------------------------------------------------------------*/
int main()
{
vector<int> Estados;
vector<char> Simbolos;
int Transiciones[MAX][MAX];
int q0;
// Estado inicial
vector<int>qf;
// Estados finales
vector<int>w;
bool AutomataIngresado = false; // Aun no se ha ingresado autmata

int op, temp, tam;

do{
menu(); cin>>op;

switch(op){

case 1:
Estados.clear();
Simbolos.clear();
qf.clear();

IngresaAutomata(Estados, Simbolos, Transiciones);


MostrarEstados(Estados);

cout << "\n Ingrese estado inicial: ";


cin >> q0;

cout << "\n Cuantos de estados finales hay?: ";


cin >> tam;

cout << endl;


for(int i=0; i<tam; i++){
cout << "\t Numero de estado final: ";
cin >> temp;
qf.push_back(temp);
}

AutomataIngresado = true;
break;

case 2:

if(AutomataIngresado){
string palabra;
w.clear();
bool EstadoVerificacion = false;
cout << "\n Ingrese palabra: ";
cin>> palabra;

ConvertirPalabra(palabra, Simbolos, w);

EstadoVerificacion = VerificarPalabra(w, Transiciones, q0, qf);

if(EstadoVerificacion){
cout << "\n\t Palabra aceptada \n\n";
}
else{
cout << "\n\t Palabra no aceptada \n\n";
}
}
else{
cout << "\n Automata no ingresado..! \n";
}

break;

case 3:
exit(0);

default:
cout << "\n\tOpcion incorrecta..!\n";

//cout << "\n\n"; system("pause"); system("cls");

}while(op!=3);
}

You might also like