Publicado por: Elzo Brito | 20/04/2009

Autômato em C

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

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

estadoAA

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

estadoAAA

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

estadoinicial

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…


Respostas

  1. Olá!
    nao rodou nao..
    está dando varios erros…

  2. 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

  3. 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.

  4. 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

  5. valew… pra mim rodou perfeito… esse automato tirou várias dúvidas que eu tava em relação a esse assunto


Deixe uma resposta

Sua resposta:

Categorias