Automata de Pila Determinista

Temas sobre programacion en C/C++ (no Visual C++)

Moderador:ivancp

carlos89cs
Novato
Novato
Mensajes:2
Registrado:Lun Jul 02, 2012 8:18 pm
Automata de Pila Determinista

Mensaje por carlos89cs » Lun Jul 02, 2012 8:23 pm

Reconoce ciertas palabras del orden C(WWr), si desean otros autómatas AFD o APD pueden visitar http://pseudoprogramadores*wordpress*com (recuerden reemplazar * por el .) :o

#include <winbgim.h>
#include <iostream>
#include <cstdlib>
#include<conio.h>
#include <string.>
#include <stdio.h>
#include <stack>
#include <windows.h>
#include <string>
#include <algorithm>
#define MAX 100
HANDLE hCon;

using namespace std;

void waitForLeftMouseClick();
void SetColor(int i);

int grafica()
{

settextstyle(0,0,2);

setcolor(WHITE);
outtextxy(50,70,"TEORIA DE LA COMPUTACION");
outtextxy(70,90," APD [ww^r]");
setcolor(RED);
settextstyle(0,0,1);
setlinestyle(CENTER_LINE,20,2);


circle (108, 260, 40);circle (60, 260, 6);circle (60, 260, 4);circle (60, 260, 2);//0
circle (343, 260, 35);circle (343, 260, 40);//1



setlinestyle(CENTER_LINE,20,2);
setcolor(WHITE);
settextstyle(0,0,2);
outtextxy(85,250,"q0");
outtextxy(320,250,"q1");


setcolor(LIGHTBLUE);
//////conectores
settextstyle(0,0,2);
arc (225, 390, 60, 120, 180);circle (311, 235, 4);//0,1
arc (108, 210, 320, 220, 25);circle (128, 223, 4);//0,0
arc (340, 210, 320, 220, 25);circle (355, 223, 4);//1,1
setcolor(YELLOW);
outtextxy (50, 140,"a, & / X");
outtextxy (50, 157,"b, & / Y");
outtextxy (290, 140,"X, & / a");
outtextxy (290, 157,"Y, & / b");
outtextxy (155, 235,"&, & / &");
return 0;
}


void waitForLeftMouseClick()
{
clearmouseclick(WM_LBUTTONDOWN);
const int DELAY = 50;
int x, y;
while (!ismouseclick(WM_LBUTTONDOWN))
delay(DELAY);
getmouseclick(WM_LBUTTONDOWN, x, y);
}

void reconocedor()
{
stack<char>operation;
string palabra,sub_palabra;
int tam,tamb;
cout<<"\n --> Ingrese palabra: ";
cin>>palabra;
tam=palabra.size();
tamb=tam-1;

string pri_palabra=("c"+palabra.substr(1,tamb/2));//primera parte de la cadena
string sec_palabra=(palabra.substr(tamb/2+1,tamb)+"c");//segunda parte de la cadena

string inv_palabra(sec_palabra.begin(),sec_palabra.end());//invierto sec_palabra
reverse(inv_palabra.begin(),inv_palabra.end());


if(pri_palabra==inv_palabra)//si la primera subcadena es igual a la segunda subcadena
{
settextstyle(0,0,2);
setcolor(GREEN);
outtextxy(100,350,"Palabra Aceptada");
int i=0;
SetColor(10);cout<<"\n\tEmpilando en q0 :"<<endl;
SetColor(6);cout<<"\t[";SetColor(15); cout<<" _ ";SetColor(6);cout<<"]";SetColor(15);
while(i<=tam)
{
for(int k=0;k<i;k++)
{
if(palabra[k]=='a'){SetColor(6);cout<<"\t[";SetColor(15);operation.push('X');SetColor(15); cout<<" X ";SetColor(6);cout<<"]";SetColor(15);}
else if(palabra[k]=='b'){SetColor(6);cout<<"[";SetColor(15);operation.push('Y');SetColor(15); cout<<" Y ";SetColor(6);cout<<"]";SetColor(15);}
else {SetColor(6);cout<<"[";SetColor(15);operation.push('Z');SetColor(15); cout<<" Z ";SetColor(6);cout<<"]";SetColor(15);}
}cout<<endl;
i++;
}
SetColor(10);cout<<"\n\tPasando por la transicion: &, & / & "<<endl<<endl;
SetColor(10);cout<<"\n\tDesempilando en q1 :"<<endl;
for(signed int i = tam; i >=0; i--)
{
for(signed int j = 0; j < i; j++)
{
if(palabra[j]=='a'){SetColor(6);cout<<"\t[";SetColor(15); operation.top(); operation.pop(); cout<<" X ";SetColor(6);cout<<"]";SetColor(15);}
else if(palabra[j]=='b'){SetColor(6);cout<<"\t[";SetColor(15); operation.top(); operation.pop(); cout<<" Y ";SetColor(6);cout<<"]";SetColor(15);}
else {SetColor(6);cout<<"[";SetColor(15); operation.top(); operation.pop(); cout<<" Z ";SetColor(6);cout<<"]";SetColor(15);}
}
cout<<endl;
}
SetColor(6);cout<<"\t[";SetColor(15); cout<<" _ ";SetColor(6);cout<<"]";SetColor(15);
}

else{ settextstyle(0,0,2); setcolor(GREEN); outtextxy(100,350,"Palabra Rechazada"); }
}

void imprimematrix()
{
char a=156;
SetColor(10);
cout<<"\n\t\t\t MATRIZ DEL APD [ww^r]"<<endl<<endl;SetColor(11);
cout<<"\t Alfabeto ("<<a<<"):";SetColor(15);cout<<"a,b"<<endl;SetColor(11);
cout<<"\t Estados :";SetColor(15);cout<<" q0,q1"<<endl;SetColor(11);
cout<<"\t E.Inicial :";SetColor(15);cout<<" q0"<<endl;SetColor(11);
cout<<"\t E.Final :";SetColor(15);cout<<" q1"<<endl<<endl;
SetColor(15);
}

int main(int argc, char *argv[])
{
initwindow(500,500); //abre una ventana de 500 x 500
grafica();
int op,ant,estado;
char palabra[50];
do{

SetColor(10);
system("cls");
cout<<endl;
cout<<"\t\t ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» "<<endl;
cout<<"\t\t º Automata de Pila Deterministico(definido) º "<<endl;
cout<<"\t\t ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n"<<endl;
cout<<"\n\t\t [1] Reconocedor de palabra"<<endl;
cout<<"\n\t\t [2] Salir"<<endl<<endl;
SetColor(15);cout<<"\n\t -> Ingrese opcion: ";
cin>>op;
switch(op)
{
case 1:
{
system("cls");
imprimematrix();
cout<<"\t\t";reconocedor();
getch();
break;}
};
}while(op!=2);
system("PAUSE");
return EXIT_SUCCESS;
}


void SetColor(int i)
{
if(hCon == NULL)
hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon, i);
}

Responder