Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

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.

 

 

 

 

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

  • Moderador

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
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...