PONTIFÍCIA UNIVERSIDADE CATÓLICA DO RIO GRANDE DO SUL FACULDADE DE INFORMÁTICA – Algoritmos e Programação II Professora Isabel Harb Manssour Exercícios de Revisão para P1 Considerando as classes Circulo e Ponto apresentadas abaixo, responda às questões 1 à 7. Circulo -centrox: int -centroy: int -raio: int +Circulo(x:int, y:int, r:int) +Circulo() +area():double +circunferencia():double +diametro():int + toString() : String Ponto -x: int -y: int +Ponto(x:int, y:int) + setX (x: int) + getX ( ) : int + setY (y: int) + getY ( ) : int + deslocar (dx: int, dy: int) + toString ( ) : String 1. Apresente a implementação de um novo construtor para a classe Circulo que receba por parâmetro um objeto Ponto e um raio para inicializar todos os seus atributos. Portanto, a assinatura do método deve ser: public Circulo(Ponto p, int r). 2. Faça a sobrecarga do método deslocar, considerando que ele irá receber um objeto Ponto por parâmetro. A assinatura do método fica: public void deslocar (Ponto p). Este método irá alterar o valor dos atributos x e y, acrescentado à eles, respectivamente, o valor x e y recebido por parâmetro. 3. Quando o método toString é implementado, considera-se que está sendo feita uma sobrecarga ou uma sobrescrita? Explique. 4. Implemente o método equals na classe Ponto, considerando que um ponto é igual ao outro se as suas coordenadas x e y, respectivamente, são iguais. 5. Implemente uma classe cadastro de pontos que tenha um arranjo de pontos como atributo e métodos para: incluir pontos no cadastro; consultar se um ponto está no cadastro ou não; retornar o tamanho do cadastro (size); retornar o i-ésimo elemento do cadastro(get(i)). 6. Apresente uma implementação para a classe Ponto em que o tipo dos atributos seja genérico, ou seja, no momento de instanciar um ponto, o usuário escolhe se quer que as coordenadas x e y sejam do tipo Integer, Float ou Double. 7. Inclua um método de classe chamado getAreaCirculo na classe Circulo que recebe o valor do raio de um círculo por parâmetro e retorna o valor da área deste círculo. 8. Implemente uma classe Pessoa para armazenar os seguintes dados de uma pessoa: idade, peso e altura. A classe deve ter métodos set, get e toString. Implemente também um cadastro de Pessoas que permita apresentar os dados das pessoas cadastradas ordenados por idade. 9. Implemente uma classe Produto para armazenar os seguintes dados de um produto: código, descrição e preço unitário. Depois, implemente uma hierarquia de classes capaz de armazenar os produtos de um supermercado. Além do código, descrição e preço unitário, para os produtos perecíveis é necessário ainda armazenar a data de validade. No caso dos produtos de bazar é necessário armazenar o número máximo de vezes pelo qual o mesmo pode ser parcelado e a taxa de juros a ser aplicada para cada mês de prazo. 10. Considerando a questão anterior, e utilizando polimorfismo, mostre como poderia ser criado um cadastro de produtos capaz de adicionar e remover produtos, e apresentar uma listagem completa de todos os produtos, independente do seu tipo. 11. Escreva um método em Java que recebe por parâmetro um arranjo de Pontos (considere a classe Ponto apresentada do exercício 1) e retorna a média das coordenadas x dos pontos. A assinatura do método deve ser: public double getMediaX(Ponto []array). 12. Implemente um método que recebe um arranjo de números inteiros por parâmetro e retorna este arranjo com os valores na ordem inversa do que foram recebidos. 13. Considere uma classe abstrata Funcionario capaz de armazenar o nome, o CPF, o salário bruto e o número de filhos de um funcionário. Esta classe possui um construtor que recebe por parâmetro os valores para inicializar os atributos e um método abstrato getSalarioLiquido, além de gets, sets e toString. Uma empresa possui três tipos de funcionários: caixa, vendedor e gerente. No cadastro da empresa existem dados que são específicos a cada tipo de funcionário: número do caixa, percentual de vendas para o vendedor, e adicional pelo cargo de confiança para gerente. Considerando a utilização da classe Funcionario e os dados fornecidos sobre a empresa, modele e implemente um sistema que suporte um cadastro de funcionários. Indique claramente na sua implementação onde são usados os conceitos de polimorfismo, herança e métodos abstratos. Na hierarquia de classes que deve ser criada considere a sobrecarga do construtor da classe Funcionario, que recebe por parâmetro apenas os valores para inicializar os atributos nome e cpf. É preciso implementar o corpo dos construtores, mas os demais métodos não é preciso implementar, apenas apresentar a sua assinatura. Não será aceito apenas o diagrama de classes, é necessário apresentar o código Java para especificação das classes. 14. Escreva um programa Java que cria dois arranjos de valores inteiros inicializadas com 100 valores aleatórios. Em seguida o programa deverá imprimir qual é o maior valor que está armazenado nas duas listas simultaneamente. No exemplo abaixo, com arranjos de 5 elementos, o maior valor armazenado nas duas é 07. A1: 04,12,07,30,20 A2: 50,07,04,21,33 Obs: Para gerar um número aleatório, pode ser utilizado o método Math.random(). Para gerar um número entre 0 e (n - 1), utilize Math.random() * n. Exemplo: para gerar um número entre 0 e 10 o trecho de código seria: int numero; numero = (int)(Math.random() * 11); 15. Considere a implementação de uma classe Filme, que possui como atributos titulo, ano e diretor, e métodos gets, sets, equals e toString, e uma classe CadastroDeFilmes que possui como atributo um ArrayList<Filme> listaFilmes. O construtor da classe CadastroDeFilmes deve ser private e ela deve possuir um método de classe chamado getInstance. Apresente a implementação desta classe, sabendo que ela possui também um método public String getFilmesOrdenadosPorAno(), que retorna em uma String as informações de todos os filmes (toString da classe Filme) ordenados por ano. Apresente também que alterações deveriam ser feitas na classe Filme para facilitar esta ordenação. DICA: o método Collections.sort() é o responsável por ordenar uma lista recebida por parâmetro. 16. Considerando a questão 15, explique o que deveria ser feito para que a classe CadastroDeFilmes também tenha um método public String getFilmesOrdenadosPorTitulo() sem que seja necessário alterar as implementações feitas na questão 15. Apresente as implementações necessárias. 17. Para que servem e quando devem ser usados os atributos de acesso: public, private e protected? Para ilustrar, ligue as classes Classe2 e SubClasse1 (que é subclasse de Classe1) aos atributos da Classe1 que elas podem acessar diretamente. Pacote 1 Classe 2 Pacote 2 Classe1 int x; private int y; protected int z; public int w; Pacote 3 SubClasse1 18. Um clube de futebol possui 3 categorias de sócios: Branco, Amarelo e Vermelho. O tipo de evento que os diferentes tipos de sócio têm direito bem como o valor que eles pagam por cada um deles varia conforme a categoria. O clube promove 3 tipos de eventos: partidas de futebol, shows e eventos Vip. Para entrar em um evento os sócios tem de carregar sua carteirinha (que possui chip) com um certo número de créditos. Sócios categoria Amarela ganham um bônus de 10% sempre que compram créditos e sócios categoria Vermelha ganham um bônus de 20%. Sócios categoria Branca só podem entrar em partidas de futebol, categoria Amarela podem entrar em partidas de futebol e shows enquanto que os categoria vermelha podem entrar em qualquer tipo de evento. Os eventos futebol, show e festa vip custam, respectivamente, 20, 40 e 80 reais. As classes SocioBranco, SocioVermelho e SocioAmarelo modelam cada um dos três tipos de sócio e são derivadas da classe abstrata Socio definida a seguir: public abstract class Socio { public enum CatEvento {Futebol,Show,EventoVip}; private String nome; private double creditos; public Socio(String nome){ this.nome = nome; creditos = 0; } public double getCreditos(){ return(creditos); } public void insereCreditos(double valor){ creditos += valor; } private double custoEvento(CatEvento tipoEvento){ switch(tipoEvento){ case Futebol: return(20); case Show: return(40); case EventoVip: return(80); } return(0); } // Verifica se o sócio pode entrar no evento (testa o tipo de // sócio e o tipo de evento) e se tem créditos suficientes. // Se puder entrar já debita os creditos. public abstract boolean podeEntrar(CatEvento tipoEvento); } I. II. Escreva o código das classes SocioBranco, SocioVermelho e SocioAmarelo. Crie uma classe chamada ControleEntrada que será usada no software de controle das roletas que controlam a entrada nos eventos. Esta classe recebe por parâmetro no construtor a categoria do evento que vai ocorrer. A classe deve oferecer os seguintes métodos: a. “boolean podeEntrar(Socio s)” que recebe um sócio por parâmetro e devolve true ou false conforme o sócio pode ou não entrar no evento. Os sócios autorizados a entrar devem ser armazenados em uma lista interna da classe. b. “int qtdadeVermelhos()” que retorna a quantidade de sócios categoria Vermelha que entraram no estádio até então. c. “int qtdadeComCreditos(Double valor)” que retorna a quantidade de sócios que entraram no estádio e que possuem mais de “valor” créditos. d. “int removeBrancos()” que remove todas as ocorrências de sócios categoria Branca da lista dos que já entraram e retorna a quantidade de sócios removidos. OBS: Não se restrinja às aulas do professor ou a apostilas e tutoriais. Vá à biblioteca, consulte os livros!