Exercícios e exemplos

Aqui exercícios para o curso de POO. Alguns exercícios indicam o nome do projeto entre parêntesis. Recomenda-se usar esses nomes para o projeto porque exercícios mais avançados podem usar projetos de exercícios anteriores, acrescentando novas classes ou funcionalidades ao projeto. Usar os nomes sugeridos facilita as referências.

**1) Hello world**
Crie seu primeiro projeto java usando o Netbeans. Siga as instruções desta página.

**2) Classe Pessoa (Projeto Enterprise)**
Crie um novo projeto chamado **Enterprise** e implemente nele a classe **Pessoa**. Esta classe deve ter dois atributos do tipo String para armazenar o nome e sobrenome da pessoa.

* Mantenha os atributos privados e implemente getters e setters para acesso aos atributos.
* Implemente dois construtores para a classe: um parametrizado e um Copy constructor
* Acrescente o método **getFullName** para a classe. Este método deve retornar uma string com nome completo da pessoa no formato "Sobrenome, Nome".

Resolução exercício 2

**3) Classe Ponto (Projeto Cartesiano)**
Crie um novo projeto chamado Cartesiano e implemente nele a classe Ponto. Esta classe representa um ponto no plano cartesiano. Tem como atributos as coordenadas X e Y do ponto (double).

* Mantenha os atributos protegidos e implemente getters e setters para acesso aos atributos.
* Implemente três construtores para a classe: o construtor padrão, um parametrizado e um Copy constructor. O construtor padrão inicia o ponto na origem (0,0).
* Implemente também os seguintes métodos públicos:
	+ **void setXY(double newX, double newY):** Atribui novos valores para as coordenadas X e Y.
	+ **void assign(Ponto pt):** Copia o valor dos atributos de pt para os atributos do objeto.
	+ **double deltaX(double vX):** Retorna o delta X para o valor informado (vX - X).
	+ **double deltaY(double vY):** Retorna o delta Y para o valor informado (vY - Y).
	+ **double distance(double posX, double posY):**Calcula e retorna a distância do ponto até a posição informada pelos parâmetros. Use os métodos deltaX e deltaY para calcular a distância.
	+ **void desloc(double dX, double dY):** Desloca o ponto adicionando os valores informados às coordenadas do ponto.
	+ **void escale(double factor):**Faz o escalonamento do ponto multiplicando as coordenadas pelo fator de escalonamento informado no parâmetro.

Resolução exercício 3

**4) Classe Ponto (Projeto Cartesiano)**
Para a classe Ponto do exercício anterior, implemente os seguintes métodos:

* **double distance (Ponto pt):** sobrecarga do método **distance**. Retorna a distância do ponto até o ponto informado no parâmetro.
* **double distance ( ):** sobrecarga do método **distance**. Retorna a distância do ponto até a origem do plano cartesiano.
* **String toString ( ):** retorna uma representação do ponto em forma de string no formato "(x, y)".

Resolução exercício 4

**5) Classe Segmento (Projeto cartesiano)**
No projeto Cartesiano, acrescente a classe **Segmento**. Esta classe representa um segmento de reta através dos dois pontos nas extremidades do dito cujo. Para representá-los, use dois objetos da classe Ponto como atributos da classe Segmento. Faça também três construtores: padrão, parametrizado e clone. O construtor padrão deve iniciar o segmento com os pontos (0,0) e (0,1). O construtor parametrizado deve receber as coordenadas x e y dos dois pontos para iniciar o segmento e finalmente o construtor clone inicia o segmento copiando as coordenadas dos pontos de outro segmento já existente.

Para esta classe faça os seguintes métodos públicos:

* **void assign(Segmento sg):** Copia o valor dos atributos de sg para os atributos do objeto.
* **void desloc(double dX, double dY):** Desloca o segmento com os valores informados.
* **void escale(double factor):**Faz o escalonamento do segmento pelo fator de escalonamento informado no parâmetro.
* **String toString ( ):** retorna uma representação do segmento em forma de string no formato "[(x1,y1),(x2,y2)]".
* **double length( ):** retorna o comprimento do segmento.
* **public boolean isValid()**: Informa se o segmento é válido ou não. Para este método, um segmento é válido se os dois pontos estão instanciados e são diferentes entre si.
* **public Ponto midPoint()**: retorna o ponto médio do segmento.

Resolução exercício 5

**6) Classe Circulo (Projeto cartesiano)**
Ainda no projeto Cartesiano, acrescente a classe **Circulo**. Esta classe é descendente da classe Ponto. Para esta representação, o circulo é descrito por um ponto (centro) e o raio (double). Implemente os três construtores de praxe: padrão, parametrizado e clone. Para o construtor padrão inicie o círculo com centro em (0,0) e raio 1.

Faça também os seguintes métodos públicos:

* **void assign(Circulo cl):** Copia o valor dos atributos de cl para os atributos do objeto.
* **void escale(double factor):**Faz o escalonamento do círculo pelo fator de escalonamento informado no parâmetro.
* **String toString ( ):** retorna uma representação do círculo em forma de string no formato "(cx,cy):raio".
* **public boolean isValid()**: Informa se o círculo é válido ou não. Para este método, um círculo é válido se o raio é maior que zero.
* **double perimeter( ):** retorna o perímetro do círculo.
* **double area( ):** retorna a área do círculo.

**7) Classe Poligono (Projeto cartesiano)**
Para o projeto Cartesiano, acrescente a classe **Poligono**. Esta classe mantém uma lista de pontos (da classe Ponto) que representam os vértices do polígono. Para este projeto, um polígono pode ter no máximo 50 vértices. O polígono é criado sem vértices e depois eles são adicionados usando o método apropriado. Para esta classe faça os seguintes métodos:

* **public boolean ptExist(Ponto pt)**: retorna true se o ponto já existe na lista de vértices ou false se não existe.
* **public boolean addVertex(Ponto pt)**: Adiciona um novo vértice no final da lista. Retorna true se o vértice foi adicionado com sucesso ou false se houve algum erro. São condições de erro:
	+ O ponto já existe na lista.
	+ O polígono já tem 50 vértices.
* **public boolean isValid()**: Informa se é um polígono válido ou não. Para este método, um polígono é válido se tiver pelo menos 3 vértices.
* **public double perimeter()**: retorna o perímetro do polígono. Se não é um polígono válido, deve retornar -1.
* **public Ponto geoCenter()**: retorna o ponto que é o centro geométrico do polígono. O centro geométrico pode ser calculado fazendo a média de todos os vértices.
* **public double distance(Poligono plg)**: retorna a distância entre o centro geométrico do polígono no objeto e o centro geométrico do polígono informado no parâmetro.
* **public void desloc(double dx, double dy)**: desloca o polígono com os valores informados.
* **public void escale(double factor)**: faz o escalonamento do polígono usando o fator informado.

**8) Exemplo de uso de listas e interfaces.**