Ir ao conteúdo

Posts recomendados

Postado

Boa tarde tenho um código de um trabalho de faculdade, onde preciso fazer uma busca em um segundo arquivo.

O código é para gerenciar uma livraria e a função que estou empacado é a de listarLivros(), onde no cadastro de livros eu tenho o código da categoria, editora e autores, eu precisava trazer a descrição e nome deles e não  os códigos e não estou sabendo montar.

segue a função em questão e em seguida o código completo.

 

void listarLivros(){
	
  FILE *fpLivro;
  FILE *fpCategorias;
  FILE *fpEditoras;
  FILE *fpAutores;
  struct c_livro livro;
  struct c_categorias categoria;
  int n, chave;
  char desc[30], c;		
  
  fpLivro = fopen(LIVROS,"rb");
  fpCategorias = fopen(CATEGORIAS,"rb");
  
  printf("\n      * * *  Relatorio de Todos os Livros  * * *\n");
  printf("\n--------------------------------------");  
  printf("\nCodigo Titulo                         ");
  printf("\n--------------------------------------");
    
  while (fread(&livro,sizeof(livro),1,fpLivro)==1){

				    printf("\n%-6i | %-30s | %-5i",livro.codigo,livro.titulo,livro.codigoCategoria);    
    }

fclose(fpLivro);
fclose(fpCategorias);
printf("\n\n\n\n");  
system("pause");
}

 

 

Aqui em baixo segue o código completo:

 

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define LIVROS "Livros.dat"
#define AUTORES "Autores.dat"
#define CATEGORIAS "Categorias.dat"
#define EDITORAS "Editoras.dat"

struct c_livro{
int codigo;
char titulo [30];
float preco;
int codigoAutor1;
int codigoAutor2;
int codigoAutor3;
int codigoAutor4;
int codigoCategoria;
int codigoEditora;
int edicao;
int anoPublicacao;
int quantidadeEstoque;
};

struct c_autores{
int codigo;
char sobrenome [30];
char nome [30];
};

struct c_categorias{
int codigo;
char descricao [30];
};

struct c_editoras{
int codigo;
char nome [30];
char contato [10];
char telefone [10];
char email [10];
};                      

void cadLivros(){                

FILE *fpLivro;
  struct c_livro livro;
  char opc;
  int q=0,i=0;
 
  printf("\n--*-*-*- Cadastro de Livro -*-*-*--\n");
  printf("\nInforme o Codigo ou digite 0 para retornar: ");
  fflush(stdin); 
  scanf("%i",&livro.codigo);
  i = livro.codigo;
  
  if (i==0){
  	  system("cls");
	  return;
  }
  
  printf("Informe o Titulo: ");
  fflush(stdin); 
  gets(livro.titulo);
  printf("Informe o Preco: ");
  fflush(stdin); 
  scanf("%f",&livro.preco);
  printf("Quantos autores sera cadastrados? (1 a 4): ");
  scanf("%i",&q);
  
  if (q==1){
  	printf("Informe o codigo do Autor 1: ");
    fflush(stdin); 
    scanf("%i",&livro.codigoAutor1);
  }
  else if (q==2){
  	 printf("Informe o codigo do Autor 1: ");
     fflush(stdin); 
     scanf("%i",&livro.codigoAutor1);
     printf("Informe o codigo do Autor 2: ");
     fflush(stdin); 
     scanf("%i",&livro.codigoAutor2);
  }	
  else if (q==3){
  	  printf("Informe o codigo do Autor 1: ");
      fflush(stdin); 
      scanf("%i",&livro.codigoAutor1);
      printf("Informe o codigo do Autor 2: ");
      fflush(stdin); 
      scanf("%i",&livro.codigoAutor2);
      printf("Informe o codigo do Autor 3: ");
      fflush(stdin); 
      scanf("%i",&livro.codigoAutor3);
  }	
  else if (q==4){
  	  printf("Informe o codigo do Autor 1: ");
      fflush(stdin); 
      scanf("%i",&livro.codigoAutor1);
      printf("Informe o codigo do Autor 2: ");
      fflush(stdin); 
      scanf("%i",&livro.codigoAutor2);
      printf("Informe o codigo do Autor 3: ");
      fflush(stdin); 
      scanf("%i",&livro.codigoAutor3);
      printf("Informe o codigo do Autor 4: ");
      fflush(stdin); 
      scanf("%i",&livro.codigoAutor4);
  }	

  printf("Informe o codigo da categoria: ");
  fflush(stdin); 
  scanf("%i",&livro.codigoCategoria);
  printf("Informe o codigo da editora: ");
  fflush(stdin); 
  scanf("%i",&livro.codigoEditora);
  printf("Informe a edicao: ");
  fflush(stdin); 
  scanf("%i",&livro.edicao);    
  printf("Informe o ano de publicacao (AAAA): ");
  fflush(stdin); 
  scanf("%i",&livro.anoPublicacao);
  printf("Informe a quantidade em estoque: ");
  fflush(stdin); 
  scanf("%i",&livro.quantidadeEstoque);    
  
  printf("\nSalvar?(S/N) ");
  fflush(stdin); 
  scanf("%c",&opc);
  
  if ((opc!='S')&&(opc!='s')){
    printf("\nOperacao Cancelada!");
    return;
  }

  fpLivro = fopen("Livros.dat","ab");

  fwrite(&livro,sizeof(livro),1,fpLivro);

  fclose(fpLivro);

  printf("\nLivro cadastrado com sucesso.");
  system("cls");
}

void cadAutores(){                

FILE *fpAutores;
  struct c_autores autor;
  char opc;
  int i;

  printf("\n--*-*-*- Cadastro de Autores -*-*-*--\n");
  printf("\nInforme o Codigo ou digite 0 para retornar: ");
  fflush(stdin); 
  scanf("%i",&autor.codigo);
  
  i = autor.codigo;
  if (i==0){
  	  system("cls");
	  return;
  }
  
  printf("Informe o nome: ");
  fflush(stdin); 
  gets(autor.nome);
  printf("Informe o sobrenome: ");
  fflush(stdin); 
  gets(autor.sobrenome);
 
  printf("\nSalvar?(S/N) ");
  fflush(stdin); 
  scanf("%c",&opc);
  
  if ((opc!='S')&&(opc!='s')){
    printf("\nOperacao Cancelada!");
    return;
  }

  fpAutores = fopen("Autores.dat","ab");

  fwrite(&autor,sizeof(autor),1,fpAutores);

  fclose(fpAutores);

  printf("\nAutor cadastrado com sucesso.");
  system("cls");
}

void cadCategorias(){                

FILE *fpCategorias;
  struct c_categorias categoria;
  char opc;
  int i;

  printf("\n--*-*-*- Cadastro de Categorias -*-*-*--\n");
  printf("\nInforme o Codigo ou digite 0 para retornar: ");
  fflush(stdin); 
  scanf("%i",&categoria.codigo);
  
    i = categoria.codigo;
  if (i==0){
  	  system("cls");
	  return;
  }
  
  printf("Informe a descricao: ");
  fflush(stdin); 
  gets(categoria.descricao); 
  
  printf("\nSalvar?(S/N) ");
  fflush(stdin); 
  scanf("%c",&opc);
  if ((opc!='S')&&(opc!='s')){
    printf("\nOperacao Cancelada!");
    return;
  }

  fpCategorias = fopen("Categorias.dat","ab");

  fwrite(&categoria,sizeof(categoria),1,fpCategorias);

  fclose(fpCategorias);

  printf("\nCategoria cadastrada com sucesso.");
  system("cls");
}

void cadEditoras(){                

FILE *fpEditoras;
  struct c_editoras editora;
  char opc;
  int i;

  printf("\n--*-*-*- Cadastro de Editoras -*-*-*--\n");
  printf("\nInforme o Codigo ou digite 0 para retornar: ");
  fflush(stdin); 
  scanf("%i",&editora.codigo);
  
  i = editora.codigo;
  if (i==0){
  	  system("cls");
	  return;
  }
  
  printf("Informe o nome: ");
  fflush(stdin); 
  gets(editora.nome);   
  printf("Informe o contato: ");
  fflush(stdin); 
  gets(editora.contato);
  printf("Informe o telefone: ");
  fflush(stdin); 
  gets(editora.telefone);  
  printf("Informe o email: ");
  fflush(stdin); 
  gets(editora.email);     

  printf("\nSalvar?(S/N) ");
  fflush(stdin); 
  scanf("%c",&opc);
  if ((opc!='S')&&(opc!='s')){
    printf("\nOperacao Cancelada!");
    return;
  }

  fpEditoras = fopen("Editoras.dat","ab");

  fwrite(&editora,sizeof(editora),1,fpEditoras);

  fclose(fpEditoras);

  printf("\nEditora cadastrada com sucesso.");
  system("cls");
}

void listarLivros(){
	
  FILE *fpLivro;
  FILE *fpCategorias;
  FILE *fpEditoras;
  FILE *fpAutores;
  struct c_livro livro;
  struct c_categorias categoria;
  int n, chave;
  char desc[30], c;		
  
  fpLivro = fopen(LIVROS,"rb");
  fpCategorias = fopen(CATEGORIAS,"rb");
  
  printf("\n      * * *  Relatorio de Todos os Livros  * * *\n");
  printf("\n--------------------------------------");  
  printf("\nCodigo Titulo                         ");
  printf("\n--------------------------------------");
    
  while (fread(&livro,sizeof(livro),1,fpLivro)==1){

				    printf("\n%-6i | %-30s | %-5i",livro.codigo,livro.titulo,livro.codigoCategoria);    
    }

fclose(fpLivro);
fclose(fpCategorias);
printf("\n\n\n\n");  
system("pause");
}

void listarCategorias(){
	
  FILE *fpCategoria;
  struct c_categorias categoria;

  fpCategoria = fopen(CATEGORIAS,"rb");

  printf("\n      * * *  Relatorio de Todos as Categorias  * * *\n");
  printf("\n--------------------------------------");  
  printf("\nCodigo Descricao                         ");
  printf("\n--------------------------------------");  
  
  while (fread(&categoria,sizeof(categoria),1,fpCategoria)==1){
  	
    printf("\n%-6i | %-30s",categoria.codigo ,categoria.descricao);

  }

fclose(fpCategoria);
printf("\n\n\n\n");  
system("pause");
}

void listarAutores(){
  FILE *fpAutores;
  struct c_autores autor;

  fpAutores = fopen(AUTORES,"rb");

  printf("\n      * * *  Relatorio de Todos os Autores  * * *\n");
  printf("\n--------------------------------------");  
  printf("\nCodigo Sobrenome   ,Nome");
  printf("\n--------------------------------------");
    
  while (fread(&autor,sizeof(autor),1,fpAutores)==1){
  	
    printf("\n%-6i | %-10s, %s",autor.codigo,autor.sobrenome,autor.nome);

  }



fclose(fpAutores);
printf("\n\n\n\n");  
system("pause");
}

void listarEditoras(){
	
  FILE *fpEditoras;
  struct c_editoras editora;

  fpEditoras = fopen(EDITORAS,"rb");

  printf("\n      * * *  Relatorio de Todos as Editoras  * * *\n");
  printf("\n-------------------------------------------------");  
  printf("\nCodigo nome                             Contato");
  printf("\n-------------------------------------------------");  
  
  while (fread(&editora,sizeof(editora),1,fpEditoras)==1){
  	
    printf("\n%-6i | %-30s %s",editora.codigo,editora.nome,editora.contato);

  }
fclose(fpEditoras);
printf("\n\n\n\n");  
system("pause");
}

void excluirCategoria(){
	
  FILE *fpCategorias, *fpCategoriasTemp;
  struct c_categorias categoria;
  int cod, achou=0, i;
  char opc;

  printf("\nDigite o Codigo da categoria a ser EXCLUIDA ou 0 para retornar: ");
  fflush(stdin); 
  scanf("%i",&cod);
    i = cod;
  if (i==0){
  	  system("cls");
	  return;
  }

  fpCategorias = fopen(CATEGORIAS,"rb");

  
  while ((achou==0)&&(fread(&categoria,sizeof(categoria),1,fpCategorias)==1)){
    
    if (categoria.codigo == cod){
      printf("\nCodigo: %i",categoria.codigo);
      printf("\nDescricao: %s",categoria.descricao);
      achou=1;
    }
    
  }

    fclose(fpCategorias);
  
  if (!achou){
    printf("\n Categoria não Localizada!!");
    return;
  }

  printf("\nConfirma Exclusao?(S/N) ");
  fflush(stdin);  scanf("%c",&opc);
  if ((opc!='S')&&(opc!='s')){
    printf("\nEXCLUSAO Cancelada.");
    return;
  }

  fpCategorias = fopen(CATEGORIAS,"rb");
  fpCategoriasTemp = fopen("CategoriasTemp.dat","wb");
  
  while(fread(&categoria,sizeof(categoria),1,fpCategorias)==1){
   
    if (categoria.codigo!=cod)
      fwrite(&categoria,sizeof(categoria),1,fpCategoriasTemp);
      
  }
  
  fclose(fpCategorias);
  fclose(fpCategoriasTemp);

  system("del Categorias.dat");
  system("ren CategoriasTemp.dat Categorias.dat");

  printf("\nCategoria Excluida com Sucesso.");
}

void consTituloPChave(){
  FILE *fplivro;
  struct c_livro livro;
  char palavra[30];
  int achou=0, i;

  printf("\nDigite a Palavra-Chave ou 0 para retornar: ");
  fflush(stdin); 
  gets(palavra);
  
  i = livro.codigo;
  if (i==0){
  	  system("cls");
	  return;
  }
  
  fplivro = fopen(LIVROS,"rb");
  
  while (fread(&livro,sizeof(livro),1,fplivro)==1){
  	
      if (strstr(livro.titulo,palavra)!=NULL){
      	
        achou++;
        
        if (achou==1){
        	
          printf("\nCodigo Titulo");
          
        }
        
        printf("\n%-6i %-30s",livro.codigo,livro.titulo);
      }
  }

  if (achou==0){
  	
    printf("\nNenhum Livro Encontrado com a palavra %s no Titulo.",palavra);
    
  }

  fclose(fplivro);
  printf("\n\n\n\n");
  system("pause");

}

void consAutor(){
	
  FILE *fpAutores;
  struct c_autores autor;
  int achou=0,i;
  char nom[50], temp[50];

  printf("\nConsulta de Autor\n\n\n ");
  printf("\nDigite o nome ou inicio do nome do autor a ser Localizado: ");
  fflush(stdin); 
  gets(nom);

  fpAutores = fopen(AUTORES,"rb");

  while ((achou==0)&&(fread(&autor,sizeof(autor),1,fpAutores)==1)){
   
    if (strstr(autor.nome,nom)!=NULL){
    	
      printf("\nNome: %s",autor.nome);
      printf("\nSobrenome: %s",autor.sobrenome);
      achou=1;
      
    }
  }

  if (!achou){
  	
    printf("\n Autor não Localizado!!\n\n\n\n\n\n\n");
    
}
  
  fclose(fpAutores);
  printf("\n\n\n\n");
  system("pause");
  system("cls");
}


main(){
	
  int op;

  do{

    printf("\n\n    # # #  Livraria  # # # \n");
	printf("\n-------------------------------------------------------");
    printf("\n\n    # # #  MENU PRINCIPAL  # # # \n");
    printf("\n---------------------------------");
    printf("\n            CADASTROS            ");
    printf("\n---------------------------------");
    printf("\n 1   --> Cadastro de Livros");
    printf("\n 2   --> Cadastro de Autores");
    printf("\n 3   --> Cadastro de Categorias");
    printf("\n 4   --> Cadastro de Editoras");
    printf("\n----------------------------------");
    printf("\n            RELATORIOS            ");
    printf("\n----------------------------------");
    printf("\n 5   --> Listar todos os Livros");
 	printf("\n 6   --> Listar todos os Autores");      
	printf("\n 7   --> Listar todos as Categorias");   
	printf("\n 8   --> Listar todos as Editoras");
	printf("\n--------------------------------");
	printf("\n            EXCLUSAO            ");
    printf("\n--------------------------------");
	printf("\n 9   --> Excluir Categoria");
    printf("\n---------------------------------");
    printf("\n            CONSULTAS            ");
    printf("\n---------------------------------");
    printf("\n 10  --> Consultar Livro por Palavra-Chave no Titulo");
    printf("\n 11  --> Consultar autor por inicial do nome");    
    printf("\n\n------------SAIR------------");
    
    printf("\n\n 0   --> Sair");
    printf("\n\n opcao  --> ");
    fflush(stdin); scanf("%i",&op);

    switch(op){
      case 1:
        system("cls");        
		cadLivros();
        break;
      case 2:
        system("cls");
		cadAutores();
        break;
      case 3:
      	system("cls");
        cadCategorias();
        break;
      case 4:
      	system("cls");
        cadEditoras();
        break;
      case 5:
      	system("cls");
        listarLivros();
        break;
      case 6:
        system("cls");
        listarAutores();
        break;
      case 7:
      	system("cls");
        listarCategorias();
        break;
      case 8:
      	system("cls");
        listarEditoras();
        break;
      case 9:
      	system("cls");
        excluirCategoria();
        break;
      case 10:
      	system("cls");
        consTituloPChave();
        break;
     case 11:
      	system("cls");
        consAutor();
        break;
    }

  }while(op!=0);
}

 

Postado
2 horas atrás, Camila Martinho de Oliveira disse:

Boa tarde tenho um código de um trabalho de faculdade, onde preciso fazer uma busca em um segundo arquivo.

O código é para gerenciar uma livraria e a função que estou empacado é a de listarLivros(), onde no cadastro de livros eu tenho o código da categoria, editora e autores, eu precisava trazer a descrição e nome deles e não  os códigos e não estou sabendo montar

 

Não consegui entender o que seria  "segundo arquivo" e  "descrição". São 4 arquivos e não entendi o que seria descrição de que.

 

Seu programa parece ter muitos dos problemas comuns, o que sugere que a maneira comum de ensinar essas coisas não é a correta. 

 

Assim só vai ter MUITO mais trabalho para testar e terminar. E mais dificuldade para aproveitar essas coisas em outros programas.

 

De volta ao programa

 

2 horas atrás, Camila Martinho de Oliveira disse:
void cadLivros(){                

 

Nunca use essas coisas de void x(void). É um buraco negro e não serve para nada. Ou no máximo para uma única coisa. E ninguém escreve uma função para uma única coisa. Ou ninguém deveria pelo menos.

 

Escreva em torno dos dados.

 

Seu programa manipula ao que parece 4 coleções de dados e não tem nenhuma. Pretende mesmo tratar TODOS os dados a partir dos arquivos? Em geral o que se faz é no início carregar todos ou parte dos dados para a memória e tratar lá. E na saída regravar os arquivos.

 

2 horas atrás, Camila Martinho de Oliveira disse:
   printf("\n---------------------------------");
    printf("\n            CONSULTAS            ");
    printf("\n---------------------------------");
    printf("\n 10  --> Consultar Livro por Palavra-Chave no Titulo");
    printf("\n 11  --> Consultar autor por inicial do nome");    
    printf("\n\n------------SAIR------------");
    
    printf("\n\n 0   --> Sair");
    printf("\n\n opcao  --> ");
    fflush(stdin); scanf("%i",&op);

    switch(op){
      case 1:
        system("cls");        
		cadLivros();

 

 

 

Não use system(). Nunca. Para nada. Não estará fazendo nada. Não irá aprender nada usando isso. Está programando em C. system() foi escrita em C. O sistema foi escrito em C.

 

Não use fflush() na entrada. Essa função não é para isso e sequer está definida para entrada. Apenas consuma os dados corretamente.

 

TESTE sempre o retorno de scanf(). É muito ingênuo seguir cegamente.

 

Entenda que  8 printf() de uma linha não é uma coisa assim esperta ou rápida. É lerdo demais. difícil de alinhar e de entender. Use UM printf() de oito linhas...

 

Isso faz a mesma coisa, só que é muito mais fácil de ler e de alinhar:

 

    printf("\
\n\
---------------------------------\n\
              CONSULTAS          \n\
---------------------------------\n\
 10  --> Consultar Livro por Palavra-Chave no Titulo\n\
 11  --> Consultar autor por inicial do nome\n\
 \n\
 \n\
 --------------SAIR--------------\n\
\n\
\n\
  0   --> Sair\n\
\n\
\n\
      opcao  --> ");

 

Isso também:

 

    puts("\
\n\
---------------------------------\n\
              CONSULTAS          \n\
---------------------------------\n\
 10  --> Consultar Livro por Palavra-Chave no Titulo\n\
 11  --> Consultar autor por inicial do nome\n\
 \n\
 \n\
 --------------SAIR--------------\n\
\n\
\n\
  0   --> Sair\n\
\n\
\n\
      opcao  --> ");

 

E é muito mais rápido.

 

 

  • Curtir 1
Postado

@arfneto 👍 Obrigado pelas dicas. Mas hoje esse irá ficar dessa forma, os outros tendo seguir como você sugeriu 😅.

Os 2 arquivos que cito são o Livro.dat e o Categorias.dat.

Preciso fazer um relatório listando os dados dos livros, mas no arquivo Livro.dat eu tenho apenas o código da categoria, preciso de alguma forma na função, citada no post principal, conseguir atrelar o código inserido no item livro.codigoCategoria no Livro.dat com a categoria.descricao na Categoria.dat e depois replicarei com alterações nos outros itens que preciso.

Postado
1 hora atrás, Camila Martinho de Oliveira disse:

Obrigado pelas dicas. Mas hoje esse irá ficar dessa forma, os outros tendo seguir como você sugeriu 😅.

Os 2 arquivos que cito são o Livro.dat e o Categorias.dat.

Preciso fazer um relatório listando os dados dos livros, mas no arquivo Livro.dat eu tenho apenas o código da categoria, preciso de alguma forma na função, citada no post principal, conseguir atrelar o código inserido no item livro.codigoCategoria no Livro.dat com a categoria.descricao na Categoria.dat e depois replicarei com alterações nos outros itens que preciso.

 

Já li isso antes. Entenda que muitas vezes perseguir a solução errada leva MUITO mais tempo e dá muito mais trabalho do que corrigir o modelo ANTES de seguir adiante. Pode gastar uma hora nisso ou uma vida lutando com o que já fez e insistindo no modêlo comum, mas errado.

 

Poste um exemplo dos arquivo de teste

 

Se eu entendi seu modelo apenas pegue o código da categoria da obra e use para encontrar a descrição. 

 

Você não respondeu, então pergunto de novo. Você pretende mesmo navegar pelos dados direto do arquivo em disco? Não se faz isso a menos que os arquivos tenham muitos milhares de itens

 

De todo modo não tem nada demais em fazer assim, desde que tenha os arquivos em ordem e tenha programas de suporte para manter isso atualizado.

 

 

 

 

 

 

 

 

 

 

Postado

image.png.88a51165ec6621aa23dc1bd301462530.png

Li umas outras partes de seu programa e recomendo muito seguir as coisas como te expliquei.

 

O programa tem mais de 600 linhas e está muito frágil. Pode até funcionar mas vai ter um  trabalho enorme e imagino que já tenha tido bastante trabalho com ele :( 

 

Nessa linha 473 aqui que acha que vai ter em livro? Seu compilador não te avisou sobre isso?

 

Esse caso serve como exemplo de algumas coisas. Pelo nome da função vai consultar um livro a partir do título.

 

  • Mas a função é void e não tem argumentos. É muito ruim isso. É errado, simples assim.
  • gets() é obsoleta há décadas e não deve ser usada
  • não deve colocar nada interativo numa função de consulta.
  • não deve colocar uma pausa no programa numa função de consulta
  • nem deve escrever na tela
  • não chame fflush() para um arquivo de entrada. Sequer está definido e só mostra que não está consumindo os dados direito.

 

O que é o simples de uma consulta por um livro a partir de uma palavra-chave?

 

Retorne o Livro. Nada mais. Não escreva, não pare o programa, não pergunte nada, não espere nada de fora.

 

Algo assim

 

    Livro* cons_tit_chave(const char*,const char*);

 

Que você chama assim

 

    Livro* obra = cons_tit_chave("Clube do Hardware", "livros.dat");

 

E se tem o livro no arquivo retorna o registro todo e se não tem retorna NULL.

 

O simples. Sem interatividade e perguntar nada. E sem system() e sem pause...

 

 

Deve dar certo da primeira vez. E se der erro não precisa procurar nada fora da função.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!