É meu primeiro post no fórum, havia descoberto ele há alguns dias procurando sobre o mesmo assunto do título, e acho que vocês poderiam me ajudar. O seguinte código representa um AFD simples para o reconhecimento de constantes reais com exponenciação.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int testePalavra(int contador, char palavra[]);
int testePosicao(int e, int estadoFinal[]);
int main() {
char palavra[] = "+32E-52E";
int estadoFinal[] = {3, 5, 9};
int estadoIncial = 0;
int i;
//+ //- //. //E //Digito
int tabelaTransicoes[10][5] = {{1, 1, 2, -1, 3}, //q0
{-1, -1, 2, -1, 3}, //q1
{-1, -1, -1, -1, 5}, //q2
{-1, -1, 4, 6, 3}, //q3
{-1, -1, -1, -1, 5}, //q4
{-1, -1, -1, 6, 5}, //q5
{ 8, 8, -1, -1, 9}, //q6
{-1, -1, -1, -1, 9}, //q8
{-1, -1, -1, -1, 9}}; //q9
int e = estadoIncial;
printf("Estado Inicial q%d\n", e);
int contador = 0;
for (i = 0; i < strlen(palavra); i++) {
char c = palavra[i];
int coluna;
if (c == '+') {
printf("Caractere lido: %c\n", c);
coluna = 0;
} else if (c == '-') {
printf("Caractere lido: %c\n", c);
coluna = 1;
} else if (c == '.') {
printf("Caractere lido: %c\n", c);
coluna = 2;
} else if (c == 'E') {
printf("Caractere lido: %c\n", c);
coluna = 3;
} else if (isdigit(c)) {
printf("Caractere lido: %c\n", c);
coluna = 4;
} else {
printf("Caractere lido: %c\n", c);
coluna = -1;
printf(" Transicao invalida: Caractere nao aceito!\n");
break;
}
e = tabelaTransicoes[e][coluna];
if (e != -1) {
contador++;
printf(" Transicao para q%d", e);
if (testePosicao(e, estadoFinal))
printf(" | Estado Final");
else
printf(" | Estado Nao-Final");
printf("\n");
}
else{
printf(" Transicao invalida: Erro de leitura!\n");
break;
}
}
if ((testePalavra(contador, palavra)) && (testePosicao(e, estadoFinal))) {
printf("\nA palavra %s foi aceita pelo AFD!", &palavra);
} else{
printf("\nA palavra %s foi recusada pelo AFD!", &palavra);
}
return 0;
}
int testePalavra(int contador, char palavra[]){ //Teste para verificar se a
if (contador == strlen(palavra))
return 1;
else
return 0;
}
int testePosicao(int e, int estadoFinal[]){ //Teste para verificar se a posição em que a palavra terminou é estado final
int i;
int status = 0;
for(i = 0; i < sizeof(estadoFinal); i++){
if (e == estadoFinal[i]){
status = 1;
break;
}
}
return status;
}
int tabelaTransicoes[10][5] = {{1, 1, 2, -1, 3}, //q0
{-1, -1, 2, -1, 3}, //q1
{-1, -1, -1, -1, 5}, //q2
{-1, -1, 4, 6, 3}, //q3
{-1, -1, -1, -1, 5}, //q4
{-1, -1, -1, 6, 5}, //q5
{ 8, 8, -1, -1, 9}, //q6
{ 0, 0, 0, 0, 0}, //q7
{-1, -1, -1, -1, 9}, //q8
{-1, -1, -1, -1, 9}}; //q9
//EDIT 2: Problema corrigido apenas por inserir um novo array na matriz, "q7", com todos os valores 0.
//O porquê eu não sei hahahaha ainda estou em dúvida! Se alguém souber responder, agradeço!
#Estou fazendo um trabalho da faculdade, em que foi pedido um AFD para reconhecimento de constantes reais com exponenciação, e acabei de concluí-lo, porém estou #com um erro totalmente sem sentido, que ainda não consegui compreender o que é.
#A palavra que estou usando como teste demonstra o erro, segundo a tabela de transições, quando eu chego no estado q9 eu não posso mais sair dele (e isso está explícito #na matriz que eu declarei), porém de alguma forma ela está voltando para q5, o que possibilita inserir um E após os dígitos.
#Preciso da resposta urgente, quem puder me ajudar agradeço!
Problema acima corrigido, agora preciso saber o porquê de essa alteração ter resolvido..