CodeKata #2: Caixa Eletrônico

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:

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;
}

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

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;}
} 

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:

public class ImpossivelSacarException extends Exception {
   public ImpossivelSacarException(final String message) {
      super(message);
   }
}

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

Abraços

4 Comentários

  1. […] último desafio (CodeKata #2: Caixa Eletrônico) foi bem legal. Existiam muitas pegadinhas e requereu um pouco mais de trabalho e atenção dos […]

    Curtir

  2. […] este CodeKata, seria mais difícil que o anterior (CodeKata #3: Restaurante), mas mais fácil que o CodeKata #2: Caixa Eletrônico. No entato quando comecei a implementar minha solução para o problema, vi que a complexidade […]

    Curtir

  3. […] um dos mais desafiadores que já postei, não sei dizer ao certo qual foi o mais complexo, pois o CodeKata #2: Caixa Eletrônico também foi foda. Acho que a complexidade foi o motivo do baixo número de participantes, […]

    Curtir

  4. […] um dos mais desafiadores que já postei, não sei dizer ao certo qual foi o mais complexo, pois o CodeKata #2: Caixa Eletrônico também foi foda. Acho que a complexidade foi o motivo do baixo número de participantes, […]

    Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: