Anda di halaman 1dari 10

/* afn-afd.cpp Ing.

Rosa Imelda Garcia Chi Programa que convierte un automata finito no determinista en un automata finito determinista con un numero maximo de 10 estados y 2 simbolos. */ #define MAXEST 10 #define MAXSIM 2 #define NULO -1 #define VACIO -2 #include <stdio.h> #include <stdlib.h> #include <iostream.h> #include <conio.h> #include <dos.h> void pantalla(); void mensaje(int); void Beep(); void copia(int, int, int, int); int agregacad(int, int, int); void une(int, int); int igual(int, int, int, int); struct { int est[MAXEST]; } funtra[MAXSIM][MAXEST]; struct { int est[MAXEST]; } nuefuntra[MAXSIM+1][MAXEST]; int main () { int int char

est[MAXEST], sim[MAXSIM], estini, estfin[MAXEST]; i, j, k, l, lin, col, ren, maxlin, maxcol; c;

pantalla(); /* ** */ Inicializacion de variables. i= j= k= 0; while (i < MAXSIM) { // Funcion de transicion. while (j < MAXEST) { while (k < MAXEST) {

funtra[i][j].est[k]= NULO; k++; } k= 0; j++; } j= 0; i++; } i= j= k= 0; while (i < MAXSIM+1) { // Nueva funcion de transicion. while (j < MAXEST) { while (k < MAXEST) { nuefuntra[i][j].est[k]= NULO; k++; } k= 0; j++; } j= 0; i++; } i= 0; while (i < MAXSIM) { // Simbolos. sim[i]= NULO; i++; } i= 0; while (i < MAXEST) { // Estados. est[i]= NULO; i++; } /* ** */ 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);

// Sale cuando oprime <Enter> // Si esta en el rango 0-9

} else { Beep(); gotoxy(col,lin); cout << " "; gotoxy(col,lin); --i; } } /* ** */ 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; } } /* ** */ Introduce el valor del estado inicial. 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);

// Sale cuando oprime <Enter> // Si esta en el rango 0-9

cout << " "; gotoxy(col,lin); c= getche(); } } /* ** */ Introduce los valores de los estados finales. 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; } } /* ** */ Despliega los simbolos. i= 0; col= 1; lin= 12; gotoxy(col,lin); cout << ""; // - Alt+235 col= col+4; while (i < MAXSIM && sim[i] != NULO) { gotoxy(col,lin); cout << sim[i]; col= col+30; i++; } maxcol= i; // Maximo de columna por avanzar. /* ** */ Despliega los estados. i= 0; col= 1; lin= 13;

while (i < MAXEST && est[i] != NULO) { gotoxy(col,lin); cout << "q" << est[i]; lin++; i++; } maxlin= i; // Maximo de linea por avanzar. /* ** */ Introduce los valores de la funcion de transicion.

i= j= 0; col= 4; lin= 13; while (i < maxlin) { while (j < maxcol) { gotoxy(col-1,lin); cout << "{"; gotoxy(col,lin); cout << "q"; for (k=0; k < MAXEST && (c=getche()) != 13; ++k) { if ((c >= 48 && c <=57) || (c == 'f' || c == 'F')) { // Si esta en el rango 0-9 if (c >= 48 && c <=57) // o es vacio () la letra f. funtra[j][i].est[k]= c-48; else { funtra[j][i].est[k]= VACIO; col= col+3; break; } col= col+3; gotoxy(col,lin); cout << "q"; } else { Beep(); gotoxy(col+1,lin); cout << " "; gotoxy(col+1,lin); --k; } } j++; gotoxy(col,lin); cout << "}"; col= 34; } j= 0;

col= 4; lin++; i++; } /* ** */ Construye la nueva funcion de transicion (primer renglon). i= j= k= 0; while (i < 1) { // Se copian el primer renglon de la funcion de transicion while (j < MAXSIM+1) { // en la nueva funcion de transicion. while (k < MAXEST) { if (j==0) { nuefuntra[j][i].est[k]= 0; break; } else { nuefuntra[j][i].est[k]= funtra[j-1][i].est[k]; k++; } } k= 0; j++; } j= 0; i++; } ren= 0; ren= agregacad(0+1, 0, ren); // Agrega en la nueva funcion Simbolo-0 Estado-0. ren= agregacad(1+1, 0, ren); // Agrega en la nueva funcion Simbolo-1 Estado-0. /* ** */ Construye los siguientes renglones de la nueva funcion de transicion.

i= 1; while (i <= ren) { j= 0; while (j < maxcol) { une(j+1, i); ren= agregacad(j+1, i, ren); Estado-i. j++; } i++; } /* ** Despliega la nueva funcion de transicion. */ i= 0; col= 55;

// Realiza la union entre Simbolo-j Estado-i. // Agrega en la nueva funcion Simbolo-j

lin= 12; gotoxy(col,lin); cout << "'"; // - Alt+235 col= col+4; while (i < MAXSIM && sim[i] != NULO) { gotoxy(col,lin); cout << sim[i]; col= col+4; i++; } maxcol= i; l= 0; col= 55; lin= 13; while (l <= ren) { gotoxy (col,lin); cout << "r" << l; col= col+4; i= 0; while ( i < maxcol) { j= 0; while (j <= ren) { k= igual(0, j, i+1, l); if ( k != -1) { gotoxy(col,lin); cout << "r" << k; col= col+4; break; } else j++; } i++; } l++; col= 55; lin++; } } void pantalla() { clrscr(); gotoxy(5,1); cout << "AUTOMATA FINITO NO 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(5,23); cout << "Utilice la letra f para indicar vacio ()"; // - Alt+237 } 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(); } void copia(int sim, int est, int sim1, int est1) { int i; i= 0; while (i < MAXEST) { nuefuntra[sim][est].est[i]= nuefuntra[sim1][est1].est[i]; i++; } } int agregacad(int sim, int est, int ren) { int i, est1, ban; i= est1= 0; ban= 1; while (est1 <= ren) { while (nuefuntra[0][est1].est[i] != NULO && ban) {

if (nuefuntra[0][est1].est[i] == nuefuntra[sim][est].est[i]) i++; else ban= 0; } if (ban && nuefuntra[0][est1].est[i] == nuefuntra[sim][est].est[i]) { iguales return ren; } else { // Son diferentes est1++; i= 0; ban= 1; // Son

} } copia(0, est1, sim, est); return est1; } void une(int sim, int est) { int i, j, k, aux, ban; i= j= aux= 0; ban= 1; if (nuefuntra[0][est].est[i] == VACIO) { nuefuntra[0+1][est].est[i] = VACIO; nuefuntra[1+1][est].est[i] = VACIO; } else { while (nuefuntra[0][est].est[i] != NULO) { while (funtra[sim-1][nuefuntra[0][est].est[i]].est[j] != NULO) { if (ban) { // La primera vez acepta el primer estado. nuefuntra[sim][est].est[j]= funtra[sim1][nuefuntra[0][est].est[i]].est[j]; aux++; ban= 0; } else if (funtra[sim-1][nuefuntra[0][est].est[i]].est[j] != VACIO) { // Si se lee un estado vacio, no se agrega. k= 0; if (nuefuntra[sim][est].est[k] == VACIO) // Si en la primera vez se agrego un estado vacio, se sustituye cuando se lee el siguiente. nuefuntra[sim][est].est[k]= funtra[sim1][nuefuntra[0][est].est[i]].est[j]; else { while (k < aux) // Valida que exista el estado solo una vez. if ((nuefuntra[sim][est].est[k] != funtra[sim-1][nuefuntra[0][est].est[i]].est[j]) && (nuefuntra[sim][est].est[k] != NULO))

k++; else break; if (nuefuntra[sim][est].est[k] == NULO) { Si no existe el estado lo agrega. nuefuntra[sim][est].est[k]= funtra[sim1][nuefuntra[0][est].est[i]].est[j]; aux++; } } } j++; } j= 0; i++; } // Ordena la cadena de estados (Metodo de la Burbuja). i= 0; while (i < aux-1) { j= 0; while(j < aux-i) { if ((nuefuntra[sim][est].est[j] > nuefuntra[sim][est].est[i+1]) && (nuefuntra[sim][est].est[j+1] != NULO)) { k= nuefuntra[sim][est].est[j]; nuefuntra[sim][est].est[j]= nuefuntra[sim][est].est[j+1]; nuefuntra[sim][est].est[j+1] = k; } j++; } i++; } } } int igual (int sim, int est, int sim1, int est1) { int i; i= 0; while (nuefuntra[sim][est].est[i] != NULO) { if (nuefuntra[sim][est].est[i] == nuefuntra[sim1][est1].est[i]) i++; else return -1; } if (nuefuntra[sim][est].est[i] == nuefuntra[sim1][est1].est[i]) return est; else return -1; }

//

Anda mungkin juga menyukai