CodeKata #2: Caixa Eletrônico

Tempo de leitura: menos de 1 minuto

Bruce Lee

Fala aí pessoal, prontos para o CodeKata #2?

Mesmo com poucas pessoas participando efetivamente do CodeKata #1, o resultado foi muito legal, várias pessoas do trabalho comentaram que vão participar próximo quando houver. Então porque parar?

Regras

As regras são as mesmas, com exceção do prazo para entrega:

  • O desafio será dado, e qualquer leitor poderá participar.
  • O participante terá 10 dias para dar uma solução para o problema.
  • A solução deverá ser escrita em Java ou Groovy.
  • A solução deve ser enviada através do formulário no fim do post.
  • As melhores soluções e seus autores serão divulgadas em um post no dia previamente fixado.

Desafio: Caixa Eletrônico

Enviar a solução até: 21/02/2016
Divulgação do resultado dia: 22/02/2016

Um caixa eletrônico opera com alguns tipos de notas disponíveis (R$ 50,00, R$ 20,00, R$ 10,00, R$ 5,00 e R$2,00), mantendo um estoque de cédulas para cada valor. Os clientes do banco, podem efetuar saques de um certo valor.

Escreva um programa que, dado o valor solicitado (v) pelo cliente, determine o número de cada uma das notas necessário para totalizar esse valor, de modo a minimizar a quantidade de cédulas entregues.

Exemplo 1: Se o cliente deseja retirar R$ 50,00, basta entregar uma única nota de cinquenta reais.

Exemplo 2: Se o cliente deseja retirar R$ 92,00, é necessário entregar uma nota de R$50,00, duas de R$ 20,00 e uma de R$2,00.

Restrições

  1. 0 < v ≤ 10000.
  2. Estoque de notas: deverá se informado pelo QuantidadeNotaTO.
  3. O valor solicitado pelo usuário deve corresponder exatamente a quantidades de notas dispensadas pelo caixa eletrônico.

Interface a ser implementada e TO

Implemente a interface:

[code language=”java”]
public interface ICaixaEletronicoService {
/**
* Método usado para informar o estoque de notas. Este método serve apenas para informar o estoque inicial de notas,
* funcionará como um setter para um atributo da classe.
* O nome do método não ficou legal…. Sorry!!
* @param pQuantidadeNotas
**/
public void contarNotas(QuantidadeNotaTO pQuantidadeNotas);

/**
* Método retornará um objeto do tipo QuantidadeNotaTO com a quantidade de notas necessárias para compor o valor informado por parametro.
* @param pValor
* @throws ImpossivelSacarException
**/
public QuantidadeNotaTO sacar(BigDecimal pValor) throws ImpossivelSacarException;
}
[/code]

Esse deve ser o objeto de retorno, o mesmo será usado para definir o estoque de notas:

[code language=”java”]
public class QuantidadeNotaTO {
private Integer notas10;
private Integer notas2;
private Integer notas20;
private Integer notas5;
private Integer notas50;

public QuantidadeNotaTO(final Integer pQuantidadeNotas2,
final Integer pQuantidadeNotas5, final Integer pQuantidadeNotas10,
final Integer pQuantidadeNotas20, final Integer pQuantidadeNotas50) {
notas2 = pQuantidadeNotas2;
notas5 = pQuantidadeNotas5;
notas10 = pQuantidadeNotas10;
notas20 = pQuantidadeNotas20;
notas50 = pQuantidadeNotas50;
}

public QuantidadeNotaTO() { }
public Integer getNotas2() { return notas2; }
public Integer getNotas5() { return notas5; }
public Integer getNotas10() { return notas10; }
public Integer getNotas20() { return notas20; }
public Integer getNotas50() { return notas50; }
public void setNotas2(final Integer pNotas2) {notas2 = pNotas2;}
public void setNotas5(final Integer pNotas5) {notas5 = pNotas5;}
public void setNotas10(final Integer pNotas10) {notas10 = pNotas10;}
public void setNotas20(final Integer pNotas20) {notas20 = pNotas20;}
public void setNotas50(final Integer pNotas50) {notas50 = pNotas50;}
}
[/code]

Nota: 19/02/2016 – Pessoal, faltou adicionar os setters, para quem quiser controlar a notas do estoque no próprio TO.

Código da exception:

[code language=”java”]
public class ImpossivelSacarException extends Exception {
public ImpossivelSacarException(final String message) {
super(message);
}
}
[/code]

Nota: Projeto disponível no GitHub.

Observação: A classe QuantidadeNotaTO é usada tanto para setar o estoque de notas, quando para retornar o resultado.

Espero que gostem!!

Convide seus amigos para o desafio.

Formulário para envio da solução

[contact-form][contact-field label=’Nome’ type=’name’ required=’1’/][contact-field label=’Email’ type=’email’ required=’1’/][contact-field label=’Cole sua implementação aqui’ type=’textarea’ required=’1’/][/contact-form]

Abraços

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *