Dart ::: Desafios e Lista de Exercícios Resolvidos ::: Arrays e Matrix (Vetores e Matrizes)

Exercício Resolvido de Dart - Escreva um programa Dart para mover todos os zeros para o final do vetor, sem alterar a ordem dos elementos já presentes no array

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

Dado o seguinte vetor de inteiros:

// vamos declarar e construir um vetor (List) de 8 inteiros
List<int> valores = [0, 3, 0, 5, 7, 4, 0, 9];
Escreva um programa Dart para mover todos os zeros para o final do vetor, ou seja, para a direita, sem alterar a ordem dos elementos diferentes de zero já presentes no array e sem criar um vetor adicional ou temporário.

Sua saída deverá ser parecida com:

Vetor na ordem original:

0   3   0   5   7   4   0   9   

Vetor com os zeros deslocados para o final:

3   5   7   4   9   0   0   0
Resposta/Solução:

Veja a resolução comentada deste exercício usando Dart:

// Vamos importar a biblioteca dart:io
import "dart:io";

void main(){
  // vamos declarar e construir um vetor (List) de 8 inteiros
  List<int> valores = [0, 3, 0, 5, 7, 4, 0, 9];
    
  // vamos mostrar o vetor na ordem original
  print("Vetor na ordem original:\n");
  for(int i = 0; i < valores.length; i++){
    stdout.write("${valores[i]}   ");
  }
    
  // vamos inicializar j como 0 para que ele aponte para
  // o primeiro elemento do vetor
  int j = 0;
    
  // agora o laço for percorre todos os elementos do vetor,
  // incrementanto a variável i e deixando o j em 0
  for(int i = 0; i < valores.length; i++){
    // encontramos um valor que não é 0
    if(valores[i] != 0){
      // fazemos a troca entre os elementos nos índices
      // i e j
      int temp = valores[i];
      valores[i] = valores[j];
      valores[j] = temp;
      // e avançamos o j para o elemento seguinte
      j++;
    }
  }
    
  // agora mostramos o resultado
  print("\n\nVetor com os zeros deslocados para o final:\n");
  for(int i = 0; i < valores.length; i++){
    stdout.write("${valores[i]}   ");
  }
}

Não se esqueça: A resolução do exercício deve ser feita sem a criação de um vetor, array ou lista adicional, e os elementos diferentes de zero devem permanecer na mesma ordem que eles estavam antes.


PHP ::: Fundamentos da Linguagem ::: Métodos, Procedimentos e Funções

Apostila de PHP - Como criar suas próprias funções em PHP

Quantidade de visualizações: 31174 vezes
Uma função é um bloco de código que executa uma determinada tarefa, possivelmente baseado em um conjuntos de valores fornecidos, ou parâmetros, e possivelmente retornando um único valor. Funções permitem a melhora na leitura do código e correção de bugs, visto que blocos de códigos bem testados podem ser reutilizados inúmeras vezes em seus programas.

Antes de continuarmos é bom estar ciente dos diferentes nomes que as linguagens de programação adotam quando o assunto é função. Em Java, funções são chamadas de métodos. Em Delphi, temos funções (function) e procedimentos (procedure). Se uma função em Delphi retorna um valor, ela é chamada de function. Se nenhum valor é retornado, ela é chamada de procedure. Em PHP o nome é função (function) mesmo, não importando se valores são retornados ou não.

Veja um exemplo onde criamos uma função que apenas escreve na página:

<?
  // define a função
  function escrever(){
    echo "Observe este texto";
  }
  
  // chama a função
  escrever();
?>

Podemos estender este exemplo e fornecer à função o texto que deverá ser escrito. Veja:

<?
  // define a função
  function escrever($texto){
    echo $texto;
  }
  
  // chama a função
  escrever("Observe este texto");
?>

Veja que agora a função possui parâmetros, neste caso a variável local $texto. Assim, ao efetuarmos a chamada nós podemos fornecer um valor (um argumento) a esta função. Vamos progredir escrevendo uma função que soma dois valores:

<?
  // define a função
  function somar($valor1, $valor2){
    echo "A soma é: " . ($valor1 + $valor2);
  }
  
  // chama a função
  somar(3, 5);
?>

Para finalizar, vamos escrever uma função que retorna um valor. Veja:

<?
  // define a função
  function somar($valor1, $valor2){
    return ($valor1 + $valor2);
  }
  
  // chama a função
  $soma = somar(3, 5);
  echo "O resultado é: " . $soma;
?>

Observe o uso da palavra-chave return para definirmos o valor que será retornado pela função.


Python ::: Dicas & Truques ::: Geometria, Trigonometria e Figuras Geométricas

Como calcular o diâmetro, a circunferência e a área de um círculo dado o raio em Python - Python para Geometria

Quantidade de visualizações: 5086 vezes
O círculo é uma figura geométrica plana e que possui quatro características: seu raio, seu diâmetro, sua circunferência e sua área. Aqui já podemos aproveitar e relembrar a diferença entre o círculo e a circunferência. O círculo é o conjunto de pontos resultantes da união entre uma circunferência e seus pontos internos, ou seja, o círculo é a área cuja delimitação é uma circunferência.

É importante observar que alguns autores tratam o círculo como uma circunferência. Assim, para estes autores, calcular a circunferência de um círculo equivale a calcular o perímetro da circunferência.

Veja a figura a seguir para relembrar o que é o raio de um círculo:



Nesta dica mostrarei como podemos usar Python para calcular o diâmetro, a circunferência e a área de um círculo tendo apenas o raio como informação. Antes, porém, vamos às formulas. Sabendo que r é o raio, temos:

\[\text{Diâmetro d} = 2 \times r \]

\[\text{Circunferência C} = 2 \times \pi \times r \]

\[\text{Área A} = \pi \times r^2 \]

Agora vamos ver o código Python que solicita ao usuário que informe o raio do círculo e mostra o diâmetro, a circunferência e a área:

import math as math

def main():
  # vamos ler o raio do círculo
  raio = float(input("Informe o raio do círculo: "))
  
  # vamos achar o diâmetro do círculo
  diametro = 2 * raio
  # agora calculamos a circunferência
  circunferencia = 2 * math.pi * raio
  # finalmente calculamos a área do círculo
  area = math.pi * math.pow(raio, 2)
    
  # vamos mostrar os resultados
  print("O diâmetro do círculo é:", diametro)
  print("A circunferência do círculo é:", circunferencia)
  print("A área do círculo é:", area)

if __name__== "__main__":
  main()

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

Informe o raio do círculo: 10
O diâmetro do círculo é: 20.0
A circunferência do círculo é: 62.83185307179586
A área do círculo é: 314.1592653589793

Lembre-se de que a área é em centímetros quadrados, metros quadrados, etc.


Java ::: Desafios e Lista de Exercícios Resolvidos ::: Laços de Repetição

Exercício Resolvido de Java - Usando o laço while para pedir ao usuário que tente acertar um número aleatório entre 0 e 10 (incluindo) e mostrar a quantidade de tentativas feitas

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

Escreva um programa Java que gera um número aleatório (randômico) entre 0 e 10 (incluindo estes dois valores) e peça ao usuário para adivinhá-lo. Use um laço while para registrar as tentativas feitas e, a cada tentativa, dê dicas informando se o número gerado é maior ou menor que a tentativa feita. Finalmente mostre a quantidade de tentativas feitas até que o número fosse acertado.

Sua saída deverá ser parecida com a mostrada abaixo:

Informe um número de 0 a 10: 5
Errou! Tente um número menor.
Informe um número de 0 a 10: 2
Parabéns! Você acertou em 2 tentativas.
Resposta/Solução:

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

package estudos;

import java.util.Scanner;

public class Exercicio {
  public static void main(String[] args) {
    // vamos fazer a leitura usando a classe Scanner
    Scanner entrada = new Scanner(System.in);
      
    // declaração das variáveis
    int tentativas = 0, numeroLido;
    boolean acertou = false;
    // vamos gerar um número aleatório entre 0 e 10
    int numero = (int)(Math.random() * 11);
    
    // um laço while que repetirá até que o número seja acertado
    while(!acertou){
      System.out.print("Informe um número de 0 a 10: ");
      numeroLido = Integer.parseInt(entrada.nextLine());
      tentativas++;
      
      if(numeroLido == numero){ // acertou?
        System.out.println("Parabéns! Você acertou em " + tentativas + " tentativas.");
        acertou = true;
      }
      else if(numeroLido < numero){ // o número informado é menor que o número gerado
        System.out.println("Errou! Tente um número maior.");  
      }
      else{ // o número informado é maior que o número gerado
        System.out.println("Errou! Tente um número menor.");  
      }
    }
  
    System.out.println("\n");
  }
}



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

Como testar se um número é primo em C++

Quantidade de visualizações: 3190 vezes
O Número Primo é o número maior que 1 e que só pode ser dividido por 1 e por ele mesmo, ou seja, números primos não podem ser divididos por outros números, a não ser por ele mesmo e pelo número 1. Dessa forma, 2, 3, 5, 7, 11, 13, 17, etc, são todos números primos.

É importante observar que 0 e 1 não são números primos, e que o número 2 é o único número primo par.

Veja agora um código C++ completo que pede para o usuário informar um número inteiro positivo e mostra uma mensagem indicando se o número informado é primo ou não:

#include <iostream>
#include <cstdlib>
   
using namespace std;
   
int main(int argc, char *argv[]){
  int numero;
  bool primo = true;
	
  // vamos solicitar um número inteiro positivo
  cout << "Informe um número inteiro positivo: ";
  cin >> numero;
    
  // o número é negativo?
  if(numero < 0){
    cout << "Número inválido.\n\n";
  }
  // é 0 ou 1?
  else if((numero == 0) || (numero == 1)){
    cout << "Número válido, mas não é primo.\n\n";
  }
  // passou até aqui. Vamos testar se o número é primo
  else{
    for (int i = 2; i <= (numero / 2); i++){
      // se passar no teste, não é primo
      if (numero % i == 0) {
        primo = false;
        break;
      }
    }
      
    if(primo){
      cout << "O número informado é primo\n\n";
    }
    else{
      cout << "O número informado não é primo\n\n";
    }
  }
       
  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}

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

Informe um número inteiro positivo: 9
O número informado não é primo


Python ::: NumPy Python Library (Biblioteca Python NumPy) ::: Matemática e Estatística

Python para estatística - Como calcular a mediana de um conjunto de valores usando o método median() da biblioteca NumPy da linguagem Python

Quantidade de visualizações: 16936 vezes
A mediana (Md) representa o valor central de um conjunto de dados. Para encontrá-la, é necessário colocar os valores em ordem crescente ou decrescente.

Quando o número elementos de um conjunto é par, a mediana é encontrada pela média dos dois valores centrais. Assim, esses valores são somados e divididos por dois.

Veja a seguinte figura:



A biblioteca NumPy do Python nos oferece o método median(), que recebe um vetor de valores númericos (inteiro ou decimais) e retorna a mediana deles. Veja um exemplo com os primeiros valores da figura (um conjnto ímpar):

# importamos a biblioteca NumPy
import numpy

def main():
  # valores a serem observados
  valores = [2, 2, 3, 7, 8, 9, 9]

  # vamos obter a mediana
  mediana = numpy.median(valores)

  # vamos mostrar o resultado
  print("A mediana dos valores é:", mediana)

if __name__== "__main__":
  main()

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

A mediana dos valores é: 7.0

Veja agora o exemplo usando o segundo grupo de valores da imagem (conjunto par):

# importamos a biblioteca NumPy
import numpy

def main():
  # valores a serem observados
  valores = [1, 4, 4, 5, 6, 7, 7, 7]

  # vamos obter a mediana
  mediana = numpy.median(valores)

  # vamos mostrar o resultado
  print("A mediana dos valores é:", mediana)

if __name__== "__main__":
  main()

O resultado da execução desse código será:

A mediana dos valores é: 5.5

É importante observar que o método median() da NumPy não exige que os valores estejam ordenados. A própria função se encarrega dessa tarefa.


C++ ::: Win32 API (Windows API) ::: Arquivos e Diretórios

Arquivos e diretórios em C++ - Como escrever em arquivos usando a função WriteFile() da API do Windows

Quantidade de visualizações: 9226 vezes
A função WriteFile() da Win32 API é útil quando precisamos escrever em arquivos. Esta função foi projetada para escritas síncronas e assíncronas, enquanto WriteFileEx() é somente para escritas assíncronas.

Veja o protótipo desta função:

BOOL WINAPI WriteFile(
  HANDLE hFile,
  LPCVOID lpBuffer,
  DWORD nNumberOfBytesToWrite,
  LPDWORD lpNumberOfBytesWritten,
  LPOVERLAPPED lpOverlapped
);


Antes de escrevermos em um arquivo, é importante entendermos o significado dos parâmetros da função WriteFile():

a) HANDLE hFile - Este é o handle para o arquivo no qual queremos escrever. Este handle deve ser criado com os direitos de acesso de escrita GENERIC_WRITE.

b) LPCVOID lpBuffer - Um ponteiro para o buffer que contém os dados que serão escritos no arquivo.

c) DWORD nNumberOfBytesToWrite - O número de bytes a serem escritos no arquivo.

d) LPDWORD lpNumberOfBytesWritten - Um ponteiro para uma variável que receberá o número de bytes escritos. A função WriteFile() define o valor desta variável como zero antes de fazer seu trabalho ou verificação de erro.

d) LPOVERLAPPED lpOverlapped - Um ponteiro para um estrutura OVERLAPPED. Esta estrutura é exigida se o handle para o arquivo for obtido usando FILE_FLAG_OVERLAPPED para o parâmetro dwFlagsAndAttributes da função CreateFile(). Geralmente usamos NULL para este parâmetro.

Veja um trecho de código no qual usamos a função WriteFile() para escrever duas linhas em um arquivo texto:

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[]){
  // dados a serem escritos no arquivo
  CHAR frase[80];
  DWORD nOut; // bytes escritos
  
  // nome do arquivo
  CHAR arquivo[] = "C:\\testes.txt";
  
  // vamos abrir o arquivo para escrita.
  // se o arquivo não existir nós vamos criá-lo.
  HANDLE hArquivo = CreateFile(arquivo, GENERIC_WRITE, 0, NULL,
    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

  if(hArquivo == INVALID_HANDLE_VALUE){
    cout << "Erro ao abrir o arquivo: " << GetLastError() << endl;
  }
  else{
    // arquivo aberto com sucesso. Vamos escrever
    
    // dados a serem escritos no arquivo
    CHAR frase1[80] = "Programar em C++ é bom demais\r\n";
    CHAR frase2[80] = "E a Win32 é da hora!!!!";
    DWORD nOut; // bytes escritos
    
    // vamos escrever a primeira frase
    WriteFile(hArquivo, frase1, strlen(frase1), &nOut, NULL);
    cout << nOut << " bytes foram escritos. " << endl;
    
    // vamos escrever a segunda frase
    WriteFile(hArquivo, frase2, strlen(frase2), &nOut, NULL);
    cout << nOut << " bytes foram escritos. " << endl;   
  }
    
  // vamos fechar o handle
  CloseHandle(hArquivo);
  
  system("PAUSE");
  return EXIT_SUCCESS;
}



Java ::: Pacote java.awt.event ::: KeyEvent

Java Swing - Como obter o código da tecla pressionada usando o método getKeyCode() da classe KeyEvent do Java

Quantidade de visualizações: 4498 vezes
O método getKeyCode() da classe KeyEvent é usado quando queremos obter o código da tecla pressionada durante um evento KEY_PRESSED ou KEY_RELEASED. Para o evento KEY_TYPED, o keyCode é VK_UNDEFINED.

Veja um trecho de código no qual usamos o método getKeyCode() para obter e informar o código da tecla pressionada durante um evento keyPressed:

package estudos;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Janela extends JFrame implements KeyListener{
  public Janela(){
    super("Eventos do Teclado");
    Container c = getContentPane();
    FlowLayout layout = new FlowLayout(FlowLayout.LEFT);
    c.setLayout(layout);
    
    // vamos adicionar o objeto listener 
    addKeyListener(this);

    setSize(350, 250);
    setVisible(true);
  }
    
  @Override
  public void keyPressed(KeyEvent e){
    // vamos obter o código da tecla pressionada
    int codigo = e.getKeyCode();
    JOptionPane.showMessageDialog(null, "O código da tecla pressionada é: " + codigo);  
  }
    
  @Override
  public void keyReleased(KeyEvent e){
    // sem implementação
  }

  @Override
  public void keyTyped(KeyEvent e){
    // sem implementação
  }   
  
  public static void main(String args[]){
    Janela j = new Janela();
    j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

Ao executar este código e pressionarmos uma tecla nós teremos o seguinte resultado:

O código da tecla pressionada é: 65

É importante observar que o código da tecla pode ser obtido somente nos eventos keyPressed e keyReleased. Para o evento keyTyped o retorno do método getKeyCode() é VK_UNDEFINED.


Java ::: Dicas & Truques ::: Programação Orientada a Objetos

Programação orientada a objetos em Java - Como criar e usar interfaces em seus programas Java

Quantidade de visualizações: 11868 vezes
Muitos estudantes de Java torcem o nariz quando nós, professores e instrutores, tocamos no assunto de interfaces. Definitivamente este não é um tópico fácil de entender ao primeiro contato. Comecemos com uma analogia simples. É sabido que é cada vez maior o número de softwares sendo desenvolvidos em equipes, ou seja, o projeto do software é desmembrado e suas funcionalidades são implementadas por grupos diferentes de programadores.

Quando estamos desenvolvendo software em grupos de programadores, é comum desenvolvermos partes que dependem do trabalho de um outro grupo. E, nem sempre podemos esperar que uma parte da qual dependemos fique pronta para só então progredirmos.

Para isso, um contrato entre os grupos de programadores é firmado. E este contrato é o que chamamos de interface. Suponhamos que em um determinado momento meu grupo está desenvolvendo código que depende da parte de impressão, sendo desenvolvida por outro grupo. Todos se reúnem e decidimos quais funcionalidades a classe de impressão terá e quais métodos públicos serão disponibilizados. Feito isso, uma interface contendo a assinatura destes métodos é disponibilizada para todos e o desenvolvimento continua. Mais tarde, quando a classe de impressão estiver sendo desenvolvida, ela poderá implementar a interface anteriormente disponibilizada e tudo está resolvido.

Sendo assim, uma interface na linguagem de programação Java é um tipo referência, similar a uma classe. A diferença é que uma interface pode conter apenas constantes e assinaturas e métodos. Não há a implementação dos corpos dos métodos. Além disso, interfaces não podem ser instanciadas usando new. Veja o que acontece quando tentamos fazer isso (lembre-se de que List é interface):

import java.util.*;

public class Estudos{ 
  public static void main(String args[]){ 
    // cria um objeto da interface List
    List lista = new List();
  } 
}

Ao tentarmos compilar este código teremos a seguinte mensagem de erro:

Estudos.java:6: java.util.List is abstract; 
cannot be instantiated
    List lista = new List();
                 ^
1 error


Interfaces devem ser implementadas por classes ou extendidas por outras interfaces. Agora, um detalhe interessante. Se você verificar a API do Java, verá que a interface List é implementada pelas classes AbstractList, ArrayList, LinkedList e Vector. Desta forma, o código anterior pode ser modificado para:

import java.util.*;

public class Estudos{ 
  public static void main(String args[]){ 
    // cria um objeto da interface List
    List lista = new ArrayList();
  } 
}

Este código compila normalmente e fortalece nossa discussão a respeito da interface de impressão. O sistema inteiro pode fazer referências a uma interface e, para que ele funcione da forma esperada, só precisamos fornecer a classe que implementa a interface no momento de instanciar os objetos. Isso demonstra que o nome de uma interface pode ser usado em qualquer lugar no qual um tipo da classe que a implementa seja necessário.

Vamos ver agora como criar uma interface chamada Pessoa. Veja:

public interface Pessoa{
  public void setNome(String nome); 
  public String getNome();
}


Salve esta interface como Pessoa.java e a compile. Pronto! Esta interface já pode ser usada no sistema, contanto que todos do grupo tenham concordado com as assinaturas dos métodos. Agora observe uma classe Cliente que implementa esta interface:

public class Cliente implements Pessoa{ 
  private String nome;
  private int idade;

  public void setNome(String nome){
    this.nome = nome;
  } 

  public String getNome(){
    return this.nome;
  }
}

Salve este código como Cliente.java e o compile. O primeiro detalhe a observar é o uso da palavra-chave implements para mostrar que a classe implementa a interface Pessoa. Note também que a classe fornece implementação para todos os métodos da interface. Não seguir esta regra geraria o seguinte erro de compilação:

Cliente.java:1: Cliente is not abstract and 
does not override abstract method getNome() in 
Pessoa
public class Cliente implements Pessoa{
       ^
1 error


Em resumo, uma interface define um protocolo de comunicação entre dois objetos e pode conter, além das assinaturas dos métodos, constantes. Neste caso todas estas constantes serão implicitamente public, static e final. Mesmo que estes modificadores sejam omitidos.


Python ::: Fundamentos da Linguagem ::: Variáveis e Constantes

Como usar a função type() da linguagem Python para descobrir o tipo de dados de uma variável

Quantidade de visualizações: 14005 vezes
Em algumas situações nós gostaríamos de verificar o tipo de uma variável, ou seja, o tipo do valor que ele contém no momento, antes de efetuar algum cálculo ou procedimento.

Em Python isso pode ser feito por meio da função type(), que nos retorna uma string indicando o tipo de dados sendo armazenado no momento. Note que, em Python, uma mesma variável pode assumir tipos diferentes durante a execução do programa.

Veja o código completo para o exemplo:

def main():
  var = "Osmar J. Silva"
  print("O tipo da variavel var é:", type(var)) 
 
  var = 45
  print("Agora o tipo da variavel var é:", type(var))
 
  var = 45.30
  print("E agora o tipo da variavel var é:", type(var))   
 
if __name__== "__main__":
  main()

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

O tipo da variavel var é: <class 'str'>
Agora o tipo da variavel var é: <class 'int'>
E agora o tipo da variavel var é: <class 'float'>

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



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