Ir ao conteúdo
  • Cadastre-se
Guilherme_2

Caixa eletrônico - retirada de cédulas em php

Recommended Posts

Primeiramente, boa tarde galera!

 

To com uma dúvida referente a um problema que é construir uma espécie de "Caixa Eletrônico".

Eu informo um valor e a partir dele vai me ser retornado o número de cédulas(o menor possível) para aquele valor.

 

A partir daqui é especulação e qual é o meu problema.

O x da questão é que pelo fato da minha programação ser procedural certos valores terminados em 3 (213 por exemplo) ele conta:

 

2x Notas de 100

1x Notas de 10

0x Notas de 2

0x Notas de 5

0x Notas de 1

 

Vejam a lógica que eu usei abaixo, que acho que entenderão o que acontece.

 


          $nota100 = 0;
          $nota50  = 0;
          $nota20  = 0;
          $nota10  = 0;
          $nota5   = 0;
          $nota2   = 0;
          $nota1   = 0; 
          
          while($valor>=100){
            $nota100 = $nota100+1;
            $valor = $valor-100;
          }

          while($valor>=50){
            $nota50 = $nota50+1;
            $valor = $valor-50;
          }      

          while($valor>=20){
            $nota20 = $nota20+1;
            $valor = $valor-20;
          }

          while($valor>=10){
            $nota10 = $nota10+1;
            $valor = $valor-50;
          }       

          while($valor>=5){
            $nota5 = $nota5+1;
            $valor = $valor-5;
          }   

          while($valor>=2){
            $nota2 = $nota2+1;
            $valor = $valor-2;
          }   

          while($valor>=1){
            $nota1 = $nota1+1;
            $valor = $valor-1;
          }  

 

Quando ele cai no while da nota5 ele não entra no laço pois a condição não é satisfeita e encerra o processamento.

Então eu queria saber, é se a minha lógica que ta errada ou se é uma limitação pela estrutura ser procedural.Já garimpei o google e não consegui achar nada que me ajudasse.

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Guilherme_2 O problema do seu código é erro de digitação. 

 

na hora do while da nota 10 você definiu  a variável  $valor de -50 por isso o erro.

 

while($valor>=10){
            $nota10 = $nota10+1;
            $valor = $valor-50; //Seria -10
          } 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
9 horas atrás, FabianoS disse:

@Guilherme_2 O problema do seu código é erro de digitação. 

 

na hora do while da nota 10 você definiu  a variável  $valor de -50 por isso o erro.

 


while($valor>=10){
            $nota10 = $nota10+1;
            $valor = $valor-50; //Seria -10
          } 

 

Pô,era isso mesmo da até uma tristeza, tanto trabalho pra ser algo tão besta.Mas obrigado pela ajuda :)

--

Aproveitando, queria deixar isso mais "inteligente" esse monte de while ainda ta muito poluído. Queria deixar o código mais limpo.

Eu pensei em duas formas usando arrays, todavia na entrada do valor me vem um dado de tipo Inteiro e no array ele considera tudo como do tipo String.Não sei como fazer a conversão, acho que existe alguma função pra isso.

 

Comecei pensando em alguma coisa mais ou menos assim:

          $valores = array (100, 50, 20, 10, 5, 2 ,1);
          $cedulas = array ("Cem", "Cinquenta", "Vinte", "Dez", "Cinco", "Dois", "Um"); 

Novamente, de qualquer jeito eu recebo o dado como tipo inteiro, como eu vou fazer a operação matemática depois?

Aqui eu criei um array contendo os valores, e o outro pra ser usado em um foreach para mostrar na tela e acabar com aquela enxurrada de echo's.

 

Ou usando um array associativo, eu atribuo a chave com o nome(Ex: Dez) do valor(Ex: 10):

          $valores = array (100, 50, 20, 10, 5, 2 ,1);
          $cedulas = array (
                            "Cem" => "100", 
                            "Cinquenta" => "50",
                            "Vinte" => "20",
                            "Dez" => "10",
                            "Cinco" => "5", 
                            "Dois", => "1"
                           ); 

 

E por fim se alguém puder mostrar como isso poderia ser feito com OOP estarei agradecido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Podes fazer em uma função!

Por exemplo:

function caixa($valor) {	
	//Constantes 
	$i = $a = $soma = 0; 

	//Notas disponíveis para saque
	$notas = array(100,50,20,10,5,2);

	//Coloca array em ordem descrescente
	rsort($notas); 
	while ($i < count($notas)) :
		//Menor quantidade de notas da maior possível                      
		$qtd[$i] = floor($valor/$notas[$i]);
                          
		//Soma a quantidade de notas a cada loop                      
		$soma += $qtd[$i]; 
            
		//Subtrai a quantidade de dinheiro já calculada do valor                      
		$valor = $valor-($qtd[$i]*$notas[$i]); 
		$i++;
	endwhile;
		
	/* Exibe resultado */
	
	while ($a < count($notas)) :
		echo " $qtd[$a]x notas de " . $notas[$a] . "<br/>";
		$a++;
	endwhile;
	
}

//executa a função
 caixa(213);

Se quiser fazer  orientada a objetos.. aí crie uma classe, e crie um array do tipo private das notas..  depois crie uma função para saque com a mesma lógica.. e alterar algumas coisas se necessário.

 

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×