Como prometido, hoje vou continuar aquele post sobre autômato e fazer em C, porém não vou explicar nada sobe a linguagem C mesmo porque eu já fiz isso em um post antigo, também não vou me aprofundar em explicar cada função.
Primeiro precisamos declarar as bibliotecas que serão usadas no programa
#include <stdio.h>
#include <stdlib.h>
Declararemos agora as variáveis
char *nome;
int estadoAtual=0;
E agora os procedimentos usados
void estadoInicial();
void estadoA();
void estadoA2();
void estadoA3();
void somaEstadoAtual(int estado);
int getEstadoAtual();
O procedimento abaixo é para atualizarmos o estado da variável estadoAtual ele é quem vai informar em que letra da palavra estamos
void somaEstadoAtual(int estado) {
if (estadoAtual < strlen(nome)) {
estadoAtual = estadoAtual + estado;
}
}
Retorna a posição da letra atual
int getEstadoAtual() {
return estadoAtual;
}
EstadoA é o primeiro estado para onde vamos quando recebermos o 1º A, vou explicar como funciona este estado e a partir daí você pode tirar suas próprias conclusões de como funcionam os outros.
void estadoA(){
aqui ele diz em que estado está
printf("Estado A \n");
se o valor do estado atual for menor que o tamanho do autômato então ainda não acabamos precisamos saber que letra estamos
if (getEstadoAtual() < strlen(nome)){
Se a letra atual for igual a A então
if (nome[estadoAtual]==’a') {
soma-se 1 ao estadoAtual
somaEstadoAtual(1);
e chama o procedimento estadoA2
estadoA2();
}
else{
se o a letra atual não for A for B somamos um ao estadoAtual e chamamos o procedimento estadoInicial()
somaEstadoAtual(1);
estadoInicial();
}
}
Se o a letra atual for maior que o tamanho do autômato então a palavra é regeitada
else{
printf("Regeitado");
}
}
EstadoA2 é o primeiro estado para onde vamos quando recebermos o 2º A
void estadoA2(){
fflush(stdin);
printf("Estado A2 \n");
if (estadoAtual < strlen(nome)){
if (nome[estadoAtual]==’a') {
somaEstadoAtual(1);
estadoA3();
}
else{
somaEstadoAtual(1);
estadoInicial();
}
}
else{
printf("Regeitado");
}
}
EstadoA3 é o primeiro estado para onde vamos quando recebermos o 3º A
void estadoA3(){
printf("Estado A3 \n");
if (estadoAtual < strlen(nome)){
somaEstadoAtual(1);
estadoA3();
}
else{
printf("Aceito \n");
system("pause");
exit(0);
}
}
Este é o nosso estado inicial
void estadoInicial(){
printf("Estado Inicial \n");
if (estadoAtual < strlen(nome)){
if (nome[estadoAtual]==’a') {
somaEstadoAtual(1);
estadoA();
}
else{
somaEstadoAtual(1);
estadoInicial();
}
}else{
printf("fim \n");
printf("Regeitado \n");
system("pause");
exit(0);
}
}
Aqui é o main
main()
{
int x=1,i;
nome = (char*) calloc(x,sizeof(char));
printf("Digite [a,b]\n");
fflush(stdin);
gets(nome);
estadoInicial();
printf("\n");
system("pause");
}
pronto é isso, próxima vez vamos fazer em java…

Olá!
nao rodou nao..
está dando varios erros…
Por: Rodrigo em 27/04/2009
às 7:56 pm
Quais erros? posta ae
Por: Elzo Brito em 28/04/2009
às 12:24 am
Brother esse código me deu uma luz bcn sobre automatos, gostaria de saber se vc poderia me ajudar com um codigo de automatos utilizando o conceito de arvores. valeu
Por: Mauricio silva em 10/06/2009
às 4:13 pm
Os erros são:
falta a biblioteca String.h
e alguns caracteres estão errados vc postou acento ao invés de aspas simples :
if (nome[estadoAtual]==’a’)
obrigado me ajudou muito.
Por: Bruno em 14/08/2009
às 10:07 am
Quero implementar um que faça validação de numeros e strings de acordo com o estado.
O seu me deu uma boa noção.
vlw
Por: Bruno em 14/08/2009
às 10:25 am
valew… pra mim rodou perfeito… esse automato tirou várias dúvidas que eu tava em relação a esse assunto
Por: thyago prado em 15/10/2009
às 12:31 pm