• Nenhum resultado encontrado

EXERCÍCIOS DE REVISÃO

No documento Conceitos de Computação com Java_nodrm.pdf (páginas 134-142)

Exercício R3.1. Por que o construtor BankAccount(double initialBalance) não é estrita- mente necessário?

Exercício R3.2. Explique a diferença entre: BankAccount b;

e

BankAccount b = new BankAccount(5000);

Exercício R3.3. Explique a diferença entre: new BankAccount(5000);

e

BankAccount b = new BankAccount(5000);

Exercício R3.4. O que acontece na nossa implementação da classe BankAccount quando mais dinheiro é sacado da conta além daquele no saldo atual?

Exercício R3.5. Qual é o valor retornado a partir da chamada do método b.getBalance() depois destas operações?

BankAccount b = new BankAccount(10); b.deposit(5000);

b.withdraw(b.getBalance() / 2);

Exercício R3.6. Se b1 e b2 referenciarem objetos da classe BankAccount, considere as ins- truções a seguir.

b1.deposit(b2.getBalance()); b2.deposit(b1.getBalance());

Agora os saldos de b1 e b2 são idênticos? Explique.

Exercício R3.7. O que é a referência this? Por que você a utilizaria?

Exercício R3.8. O que o seguinte método faz? Dê um exemplo de como você pode cha- mar o método.

public class BankAccount {

public void mystery(BankAccount that, double amount) {

this.balance = this.balance - amount; that.balance = that.balance + amount; }

. . . // Outros métodos de conta bancária

}

Exercício R3.9. Suponha que você queira implementar uma classe TimeDepositAccount. Uma conta de depósito que, após um tempo especifi cado, recebe uma taxa fi xa de juros que deve ser defi nida no construtor, juntamente com o saldo inicial. Forneça um método para obter o saldo atual. Forneça um método para adicionar os juros ganhos à conta. Esse método não deve ter nenhum parâmetro porque a taxa de juros já é conhecida. Ele

também não deve ter nenhum valor de retorno porque você já forneceu um método para obter o saldo atual. Não é possível depositar quantias adicionais nessa conta. Forneça um método withdraw que remove todo o saldo. Saques parciais não são permitidos.

Exercício R3.10. Quais são os métodos modifi cadores e os métodos de acesso da classe CashRegister?

Exercício R3.11. Explique a diferença entre uma variável local e uma variável de pa- râmetro.

Exercício R3.12. Explique a diferença entre um campo de instância e uma variável local.

Exercício R3.13. Suponha que você queira estender o programa visualizador de carros da Seção 3.9 para exibir uma cena suburbana com vários carros e casas. De que classes você precisa?

Exercício R3.14. Explique por que as chamadas aos métodos getWidth e getHeight na classe CarComponent não têm nenhum parâmetro explícito.

Exercício R3.15. Como você modifi caria a classe Car para mostrar carros de diferentes tamanhos?

Exercícios de revisão adicionais estão disponíveis no WileyPLUS (recurso da editora original).

EXERCÍCIOS DE PROGRAMAÇÃO

Exercício P3.1. Escreva uma classe BankAccountTester cujo método main cria uma conta bancária, deposita US$ 1.000, retira US$ 500, retira mais US$ 400 e então imprime o saldo remanescente. Imprima também o resultado esperado.

Exercício P3.2. Adicione um método: public void addInterest(double rate)

à classe BankAccount que adiciona uma dada taxa de juros. Por exemplo, depois das ins- truções:

BankAccount momsSavings = new BankAccount(1000); momsSavings.addInterest(10); // 10% de juros

o saldo em momsSavings é US$ 1.100. Também forneça uma classe BankAccountTester que imprime o saldo real e o esperado.

Exercício P3.3. Escreva uma classe SavingsAccount semelhante à classe BankAccount, ex- ceto que pelo fato de conter um campo de instância interest extra. Forneça um construtor que confi gure tanto o saldo inicial como a taxa de juros. Forneça um método addInterest (sem parâmetro explícito) que adiciona juros à conta. Escreva uma classe SavingsAc- countTester que cria uma conta de poupança com um saldo inicial de US$ 1.000 e uma taxa de juros de 10%. Aplique então o método addInterest e imprima o saldo resultante. Também calcule o resultado esperado manualmente e o imprima.

Exercício P3.4. Implemente uma classe Employee. Um funcionário tem um nome (uma string) e um salário (um double). Forneça um construtor com dois parâmetros:

public Employee(String employeeName, double currentSalary) e métodos:

public String getName() public double getSalary()

public void raiseSalary(double byPercent)

Esses métodos retornam o nome e o salário e aumentam o salário do funcionário de acor- do com uma porcentagem. Exemplo de uso:

Employee harry = new Employee("Hacker, Harry", 50000); harry.raiseSalary(10); // Harry ganha 10% de aumento

Forneça uma classe EmployeeTester que testa todos os métodos.

Exercício P3.5. Implemente uma classe Car com as seguintes propriedades. Um carro tem um rendimento de combustível (medido em milhas/galão ou litros/km – escolha um) e uma quantidade de combustível no tanque de gasolina. O rendimento é especifi cado no construtor e o nível inicial de combustível é 0. Forneça um método drive que simula o uso do carro de acordo com certa distância, reduzindo a quantidade de gasolina no tan- que de combustível. Também forneça os métodos getGasInTank, retornando a quantidade atual de gasolina no tanque de combustível, e addGas, para adicionar gasolina ao tanque de combustível. Exemplo de uso:

Car myHybrid = new Car(50); // 50 milhas por galão

myHybrid.addGas(20); // Tanque com 20 galões

myHybrid.drive(100); // Dirige por 100 milhas

double gasLeft = myHybrid.getGasInTank(); // Obtém a qtde de gasolina restante no tanque

Você pode supor que o método drive nunca é chamado com uma distância que consome mais gasolina do que a disponível. Forneça uma classe CarTester que testa todos os métodos.

Exercício P3.6. Implemente uma classe Student. Para o propósito deste exercício, um es- tudante tem um nome e uma pontuação total no exame. Forneça um construtor apropriado e os métodos getName(), addQuiz(int score), getTotalScore() e getAverageScore(). Para calcular o último, você também precisa armazenar o número de exames que o aluno fez. Forneça uma classe StudentTester que testa todos os métodos.

Exercício P3.7. Implemente uma classe Product. Um produto tem um nome e um preço, por exemplo, new Product("Toaster", 29.95). Forneça os métodos getName, getPrice e reducePrice. Forneça um programa ProductPrinter que cria dois produtos, imprime o nome e o preço, reduz os preços por US$ 5.00 e então imprime os preços novamente.

Exercício P3.8. Forneça uma classe para escrever uma carta simples. No construtor, for- neça os nomes do remetente e do destinatário:

public Letter(String from, String to) Forneça um método

public void addLine(String line)

Forneça um método

public String getText()

que retorna o texto inteiro da carta. O texto tem a forma:

Prezado nome do destinatário: linha em branco

primeira linha do corpo segunda linha do corpo . . .

última linha do corpo linha em branco Atenciosamente, linha em branco nome do remetente

Também forneça um programa LetterPrinter que imprime essa carta. Dear John:

I am sorry we must part. I wish you all the best. Sincerely,

Mary

Construa um objeto da classe Letter e chame addLine duas vezes.

Dicas: (1) Utilize o método concat para formar uma string mais longa a partir de duas strings mais curtas. (2) A string especial "\n" representa uma nova linha. Por exemplo, a instrução

body = body.concat("Sincerely,").concat("\n");

adiciona uma linha contendo a string "Sincerely," ao corpo da carta.

Exercício P3.9. Escreva uma classe Bug que represente um inseto movendo-se sobre uma linha horizontal. O inseto se move para a direita ou para a esquerda. Inicialmente, ele se move para a direita, mas pode virar e mudar de direção. Em cada movimento, a posição muda de uma unidade na direção atual. Forneça um construtor

public Bug(int initialPosition) e os métodos

public void turn() public void move() public int getPosition() Exemplo de uso:

Bug bugsy = new Bug(10);

bugsy.move(); // agora a posição é 11

bugsy.turn();

bugsy.move(); // agora a posição é 10

Seu BugTester deve criar um inseto, fazer ele se mover, virar algumas vezes e imprimir a posição real e a esperada.

Exercício P3.10. Implemente uma classe Moth que modele uma mariposa que voa ao longo de uma linha reta. A mariposa tem uma posição, a distância a partir de uma origem fi xa. Quando a mariposa se move em direção a um ponto de luz, sua nova posição é a metade entre a posição antiga e a posição da fonte de luz. Forneça um construtor

public Moth(double initialPosition) e os métodos

public void moveToLight(double lightPosition) public void getPosition()

Seu MothTester deve criar uma mariposa, movê-la em direção a algumas fontes de luz e verifi car se a posição da mariposa é a esperada.

Exercício P3.11. Implemente uma classe RoachPopulation que simula o crescimento de uma população de baratas. O construtor recebe o tamanho da população inicial de ba- ratas. O método breed simula o período em que as baratas procriam, o que dobra a sua população. O método spray simula a pulverização com um inseticida, o que reduz a população em 10%. O método getRoaches retorna o número atual de baratas. Um progra- ma chamado RoachSimulation simula uma população que inicia com 10 baratas, procria, pulveriza e imprime a contagem de baratas. Repita o processo três vezes.

Exercício P3.12. Implemente uma classe VotingMachine que pode ser utilizada para uma eleição simples. Crie os métodos para limpar o estado da máquina, votar em um demo- crata, votar em um republicano e obter a totalização dos votos para os dois partidos. Você ganha um crédito extra se seu programa totaliza a apuração dos votos do seu partido pre- ferido depois das 20h da primeira terça-feira de novembro, mas funciona normalmente em todas as outras datas. (Dica: Utilize a classe GregorianCalendar – veja o Projeto de Programação 2.1.)

Exercício P3.13. Desenhe um “alvo” – um conjunto de anéis concêntricos nas cores preto e branco alternadas. Dica: Preencha um círculo preto e depois um círculo branco menor por cima e assim por diante.

Seu programa deve ser composto das classes BullsEye, BullsEyeComponent e BullsEye- Viewer.

Exercício P3.14. Escreva um programa que desenha uma casa. Ela pode ser tão simples quanto a fi gura a seguir ou, se você preferir, mais elaborada (em 3D, um arranha-céu, com colunas de mármore no hall de entrada, qualquer coisa).

Implemente uma classe House e forneça um método draw(Graphics2D g2) que desenha a casa.

Exercício P3.15. Estenda o Exercício P3.14 fornecendo um construtor House para especi- fi car a posição e o tamanho da casa. Em seguida, preencha a tela com algumas casas de tamanhos diferentes.

Exercício P3.16. Mude o programa visualizador de carros da Seção 3.9 para que os carros apareçam em cores diferentes. Cada objeto Car deve armazenar sua própria cor. Forneça as classes Car e CarComponent modifi cadas.

Exercício P3.17. Altere a classe Car para que o tamanho de um carro possa ser especifi ca- do no construtor. Altere a classe CarComponent para que um dos carros tenha duas vezes o tamanho do exemplo original.

Exercício P3.18. Escreva um programa para plotar a string “HELLO”, utilizando apenas linhas e círculos. Não chame drawString e não utilize System.out. Crie as classes LetterH, LetterE, LetterL e LetterO.

Exercício P3.19. Escreva um programa que exibe os anéis olímpicos. Aplique aos anéis as cores olímpicas.

Forneça uma classe OlympicRingViewer e uma classe OlympicRingComponent.

Exercício P3.20. Crie um gráfi co de barras para plotar o conjunto de dados a seguir. Ro- tule cada barra. Crie barras horizontais para facilitar a rotulação. Forneça uma classe BarChartViewer e uma classe BarChartComponent.

Nome da ponte Maior vão livre (ft)

Golden Gate 4.200

Brooklyn 1.595

Delaware Memorial 2.150

Mackinac 3.800

Exercícios de programação adicionais estão disponíveis no WileyPLUS (recurso da edi- tora original).

PROJETOS DE PROGRAMAÇÃO

Projeto 3.1. Neste projeto, você irá aprimorar a classe BankAccount e ver como a abstra-

ção e o encapsulamento permitem alterações evolutivas para os softwares.

Inicie com um aprimoramento simples: cobrando uma tarifa para cada depósito e sa- que. Forneça um mecanismo para confi gurar a tarifa e modifi que os métodos deposit e withdraw de modo que a tarifa seja cobrada. Teste sua classe resultante e verifi que se a tarifa é calculada corretamente.

Agora faça uma alteração mais complexa. O banco permitirá um número fi xo de transa- ções gratuitas (depósitos ou saques) todos os meses e cobrará pelas transações que exce- derem a cota gratuita. A taxa não é cobrada imediatamente, mas no fi m do mês.

Forneça um novo método deductMonthlyCharge para a classe BankAccount que subtrai a taxa mensal e redefi ne a contagem de transações. Crie um programa de teste que verifi ca se as tarifas são calculadas corretamente ao longo de vários meses.

Projeto 3.2. Neste projeto, você irá explorar uma alternativa orientada a objetos para o

programa “Hello, World” do Capítulo 1.

Inicie com uma classe Greeter simples que contém um único método, sayHello. Esse mé- todo deve retornar uma string sem imprimi-la. Use o BlueJ para criar dois objetos dessa classe e invoque seus métodos sayHello.

Isso é entediante – naturalmente, já que os dois objetos retornam a mesma resposta. Aprimore a classe Greeter para que cada objeto produza uma saudação personalizada. Por exemplo, o objeto construído como new Greeter("Dave") deve dizer "Hello, Dave". (Utilize o método concat para combinar strings a fi m de formar uma string mais longa ou examine a Seção 4.6 para ver como você pode utilizar o operador + para o mesmo propósito.)

Adicione um método sayGoodbye à classe Greeter.

Por fi m, adicione um método refuseHelp à classe Greeter. Ele deve retornar uma string como "I am sorry, Dave. I am afraid I can't do that". [“Desculpe, Dave. Infelizmen- te, não posso fazer isso.”]

Teste sua classe no BlueJ. Crie objetos que saúdam todo mundo em geral e Dave em particular, e invoque métodos a partir deles.

RESPOSTAS ÀS PERGUNTAS DE AUTOVERIFICAÇÃO DA APRENDIZAGEM

1. Os programadores que projetaram e implementaram a biblioteca Java.

2. Outros programadores que trabalham com o aplicativo de fi nanças pessoais.

3. harrysChecking.withdraw(harrysChecking.getBalance())

4. Adicione um parâmetro accountNumber aos construtores e um método getAccountNum- ber. Não há necessidade de um método setAccountNumber – o número da conta nunca muda depois da construção.

5. /**

Constrói uma nova conta bancária com um dado saldo inicial.

@param accountNumber número dessa conta

@param initialBalance saldo dessa conta

*/

6. A primeira frase da descrição do método deve descrever o método – ela é exibida isoladamente na tabela de resumo.

7. Um campo de instância private int accountNumber; precisa ser adicionado à classe.

8. Há quatro campos: x, y, width, height. Todos os campos são do tipo int.

9. public int getWidth() {

return width; }

10. Há mais de uma resposta correta. Uma possível implementação seria esta: public void translate(int dx, int dy)

{

int newx = x + dx; x = newx;

int newy = y + dy; y = newy;

}

11. Um objeto BankAccount, nenhum objeto BankAccountTester. O propósito da classe BankAccountTester é apenas hospedar o método main.

12. Nesses ambientes, você pode emitir comandos interativos para construir objetos BankAccount, invocar métodos e exibir valores de retorno.

13. Variáveis de ambas pertencem a métodos – elas ganham vida quando o método é chamado e morrem quando o método é fechado. Elas diferem na maneira como são inicializadas. Variáveis de parâmetro são inicializadas com os valores de chamada; variáveis locais devem ser inicializadas explicitamente.

14. Um campo de instância, chamado balance. Três variáveis locais, uma chamada har- rysChecking e duas chamadas newBalance (nos métodos deposit e withdraw); duas variáveis de parâmetro, as duas chamadas amount (nos métodos deposit e withdraw).

15. Um parâmetro implícito do tipo BankAccount chamado this e um parâmetro explícito do tipo double chamado amount.

16. Não é uma expressão válida. this é do tipo BankAccount; e a classe BankAccount não tem campo algum chamado amount.

17. Nenhum parâmetro implícito – o método é estático – e um parâmetro explícito, cha- mado args.

18. CarComponent

19. No método draw da classe Car, chame: g2.fi ll(frontTire);

g2.fi ll(rearTire);

4

No documento Conceitos de Computação com Java_nodrm.pdf (páginas 134-142)