Ir ao conteúdo

Posts recomendados

Postado

Boa tarde amigos,

 

Tenho um trabalho bem robusto para fazer e estou com duvidas em um erro na compilação.

O professor passou um programa e nossa tarefa é alterá-lo conforme as especificações de uma lista de alterações.

 

Codigo que já fiz algumas alterações

program cadastro_funcionarios;uses crt;type endereco = record                  rua     : string[40];                  numero  : integer;                  cidade  : string;                  estado  : string;                  cep     : real;                end;type dados_funcionario = RECORD                          codi    : string[4];                          nome    : string[40];                          cargo   : string[20];                          salario : real;                          ender   : endereco;                          fone    : string[15];                          status  : char;                         END;                         	cadastro_funcionario = FILE of dados_funcionario;var REG: dados_funcionario;    ARQ: cadastro_funcionario;{procedure introducao;begin  textbackground(1);  clrscr;  gotoxy(30,5); write('REGISTRO E ARQUIVO');  gotoxy(10,8);  write('Este programa contem exemplos de procedimentos para manipulacao de');  gotoxy(10,10);  write('arquivos. O objetivo e mostrar de maneira simples diferentes modos');  gotoxy(10,12);  write('de manipulacao de arquivos, seja na inclusao, consulta, alteracao,');  gotoxy(10,14);  write('exclusao ou emissao de relatorios.');  gotoxy(10,16);  write('Procure desenvolver o seu programa, com criatividade ...');  gotoxy(50,20); write('Tecle algo.');  readkey;end; }procedure tela_cabecalho;var k: byte;begin   window(1,1,80,25);   textcolor(12);   textbackground(1);   clrscr;   for k:=1 to 80 do      begin         gotoxy(k,1); write(chr(223));         gotoxy(k,4); write(chr(223));      end;   gotoxy(20,2); write('C A D A S T R O - F U N C I O N A R I O S');end;procedure tela_num_reg;begin   textcolor(10);   gotoxy(26,10); write('Nº Registro :');end;procedure tela_campos;begin   textcolor(12);   gotoxy(20,12); write('C o d i g o . . . :');   gotoxy(20,14); write('N o m e . . . . . :');   gotoxy(20,16); write('C a r g o . . . . :');   gotoxy(20,18); write('S a l á r i o . . :');   gotoxy(20,20); write('R u a . . . . . . :');   gotoxy(20,22); write('N ú m e r o . . . :');   gotoxy(20,24); write('C i d a d e . . . :');   gotoxy(20,26); write('E s t a d o . . . :');   gotoxy(20,28); write('C e p . . . . . . :');   gotoxy(20,30); write('F o n e . . . . . :');   gotoxy(20,32); write('S t a t u s . . . :');   end;procedure tela_campos_numerados;begin   textcolor(12);   gotoxy(16,12); write('    C o d i g o . . . :');   gotoxy(16,14); write('(01) N o m e . . . . . :');   gotoxy(16,16); write('(02) C a r g o . . . . :');   gotoxy(16,18); write('(03) S a l á r i o . . :');   gotoxy(16,20); write('(04) R u a . . . . . . :');   gotoxy(16,22); write('(05) N ú m e r o . . . :');   gotoxy(16,24); write('(06) C i d a d e . . . :');   gotoxy(16,26); write('(07) E s t a d o . . . :');   gotoxy(16,28); write('(08) C e p . . . . . . :');   gotoxy(16,30); write('(09) F o n e . . . . . :');   gotoxy(16,32); write('(10) S t a t u s . . . :');   gotoxy(16,34); write('( 0) F i m');end;procedure abre_janela;begin   window(40,10,78,22);   textcolor(15);end;procedure tela_opcao(opcao:byte);begin   tela_cabecalho;   case opcao of   1: begin tela_campos; gotoxy(56,3); write('INCLUSAO'); abre_janela; end;   2: begin tela_campos; gotoxy(56,3); write('INCLUSAO'); abre_janela; end;   3: begin tela_num_reg; tela_campos; gotoxy(56,3);            write('CONSULTA - REGISTRO'); abre_janela; end;   4: begin tela_campos; gotoxy(56,3); write('CONSULTA - CODIGO');            abre_janela; end;   5: begin tela_num_reg; tela_campos_numerados; gotoxy(56,3);            write('ALTERACAO'); abre_janela; end;   6: begin tela_num_reg; tela_campos; gotoxy(56,3);            write('ALTERACAO'); abre_janela; end;   7: begin tela_campos; gotoxy(56,3); write('EXCLUSAO'); abre_janela; end;   8: begin gotoxy(56,3); write('RELATORIO'); end;   9: begin gotoxy(56,3); write('REORGANIZA'); end;   end;end;procedure abre_arquivo;begin   assign(ARQ,'D:\AMIGO.DAT');   {$I-} reset(ARQ); {$I+};   if ioresult<>0 then rewrite(ARQ);end;procedure inclue;var   op: char;begin   if filesize(ARQ) > 0 then seek(ARQ,filesize(ARQ));   with REG do      repeat         gotoxy(1,3); readln(codi);         if codi<>'' then            begin               gotoxy(1,5); readln(nome);               gotoxy(1,7); readln(cargo);               gotoxy(1,9); readln(salario);               gotoxy(1,11); readln(reg.ender.rua);               gotoxy(1,13); readln(reg.ender.numero);               gotoxy(1,15); readln(reg.ender.cidade);               gotoxy(1,17); readln(reg.ender.estado);               gotoxy(1,19); readln(reg.ender.cep);               gotoxy(1,21); readln(fone);               gotoxy(1,23); readln(status);               write(ARQ,REG);               gotoxy(10,11); write('Continua (S/N)?'); readln(op); op:=upcase(op);               clrscr;            end;      until op='N';end;procedure consulta_registro;var numreg:integer;    op: char;beginrepeat   clrscr;   repeat      gotoxy(1,1); clreol; readln(numreg);      if (numreg<0) or (numreg>=filesize(ARQ)) then            begin             gotoxy(10,11); write('Registro nao existente.');             repeat until readkey<>#0;             clrscr;            end;   until (numreg>=0) and (numreg < filesize(ARQ));   seek(ARQ,numreg);   read(ARQ,REG);   with REG do   begin       gotoxy(1,3); write(codi);       gotoxy(1,5); write(nome);       gotoxy(1,7); readln(cargo);       gotoxy(1,9); readln(salario);       gotoxy(1,11); readln(reg.ender.rua);       gotoxy(1,13); readln(reg.ender.numero);       gotoxy(1,15); readln(reg.ender.cidade);       gotoxy(1,17); readln(reg.ender.estado);       gotoxy(1,19); readln(reg.ender.cep);       gotoxy(1,21); readln(fone);       gotoxy(1,23); readln(status);   end;   gotoxy(1,30); write('Continua (S/N)?');   repeat      gotoxy(17,9); clreol; readln(op); op:=upcase(op);   until (op='S') or (op='N');until op='N';end;procedure consulta_codigo;var codigo_consulta: string[25];beginrepeat   clrscr;   gotoxy(1,3); readln(codigo_consulta);   with REG do    if codigo_consulta<>'' then      begin         seek(ARQ,0);            repeat               read(ARQ,REG);               if codi = codigo_consulta then                  begin                     gotoxy(1,5); write(nome);                     gotoxy(1,7); readln(cargo);                     gotoxy(1,9); readln(salario);                     gotoxy(1,11); readln(reg.ender.rua);                     gotoxy(1,13); readln(reg.ender.numero);                     gotoxy(1,15); readln(reg.ender.cidade);                     gotoxy(1,17); readln(reg.ender.estado);                     gotoxy(1,19); readln(reg.ender.cep);                     gotoxy(1,21); readln(fone);                     gotoxy(1,23); readln(status);                  end;            until (eof(ARQ)) or (codi=codigo_consulta);         if codi<>codigo_consulta then            begin gotoxy(10,9); write('Codigo nao encontrado.'); end;         gotoxy(10,11); write('Tecle <enter>...');         repeat until readkey=#13;      end;until codigo_consulta='';end;procedure altera;var numreg:integer;    op: char;    numcampo:byte;beginrepeat   clrscr;   repeat      gotoxy(1,1); clreol; readln(numreg);   until (numreg>=0) and (numreg < filesize(ARQ));   seek(ARQ,numreg);   read(ARQ,REG);   with REG do   begin       gotoxy(1,3); write(codi);       gotoxy(1,5); write(nome);       gotoxy(1,7); readln(cargo);       gotoxy(1,9); readln(salario);       gotoxy(1,11); readln(reg.ender.rua);       gotoxy(1,13); readln(reg.ender.numero);       gotoxy(1,15); readln(reg.ender.cidade);       gotoxy(1,17); readln(reg.ender.estado);       gotoxy(1,19); readln(reg.ender.cep);       gotoxy(1,21); readln(fone);       gotoxy(1,23); readln(status);   end;   gotoxy(1,27); clreol; write('Nº do campo p/ alterar:');   repeat     repeat        gotoxy(25,11); clreol; readln(numcampo);     until numcampo in [0..2];     if numcampo<>0 then     case numcampo of       1: begin gotoxy(1,5); clreol; readln(REG.nome); end;       2: begin gotoxy(1,7); clreol; readln(REG.cargo); end;       3: begin gotoxy(1,9); clreol; readln(reg.salario); end;       4: begin gotoxy(1,11); clreol; readln(reg.ender.rua); end;        5: begin gotoxy(1,13); clreol; readln(reg.ender.numero); end;       6: begin gotoxy(1,15); clreol; readln(reg.ender.cidade); end;       7: begin gotoxy(1,17); clreol; readln(reg.ender.estado); end;       9: begin gotoxy(1,19); clreol; readln(reg.ender.cep); end;      10: begin gotoxy(1,21); clreol; readln(reg.fone); end;      11: begin gotoxy(1,23); clreol; readln(reg.status); end;     end;   until numcampo=0;   seek(ARQ,numreg);   write(ARQ,REG);   gotoxy(1,27); write('Continua alteracao (S/N)?');   repeat      gotoxy(27,11); clreol; readln(op); op:=upcase(op);   until (op='S') or (op='N');until op='N';end;procedure exclue;var codi_exclue: string[4];    op: char;    arqaux: cadastro_funcionario;begin  repeat    clrscr;    gotoxy(1,3); readln(codi_exclue);    if codi_exclue<>'' then    with REG do      begin        seek(ARQ,0);        repeat          read(ARQ,REG);          if codi = codi_exclue then              begin                gotoxy(1,5); write(nome);                gotoxy(1,7); readln(cargo);                gotoxy(1,9); readln(salario);                gotoxy(1,11); readln(reg.ender.rua);                gotoxy(1,13); readln(reg.ender.numero);                gotoxy(1,15); readln(reg.ender.cidade);                gotoxy(1,17); readln(reg.ender.estado);                gotoxy(1,19); readln(reg.ender.cep);                gotoxy(1,21); readln(fone);                gotoxy(1,23); readln(status);              end;        until (eof(ARQ)) or (codi=codi_exclue);        if codi<>codi_exclue           then             begin gotoxy(5,11); write('Codigo nao encontrado.');                delay(1000); end           else             begin                gotoxy(5,11); write('Confirma exclusao (S/N)? ');                repeat                  gotoxy(42,17); clreol; readln(op); op:=upcase(op);                until (op='S') or (op='N');                if op='S' then                   begin                     REG.codi:='***';                     seek(ARQ,filepos(ARQ)-1);                     write(ARQ,REG);                   end;             end;      end;  until codi_exclue='';  gotoxy(1,11); write('Reorganiza arquivo (S/N)? ');  repeat     gotoxy(42,17); clreol; readln(op); op:=upcase(op);  until (op='S') or (op='N');  if op='S' then    begin      tela_opcao(9);      gotoxy(20,15); write('Reorganizando arquivo.');      assign(arqaux,'D:\AUXILIAR.DAT');      rewrite(arqaux);      seek(ARQ,0);      repeat         read(ARQ,REG);         if REG.codi<>'***' then write(arqaux,REG);      until eof(ARQ);      close(ARQ);      close(arqaux);      erase(ARQ);      rename(arqaux,'D:\AMIGO.DAT');      abre_arquivo;   end;end;procedure cabecalho;const tit= 'C A D A S T R O - F U N C I O N A R I O S';var traco: string[80];    k: byte;begin   traco:='';   for k:=1 to 80 do traco:=traco+'-';   writeln(traco,#10);   k:= (80 - length(tit)) div 2;   writeln('':k,tit,#10);   writeln(traco,#10);   writeln('':4,'Codigo  Nome','':36,'Fone',#10);end;{procedure imprime;var lin, espaco: byte;begin   gotoxy(20,15); write('Prepare a impressora e tecle enter.');   repeat until readkey=chr(13);   cabecalho;   lin:=9;   seek(ARQ,0);   while not(eof(ARQ)) do   with REG do     begin      read(ARQ,REG);      espaco:=40-length(nome);      writeln('':5,codi:4,'  ',nome,'':espaco,fone);      lin:=lin+2;      if lin>=60 then                 begin                   writeln(#12);                   cabecalho;                   lin:=9;                 end;     end; writeln(#12);end;}procedure inclue_sem_repeticao;var codi_inclue: string[25];    op: char;beginrepeat   clrscr;   gotoxy(1,3); readln(codi_inclue);   with REG do    if codi_inclue<>'' then      begin         if filesize(ARQ)>0 then           begin             seek(ARQ,0);             repeat               read(ARQ,REG);               if codi = codi_inclue then                  begin                     gotoxy(1,5); write(nome);                     gotoxy(1,7); readln(cargo);                     gotoxy(1,9); readln(salario);                     gotoxy(1,11); readln(reg.ender.rua);                     gotoxy(1,13); readln(reg.ender.numero);                     gotoxy(1,15); readln(reg.ender.cidade);                     gotoxy(1,17); readln(reg.ender.estado);                     gotoxy(1,19); readln(reg.ender.cep);                     gotoxy(1,21); readln(fone);                     gotoxy(1,23); readln(status);                     gotoxy(8,9); write('Codigo cadastrado anteriormente.');                     gotoxy(10,11); write('Tecle <enter>...');                     repeat until readkey=#13;                  end;             until (eof(ARQ)) or (codi=codi_inclue);           end;         if codi<>codi_inclue then           begin              codi:=codi_inclue;              gotoxy(1,5); readln(nome);              gotoxy(1,7); readln(cargo);              gotoxy(1,9); readln(salario);              gotoxy(1,11); readln(reg.ender.rua);              gotoxy(1,13); readln(reg.ender.numero);              gotoxy(1,15); readln(reg.ender.cidade);              gotoxy(1,17); readln(reg.ender.estado);              gotoxy(1,19); readln(reg.ender.cep);              gotoxy(1,21); readln(fone);              gotoxy(1,23); readln(status);              write(ARQ,REG);              gotoxy(10,11); write('Continua (S/N)?'); readln(op); op:=upcase(op);              clrscr;            end;      end;until op='N';end;procedure altera_sem_numerar_campo;var numreg:integer;    op: char;    campo: string[25];beginrepeat   clrscr;   repeat      gotoxy(1,1); clreol; readln(numreg);   until (numreg>=0) and (numreg < filesize(ARQ));   seek(ARQ,numreg);   read(ARQ,REG);   with REG do   begin       gotoxy(1,3); write(codi);       gotoxy(1,5); write(nome);       gotoxy(1,7); readln(cargo);       gotoxy(1,9); readln(salario);       gotoxy(1,11); readln(reg.ender.rua);       gotoxy(1,13); readln(reg.ender.numero);       gotoxy(1,15); readln(reg.ender.cidade);       gotoxy(1,17); readln(reg.ender.estado);       gotoxy(1,19); readln(reg.ender.cep);       gotoxy(1,21); readln(fone);       gotoxy(1,23); readln(status);       gotoxy(1,5); readln(campo);       if campo<>'' then         begin gotoxy(length(campo)+1,5); clreol; nome:=campo; end;       gotoxy(1,7); readln(campo);       if campo<>'' then         begin gotoxy(length(campo)+1,7); clreol; cargo:=copy(campo,1,6); end;       gotoxy(1,9); readln(campo);       if campo<>'' thenO ERRO É EXIBIDO NESTA LINHA         begin gotoxy(length(campo)+1,9); clreol; salario:=copy(campo,1,8); end;       gotoxy(1,11); readln(campo);       if campo<>'' then         begin gotoxy(length(campo)+1,11); clreol; reg.ender.rua:=copy(campo,1,10); end;         gotoxy(1,13); readln(campo);       if campo<>'' then         begin gotoxy(length(campo)+1,13); clreol; reg.ender.numero:=copy(campo,1,12); end;       gotoxy(1,15); readln(campo);       if campo<>'' then         begin gotoxy(length(campo)+1,15); clreol; reg.ender.cidade:=copy(campo,1,14); end;       gotoxy(1,17); readln(campo);       if campo<>'' then         begin gotoxy(length(campo)+1,17); clreol; reg.ender.estado:=copy(campo,1,16); end;       gotoxy(1,19); readln(campo);       if campo<>'' then         begin gotoxy(length(campo)+1,19); clreol; reg.ender.cep:=copy(campo,1,18); end;       gotoxy(1,21); readln(campo);       if campo<>'' then         begin gotoxy(length(campo)+1,21); clreol; fone:=copy(campo,1,20); end;       gotoxy(1,23); readln(campo);       if campo<>'' then         begin gotoxy(length(campo)+1,23); clreol; status:=copy(campo,1,22); end;       seek(ARQ,filepos(ARQ)-1);       write(ARQ,REG);       gotoxy(1,27); write('Continua alteracao (S/N)?');       repeat          gotoxy(27,11); clreol; readln(op); op:=upcase(op);       until (op='S') or (op='N');   end;until op='N';end;procedure menu;var opcao: byte;begin   repeat      tela_cabecalho;      gotoxy(30,5); write('1. INCLUIR');      gotoxy(30,7); write('2. INCLUIR SEM REPETICAO');      gotoxy(30,9); write('3. CONSULTAR PELO NéMERO DO REGISTRO');      gotoxy(30,11); write('4. CONSULTAR PELO CAMPO CODIGO');      gotoxy(30,13); write('5. ALTERAR');      gotoxy(30,15); write('6. ALTERAR SEM NUMERAR CAMPO');      gotoxy(30,17); write('7. EXCLUIR');      gotoxy(30,19); write('8. FIM');      //gotoxy(30,21); write('9. FIM');      gotoxy(30,23); write('Digite sua opcao:');      repeat         gotoxy(48,23); clreol; readln(opcao);      until opcao in [0..8];      tela_opcao(opcao);      case opcao of         1: INCLUE;         2: INCLUE_SEM_REPETICAO;         3: CONSULTA_REGISTRO;         4: CONSULTA_CODIGO;         5: ALTERA;         6: ALTERA_SEM_NUMERAR_CAMPO;         7: EXCLUE;       //8: IMPRIME;      end;   until opcao=8;end;begin   introducao;   abre_arquivo;   menu;   close(ARQ);end.

Este codigo já editei algumas coisa, mas está exindo erro semantico na linha 484

Atribuição com tipos de dados incompativeis para variável salário.

Não sei se vai ser util postar o codigo original.

Preciso de ajuda.

  • Membro VIP
Postado

Olá.
 
Analise o erro dado:
 
Ex.:
Mensagem:

_FCH.PAS(484,60) Error: Incompatible types: got "ShortString" expected "Real"

Linha correspondente:

         begin gotoxy(length(campo)+1,9); clreol; salario:=copy(campo,1,8); end; ////O ERRO É EXIBIDO NESTA LINHA

Daí, basta olha a coluna 60, ou de uma maneira mais simples, como eu fiz, separar as instruções:

       if campo<>'' then         begin         gotoxy(length(campo)+1,9);         clreol;         salario:=copy(campo,1,8);         end; ////O ERRO É EXIBIDO NESTA LINHA

Nesse caso, indo para 487...

 

Os seja, salario e Copy() são incompatíveis. salario é real, e Copy() retorna um ShortString.

 

No aguardo.

  • Membro VIP
Postado

Olá.

 

@Simon Viegas Esta modificação a ser feita é muito além do meu conhecimento, pois dentro de um algoritmo pronto fazer a modificação e inserir informações diferentes é complicado.

Sinceramente não sei como contornar esta situação

 

Para corrigir não é tão complicado.. basta ter um pouco de atenção. Vamos lá:

 

Então, como você não postou o código inicial, estou me baseando pelo código que você postou. Apenas compilando ele deu o seguinte erro:

_FCH.PAS(484,7) Error: Identifier not found "O"

Na linha 484

    O ERRO É EXIBIDO NESTA LINHA         begin gotoxy(length(campo)+1,9); clreol; salario:=copy(campo,1,8); end;

Ou seja, na coluna 7, tem um "O", que "O" é esse? Está claro que se trata "de um comentário" inserido no texto... basta corrigir,
obs.: claro que poderia inserir esse "texto" de propósito justamente para marcar a linha...
ex.:

             begin gotoxy(length(campo)+1,9); clreol; salario:=copy(campo,1,8); end; //O ERRO É EXIBIDO NESTA LINHA

Compilei novamente:

Deu erro:

_FCH.PAS(484,64) Error: Incompatible types: got "ShortString" expected "Real"_FCH.PAS(490,74) Error: Incompatible types: got "ShortString" expected "SmallInt"_FCH.PAS(499,71) Error: Incompatible types: got "ShortString" expected "Real"_FCH.PAS(505,64) Error: Incompatible types: got "ShortString" expected "Char"_FCH.PAS(549,18) Error: Identifier not found "introducao"_FCH.PAS(554) Fatal: There were 5 errors compiling module, stoppingFatal: Compilation aborted

Lá na linha 484, coluna 64 está dizendo que está uma "incompatibilidade de tipos". Foi dato um "ShortString", mas o esperado é um Real... analisando as "coordenadas" temos:

salario:=copy(campo,1,8);

A variável salario é de um tipo, e a function Copy() está retornado outro que não é compatível com o tipo do salario.. e nessa linha o programador está tentado atribuir o valor de um no outro. É sabido que NÃO PODE atribuir um valor de um tipo em uma variável que não suporta esse tipo!!! (por isso o erro)

reg.salario = tipo "real"

Copy() = retorna tipo "ShortString"

 

Está entendendo? Não dá para atribuir letras para uma variável que só aceita números.

 


Daí, precisa analisar o que está querendo ser feito... para que serve o Copy()? ele vai "copiar" um trecho de uma String e retornar essa trecho nela mesma (no Copy()). Pelo parâmetros, ele está recebendo a variável campo e copiando do 1º a 8º caractere. Logo se imagina duas coisas: ou você vai precisar de uma variável do tipo String para armazenar esse "8 caracteres", ou, será necessário converter esses 8 caracteres em um número. Tá entendendo?

 

RESUMINDO

 

Quem colocou o "salario:=copy(campo,1,8);" ? qual o objetivo?

Daí corrige da forma que achar adequada.

 

 

No aguado.

Postado

Pois é.... 

O codigo original é tão grande quanto este... o que fiz na verdade foi postar um codigo onde apenas mudei os campos do registro.. 

Estou colocando os arquivos em anexo

Agenda.rar é o codigo em pascal original

APS é a lista de mudanças que o professor pediu

APS.doc

Agenda.rar

  • Membro VIP
Postado

Olá.

 

O código original está compilável, logo os erros apresentados surgiram após as modificações.

 

 

Para corrigir o erros a dica anterior persiste, apenas que no PascalZim os erros apresentados são diferentes, ou seja, como ele não diz qual é a coluna na linha e nem exatamente qual o erro, fica mais fácil separando cada comando por linhas mesmo.

           if campo<>'' then             begin             gotoxy(length(campo)+1,9);             clreol;             salario:=copy(campo,1,8);   //o erro vai apontar para esse linha             end;

No outro post já comentei sobre o que está ocorrendo.

 

Minha sugestão é a seguinte:

Pegue o código original e vá fazendo testes nele e corrigindo até que funcione corretamente. Só depois faça as modificações para o seu programa!!! Acho que fazer as duas coisas juntas mais complicado.

 

Se tiver dúvida sobre alguma parte é só postar.

 

No aguardo

  • Membro VIP
Postado

Olá

O problema é que as duvidas vão alem do antendimento pois estas partes de gotoxy, clreol, copy e etc. nao foram ensinados....

E por quê não expandir os conhecimentos?  Isso faz parte do processo. :D

 

Então, basta dá uma pesquisada nos comandos... ex.: Vai no Fórum de Pascal, e pesquisa por "gotoxy" ou "gotoxy pascal" (sem as aspas).

 

No aguardo.
 

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!