Ofereço ajuda em Java, C/C++, Python, C#, LISP, AutoLisp, AutoCAD
Ofereço ajuda em PHP, Python, C#, JavaScript, Laravel, Google Ads e SEO

Planilha Web - Planilhas e Calculadoras online para estudantes e profissionais de Engenharia Civil, Engenharia Elétrica e Engenharia Mecânica.

JavaScript ::: Fundamentos da Linguagem ::: Estruturas de Controle

Apostila de JavaScript - Como usar o laço for da linguagem JavaScript

Quantidade de visualizações: 8050 vezes
O laço for (também chamado de loop for ou laço para) é usado quando queremos repetir uma instrução ou um conjunto de instruções um determinado número de vezes. Este laço é composto de três partes: inicialização, teste de continuídade e incremento ou decremento da variável de controle. Veja:

for(inicialização; teste; incremento/decremento){
  instrução ou conjunto de instruções
}

Na parte da inicialização nós podemos inicializar a variável a ser usada para controlar a quantidade de repetições do laço. Na parte do teste de continuídade nós avaliamos uma condição boolean (verdadeiro/falso) para determinar se o laço deve ser interrompido ou continuar sua execução. Na parte de incremento/decremento nós incrementamos ou decrementamos o valor da variável de controle.

Veja um trecho de código no qual usamos o laço for para contar de 0 até 10:

<html>
<head>
<title>Estudos JavaScript</title>
</head>
<body>

<script type="text/javascript">
  for(var i = 0; i <= 10;  i++){
    document.write(i + "<br>");
  }  
</script>

</body>
</html>

Este código exibirá o seguinte resultado:

0
1
2
3
4
5
6
7
8
9
10

Veja que a condição de continuídade do laço é o valor da variável i menor ou igual a 10. Eis agora uma modificação deste código que conta de 10 até 0:

<html>
<head>
<title>Estudos JavaScript</title>
</head>
<body>

<script type="text/javascript">
  for(var i = 10; i >= 0;  i--){
    document.write(i + "<br>");
  }  
</script>

</body>
</html>

Agora o código exibirá o seguinte resultado:

10
9
8
7
6
5
4
3
2
1
0

Agora que já vimos um exemplo do uso deste laço, é importante saber quando e quantas vezes as três partes de um laço for são executadas:

a) A parte de inicialização é executada apenas uma vez, ou seja, na entrada da estrutura do laço.

b) O teste de continuídade é feito ANTES de cada repetição (iteração) do laço. Se o teste de continuída não resultar satisfatório já na primeira repetição, as instruções contidas no laço não serão executadas e o fluxo do código continuará após sua chave de fechamento.

c) A parte de incremento/decremento da variável de controle é feita DEPOIS de cada repetição do laço.

Com exceção do teste de continuídade, as demais partes de um laço for podem conter mais de uma instrução. Quando isso acontece nós as separamos usando vírgulas. Veja um exemplo:

<html>
<head>
<title>Estudos JavaScript</title>
</head>
<body>

<script type="text/javascript">
  for(var i = 0, j = 2; i <= 10;  i++, j = j + 3){
    document.write("i = " + i + "; j = " + j + "<br>");
  }  
</script>

</body>
</html>

Ao executar este código teremos o seguinte resultado:

i = 0; j = 2
i = 1; j = 5
i = 2; j = 8
i = 3; j = 11
i = 4; j = 14
i = 5; j = 17
i = 6; j = 20
i = 7; j = 23
i = 8; j = 26
i = 9; j = 29
i = 10; j = 32

Esta dica foi escrita e testada no Internet Explorer 8 e Firefox 3.6.


Java ::: Desafios e Lista de Exercícios Resolvidos ::: Matemática e Estatística

Exercício Resolvido de Java - Como simplificar frações em Java

Quantidade de visualizações: 784 vezes
Pergunta/Tarefa:

Simplificar uma fração consiste em reduzir o numerador e o denominador por meio da divisão pelo máximo divisor comum aos dois números. Uma fração está totalmente simplificada quando verificamos que seus termos estão totalmente reduzidos a números que não possuem termos divisíveis entre si. Uma fração simplificada sofre alteração do numerador e do denominador, mas seu valor matemático não é alterado, pois a fração, quando tem seus termos reduzidos, torna-se uma fração equivalente.

Escreva um programa Java que pede para o usuário informar o numerador e o denominador de uma fração e mostre a fração simplificada. Use uma classe Fracao para a operação de simplificação. Em outras seções do nosso site você encontra o cálculo do MDC para encontrar o Máximo Divisor Comum.

Sua saída deverá ser parecida com:

Informe o numerador: 32
Informe o denominador: 40
A fração gerada foi: 32/40
A fração simplificada é: 4/5
Resposta/Solução:

Veja a resolução comentada deste exercício em Java:

package estudos;

import java.util.Scanner;
  
public class Estudos{
  public static void main(String[] args) {
    // para ler a entrada do usuário
    Scanner entrada = new Scanner(System.in);
    
    // vamos pedir para o usuário informar o numerador
    System.out.print("Informe o numerador: ");
    int numerador = Integer.parseInt(entrada.nextLine());
    
    // vamos pedir para o usuário informar o denominador
    System.out.print("Informe o denominador: ");
    int denominador = Integer.parseInt(entrada.nextLine());
    
    // vamos criar um objeto da classe Fracao
    Fracao f = new Fracao(numerador, denominador);
    
    // vamos mostrar a fração gerada
    System.out.println("A fração gerada foi: " + f.toString());
    
    // agora vamos simplificar esta fração
    System.out.println("A fração simplificada é: " +
      f.simplificar().toString());
  }
}

// classe usada para representar uma Fração
class Fracao{
  int numerador;
  int denominador;

  // construtor da classe 
  public Fracao(int numerador, int denominador) {
    this.numerador = numerador;
    this.denominador = denominador;
  }

  // método que simplifica a fração atual e retorna o
  // resultado como uma fração
  public Fracao simplificar(){
    // cria uma fração temporária
    Fracao temp = new Fracao(this.numerador, this.denominador);
    
    // descobrimos que é maior, o numerador ou o
    // denominador
    int n = temp.numerador, d = temp.denominador, maior;
    
    // o numerador é menor que 0?
    if (temp.numerador < 0) {
      n = -temp.numerador;
    }
    
    // descobrimos o maior
    if (n > d) {
      maior = n;
    } 
    else {
      maior = d;
    }
 
    // encontramos o maior número que divide o numerador e o
    // denominador
    int mdc = 0;
    for (int i = maior; i >= 2; i--) {
      if ((temp.numerador % i == 0) && (temp.denominador % i == 0)) {
        mdc = i;
        break;
      }
    }
 
    // agora dividimos tanto o numerador quanto o denominador
    // pelo mdc encontrado    
    if (mdc != 0) {
      temp.numerador = temp.numerador / mdc;
      temp.denominador = temp.denominador / mdc;
    }
    
    // retorna a fração temporária
    return temp;
  }
  
  // retorna uma representação textual dessa fração
  @Override
  public String toString() {
    return this.numerador + "/" + this.denominador; 
  }
}



Delphi ::: Dicas & Truques ::: Strings e Caracteres

Como substituir todas as ocorrências de uma substring em uma string Delphi usando a função ReplaceStr()

Quantidade de visualizações: 16805 vezes
Algumas vezes precisamos substituir todas as ocorrências de uma substring em uma string. Em Delphi isso pode ser feito com o auxílio da função ReplaceStr(). Esta função requer a string na qual a substituição ocorrerá, a substring a ser substituída e a nova substring. O resultado será uma nova string resultante da substituição. Veja o exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
  frase: string;
begin
  frase := 'PHP? Sim, eu gosto muito de PHP';

  // vamos substituir todas as ocorrências de "PHP" por "Delphi'
  frase := ReplaceStr(frase, 'PHP', 'Delphi');

  // vamos exibir o resultado
  ShowMessage(frase);
end;

Lembre-se de que esta função diferencia maiúsculas e minúsculas.

Não se esqueça de adicionar a unit StrUtils no uses do seu formulário.

Para questões de compatibilidade, esta dica foi escrita usando Delphi 2009.


C++ ::: Dicas & Truques ::: Matemática e Estatística

Como calcular porcentagem em C++ - Como efetuar cálculos de porcentagem em C++

Quantidade de visualizações: 40467 vezes
Cálculos de porcentagens estão presentes em boa parte das aplicações que desenvolvemos. Porém, há momentos em que a mente trava e não conseguimos lembrar com clareza como estes cálculos são feitos, principalmente em C++.

Esta anotação tem o objetivo de ser uma fonte de pesquisa para os momentos em que suas habilidades matemáticas insistirem em continuar ocultas.

Ex: 1 - Suponhamos que um produto que custe R$ 178,00 sofra um acréscimo de 15%. Qual o valor final do produto? Veja o código em C++:

// Algoritmo que calcula porcentagem em C++
#include <iostream>

using namespace std;

// função principal do programa
int main(int argc, char *argv[]){
  // variáveis usadas na resolução do problema
  double valor, percentual, valor_final;

  valor = 178.00; // valor original
  percentual = 15.0 / 100.0; // 15%
  valor_final = valor + (percentual * valor);

  // mostra o resultado
  cout << "O valor final do produto é: " << valor_final;

  // O resultado será 204,70
  
  cout << "\n\n";
  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}

Ex: 2 - Um produto, cujo valor original era de R$ 250,00, teve um desconto de 8%. Qual foi seu valor final? Veja o código em C++:

// Algoritmo que calcula porcentagem em C++
#include <iostream>

using namespace std;

// função principal do programa
int main(int argc, char *argv[]){
  // variáveis usadas na resolução do problema
  double valor, percentual, valor_final;

  valor = 250.00; // valor original
  percentual = 8.0 / 100.0; // 8%
  valor_final = valor - (percentual * valor);

  // mostra o resultado
  cout << "O valor final do produto é: " << valor_final;
  
  // O resultado será 230,00
  
  cout << "\n\n";
  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}

Ex: 3 - Em um concurso de perguntas e respostas, um jovem acertou 72 das 90 perguntas apresentadas. Qual foi a porcentagem de acertos? E a porcentagem de erros? Veja o código em C++:

// Algoritmo que calcula porcentagem em C++
#include <iostream>

using namespace std;

// função principal do programa
int main(int argc, char *argv[]){
  // variáveis usadas na resolução do problema
  double perguntas, acertos;

  perguntas = 90.0;
  acertos = 72.0;

  // mostra a porcentagem de acertos
  cout << "Porcentagem de acertos: " << ((acertos / perguntas) * 100) << "%";

  // mostra a porcentagem de erros
  cout << "\nPorcentagem de erros: " << ((perguntas - acertos) / perguntas) 
    * 100 << "%";

  // Os resultados serão 80% e 20%
  
  cout << "\n\n";
  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}

Ex: 4 - Um aparelho de CD foi adquirido por R$ 300,00 e revendido por R$ 340,00. Qual foi a porcentagem de lucro na transação? Veja o código em C++:

// Algoritmo que calcula porcentagem em C++
#include <iostream>

using namespace std;

// função principal do programa
int main(int argc, char *argv[]){
  // variáveis usadas na resolução do problema
  double valor_anterior, novo_valor, porcentagem_lucro;

  valor_anterior = 300.0; // valor anterior
  novo_valor = 340.0; // valor novo

  // calcula a porcentagem de lucro
  // efetua o cálculo
  porcentagem_lucro = ((novo_valor * 100) / valor_anterior) - 100;

  cout << "A porcentagem de lucro foi de: " << porcentagem_lucro << "%";

  // O resultado será 13,33
  
  cout << "\n\n";
  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}

Ex: 5 - Uma loja repassa 5% do lucro a seus vendedores. Se um produto custa R$ 70,00, qual o valor em reais repassado a um determinado vendedor? Veja o código em C++:

// Algoritmo que calcula porcentagem em C++
#include <iostream>

using namespace std;

// função principal do programa
int main(int argc, char *argv[]){
  // variáveis usadas na resolução do problema
  double valor, percentual, comissao;

  valor = 70.0; // valor do produto
  percentual = 5.0 / 100.0; // 5%

  // calcula a comissão
  comissao = percentual * valor;

  // mostra o resultado
  cout << "O valor repassado ao vendedor é: " << comissao;

  // O resultado será 3,5
  
  cout << "\n\n";
  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}



Java ::: Pacote java.lang ::: String

Java para iniciantes - Como verificar se duas strings são iguais ou diferentes usando os métodos equals() e equalsIgnoreCase() da classe String

Quantidade de visualizações: 4486 vezes
Podemos verificar se duas strings são iguais ou diferentes em Java usando os métodos equals() e equalsIgnoreCase(). O método equals() recebe um objeto do tipo String e o compara com o String atual. Veja sua assinatura:

public boolean equals(Object anObject)

O resultado será true se as duas strings forem iguais e false em caso contrário. Note que equals() diferencia letras maiúsculas e letras minúsculas. Veja um exemplo:

package estudos;

public class Estudos{
  public static void main(String[] args) {
    String palavra1 = "Java";
    String palavra2 = "java";
    
    // vamos verificar se as duas strings são iguais
    if(palavra1.equals(palavra2)){
      System.out.println("As duas strings são iguais");
    }
    else{
      System.out.println("As duas strings são diferentes");  
    }
  }
}

Ao executar este código nós teremos o seguinte resultado:

As duas strings são diferentes

O método equalsIgnoreCase(), por sua vez, não diferencia letras maiúsculas de letras minúsculas. Veja o exemplo anterior usando o método equalsIgnoreCase():

package estudos;

public class Estudos{
  public static void main(String[] args) {
    String palavra1 = "Java";
    String palavra2 = "java";
    
    // vamos verificar se as duas strings são iguais
    if(palavra1.equalsIgnoreCase(palavra2)){
      System.out.println("As duas strings são iguais");
    }
    else{
      System.out.println("As duas strings são diferentes");  
    }
  }
}

Ao executarmos este código o resultado será:

As duas strings são iguais



Ruby ::: Dicas & Truques ::: Strings e Caracteres

Como retornar a quantidade de vezes que um caractere aparece em uma string Ruby usando a função count()

Quantidade de visualizações: 8343 vezes
O método count() da classe String da linguagem Ruby pode ser usado para obter a quantidade de vezes em que um determinado caractere aparece em uma string. Para isso, só precisamos fornecer o caractere que será pesquisado. O retorno será um número inteiro. Veja o exemplo:

# declara e inicializa uma variável string
frase = "Gosto muito de Ruby"

# vamos obter a quantidade de vezes em que o
# caractere "o" aparece na frase
quant = frase.count("o")

# exibe o resultado
puts "O caractere \"o\" aparece " + quant.to_s \
  + " vezes"

Ao executar este código Ruby nós teremos o seguinte resultado:

O caractere "o" aparece 3 vezes


Java ::: Coleções (Collections) ::: LinkedList

Java Collections - Como adicionar elementos no final de uma LinkedList usando os métodos add() e addLast()

Quantidade de visualizações: 9342 vezes
O trecho de código a seguir mostra como adicionar elementos no final de um lista ligada (objeto da classe LinkedList). Para isso podemos usar os métodos add() e addLast(). Ambos possuem a mesma funcionalidade. É claro que addLast() representa melhor a idéia de adicionar elementos no final da lista ligada. Veja ainda como usar um ListIterator para percorrer a lista e exibir os elementos. Outra técnica que você perceberá é o uso de unboxing dentro do laço while:

import java.util.*;
 
public class Estudos{ 
  public static void main(String args[]){ 
    // Cria uma LinkedList de inteiros
    LinkedList<Integer> valores = new 
      LinkedList<Integer>();
     
    // adiciona valores no final da lista ligada 
    // usando os métodos add() e addLast(). Lembre-se 
    // de que ambos fornecem a mesma funcionalidade
    valores.add(56);
    valores.addLast(3);
    valores.add(28);
 
    // obtém um ListIterator para percorrer toda a
    // lista ligada, começando no primeiro elemento
    ListIterator<Integer> iterador = 
      valores.listIterator(0);
    while(iterador.hasNext()){  
      // note o unboxing aqui
      int valor = iterador.next(); 
      System.out.println(valor); 
    }
  } 
}

Ao executar este código Java nós teremos o seguinte resultado:

56
3
28


AutoCAD ::: Dicas & Truques ::: Configurações da Área de Desenho

Como definir os limites da área de desenho do AutoCAD usando o comando LIMITS

Quantidade de visualizações: 1103 vezes
Quando estamos criando um novo desenho no AutoCAD, muitas vezes usando os arquivos de template acad.dwt (medidas imperiais) ou acadiso.dwt (medidas métricas), nos deparamos com uma área de desenho gigantesca, com medidas enormes.

Assim, é sempre uma boa idéia delimitarmos a área de desenho, e isso é feito por meio do comando LIMITS. Este comando, quando acionado, nos pede duas coordenadas: Lower Left e Upper Right. Veja a figura:



Dessa forma, Lower Left define os limites para o canto esquerdo inferior e Upper Right define os limites para o canto superior direito. Quando acionamos o comando LIMITS (ligado: ON), não conseguimos sair desses limites, o que pode ser uma comodidade, pois podemos nos concentrar em pequenos porções de um desenho de grandes proporções.

Vamos então aprender a usar o comando LIMITS do AutoCAD? Comece criando um novo desenho (usando ou não os templates mencionados acima) e digite os comandos a seguir:

LIMITS [Enter]
Specify lower left corner or [ON/OFF] <0.0000,0.0000>: 0,0
Specify upper right corner <420.0000,297.0000>: 100,80

Tenha a certeza de inserir as coordenadas separadas por vírgulas e acionar a opção ON para ativar os limites. No final, digite o comando ZOOM ALL para aproximar a área de desenho dentro dos limites recém-definidos.

Agora, sempre que digitarmos coordenadas fora desses limites, o AutoCAD nos avisará que os valores são inválidos e os rejeitará. Para desligar os limites, basta chamar LIMITS novamente e informar o valor OFF.


C# ::: Windows Forms ::: DataGridView

Como ligar um DataGridView do C# Windows Forms à tabela de um banco de dados e efetuar inserção, alteração e remoção de registros

Quantidade de visualizações: 32971 vezes
Uma das principais dúvidas que recebo em meu site é em relação aos passos necessários para associar um DataGridView com a tabela de um banco de dados e listar os dados. Em tempo de design este processo é relativamente fácil, visto que temos wizards que nos acompanham e fazem o trabalho mais pesado nos bastidores. No entanto, o cenário é completamente diferente quando temos que realizar tal tarefa via código. Espero que esta dica o deixe mais preparado para enfrentar tais situações.

Para esta dica eu fiz uma conexão Visual C# 2005 + MySQL 5.0 usando ODBC (caso tenha dúvidas sobre isso, veja minha seção sobre C# + MySQL). Criei uma tabela MySQL chamada clientes contendo id, nome, idade, cidade e estado do cliente. Criei uma classe de conexão, inseri um DataGridView no formulário e coloquei as declarações abaixo na classe do formulário Form1.cs (fora dos métodos, para que os dados sejam globais na classe):

// membros de instância de acesso global na classe
// Dica: Se estiver usando SQL Server, troque "Odbc" por
// "Sql" (Ex: SQLConnection, SqlCommand, SqlDataAdapter)

// conexão com o banco de dados
OdbcConnection conn = null;
OdbcCommand cmd = null;
OdbcDataAdapter adapter = null;
DataSet ds = null;


Em seguida colocamos o código abaixo no evento Click de um botão:

private void button4_Click(object sender, EventArgs e){
  // Dica: Se estiver usando SQL Server, troque "Odbc" 
  // por "Sql" (Ex: SqlCommand, SqlDataAdapter, etc)
  
  // obtém a conexão com o banco de dados
  conn = ConexaoODBC.obterConexao();

  if(conn != null){
    // obtém todos os clientes cadastrados
    cmd = new OdbcCommand("SELECT * FROM clientes",
      conn);

    adapter = new OdbcDataAdapter(cmd);
    ds = new DataSet();
    adapter.Fill(ds, "clientes_table");

    // exibe os dados da tabela no DataGridView 
    dataGridView1.DataSource = ds;
    dataGridView1.DataMember = "clientes_table";

    // fecha a conexão
    ConexaoODBC.fecharConexao();
  }
}

Aqui os dados já são listados no DataGridView. Porém, as alterações efetuadas no controle ainda não são repassadas para o banco de dados. Veja o código adicional no evento Click de outro botão:

private void button5_Click(object sender, EventArgs e){
  // vamos salvar os dados do DataGridView para a tabela do
  // banco de dados
  
  // Dica: Se estiver usando SQL Server, troque "Odbc" por
  // "Sql" (Ex: SqlCommandBuilder)

  // obtém a conexão com o banco de dados
  conn = ConexaoODBC.obterConexao();

  if(conn != null){
    OdbcCommandBuilder cmb = new OdbcCommandBuilder(adapter);
    cmb.GetUpdateCommand();
    adapter.Update(ds.Tables["clientes_table"]);

    // fecha a conexão
    ConexaoODBC.fecharConexao();
  }
}

Pronto! Execute a aplicação, clique no primeiro botão para carregar os dados da tabela MySQL no DataGridView. Em seguida efetue algumas alterações, insira ou exclua linhas e clique no segundo botão. Feche a aplicação e abra-a novamente e se certifique de que os registros foram atualizados, inseridos ou removidos com sucesso.


Python ::: Dicas & Truques ::: Data e Hora

Como obter um datetime da data e hora atual usando o método today() da classe datetime da linguagem Python

Quantidade de visualizações: 10649 vezes
Neste exemplo mostrarei como podemos usar o método today() da classe datetime do Python para retornar a data e hora local.

Veja o código completo:

from datetime import datetime

def main():
  # Obtém um datetime da data e hora atual
  hoje = datetime.today()
 
  # Exibe o conteúdo do datetime
  print("Hoje é: " + str(hoje))
 
if __name__== "__main__":
  main()

Ao executar este código nós teremos o seguinte resultado:

Hoje é: 2018-03-03 15:54:01.477809

Carregar Publicações Anteriores


Nossas 20 dicas & truques de programação mais populares

Você também poderá gostar das dicas e truques de programação abaixo

Nossas 20 dicas & truques de programação mais recentes

Últimos Projetos e Códigos Fonte Liberados Para Apoiadores do Site

Últimos Exercícios Resolvidos

E-Books em PDF

E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby


E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser. Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book Apenas R$ 32,90


© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 57 usuários muito felizes estudando em nosso site.