Clipper On Line • Ver Tópico - MAPA DE TROCO

MAPA DE TROCO

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

MAPA DE TROCO

Mensagempor informais » 19 Mai 2021 07:52

Olá amigos, bom dia

Preciso fazer um Mapa de troco,

Exemplo

R$ 45,30
2 Nota(s) de R$ 20,00
4 Nota(s) de R$ 10,00
1 Nota(s) de R$ 5,00
3 Moedas de R$ 0,10

etc


Algo mais ou menos assim
informais
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 23
Data de registro: 15 Jun 2018 07:14
Cidade/Estado: VISCONDE DO RIO BRANCO
Curtiu: 1 vez
Mens.Curtidas: 0 vez

MAPA DE TROCO

Mensagempor JoséQuintas » 20 Mai 2021 09:55

informais escreveu:R$ 45,30
2 Nota(s) de R$ 20,00
4 Nota(s) de R$ 10,00
1 Nota(s) de R$ 5,00
3 Moedas de R$ 0,10


também poderia ser 1 moeda de 0.25 e 1 de 0,05
Ou 3 reais de troco, poderiam ser 3 moedas de 1, ou 1 nota de 2 + 1 moeda de 1

É fazer a tabela de notas/moedas.
Vai usar Int() e Mod().
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

MAPA DE TROCO

Mensagempor JoséQuintas » 20 Mai 2021 10:22

PROCEDURE Main

   LOCAL nValor := 45.30
   LOCAL aItem

   FOR EACH aItem IN Troco( nValor )
      ? Str( aItem[ 1 ], 3 ) + " " + aItem[ 2 ] + " de " + Str( aItem[ 3 ] )
   NEXT
   Inkey(0)

   RETURN

FUNCTION Troco( nValor )

   LOCAL aList := { ;
      { 50, "nota(s)" }, ;
      { 20, "nota(s)" }, ;
      { 10, "nota(s)" }, ;
      { 5, "nota(s)" }, ;
      { 2, "nota(s)" }, ;
      { 1, "moeda(s)" }, ;
      { 0.50, "moeda(s)" }, ;
      { 0.25, "moeda(s)" }, ;
      { 0.10, "moeda(s)" }, ;
      { 0.05, "moeda(s)" }, ;
      { 0.01, "moeda(s)" } }
   LOCAL aTroco := {}
   LOCAL aItem, nQtd

   FOR EACH aItem IN aList
     nQtd := Int( nValor / aItem[ 1 ] )
     ? nValor, aItem[ 1 ], nQtd
     IF nValor >= aItem[ 1 ]
        nValor := nValor - ( nQtd * aItem[ 1 ] )
        AAdd( aTroco, { nQtd, aItem[ 2 ], aItem[ 1 ] } )
     ENDIF
   NEXT

   RETURN aTroco


moeda.png


O problema é o Harbour fazer conta errada.

0.05 / 0.05 deu zero
e 0.05 / 0.01 deu 4
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

MAPA DE TROCO

Mensagempor JoséQuintas » 20 Mai 2021 10:37

PROCEDURE Main

   LOCAL nValor := 45.30
   LOCAL nItem

   FOR EACH nItem IN Troco( nValor )
      ? Str( nItem[ 1 ], 2 ) + " " + iif( nItem[ 1 ] < 2, "moeda(s)", "nota(s)" ) + " de " + Str( nItem[ 2 ] )
   NEXT
   Inkey(0)

   RETURN

FUNCTION Troco( nValor )

   LOCAL aList := { 50, 20, 10, 5, 2, 1, 0.50, 0.25, 0.10, 0.05, 0.01 }
   LOCAL aTroco := {}
   LOCAL nItem, nQtd

   nValor := Int( nValor * 100 )
   FOR EACH nItem IN aList
     nQtd := Int( nValor / ( nItem * 100 ) )
     //? nValor/100, nItem, nQtd
     IF nValor >= ( nItem * 100 )
        nValor := nValor - ( nQtd * nItem * 100 )
        AAdd( aTroco, { nQtd, nItem } )
     ENDIF
   NEXT

   RETURN aTroco


moeda.png
moeda.png (10.61 KiB) Visualizado 1256 vezes


Mais simples, considerando que abaixo de 2 reais é moeda
E trabalhando com valor multiplicado por 100, pra evitar erro de cálculo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

MAPA DE TROCO

Mensagempor JoséQuintas » 20 Mai 2021 10:40

Aproveitando...

Pra quem nunca viu erro de cálculo por causa do tal ponto flutuante, está aí.
Internamente 0.05 virou algo como 0.049999999999999999999999999999
Numa visão normal, tudo bem, mas em cálculos detalhados.... erro de cálculo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

MAPA DE TROCO

Mensagempor JoséQuintas » 20 Mai 2021 10:47

Pequena correção no fonte:

 iif( nItem[ 2 ] < 2, "moeda(s)", "nota(s)" ) 


Ao invés de comparar o valor, eu tinha comparado a quantidade.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

MAPA DE TROCO

Mensagempor Fernando queiroz » 20 Mai 2021 10:57

O único problema é saber o tipo e a quantidade do troco, ou tal mapa é somente para informacao?????
caso não seja somente para informação tem de carregar os tipos de notas e moedas, como acontece em caixa eletrônico, que você informa a quantidade de notas, valor e qual cassete ela esta localizada.
no caso de caixa eletronico tem somente dispenser e o recebimento é separado.

Quando trabalhei em Banco , dava manutenção em sistema de caixa eletrônico, era bem legal, tratar o hardware para contar e recusar notas com defeito
HARBOUR 3.2, HWGUI 2.23 B3, SEFAZCLASS, PDFClass, ADO + MariaDB/MySQL, RMChart
Fernando queiroz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 737
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 12 vezes
Mens.Curtidas: 58 vezes

MAPA DE TROCO

Mensagempor JoséQuintas » 20 Mai 2021 11:01

Não prestei atenção sobre o tópico ser Clipper.
Troque o FOR/EACH por FOR nCont = 1 TO n, e acrescente uma linha.

FOR EACH nItem IN a List


troque por

FOR nCont = 1 TO Len( aList )
   aItem := aList[ nCont ]


E ao invés de usar direto o Troco( nValor ) no FOR/EACH, primeiro atribua a uma variável.

   FOR EACH nItem IN Troco( nValor )


troque por

aList := Troco( nValor )
FOR nCont = 1 TO Len( aList )
   nItem := aList[ nCont ]


Assim o resto do fonte permanece igual.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

MAPA DE TROCO

Mensagempor JoséQuintas » 20 Mai 2021 11:44

troco.png


Uia... sem erro de ponto flutuante no MySQL.

http://www.pctoledo.com.br/forum/viewtopic.php?f=57&t=25626&start=0
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Google [Bot] e 4 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro