Neste artigo vamos ver como programar um autómato em C.
Quero contudo verificar se uma palavra (string) introduzida pelo utilizador cumpre certos requisitos.
Vamos dar o exemplo da composição da data:
22-04-2001
Uma data contém primeiramente dois dígitos, um hífen, mais dois dígitos, outro hífen e finalmente quatro dígitos neste formato que é desejado para o exemplo.
(Referir que não vamos dar importância ao conjunto de números por exemplo nos meses, visto que no calendário só existem meses de 1-12, nos vamos alargar o nosso leque de aceitação, portanto aceitamos todos os numero, terão de ser é dois.)
Muito bem, então como vamos fazer isto?
É muito fácil, os passos para a elaboração de um problema deste género tem a seguinte composição:
- Desenhar o nosso autómato
- Fazer a representação da tabela de transição de estados
- Computacionar o autómato
digitodigitohífendigitodigitohífendigitodigitodigitodigito
99-99-2221
- Q0 -> se dígito vai para q1 senão vai para q11 o estado de erro
- Q1 -> se dígito vai para q2 senão vai para q11 o estado de erro
- Q2 -> se for hífen vai para q3 senão para q11 o estado de erro
- Pedir ao utilizador uma string (a string de analise)
- Declarar uma variável (estado actual) para percorrer o autómato
- Basicamente o nosso autómato vai ser definido por uma matriz, muito parecido com a tabela a cima.
- /*###################################
- # CODE BY Pedro Tavares #
- # #
- ####################################*/
- #include <stdio.h>
- //função que permite obter o estado do automato
- int delta(int M[12][2],int estado, char ch){
- //se o estado entrar como -1 sabemos que já não é valido
- if(estado==-1)
- return(–1);
- //verificar se o caracter que entra é um digito
- if(ch>=‘0’ && ch<=‘9’)
- return(M[estado][0]);
- //verificar se é um hifen
- if(ch==‘-‘)
- return(M[estado][1]);
- if(estado==-1)
- return(–1);
- else
- return –1;
- }
- int main(){
- //declaracao da matriz com todos os estados
- int M[12][2]={
- {1,11},
- {2,11},
- {11,3},
- {4,11},
- {5,11},
- {11,6},
- {7,11},
- {8,11},
- {9,11},
- {10,11},
- {11,11},
- {11,11}
- };
- char buff[15];
- int i,estado=0;
- printf(“Intruduza a data..n“);
- gets(buff);
- //percorrer todos os caracteres da string
- for(i=0;i<strlen(buff);i++)
- estado=delta(M,estado,buff[i]);
- //verificar se foi aceite ou nao
- if(estado==10)
- printf(“data correctan“);
- else if(estado==-1)
- printf(“data incorrectan“);
- else
- printf(“data incorrectan“);
- return(0);
- }
- /*###################################
- # CODE BY Pedro Tavares #
- # #
- ####################################*/
- #include <stdio.h>
- #include <string.h>
- int delta(int M[12][2],int estado, char ch){
- int i=0;
- if(estado==-1)
- return(–1);
- if(ch>=‘0’ && ch<=‘9’){
- return(M[estado][0]);
- }
- if(ch==‘-‘){
- return(M[estado][1]);
- }
- if(estado==-1)
- return(–1);
- else
- return –1;
- }
- int main(){
- int M[12][2]={
- {1,11},
- {2,11},
- {11,3},
- {4,11},
- {5,11},
- {11,6},
- {7,11},
- {8,11},
- {9,11},
- {10,11},
- {11,11},
- {11,11}
- };
- char buff[15];
- int i,estado=0;
- printf(“Intruduza a data..n“);
- scanf(“%s”,buff);
- for(i=0;i<strlen(buff);i++){
- if(estado==-1)
- break;
- switch(estado){
- case 0:
- if(atoi(&buff[i])<0 || atoi(&buff[i])>31)
- estado=-1;
- break;
- case 3:
- if(atoi(&buff[i])<0 || atoi(&buff[i])>12)
- estado=-1;
- break;
- }
- estado=delta(M,estado,buff[i]);
- }
- if(estado==10)
- printf(“data correctan“);
- else if(estado==-1)
- printf(“data incorrectan“);
- else
- printf(“data incorrectan“);
- return(0);
- }





