no pido que me lo hagan pues ya comenze a programarlo de hecho ya tengo todo solo en una funcion que llamo analizar_transiciones(etc); la verdad no logro acomodar mis ideas, el problema que tengo en si es que los estados cambien de acuerdo a la cadena ingresada por el usuario, el programa debe pedir toda la quintupla es decir:
conjunto de estados
estado inicial
estado(s) final(es)
lenguaje del automata
y la tabla de transiciones, por ejemplo estado q0 con respecto a una "a" pasa al estado q1
les pongo mi codigo a continuacion si gustan primero corranlo para que vean lo que hace, donde tengo problemas o mas bien no se que diablos hacer para "seguir" la cadena ingresada por el usuario, si mi codigo esta algo confuso diganme y os explicare que es, lo estaba intentando hacer con arreglos de estructuras cada estructura es un estado pero creo que ese no es el camino je je saludos y disculpen las molestias, espero no me insulten ja ja ja o me traten de lammer, creo que con mi codigo demuestro algun conocimiento
PD: esta hecho en C, utilizo el compilador en modo DOS, TC, BC como lo conozcan jeje, bajo win xp(valga la redundancia XD)
si esta muy abstracto espero compartan sus ideas o el "así lo haria yo" digo para que no gasten valioso tiempo tratando de parchar mi program je je
Código:
//importante: los estados se almacenan como enteros es decir el estado q0 en realidad solo es 0, no se guardan como cadena "q0"
//le pongo la "q" cuando muestro los estados para que se vea mejor o se entienda, bueno ya me revolvi
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <dos.h>
struct estado
{
int numero, destino[10];
char lenguaje[10];
};
typedef struct estado Estado;
void pedir_estados(int *estados,int *inicial,int final[10],int *aux);
void pedir_lenguaje(char lenguaje[10]);
int mostrar(char cadena[10]);
void transicion(int *estados,int *tam,char lenguaje[10],int transiciones[10][10]);
void mostrar_transiciones(int *estados,int *tam,char lenguaje[10],int transiciones[10][10]);
void asignar_estructura(int *estados,char lenguaje[10],int *tam,int transiciones[10][10],Estado Estructura[10]);
int analizar_transiciones(int *inicial,int *tam,int *tam2,int *aux,int *final,Estado Estructura[10],char cadena[10]);
void pedir_cadena(char cadena[10],int *tam2);
void main()
{
Estado Estructura[10];
char lenguaje[10];
char cadena[10];
int final[10];
int inicial;
int estados;
int transiciones[10][10]; //guarda los estados "destino" en la tabla de transiciones
int cont;
int tam; //tama¤o del lenguaje
int tam2;
int aux; //total de estados finales
int aceptar; //bandera que nos auxila a saber si la cadena fue aceptada o no
pedir_estados(&estados,&inicial,final,&aux);
pedir_lenguaje(lenguaje);
tam=mostrar(lenguaje);
transicion(&estados,&tam,lenguaje,transiciones);
mostrar_transiciones(&estados,&tam,lenguaje,transiciones);
asignar_estructura(&estados,lenguaje,&tam,transiciones,Estructura);
mostrar_transiciones(&estados,&tam,lenguaje,transiciones);
//este ciclo no es importante solo recuerda al usuario cuales son los estados finales
printf("\n\n\tEstados finales: ");
for(cont=0;cont<aux;cont++)
{
printf(" q%d ",final[cont]);
}
////////////////////////////////////////////////////////////////////////////////////
pedir_cadena(cadena,&tam);
aceptar=analizar_transiciones(&inicial,&tam,&tam2,&aux,final,Estructura,cadena);
if(aceptar>0)
{
printf("\n\n\tLa cadena es aceptada");
}
else
{
printf("\n\n\tLa cadena no es aceptada");
}
getch();
}
void pedir_estados(int *estados,int *inicial,int final[10],int *aux)
{
//int final[10];
//int inicial;
int cont;
//int aux;//numero de estados finales
//int estados;
clrscr();
printf("\n\tInserta el numero de estados: ");
fflush(stdin);
scanf("%d",&*estados);
printf("\n\n");
for(cont=0;cont<*estados;cont++)
{
delay(400);
printf("\n\n\tq%d",cont);
}
printf("\n\n\tEstado inicial: q");
fflush(stdin);
scanf("%d",&*inicial);
printf("\n\n\tCuantos estados finales tiene el automata?: ");
fflush(stdin);
scanf("%d",&*aux);
for(cont=0;cont<*aux;cont++)
{
printf("\n\n\tingresa el estado final %d: q",cont+1);
fflush(stdin);
scanf("%d",&final[cont]);
}
}
void pedir_lenguaje(char lenguaje[10])
{
printf("\n\n\tIngresa el lenguaje del automata,junto, ejemplo: abc\n\t: ");
fflush(stdin);
gets(lenguaje);
}
int mostrar(char cadena[10])
{
int cont;
int tam;
tam=strlen(cadena);
printf("\n\n\t");
for(cont=0;cont<tam;cont++)
{
printf(" -%c- ",cadena[cont]);
}
return tam;
}
void transicion(int *estados,int *tam,char lenguaje[10],int transiciones[10][10])
{
int cont;
int cont2;
printf("\n\n\tIngrese la tabla de transiciones\n");
for(cont=0;cont<*estados;cont++)
{
for(cont2=0;cont2<*tam;cont2++)
{
printf("\n\tq%d con respecto a una -> %c: q",cont,lenguaje[cont2]);
scanf("%d",&transiciones[cont][cont2]);
}
}
printf("\n\n\tCarga de transiciones completada con exito");
}
void mostrar_transiciones(int *estados,int *tam,char lenguaje[10],int transiciones[10][10])
{
int cont;
int cont2;
printf("\n\n\tTabla de transiciones\n");
for(cont=0;cont<*estados;cont++)
{
for(cont2=0;cont2<*tam;cont2++)
{
printf("\n\n\tq%d con respecto a una -> %c: q%d",cont,lenguaje[cont2],transiciones[cont][cont2]);
}
}
printf("\n\n\tCarga de transiciones completada con exito");
}
void asignar_estructura(int *estados,char lenguaje[10],int *tam,int transiciones[10][10],Estado Estructura[10])
{
int cont,cont2;
for(cont=0;cont<*estados;cont++)
{
Estructura[cont].numero=cont; //asigna el numero del estado
for(cont2=0;cont2<*tam;cont2++)
{
Estructura[cont].lenguaje[cont2]=lenguaje[cont2]; //asigna el lenguaje
Estructura[cont].destino[cont2]=transiciones[cont][cont2]; //asigna el estado al que llevara el lenguaje
}
}
}
//pendiente, implementacion de escructura "Estado"
int analizar_transiciones(int *inicial,int *tam,int *tam2,int *aux,int *final,Estado Estructura[10],char cadena[10])
{
int cont,cont2;
int estado_activo;
int bandera=0;
estado_activo=*inicial;
for(cont=0;cont<*tam2;cont++)
{
for(cont2=0;cont2<*tam;cont2++)
{
if(cadena[cont]==Estructura[cont].lenguaje[cont2])
{
estado_activo=Estructura[cont].destino[cont2];
}
/*else
{
cont2++;
}*/
}
}
for(cont=0;cont<*aux;cont++)
{
if(estado_activo==final[cont])
{
bandera++;
}
}
return bandera;
}
void pedir_cadena(char cadena[10],int *tam2)
{
printf("\n\n\tIngresa la cadena a evaluar, maximo 10 caracteres: ");
fflush(stdin);
gets(cadena);
*tam2=strlen(cadena);
}
EI: juntando mensajes.
¬¬ gracias
ja ja aja ja ja jaaj ja ja ja
ya termine el program estoy por la version 3.5 hoy pienso hacer la 4
el codigo que meti al principio corresponde a la version 1 ja ja ja ja estructuras que risa me dan, resolvi mi problema con arreglos bidimensionales tal vez lo ideal en este problem, saludos, creo k nadie ha entrado aparte de yo XD