Programa em C para reconhecer e-mails dentro de .txt (AUTOMATOS FINITOS)

1. Programa em C para reconhecer e-mails dentro de .txt (AUTOMATOS FINITOS)

ElisaMariaAlves
TheUser

(usa Ubuntu)

Enviado em 30/07/2017 - 19:43h

Preciso implementar um programa em C que leia o código fonte da página "Email address" do Wikipédia colocado em um arquivo "Entrada.txt" no diretório do programa em C, (fopen..., "r"), e imprima como resultado os e-mails válidos que estão no código, a partir de um automato finito deterministico, ou seja, com os estados em forma de função. Esse é código fonte: view-source:https://en.wikipedia.org/wiki/Email_address

Esse é o automato que usei: goo.gl/1PjsFY

Fiz o seguinte código:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMAX 76959 //caracteres aceitos que são do tipo letra, num, ponto, traço, @


int SelecionaSimbolosValidos(char Simbolo);

void qInicial(char Simbolo[NMAX]);
void q0(int contador, char Simbolo[NMAX]);
void q1(int contador, char Simbolo[NMAX]);
void q2(int contador, char Simbolo[NMAX]);
void q3(int contador, char Simbolo[NMAX]);
void q4(int contador, char Simbolo[NMAX]);
void q5(int contador, char Simbolo[NMAX]);
void q6(int contador, char Simbolo[NMAX]);
void q7(int contador, char Simbolo[NMAX]);
void q8(int contador, char Simbolo[NMAX]);
void q9(int contador, char Simbolo[NMAX]);
void q10(int contador, char Simbolo[NMAX]);
void q11(int contador, char Simbolo[NMAX]);
void qErro(int Contador, char Simbolo[NMAX]);


int SelecionaSimbolosValidos(char Simbolo)

{
int aceita = 0, rejeita = 1;

if((Simbolo >= 'a' && Simbolo <= 'z') || (Simbolo >= 'A' && Simbolo <= 'Z')|| Simbolo == '@'
|| Simbolo == '-' ||Simbolo == '.' || ((Simbolo >= '0' && Simbolo <= '9')))
return aceita;

else
return rejeita;


}


void qInicial(char Simbolo[NMAX])
{
int contador = 0;
q0(contador, Simbolo);
}


void q0(int contador, char Simbolo[NMAX])
{

if(contador < NMAX){
if ((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') ||
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z'))
{

printf("%c", Simbolo[contador]);
q1(++contador, Simbolo);
}

/*else
qErro(contador, Simbolo);*/
}
}


void q1(int contador, char Simbolo[NMAX])
{
if(contador < NMAX) {
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') ||
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
|| (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
{
printf("%c", Simbolo[contador]);
q2(++contador, Simbolo);
}
else if (Simbolo[contador] == '@')
{
printf("%c", Simbolo[contador]);
q3(++contador, Simbolo);
}
else if (Simbolo[contador] == '-')
{
printf("%c", Simbolo[contador]);
q4(++contador, Simbolo);
}

/*else
qErro(++contador, Simbolo);*/
}
}



void q2(int contador, char Simbolo[NMAX])
{
if(contador < NMAX){
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') ||
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
|| (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
{
printf("%c", Simbolo[contador]);
q2(++contador, Simbolo);
}
else if (Simbolo[contador] == '@')
{
printf("%c", Simbolo[contador]);
q3(++contador, Simbolo);
}
else {
q0(contador, Simbolo);
}
/*
else
qErro(contador, Simbolo); */
}
}


void q3(int contador, char Simbolo[NMAX])
{
if(contador < NMAX) {
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') ||
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
|| (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
{
printf("%c", Simbolo[contador]);
q10(++contador, Simbolo);
}
else if ((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') ||
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z'))
{
printf("%c", Simbolo[contador]);
q11(++contador, Simbolo);
}/*
else
qErro(contador, Simbolo);*/
}
}

void q4(int contador, char Simbolo[NMAX])
{
if(contador < NMAX) {
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') ||
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
|| (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
{
printf("%c", Simbolo[contador]);
q5(++contador, Simbolo);
}/*
else
qErro(contador, Simbolo);*/
}
}


void q5(int contador, char Simbolo[NMAX])
{

if(contador < NMAX){

if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') ||
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
|| (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
{
printf("%c", Simbolo[contador]);
q5(++contador, Simbolo);
}
else if (Simbolo[contador] == '@')
{
printf("%c", Simbolo[contador]);
q3(++contador, Simbolo);
}
else if(Simbolo[contador] == '-')
{
printf("%c", Simbolo[contador]);
q4(++contador, Simbolo);
}/*
else
qErro(contador, Simbolo);*/

}
}
void q6(int contador, char Simbolo[NMAX])
{ if(contador < NMAX){
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') ||
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
|| (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
{
printf("%c", Simbolo[contador]);
q7(++contador, Simbolo);
}/*
else
qErro(contador, Simbolo);*/
}
}

void q7(int contador, char Simbolo[NMAX])
{
if(contador < NMAX){
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') ||
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
|| (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
{
printf("%c", Simbolo[contador]);
q7(++contador, Simbolo);
}
else if (Simbolo[contador] == '-')
{
printf("%c", Simbolo[contador]);
q8(++contador, Simbolo);
}
else if (Simbolo[contador] == '@')
{
printf("%c", Simbolo[contador]);
q3(++contador, Simbolo);
}/*
else
qErro(contador, Simbolo);*/
}
}

void q8(int contador, char Simbolo[NMAX])

{ if(contador < NMAX){
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') ||
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
|| (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
{
printf("%c", Simbolo[contador]);
q9(++contador, Simbolo);
}/*
else
qErro(contador, Simbolo);*/

}
}

void q9(int contador, char Simbolo[NMAX])
{
if(contador < NMAX){
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') ||
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
|| (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
{
printf("%c", Simbolo[contador]);
q9(++contador, Simbolo);
}
else if (Simbolo[contador] == '@')
{
printf("%c", Simbolo[contador]);
q3(++contador, Simbolo);
}
else if (Simbolo[contador] == '-')
{
printf("%c", Simbolo[contador]);
q8(++contador, Simbolo);
}/*
else
qErro(contador, Simbolo);*/

}
}

void q10(int contador, char Simbolo[NMAX])
{

if(contador < NMAX){
if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') ||
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
|| (Simbolo[contador] >= '0' && Simbolo[contador] <= '9')||
Simbolo[contador] == '-')
{
printf("%c", Simbolo[contador]);
q10(++contador, Simbolo);
}
else if (Simbolo[contador] == '.')
{
printf("%c", Simbolo[contador]);
q11(++contador, Simbolo);
}/*
else
qErro(contador, Simbolo);*/

}
}

void q11(int contador, char Simbolo[NMAX])

{ if(contador < NMAX){

if((Simbolo[contador] >= 'a' && Simbolo[contador] <= 'z') ||
(Simbolo[contador] >= 'A' && Simbolo[contador] <= 'Z')
|| (Simbolo[contador] >= '0' && Simbolo[contador] <= '9'))
{
printf("%c", Simbolo[contador]);
q11(++contador, Simbolo);
}

}}
else
qErro(contador, Simbolo);
}
}

void qErro(int contador, char Simbolo[NMAX])
{
if(contador < NMAX)
q0(++contador, Simbolo);
else
exit(1);
}



int main()
{
int i = 0;
int teste_validacao;
int tamanho = 0;
char caracteres[NMAX];


char caracter;

FILE *arquivo;
arquivo = fopen("Entrada.txt", "r");

if (arquivo == NULL)
return EXIT_FAILURE;

while(!feof(arquivo))

{
caracter = getc(arquivo);
teste_validacao = SelecionaSimbolosValidos(caracter);
if(teste_validacao == 0)
{
caracteres[i] = caracter;
i++;
tamanho++;
}

}
qInicial(caracteres);


/*int j;

for(j = 0; j < tamanho; j++)
printf("%c", caracteres[j]);

printf("\nnumCaracteresValidos: %d\n", tamanho);
*/
fclose(arquivo);

return 0;


}


Porém como saida está reconhecendo apenas uma linha "DOCTYPEhtmlclassclient" e nada mais; Além disso, não consegui chamar recursivamente as funções, pois transformei os símbolos validos em uma string de 76959 caracteres a partir da função SelecionaSimbolosValidos e tentei aplicar o automato nessa string, repetindo o reconhecimento até o fim dela, caracter por caracter. Mas não tenho ideia do que pode estar errado, pois os AFD está certo. Alguma ajuda?



  


2. Re: Programa em C para reconhecer e-mails dentro de .txt (AUTOMATOS FINITOS)

ElisaMariaAlves
TheUser

(usa Ubuntu)

Enviado em 31/07/2017 - 09:08h

Olá! Muito obrigado pela ajuda, realmente facilitou tudo! Porém, não estou conseguindo imprimir os resultados, não sei oq acontece, tentei usar uma string auxiliar como variavel global que imprime o que for aceito após rodar os estados 4 e 5, alguma ideia do que está acontecendo??


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMAX 76959 //todos os caracteres da entrada


char frase[1000];
i = 0;


int SelecionaSimbolosValidos(char Simbolo);

void qInicial(char Simbolo[NMAX]);
void q0(int contador, char Simbolo[NMAX]);
void q1(int contador, char Simbolo[NMAX]);
void q2(int contador, char Simbolo[NMAX]);
void q3(int contador, char Simbolo[NMAX]);
void q4(int contador, char Simbolo[NMAX]);
void q5(int contador, char Simbolo[NMAX]);


int SelecionaSimbolosValidos(char Simbolo)

{
int aceita = 0, rejeita = 1;

if((Simbolo >= 'a' && Simbolo <= 'z')
|| (Simbolo >= 'A' && Simbolo <= 'Z')
|| Simbolo == '@'
|| Simbolo == '-' ||Simbolo == '.'
|| ((Simbolo >= '0' && Simbolo <= '9')))
return aceita;

else
return rejeita;

}


void qInicial(char Simbolo[NMAX])
{
int contador = 0;
q0(contador, Simbolo);
}


void q0(int contador, char Simbolo[NMAX])
{

if(contador < NMAX){

while((isalpha(Simbolo[contador])) == 1) //loop?
{
q0(++contador, Simbolo);
//do something with string?
}
if ((isalnum(Simbolo[contador])) == 0)
{

frase[i] = Simbolo[contador];
i++;
q1(++contador, Simbolo); //passa p o q1.
}


}
}


void q1(int contador, char Simbolo[NMAX])
{
if(contador < NMAX) {
while((isalnum(Simbolo[contador])) == 0)
{
frase[i] = Simbolo[contador];
i++;
q1(++contador, Simbolo); //loop no q1.
}
if (Simbolo[contador] == '@')
{
frase[i] = Simbolo[contador];
i++;
q2(++contador, Simbolo[contador]);
}
else
{
q0(++contador, Simbolo);
}
}
}




void q2(int contador, char Simbolo[NMAX])
{
if(contador < NMAX){
while((isalnum(Simbolo[contador])) == 0)
{
frase[i] = Simbolo[contador];
i++;
q2(++contador, Simbolo);
}
if(Simbolo[contador] == '.')
{
frase[i] = Simbolo[contador];
i++;
q3(++contador, Simbolo);
}
else
{
q0(++contador, Simbolo);
}

}
}


void q3(int contador, char Simbolo[NMAX])
{
if(contador < NMAX)
{
while( (isalnum(Simbolo[contador])) == 0)
{
frase[i] = Simbolo[contador];
i++;
q3(++contador, Simbolo);
}
if (Simbolo[contador] == '.')
{
frase[i] = Simbolo[contador];
i++;
q5(++contador, Simbolo);
}
else if ( (isspace(Simbolo[contador])) == 0)
{
q4(++contador, Simbolo);
}
else if(((isspace(Simbolo[contador])) == 1) && (Simbolo[contador]!= '.'))
{
q0(++contador, Simbolo);
}

}
}

void q4(int contador, char Simbolo[NMAX])
{
if(contador < NMAX)
{ printf("%s", frase);
strcpy(frase, "");
q0(++contador,Simbolo);

}

// else //IMPRESSÃO.
}



void q5(int contador, char Simbolo[NMAX])
{
if(contador < NMAX){
while((isalnum(Simbolo[contador])) == 0)
{
q5(++contador, Simbolo);
}

{
q0(++contador,Simbolo);

}

printf("%s", frase);
strcpy(frase, "");
}

// else //IMPRESSÃO.
}




int main()
{

int i = 0;
int teste_validacao;
int tamanho = 0;
char caracteres[NMAX];


char caracter;

FILE *arquivo;
arquivo = fopen("Entrada.txt", "r");

if (arquivo == NULL)
return EXIT_FAILURE;

while(!feof(arquivo))

{
caracter = getc(arquivo);
teste_validacao = SelecionaSimbolosValidos(caracter);
if(teste_validacao == 0)
{
caracteres[i] = caracter;
i++;
tamanho++;
}

}
qInicial(caracteres);


/*int j;

for(j = 0; j < tamanho; j++)
printf("%c", caracteres[j]);

printf("\nnumCaracteresValidos: %d\n", tamanho);
*/
fclose(arquivo);

return 0;



}






3. Re: Programa em C para reconhecer e-mails dentro de .txt (AUTOMATOS FINITOS)

ElisaMariaAlves
TheUser

(usa Ubuntu)

Enviado em 31/07/2017 - 14:04h


Estou tentando imprimir os chars aprovados, tentei um por um , e tentei guardá-los em uma string global e imprimir ao final da ultima função, mas nao está dando.
Ao usar as funções (isalnum(simbolo[contador]), (is alfa numerico) não sei se está correto, pois os caracteres q vem de dentro da Entrada.txt não diferenciam numeros de letras nesse caso, mas para reduzir o código usei isso. E no caso da quantiadade de chars, em uma leitura previa q fiz no aruivo deu 77000, por isso defini NMAX como 77000. Alguma ideia de como imprimir?


4. Re: Programa em C para reconhecer e-mails dentro de .txt (AUTOMATOS FINITOS)

ElisaMariaAlves
TheUser

(usa Ubuntu)

Enviado em 01/08/2017 - 09:35h

Mesmo após fazer tudo o que você disse, o resultado está sendo "l". Não sei onde está o erro na impressão, mas o problema continuar sendo a impressão.
#include <stdio.h>
#include <stdlib.h>



int SelecionaSimbolosValidos(char Simbolo);

int SelecionaSimbolosValidos(char Simbolo)

{
int aceita = 0, rejeita = 1;

if((isalnum(Simbolo))
|| Simbolo == '@'
|| Simbolo == '-' ||Simbolo == '.')
return aceita;

else
return rejeita;

}


int main ()
{
int resultado, j = 0, k = 0;
int i = 0;
int estado = 0;
int MAX;
char C;
char email[5000];
char simbolos[77000];
FILE *arquivo;
arquivo = fopen("Entrada.txt", "r");
if (arquivo == NULL)
printf("Erro!\n");

while (!feof(arquivo))
{
C = getc(arquivo);
resultado = SelecionaSimbolosValidos(C);
if (resultado == 0)
{
simbolos[i] = C;

j++;
}
}
MAX = j;


/**Máquina de Estados**/


for(i = 0; i < MAX;)

{
if (estado == 0)

{
while(isalnum(simbolos[i]))
{
email[i] = simbolos[i];
estado = 1;
i++;
}
//volta.
if(!(isalnum(simbolos[i])))
{
estado = 0;
i++;
}


}
else if(estado == 1)
{

while(isalnum(simbolos[i]) || simbolos[i] == '-')
{
email[i] = simbolos[i];
i++;
}
if(!(isalnum(simbolos[i]) || simbolos[i] == '-'))
{
estado = 0;
i++;
}

else if(simbolos[i] == '@')
{
email[i] = simbolos[i];
estado = 2;
i++;
}

}
else if (estado == 2)
{

while(isalnum(simbolos[i]) || simbolos[i] == '-')
{
email[i] = simbolos[i];
i++;
}

if(!(isalnum(simbolos[i]) || simbolos[i] == '-'))
{
estado = 0;


i++;
}

if(simbolos[i] == '.')
{
email[i] = simbolos[i];
estado = 3;
i++;
}

}
else if (estado == 3)
{
while(isalnum(simbolos[i]) || simbolos[i] == '-')
{
email[i] = simbolos[i];
i++;
}


if(!(isalnum(simbolos[i]) || simbolos[i] == '-'))
{
estado = 0;


i++;
}

else if(isspace(simbolos[i]))
{

estado = 4;
i++;
}
else if (simbolos[i] == '.')

{
email[i] = simbolos[i];
estado = 5;
i++;
}
}
else if (estado == 4)
{
estado = 0;



i++;
}
else if (estado == 5)
{
while(isalnum(simbolos[i]))
{
email[i] = simbolos[i];

i++;
}

if(!(isalnum(simbolos[i])))
{
estado = 0;


i++;
}

}
}

printf("%s", email);

}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts