Ir ao conteúdo

Posts recomendados

Postado

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:

 

image.png.806f74d6e871c663e580eeb4678128de.png

 

 

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?

 

 

catsFSM (2).jpg

Postado

Olá, obrigada pelas dicas!!

 

Eu reduzi o código pela metade, e o automato está funcionando, porém não consigo imprimir, você poderia olhar meu código novo e ver o q está errado? 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. 

 

Se voce entender o automato, agora é esse que uso: grafo.gif

 

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. Nem com o malloc nao mudou. 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? 

 

#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;



}

 

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!