/* ** ** ** ** */
Programa Autor Descripcion
: afd.cpp : Ing. Rosa Imelda Garcia Chi : Programa que implanta un automata finito determinista con un numero maximo de 10 estados y 2 simbolos.
#define MAXEST 10 #define MAXSIM 2 #define NULO -1 #include <stdio.h> #include <stdlib.h> #include <iostream.h> #include <conio.h> #include <dos.h> void pantalla(); void mensaje(int); void Beep(); int main () { int est[MAXEST], sim[MAXSIM], estini, estfin[MAXEST], funtra[MAXSIM][MAXEST], cad[MAXEST]; int i, j, lin, col, maxlin, maxcol, ap; char c; pantalla(); /* ** */
Inicializacion de variables. i= j= 0; while (i < MAXSIM) { // Funcion de transicion. while (j < MAXEST) { funtra[i][j]= NULO; j++; } j= 0; i++; } i= 0; while (i < MAXSIM) { // Simbolos. sim[i]= NULO; i++; }
i= 0; while (i < MAXEST) { est[i]= NULO; i++; } /* ** */
/* ** */
// Estados.
Introduce los valores de los estados. mensaje(0); col= 9; lin= 7; gotoxy(col,lin); for (i=0; i < MAXEST && (c=getche()) != 13; ++i) { if (c >= 48 && c <= 57 && (c==48+i)) { est[i]= c-48; col= col+4; mensaje(i+1); gotoxy(col,lin); } else { Beep(); gotoxy(col,lin); cout << " "; gotoxy(col,lin); --i; } }
// Sale cuando oprime <Enter> // Si esta en el rango 0-9
Introduce los valores de los simbolos. mensaje(0); col= 8; lin= 8; gotoxy(col,lin); for (i=0; i < MAXSIM && (c=getche()) != 13; ++i) { if (c >= 48 && c <=57 && (c==48+i)) { sim[i]= c-48; col= col+2; mensaje(i+1); gotoxy(col,lin); } else { Beep(); gotoxy(col,lin); cout << " "; gotoxy(col,lin); --i;
// Sale cuando oprime <Enter> // Si esta en el rango 0-9
}
}
/* ** */
Introduce el valor del estado inicial.
/* ** */
Introduce los valores de los estados finales.
/* ** */
Despliega los simbolos.
col= 9; lin= 9; mensaje(10); gotoxy(col,lin); i=1; c= getche(); while (i) { if (c >= 48 && c <=57) { // Si esta en el rango 0-9 estini= c-48; i= 0; } else { Beep(); gotoxy(col,lin); cout << " "; gotoxy(col,lin); c= getche(); } }
col= 9; lin= 10; mensaje(10); gotoxy(col,lin); for (i=0; i < MAXEST && (c=getche()) != 13; ++i) { if (c >= 48 && c <=57) { // Si esta en el rango 0-9 estfin[i]= c-48; col= col+4; gotoxy(col,lin); } else { Beep(); gotoxy(col,lin); cout << " "; gotoxy(col,lin); --i; } }
i= 0; col= 5; lin= 12; gotoxy(col,lin); cout << "ĂŤ"; // ĂŤ - Alt+235 while (i < MAXSIM && sim[i] != NULO) { col= col+4; gotoxy(col,lin); cout << sim[i]; i++; } maxcol= i; /* ** */
Despliega los estados.
/* ** */
Introduce los valores de la funcion de transicion.
i= 0; col= 5; lin= 13; while (i < MAXEST && est[i] != NULO) { gotoxy(col,lin); cout << "q" << est[i]; lin++; i++; } maxlin= i;
i=j=0; col= 8; lin= 13; while (i < maxlin) { while (j < maxcol) { gotoxy(col,lin); cout << "q"; c=getche(); if (c >= 48 && c <=57) { // Si esta en el rango 0-9 funtra[j][i]= c-48; col= col+4; j++; } else { Beep(); gotoxy(col+1,lin); cout << " "; } } lin++;
} /* ** */
j= 0; col= 8; i++;
Introduce cadena a evaluar. do { i= 0; while (i < MAXEST) { cad[i]= NULO; i++; } col= 58; lin= 12; mensaje(11); gotoxy(col,lin); clreol(); for (i=0; i < MAXEST && (c=getche()) != 13; ++i) { if (c >= 48 && c <=49) { // Si esta en el rango 0-1 cad[i]= c-48; col= col+1; gotoxy(col,lin); } else { Beep(); gotoxy(col,lin); cout << " "; gotoxy(col,lin); --i; } }
/* ** */
Evalua cadena en la funcion de transicion.
/* ** */
Busca el estado de la ultima transicion en los estados finales.
ap= estini; i= 0; while (i < MAXEST && cad[i] != NULO) { ap= funtra[cad[i]][ap]; i++; }
i= 0; while (i < MAXEST && estfin[i] != ap && estfin[i] != NULO) i++; gotoxy(50,13);
if (estfin[i]==ap) cout << " Cadena aceptada !"; else cout << " Cadena NO aceptada !"; gotoxy(50,14); cout << "¨Desea analizar otra cadena?"; gotoxy(50,15); cout << "(S/N) "; c= getche(); gotoxy(50,13); clreol(); gotoxy(50,14); clreol(); gotoxy(50,15); clreol(); } while (c == 'S' || c == 's'); } void pantalla() { clrscr(); gotoxy(5,1); cout << "AUTOMATA FINITO DETERMINISTA"; gotoxy(5,3); cout << "En donde:"; gotoxy(5,5); cout << "Q=Estados ä=Simbolos q0=Estado Inicial F=Estados Finales"; gotoxy(5,7); cout << "Q={q , q , q , q , q , q , q , q , q , q }"; gotoxy(5,8); cout << "ä={ , }"; // ä - Alt+228 gotoxy(5,9); cout << "q0=q "; gotoxy(5,10); cout << "F={q , q , q , q , q , q , q , q , q , q }"; gotoxy(50,12); cout << "Cadena: "; } void mensaje(int i) { gotoxy(5,24); clreol(); if (i==10) cout << "Escriba digitos del 0 al 9. Si desea avanzar de linea presione <Enter>"; else if (i==11) cout << "Escriba digitos del 0 al 1. Si desea avanzar de linea presione <Enter>"; else cout << "Escriba el digitos " << i << ". Si desea avanzar de linea presione <Enter>"; } void Beep() { cout << '\a'; gotoxy(5,23); cerr << "Error. Caracter fuera de rango.";
}
sleep(2); gotoxy(5,23); clreol();