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);
-
}

Pedro Tavares is a professional in the field of information security working as an Ethical Hacker/Pentester, Malware Researcher and also a Security Evangelist. He is also a founding member at CSIRT.UBI and Editor-in-Chief of the security computer blog seguranca-informatica.pt.
In recent years he has invested in the field of information security, exploring and analyzing a wide range of topics, such as pentesting (Kali Linux), malware, exploitation, hacking, IoT and security in Active Directory networks. He is also Freelance Writer (Infosec. Resources Institute and Cyber Defense Magazine) and developer of the 0xSI_f33d – a feed that compiles phishing and malware campaigns targeting Portuguese citizens.
Read more here.





