Ir ao conteúdo
  • Cadastre-se

Caixa Eletrônico C# Windows Form


kassuy

Posts recomendados

Preciso simular um caixa eletrônico, nele, o usuário entra com a quantia de dinheiro que quer sacar. Após isso, tenho que oferecer a opção de "menor quantidade de notas" e a opção de "maior variedade de notas" (100, 50, 20, 10, 5 e 2).

Como eu começo? Alguém me da uma luz, por favor.

Link para o comentário
Compartilhar em outros sites

Eu não sei o quanto essa simulação precisa ser fiel a um caixa eletrônico real... por exemplo, precisa simular a quantidade de notas que o caixa possui em estoque? Precisa levar em conta o número de notas que ele retorna? (muitos caixas possuem um limite de 50 notas eu acho, devido a largura da abertura por onde sai o dinheiro).

Mas a lógica é mais ou menos assim:

Usuário quer sacar 127 reais:

- Cria um vetor V com os tipos de nota = [100, 50, 20, 10, 5, 2]

- 127 dividido por v[0] --> 127 / 100 --> igual a [1], sobra [27] --> adiciona [1] nota de 100

- 27 dividido por v[1] --> 27 / 50 --> igual a [0], sobra [27] --> não adiciona nota nenhuma

- 27 dividido por v[2] --> 27 / 20 --> igual a [1], sobra [7] --> adiciona [1] nota de 20

...etc

Repete tudo até não sobrar nada.

Isso vai te dar a menor quantidade de notas possíveis.

Pra pegar a maior variedade de notas possíveis você usa a mesma lógica, a diferença é que, por exemplo, se o usuário quiser sacar 200 reais, em vez de usar apenas duas notas de 100 você vai precisar fatorar aquele número pelas notas disponíveis.

200 --> 100x1 + 50x1 + 20x1 + 10x1 + 5x2 + 2x5

Pro menor número de notas, você faz as divisões de v[0] até v[5], onde o resultado das divisões é o número de notas com aquele valor.

Pra maior variedade de notas, você faz as divisões de v[5] até v[0], mas pega apenas uma nota por vez (caso a divisão seja diferente de zero) e repete o loop caso necessário.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Só por esclarecimentos, não há limite de notas, e nem limite de dinheiro a ser sacado.

Só preciso retornar os dois tipos de saques após o usuário entrar com a quantia de dinheiro a ser retirada.

Alguém me ajuda com a parte do código de menor quantidade de notas? Fiz um try catch para tratar as exceções , que no caso seria 0, 1 e 3.

Link para o comentário
Compartilhar em outros sites

Alguém me ajuda com a parte do código de menor quantidade de notas? Fiz um try catch para tratar as exceções , que no caso seria 0, 1 e 3

Essa é a mais fácil.

Digamos que n é a quantia a ser sacada:

Você vai retornar:

n/100 (Será a quantidade de notas de 100.)

Depois n vai ser o resto da visão de n por cem(n = n%100).

Agora vai retornar n/50.

De novo n tem que virar o resto da divisão de n por 50.

E assim com todas as notas.

Link para o comentário
Compartilhar em outros sites

Menor quantidade de notas:

// vetor V = [100, 50, 20, 10, 5, 2];int saque;// usuário digita o valor que ele quiser sacar em "saque"for (int i=0; i < V.Lenght; i++) {    if (saque / V[i]) // se saque dividido por V[i] for diferente de zero        imprimeNota(V[i], (saque/V[i]) );    saque = saque % V[i];}
A função "imprimeNota()" você implementa do jeito que quiser. V vai ser o tipo de nota e (saque/v) a quantidade daquele tipo de nota. Pode criar um vetor pra guardar as notas que o usuário vai sacar, ou pode simplesmente imprimir na tela uma mensagem dizendo o valor da nota que o caixa tá dispensando e a quantidade.
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Eu acho que fazendo como o @ScreenBlack disse já tá certo, afinal nenhum caixa eletrônico imprime valores assim, mas se o professor for bem chato mesmo e quiser que funcione com qualquer valor, então uma "gambiarra" seria testar se "saque" é diferente de zero no final. Se sim, basta somar os ultimos elementos da lista até serem maiores que 5, depois fatorar novamente. Se o resultado a ser fatorado for par, usa apenas notas de 2 reais. Se for impar, usa uma de 5, o resto de 2.

 

28 = [20, 5, 2] sobrou 1

soma 5 + 2 + 1 = 8, par --> fatora novamente usando 2xN

28 = [20, 2, 2, 2, 2]

 

31 = [20, 10] sobrou 1

soma 10 + 1 = 11, impar --> fatora novamente usando um 5x1 + 2xN

31 = [20, 5, 2, 2, 2]

 

33 = [20, 10, 2] sobrou 1

soma 10 + 2 + 1 = 13, impar --> fatora novamente usando 5x1 + 2xN

33 = [20, 5, 2, 2, 2, 2]

 

Ou então simplesmente dividir a função em duas partes. Uma que trata das notas de 100, 50 e 20. E a outra parte tratando das notas de 10, 5 e 2.

Uma outra opção seria fazer o programa mostrar na tela uma mensagem dizendo "To sem troco no momento, aceita uma balinha?", e dividir o restante em balas.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Eu acho que fazendo como o @ScreenBlack disse já tá certo, afinal nenhum caixa eletrônico imprime valores assim, mas se o professor for bem chato mesmo e quiser que funcione com qualquer valor, então uma "gambiarra" seria testar se "saque" é diferente de zero no final. Se sim, basta somar os ultimos elementos da lista até serem maiores que 5, depois fatorar novamente. Se o resultado a ser fatorado for par, usa apenas notas de 2 reais. Se for impar, usa uma de 5, o resto de 2.

 

28 = [20, 5, 2] sobrou 1

soma 5 + 2 + 1 = 8, par --> fatora novamente usando 2xN

28 = [20, 2, 2, 2, 2]

 

31 = [20, 10] sobrou 1

soma 10 + 1 = 11, impar --> fatora novamente usando um 5x1 + 2xN

31 = [20, 5, 2, 2, 2]

 

33 = [20, 10, 2] sobrou 1

soma 10 + 2 + 1 = 13, impar --> fatora novamente usando 5x1 + 2xN

33 = [20, 5, 2, 2, 2, 2]

 

Ou então simplesmente dividir a função em duas partes. Uma que trata das notas de 100, 50 e 20. E a outra parte tratando das notas de 10, 5 e 2.

Se eu entendi!

Então o resultado para R$31,00 será:

1x R$20,00 = 20

1x R$  5,00 =   5

3x R$  2,00 =   6

 

Vou unir as duas dicas

Valeu! 

 

Link para o comentário
Compartilhar em outros sites

Acabei de pensar num jeito aqui pra facilitar tua vida na hora de lidar com valores ímpares no algoritmo de menor qtd de notas.

A lógica é a seguinte:

Qualquer valor que o usuário digitar, ou ele terá UMA nota de 5, ou terá NENHUMA nota de 5. Ele nunca terá duas ou mais pois nesse caso o algoritmo vai usar notas de 10.

Então no começo do algoritmo você testa se o número é impar ou divisível por 5... caso isso seja verdadeiro, você retira uma nota de 5 do valor e faz o resto do algoritmo normalmente, mas sem usar mais notas de 5.

801 --> Impar

801 - 5 = 796.

7 x 100

1 x 50

2 x 20

3 x 2

[1 x 5]

103 --> Impar

103 - 5 = 98

1 x 50

2 x 20

4 x 2

[1 x 5]

 

        public int trocoMenor(int x) {            reset();            //conversão e criação de variáveis            int vlr = Convert.ToInt32(txtValor.Text);            int valor1 = Convert.ToInt32(txtValor.Text);            if ((vlr % 2) && (vlr > 4)) {                vlr -= 5;                cinco += 1;            }            cem = vlr / 100;            vlr = vlr % 100;            cinquenta = vlr / 50;            vlr = vlr % 50;            vinte = vlr / 20;            vlr = vlr % 20;            dez = vlr / 10;            vlr = vlr % 10;            dois = vlr / 2;            vlr = vlr % 2;            //Caso 'valor' seja diferente de 0, não existe saque.            if (vlr != 0)            {                MessageBox.Show("o DontPanic falou besteira... esqueça tudo e use o algoritmo anterior mesmo");            }            else            {                // ...            }            return (vlr);        }
Link para o comentário
Compartilhar em outros sites

        public int TrocoMaior(int y)        {            reset();            int vlr = Convert.ToInt32(txtValor.Text);            int valor1 = Convert.ToInt32(txtValor.Text);            if ((vlr % 2) && (vlr > 4)) {                cinco += 1;                vlr -= 5;            }            if (!(vlr % 2) && (vlr > 10)) {                cinco += 2;                vlr -= 10;            }            while (vlr > 1)            {                if (vlr / 2)                {                    vlr -= 2;                    dois++;                }                if (vlr / 10)                {                    vlr -= 10;                    dez++;                }                if (vlr / 20)                {                    vlr -= 20;                    vinte++;                }                if (vlr / 50)                {                    vlr -= 50;                    cinquenta++;                }                if (vlr / 100)                {                    vlr -= 100;                    cem++;                }            }            if (vlr != 0)            {                MessageBox.Show("Notas indisponiveis para esse valor");            }            else            {                   ...            }            return (vlr);        }

@

Eu testei aqui num compilador online e deu certo, não tava sobrando valor nenhum no final.

Mas testei apenas com alguns números.

Quais os valores que estão dando apenas aproximação?

Link para o comentário
Compartilhar em outros sites

Muito bom, lembro-me de ter feito um exercício desses em Pascal, mas já faz muuuito tempo...

 

 

@, eu também não vi nada de errado com o código postado até então..

 

@dontpanic

 

Funciona legal, mas seria interessante dar uma equilibrada na distribuição de cédulas de 5. Por exemplo, se você meter o valor 5987413, a distribuição originalmente ficaria assim:

100 = 3289750  = 3289820  = 3289910  = 329015   = 32   = 32904

Você poderia inserir mais um teste como aquele feito inicialmente (antes do while) dentro do laço para ir consumindo mais cédulas de 5. Tipo:

if (!(vlr % 10) && (vlr > 10)){	vlr -= 10;	cinco += 2;}

Colocaria isto depois do if que testa a divisão por 10.

 

 

Agora como resulta (para o mesmo valor de entrada):

100 = 3254050  = 3254020  = 3254110  = 325415   = 130192   = 32544

Não testei muitos valores, mas acho que está OK. Na dúvida, é só fazer um laço para testar todos os valores.

 

 

:natal:

LNW

Link para o comentário
Compartilhar em outros sites

Também sou iniciante de 2 meses, e estudo esporadicamente e de maneira informal

Desculpem-me se dono do post se ofendeu, eu sou do tipo que não dar prêmios a mediocridade. E acredito que tudo que já é bom pode melhorar independente de qualquer coisa ou estado. Dica: repense esse algoritmo se quiser evoluir.

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...