Вы находитесь на странице: 1из 9

/*

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 est[MAXEST], sim[MAXSIM], estini, estfin[MAXEST];
int i, j, k, l, lin, col, ren, maxlin, maxcol;
char 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) { // Sale cuando oprime
<Enter>
if (c >= 48 && c <= 57 && (c==48+i)) { // Si esta en el rango
0-9
est[i]= c-48;
col= col+4;
mensaje(i+1);
gotoxy(col,lin);
}
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) { // Sale cuando oprime
<Enter>
if (c >= 48 && c <=57 && (c==48+i)) { // Si esta en el rango
0-9
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);
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); // Realiza la union entre Simbolo-j
Estado-i.
ren= agregacad(j+1, i, ren); // Agrega en la nueva funcion
Simbolo-j Estado-i.
j++;
}
i++;
}
/*
** Despliega la nueva funcion de transicion.
*/
i= 0;
col= 55;
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]) {
// Son iguales
return ren;
}
else { // Son diferentes
est1++;
i= 0;
ban= 1;
}
}
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[sim-1]
[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[sim-1]
[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[sim-1]
[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;
}

Вам также может понравиться