Ir ao conteúdo
  • Cadastre-se

kgin

Membro Pleno
  • Posts

    380
  • Cadastrado em

  • Última visita

Tudo que kgin postou

  1. Poste o enunciado, o programa em que está fazendo e o que você já fez.
  2. @Luiz Campos Perceba que você declarou a variável opcao como inteiro, e você não declarou às variáveis op e continuar.
  3. Não tá tosco, seria basicamente isso mesmo! Se você está começando eu sugiro você não procurar nada relacionado a api do windows, ela tende a complicar tudo. Minha solução seria #include <stdio.h> #include <stdlib.h> #include <string.h> void caixa_mensagem(char *msg, int largura, int altura); int main(void) { caixa_mensagem("caixa!", 25, 8); return(0); } void caixa_mensagem(char *msg, int largura, int altura) { int local_vertical = altura/2, local_horizontal = (largura-strlen(msg))/2, x, y, contador = 0; for (y = 0; y < altura; y++) { for (x = 0; x < largura; x++) { if (x == local_horizontal && y == local_vertical) { printf("%s", msg); x+=(strlen(msg)-1); } else if (y == 0 || y == (altura-1) || x == 0 || x == (largura-1)) { putchar('*'); } else { putchar(' '); } } putchar('\n'); } }
  4. É meio distante do que você está procurando, mas eu recomendo dar uma olhada https://github.com/Stephane-D/SGDK
  5. @JMatheus5 Recomendo você pegar um adaptador dvi-i para VGA. Adaptador Dvi-i 24+5 Pinos Macho P/ VGA 15 Pinos Femea
  6. @Gustavo Soriani Não recomendo investir muito tempo tentando consertar esse aí não, tem algumas coisas erradas que vai fazer você perder tempo.
  7. @Gustavo Soriani Deixe assim para funcionar while (fgetc(stdin) != '\n');
  8. @BobNapel O que importa e o compilador não a ide, e no seu caso você está usando o mingw. Decida em qual linguagem de programação você vai fazer, C e C++ não são a mesma já faz mais de 20 anos.
  9. @Danilo Do Carmo Converter C ou C++ para visualg nesse caso e impossível, pelo fato que esse seu algoritmo usa ponteiros e no visualg não existe ponteiros. Mas você pode converter todo o resto do algoritmo que não usa ponteiros, e talvez substituir a parte dos ponteiros por um vetor bem grande.
  10. Seria isso Entrada do teclado: -Abacaxi -Manga Saida no console: -Ixacaba -Agnam
  11. @elisa_schneider poste o que você já fez.
  12. @Nevski7 teve algum progresso?
  13. @Nevski7 Perceba que as informações são correlacionadas e a mesma coisa as duas estruturas. você pode fazer uma só #include <stdio.h> #include <string.h> #define T_MARCA 30 #define T_MODELO 30 #define T_CAMBIO 20 #define T_COR 20 #define Q_CARROS 5 #define Q_MOTAS 5 enum tipo_veiculo { CARRO = 1, MOTA }; struct contentor_data { int mes, dia, ano; }; struct contentor_veiculo { int tipo; int id; char marca[T_MARCA]; char modelo[T_MODELO]; int peso; char cambio[T_CAMBIO]; int cilindrada; int potencia; char cor[T_COR]; int lotacao; struct contentor_data data; }; void inicializa(struct contentor_veiculo *carros, struct contentor_veiculo *motas) { struct contentor_veiculo in_carros[Q_CARROS] = { { CARRO, 1, "Volkswagen", "Gol quadrado", 1300, "Manual", 1984, 120, "Branco", 5, { 5, 3, 1994 } }, { CARRO, 2, "Volkswagen", "Gol quadrado gti", 1300, "Manual", 1984, 120, "Branco", 5, { 8, 2, 1996 } } }; carros[0] = in_carros[0]; carros[1] = in_carros[1]; } void lista_veiculo(struct contentor_veiculo *veiculos) { int contador; for (contador = 0; contador < Q_CARROS; contador++) { printf("Tipo de veiculo:"); if (veiculos[contador].tipo == CARRO) { printf("Carro\n"); } else { printf("Mota\n"); } printf("id:%i\n", veiculos[contador].id); printf("modelo:%s\n", veiculos[contador].modelo); printf("peso:%i\n", veiculos[contador].peso); printf("tipo de cambio:%s\n", veiculos[contador].cambio); printf("cilindradas:%i\n", veiculos[contador].cilindrada); printf("potencia:%i\n", veiculos[contador].potencia); printf("cor:%s\n", veiculos[contador].cor); printf("lotacao:%i\n", veiculos[contador].lotacao); printf("Ano:%i\\%i\\%i\n", veiculos[contador].data.mes, veiculos[contador].data.dia, veiculos[contador].data.ano); printf("\n"); } } int main(void) { struct contentor_veiculo carros[Q_CARROS] = {0}, motas[Q_MOTAS] = {0}; inicializa(carros, motas); lista_veiculo(carros); return(0); }
  14. @Nevski7 Utilize o botão code <> na barra de ferramentas do fórum para postar o código.
  15. @Lim4 recomendo dar uma olhada nessa outras também #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define T_BUFFER 124 int verifica_hex(char *numero); int main(void) { char buffer[T_BUFFER]; printf("Digite um numero hexadecimal:"); fgets(buffer, T_BUFFER, stdin); /* retira o newline */ buffer[strlen(buffer)-1] = '\0'; if (verifica_hex(buffer)) { printf("O numero e um hexadecimal valido!\n"); printf("%s convertido para decimal e %li\n", buffer, strtol(buffer, NULL, 16)); } else { printf("%s não e um numero hexadecimal valido!\n", buffer); } printf("Pressione enter para encerrar o programa!\n"); getchar(); return(0); } int verifica_hex(char *numero) { int quantidade_chars = 0, contador; for (contador = 0; numero[contador]; contador++) { if (isxdigit(numero[contador])) { quantidade_chars++; } } if (quantidade_chars == strlen(numero)) { return(quantidade_chars); } return(0); } Visite o site cplusplus.com lá tem vários exemplos. se você for fazer uma macro desse tipo eu não recomendo ser dependente de uma função externa exemplo #define _UP(x) (((x >= 'a') && (x <= 'z')?x-32:x)) #define _IS_HEX(x) ((x >= '0' && x <= '9') || (_UP(x) >= 'A' && _UP(x) <= 'F')) Deixo como exercício final você descobrir o que essa maçaroca de macros vai ser quando passar no pré-processador, Já deixo avisado que não vai ser bonito
  16. @Lim4 Eu acho que uma melhoria seria usar uma função, e também não ficar comparando um por um. Exemplo #include <stdio.h> #include <ctype.h> int is_digit(char digito) { return((digito >= '0' && digito <= '9') || (toupper(digito) >= 'A' && toupper(digito) <= 'F')); } int main() { char digit; printf("Insert the digit: "); scanf("%c", &digit); printf("Is it a hexa digit? "); if (is_digit(digit)) { printf("yes\n"); } else { printf("no\n"); } return 0; } Macros tendem a ser difíceis de debugging pelo fato que eles acontecem antes de compilar o código.
  17. kgin

    C++ Como criar um OS em C++?

    Quase todos os compiladores fazem, mas isso depende das bibliotecas que você está usando. para fazer isso no GCC basta fazer isso. $ gcc -c testes.c $ objcopy -O binary -j .text testes.o binfile esse comando vai pegar só o conteúdo executável do binário. Se você quer entrar nessa empreitada de fazer um sistema operacional eu recomendo aprender assembly, mas mais precisamente assembly do x86 16-bits. Alguns links úteis. Tutorial de assmebly do Adam hyde em português PC-GPE (PC Game Programmer's Encyclopedia) Baixe o dosbox, tasm e turbo C e crie um ambiente de programação em dos para brincar um pouco. Depois tente algo mais serio como fazer um bootloader. minimal bootloader Esse vídeo explica bem os passos mínimos para construir um sistema operacional. E mais uma porrada de links que valem dar uma olhada. Boot sector games AquilaOS sistema operacional feito em C e assembly GhostOS sistema operacional feito em C, C++ e assembly. ToaruOS 2.0 Sortix Barebone OS Writing an Operating System from Scratch: From Assembly to C Eh eu recomendo você aprender a usar o qemu para rodar seus testes ao invés de uma maquina real.
  18. kgin

    C Sistema de locadora de filmes

    Você tem que colocar na estrutura se o filme já foi alugado ou não. struct cadastroF { char nomeFilme[50]; char generoFilme[50]; int codigoFilme; int disponivel; }; Depois é só fazer um loop e salvar a posição do filme no vetor e se ele foi encontrado. Exemplo /* Busca o filme */ contador2 = filme_encontrado = 0; do { if (codigo == filmes[contador2].codigo) { filme_encontrado = 1; /* Marca que o filme foi encontrado */ local_filme = contador2; /* Salva a posição em que o filme esta */ } contador2++; } while (contador2 < Q_FILMES && filme_encontrado == 0); /* Verifica se o filme foi encontrado */ if (filme_encontrado == 1) { printf("%s filme com o codigo %i encontrado\n", filmes[local_filme].nome, filmes[local_filme].codigo); printf("1\\sim 2\\não:"); scanf("%i%*c", &opcao); if (opcao == 1) { filmes[local_filme].disponivel = 0; printf("Filme alugado!\n"); } else { printf("filme não encontrado\n"); } printf("Pressione enter para continuar\n"); getchar(); } Exemplo completo #include <stdio.h> #include <stdlib.h> #define T_NOME 60 #define T_GENERO 90 #define Q_FILMES 3 struct container_filme { char nome[T_NOME]; char genero[T_GENERO]; int codigo; int disponivel; }; void inicia_filmes(struct container_filme *f) { sprintf(f[0].nome, "Tubarao"); sprintf(f[0].genero, "Terror, acao, suspense"); f[0].codigo = 302; f[0].disponivel = 1; sprintf(f[1].nome, "A casa de vidro"); sprintf(f[1].genero, "Terror, acao, suspense"); f[1].codigo = 343; f[1].disponivel = 1; sprintf(f[2].nome, "Beverly Hills Cop"); sprintf(f[2].genero, "Acao, comedia"); f[2].codigo = 375; f[2].disponivel = 1; } int main(void) { int opcao, contador1, contador2, codigo, filme_encontrado, local_filme; struct container_filme filmes[Q_FILMES]; inicia_filmes(filmes); do { printf("Digite uma das opções abaixo\n"); printf("1-Listar filmes no sistema\n"); printf("2-Aluga filme\n"); printf("3-Sair\n"); scanf("%i%*c", &opcao); switch (opcao) { case 1: for (contador1 = 0; contador1 < Q_FILMES; contador1++) { printf("informações do filme\n"); printf("Nome:%s\n", filmes[contador1].nome); printf("Genero:%s\n", filmes[contador1].genero); printf("Codigo:%i\n", filmes[contador1].codigo); if (filmes[contador1].disponivel) { printf("Esta disponivel para alugar!\n"); } else { printf("não esta disponivel para alugar!\n"); } printf("\n"); } break; case 2: for (contador1 = 0; contador1 < Q_FILMES; contador1++) { printf("informações do filme\n"); printf("Nome:%s\n", filmes[contador1].nome); printf("Genero:%s\n", filmes[contador1].genero); printf("Codigo:%i\n", filmes[contador1].codigo); if (filmes[contador1].disponivel) { printf("Esta disponivel para alugar!\n"); } else { printf("não esta disponivel para alugar!\n"); } printf("\n"); } printf("Digite o codigo do filme que voce deseja alugar\n"); scanf("%i%*c", &codigo); /* Busca o filme */ contador2 = filme_encontrado = 0; do { if (codigo == filmes[contador2].codigo) { filme_encontrado = 1; local_filme = contador2; } contador2++; } while (contador2 < Q_FILMES && filme_encontrado == 0); /* Verifica se o filme foi encontrado */ if (filme_encontrado == 1) { printf("%s filme com o codigo %i encontrado\n", filmes[local_filme].nome, filmes[local_filme].codigo); printf("1\\sim 2\\não:"); scanf("%i%*c", &opcao); if (opcao == 1) { filmes[local_filme].disponivel = 0; printf("Filme alugado!\n"); } else { printf("filme não encontrado\n"); } printf("Pressione enter para continuar\n"); getchar(); } break; } } while (opcao != 3); return(0); }
  19. sim está errado, você teria que usar parâmetros nas funções. exemplo procedimento gerador(msg:caractere; repeticao, borda_tipo:inteiro) var contador:inteiro inicio escolha (borda_tipo) caso 1 escreval("+-------=======------+") caso 2 escreval("~~~~~~~~:::::::~~~~~~~") caso 3 escreval("<<<<<<<<------->>>>>>>") fimEscolha para contador de 1 ate repeticao faca escreval(msg) fimPara escolha (borda_tipo) caso 1 escreval("+-------=======------+") caso 2 escreval("~~~~~~~~:::::::~~~~~~~") caso 3 escreval("<<<<<<<<------->>>>>>>") fimEscolha fimProcedimento Mas eu prefiro dessa maneira. Algoritmo "bordas" const BORDA1 = 1 BORDA2 = 2 BORDA3 = 3 var opcao, contador, quantidade:inteiro msg:caractere procedimento borda(borda_tipo:inteiro) inicio escolha (borda_tipo) caso BORDA1 escreval("+-------=======------+") caso BORDA2 escreval("~~~~~~~~:::::::~~~~~~~") caso BORDA3 escreval("<<<<<<<<------->>>>>>>") fimEscolha fimProcedimento procedimento gerador(msg:caractere; repeticao, borda_tipo:inteiro) var contador:inteiro inicio borda(borda_tipo) para contador de 1 ate repeticao faca escreval(msg) fimPara borda(borda_tipo) fimProcedimento inicio escreval("Escolha entre uma dessas bordas") para contador de BORDA1 ate BORDA3 faca escreva("Borda ", contador,"|") borda(contador) fimPara leia(opcao) escreval("Digite uma mensagem para aparecer na borda") leia(msg) escreval("Digite a quantidade de vezes que voce quer que a mensgaem se repita") leia(quantidade) gerador(msg, quantidade, opcao) fimAlgoritmo
  20. @Pietra Ester Eu acho melhor você reescrever porque tem muita coisa errada aí. Veja que aqui você declarou o ponteiro para a variável vet e nunca usou você ignora o vetor criado no main era pra ser algo como vet = cria_vet(tamanho_vetor); E você declarou vet como vetor sendo que era para declarar como ponteiro. Errado! Correto! float *vet = NULL; Tome um exemplo de como fazer para criar o vetor. #include <stdio.h> #include <stdlib.h> #include <time.h> #define NOME_ARQUIVO "teste.txt" float *vetor_cria(int tamanho) { /* Cria um vetor do tamanho dado pela variavel tamanho */ float *vetor = malloc(sizeof(*vetor)*tamanho); /* Checa se foi possível criar o vetor */ if (vetor != NULL) { /* Devolve o vetor para a função que o chamou */ return(vetor); } /* Retorna NULL caso não for possível reservar a memória para o vetor */ return(NULL); } void vetor_apaga(float **vetor) { /* Verifica se o ponteiro é valido */ if (*vetor != NULL) { /* Libera a memória reservada */ free(*vetor); } /* Invalida o ponteiro */ *vetor = NULL; } /* * Coloca numeros aleatorios de 0 a 100 no vetor */ void vetor_inicializa_aleatorios(float *vetor, int tamanho) { int contador; /* Passa a hora e a data do sistema como semente para o gerador de numeros */ srand(time(NULL)); /* Coloca os numeros no vetor */ for (contador = 0; contador < tamanho; contador++) { vetor[contador] = rand()%100; } } void vetor_inicializa_usuario(float *vetor, int tamanho) { int contador; printf("Por favor digite %i numeros para o vetor\n", tamanho); for (contador = 0; contador < tamanho; contador++) { printf("[%i]:", contador+1); scanf("%f%*c", &vetor[contador]); } } float vetor_soma_elementos(float *vetor, int tamanho) { float soma = 0; int contador; for (contador = 0; contador < tamanho; contador++) { soma+=vetor[contador]; } return(soma); } float vetor_maior_elemento(float *vetor, int tamanho, float menor_elemento) { int contador; float maior = menor_elemento; for (contador = 0; contador < tamanho; contador++) { if (vetor[contador] > maior) { maior = vetor[contador]; } } return(maior); } float vetor_menor_elemento(float *vetor, int tamanho, float maior_elemento) { int contador; float menor = maior_elemento; for (contador = 0; contador < tamanho; contador++) { if (vetor[contador] < menor) { menor = vetor[contador]; } } return(menor); } void vetor_mostra(float *vetor, int tamanho) { int contador; for (contador = 0; contador < tamanho; contador++) { printf("[%i]:%.2f\n", contador+1, vetor[contador]); } } int main(void) { /* Variaveis para guardar os valores retornados */ float soma = 0, maior = 0, menor = 0, diferenca = 0; /* Nosso vetor dinamico */ float *vetor = NULL; /* tamanho do vetor */ int vetor_tamanho = 0; char opcao; /* Pergunta o tamanho do vetor */ printf("Digite o tamanho do vetor:"); scanf("%i%*c", &vetor_tamanho); /* Cria o vetor */ vetor = vetor_cria(vetor_tamanho); /* Checa se foi possível criar o vetor */ if (vetor == NULL) { perror("Erro: não foi possível reservar memória!"); exit(EXIT_FAILURE); } /* Inicia o vetor */ vetor_inicializa_aleatorios(vetor, vetor_tamanho); /* Mostra o vetor */ printf("Vetor gerado!\n"); vetor_mostra(vetor, vetor_tamanho); /* Pega o maior elemento do vetor */ maior = vetor_maior_elemento(vetor, vetor_tamanho, 0); /* Pega o menor elemento do vetor */ menor = vetor_menor_elemento(vetor, vetor_tamanho, maior); printf("O maior elemento do vetor e %.2f e o menor e %.2f\n", maior, menor); /* Mostra a diferenca */ diferenca = maior-menor; printf("E a diferenca e %.2f\n", diferenca); /* Libera o vetor */ vetor_apaga(&vetor); getchar(); /* Espera a tecla enter */ return(0); } Exemplo online!
  21. você está retornado eles na função diferenca() e soma_elementos(). Eu coloquei como pegar aqui
  22. @Pietra Ester Perceba que no main você não pegou as variáveis soma e dif. //BIBLIOTECAS #include <stdio.h> #include <stdlib.h> #define ARQ_LOCAL "info.txt" //VARÁVEL GLOBAL PARA O TAMANHO DO VETOR int tam_v; //CRIA VETOR int *cria_vet(int n) { int *vet; int i; printf("\nDigite o tamanho do vetor: "); scanf("%d%*c", &tam_v); //cria um vetor de n posições vet = (int *) malloc (tam_v*sizeof(int)); return vet; } //PREENCHE O VETOR void inicializa(float *vet, int tam_v) { int i; //Preenche o vetor for(i=0; i<tam_v; i++) { printf("Elemento %d: ", i);//valores digitados pelo usuario scanf("%f%*c", &vet[i]);//lê os valores } } //MOSTRA float mostra(float *vet, int tam_v) { int i; printf("\nVetor gerado:\n"); for (i=0; i<tam_v; i++) printf("%.2f ", vet[i]); return vet[tam_v];//retorna o vetor } //CALCULA A DIFERENÇA float diferenca(float *vet, int tam_v) { int i; float dif, menor, maior; //encontra o maior maior = vet[0]; for(i=1; i<tam_v; i++) { if (vet[i] > maior) maior = vet[i]; } printf("\n\nMaior = %.2f\n", maior); //encontra o menor menor = vet[0]; for(i=1; i<tam_v; i++) { if (vet[i] < maior) menor = vet[i]; } printf("Menor = %.2f\n", menor); //calcula a diferença dif = maior - menor; //mostra a diferença printf("Diferenca = %.2f \n\n", dif); return dif; } //CALCULA A SOMA DOS ELEMENTOS float soma_elementos(float *vet, int tam_v) { int i; float soma=0; for(i=0; i<tam_v; i++) { soma = soma + vet[i]; } printf("Soma dos elementos = %.2f\n\n", soma); return soma; } //ARMAZENA EM DISCO float salva_le(float *vet, int tam_v, float soma, float dif) { FILE *fp; //Modo W de write (escrita) fp = fopen(ARQ_LOCAL, "w"); if(fp == NULL) { printf("Sem memória!\n");//verifica se existe o arquivo } else { fprintf(fp, "Soma = %f", soma); fprintf(fp, " Dif = %f", dif); printf("Soma e diferenca gravados com sucesso!\n"); fclose(fp);//fecha o arquivo } //LÊ EM DISCO FILE *le; le = fopen(ARQ_LOCAL, "r");//Modo R de Read (leitura) if(le == NULL) //verifica se existe o arquivo { printf("\nErro ao abrir o arquivo.\n\n"); } else { fscanf(le, "Soma = %.2f\n", &soma); fscanf(le, "Dif = %.2f", &dif); printf("Soma = %.2f\nDiferenca = %.2f\n", &soma, &dif); fclose(fp);//fecha o arquivo } /* system ("pause"); Chega a ser engraça do :b *///pausa na tela, somente para Windows getchar(); } int main() { //VARIÁVEIS int n; float vet[tam_v], soma, dif; //CABEÇALHO printf("---> Avaliacao de Algoritmo\n"); printf("---> 2o Semestre\n"); printf("---------------------------------------\n"); //FUNÇÃO QUE CRIA O VETOR cria_vet(n); //FUNÇÃO QUE INICIALIZA O VETOR inicializa(vet, tam_v); //FUNÇÃO QUE IMPRIME O VETOR mostra(vet, tam_v); //FUNÇÃO QUE CALCULA A DIFERENÇA dif = diferenca(vet, tam_v); //FUNÇÃO SOMA soma = soma_elementos(vet, tam_v); //FUNÇÃO QUE ARMAZENA EM DISCO FAZ A LEITURA salva_le(vet, tam_v, soma, dif); return 0; } E esse seu código tem um vazamento de memória.
  23. @Fídias Torres Não recomendo ficar misturando C e C++, ou você faz em um ou no outro. Seria essa a sua ideia? usando apenas C. #include <stdio.h> #include <stdlib.h> #include <string.h> #define T_STR 80 void apagaTela(void) { int cont; for (cont = 0; cont < 40; cont++) printf("\n"); } int main(void) { int q_linhas, q_colunas, linhas, colunas, opcao; apagaTela(); /* Pega a quantidade de linhas */ do { printf("Digite a quantidade de linhas da matriz:"); scanf("%i%*c", &q_linhas); if (q_linhas < 1) { printf("Valor invalido!\nDigite novamente\n"); } } while (q_linhas < 1); apagaTela(); /* Pega a quantidade de colunas */ do { printf("Digite a quantidade de colunas da matriz:"); scanf("%i%*c", &q_colunas); if (q_colunas < 1) { printf("Valor invalido!\nDigite novamente\n"); } } while (q_colunas < 1); apagaTela(); char matriz[q_linhas][q_colunas][T_STR]; /* Pega a matriz */ for (linhas = 0; linhas < q_linhas; linhas++) { for (colunas = 0; colunas < q_colunas; colunas++) { printf("Digite o nome da linha e coluna [%i][%i]:", linhas, colunas); fgets(matriz[linhas][colunas], T_STR, stdin); /* Retira o caractere de nova linha da string */ matriz[linhas][colunas][strlen(matriz[linhas][colunas])-1] = '\0'; } } do { printf("Deseja visualizar a matriz 1\\sim 0\\não:"); scanf("%i%*c", &opcao); switch (opcao) { case 1: /* Mostra a matriz */ for (linhas = 0; linhas < q_linhas; linhas++) { for (colunas = 0; colunas < q_colunas; colunas++) { printf("%s, ", matriz[linhas][colunas]); } printf("\n"); /* Salta uma linha */ } break; case 0: printf("Operacao finalizada!\n"); break; default: printf("Opcao invalida!\n"); } } while (opcao != 0); return(0); } exemplo online
  24. Se você tem essa configuração, então não é problema de hardware (poderia ser se caso o computador congela-se do nada), verificar o HD e SSD sempre e bom. Recomendo você usar o ffmpeg para fazer um benchmark da cpu e gpu renderizando um vídeo para 2k ou 4k. se não souber usar, use o kdenlive para fazer o teste. o ffmpeg e muito bom para denunciar algum problema de software.

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!