tag:blogger.com,1999:blog-3371915898459901668.post747592200994127647..comments2023-07-20T11:34:00.554-03:00Comments on Meu Blog de PostgreSQL!!!: Algoritmos: Caixa de Banco Simulado no PostgreSQLCláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.comBlogger4125tag:blogger.com,1999:blog-3371915898459901668.post-919736790063163522010-09-28T00:17:28.854-03:002010-09-28T00:17:28.854-03:00Este algoritmo funciona perfeitamente para as nota...Este algoritmo funciona perfeitamente para as notas {1,5,10,50,100}. Adicionei outras possíveis variáveis {2,20} e aí surgiu o problema de apropriação de notas que não funcionou. Tomei a liberdade de criar uma nova função (talvez não com a mesma performance da função inicial) porém facilmente adaptável às possíveis notas existentes em determinada Economia.<br />Para tanto, usei as possibilidades existentes em nossa Economia (desde moedas de R$ 0,01 até notas de R$ 100,00) e funcinou perfeitamente.<br /><br /><b>CREATE OR REPLACE FUNCTION calcula_moeda (valor NUMERIC) RETURNS text AS $$ DECLARE<br />notas NUMERIC[12];<br />quantidade INTEGER[12];<br />processado NUMERIC;<br />retorno TEXT;<br />BEGIN<br />notas[0] := 0.01;<br />notas[1] := 0.05;<br />notas[2] := 0.10;<br />notas[3] := 0.25;<br />notas[4] := 0.50;<br />notas[5] := 1.00;<br />notas[6] := 2.00;<br />notas[7] := 5.00;<br />notas[8] := 10.00;<br />notas[9] := 20.00;<br />notas[10] := 50.00;<br />notas[11] := 100.00;<br />processado := 0.00;<br />retorno := 'Total: ' || valor || chr(10) || '----------------------------------';<br />FOR laco IN REVERSE 11..0 LOOP<br /> quantidade[laco] := 0;<br /> quantidade[laco] := CAST((valor - processado - ((valor - processado) % notas[laco])) / notas[laco] AS INTEGER);<br /> processado := processado + (quantidade[laco] * notas[laco]);<br /> retorno := retorno || chr(10) || 'Especie de ' || notas[laco] || ': ' || quantidade[laco] || ' unidade(s)';<br />END LOOP;<br />RETURN retorno;<br />END;<br />$$ LANGUAGE plpgsql;</b><br /><br />Podemos ver em um exemplo de execução da função:<br /><b>SELECT calcula_moeda(193.83);</b><br /><i><br />Total: 193.83<br />----------------------------------<br />Especie de 100.00: 1 unidade(s)<br />Especie de 50.00: 1 unidade(s)<br />Especie de 20.00: 2 unidade(s)<br />Especie de 10.00: 0 unidade(s)<br />Especie de 5.00: 0 unidade(s)<br />Especie de 2.00: 1 unidade(s)<br />Especie de 1.00: 1 unidade(s)<br />Especie de 0.50: 1 unidade(s)<br />Especie de 0.25: 1 unidade(s)<br />Especie de 0.10: 0 unidade(s)<br />Especie de 0.05: 1 unidade(s)<br />Especie de 0.01: 3 unidade(s)</i>Datamais.comhttps://www.blogger.com/profile/08611309302133640190noreply@blogger.comtag:blogger.com,1999:blog-3371915898459901668.post-18804855638936859932010-02-14T23:59:43.738-03:002010-02-14T23:59:43.738-03:00Nice dispatch and this enter helped me alot in my ...Nice dispatch and this enter helped me alot in my college assignement. Thanks you for your information.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-3371915898459901668.post-2653097962235382362010-01-28T09:33:10.975-03:002010-01-28T09:33:10.975-03:00Oi, Fabrízio!
Realmente teríamos de acrescentar d...Oi, Fabrízio! <br />Realmente teríamos de acrescentar duas verificações: <br />- primeira, se a quantidade solicitada é maior que a quantidade armazenada no caixa<br />- segunda, se a quantidade de notas de cada tipo é maior que a quantidade de notas disponíveis.Cláudio Leopoldinohttps://www.blogger.com/profile/16676839129160419931noreply@blogger.comtag:blogger.com,1999:blog-3371915898459901668.post-21676661161521928632010-01-28T09:15:39.035-03:002010-01-28T09:15:39.035-03:00Caro Cláudio,
Bem legal o algoritmo... a minha su...Caro Cláudio,<br /><br />Bem legal o algoritmo... a minha sugestão para incrementar a função seria um controle do número de notas disponíveis no caixa eletrônico, até mesmo para poder saber se é possível efetuar a transação.<br /><br />Para o caso de adicionar a nota de R$20, ou até mesmo de R$2 creio que o mais adequado seria criar uma matriz multidimensional com as notas disponiveis e o valor que cada uma representa para poder fazer o cálculo das quantidades... e até mesmo a qtd de notas disponíveis é importante pois pode ser que nao tenhamos notas de 50 disponiveis e o usuário quer sacar 50 e teremos de disponibilizar 2 de 20 e 1 de 10, sempre dependendo da disponibilidade...<br /><br />Podemos trocar mais alguma idéia e colocar em prática se vc desejar!<br /><br />Abraço,<br /><br />Fabrízio MelloFabrízio de Royes Mellohttps://www.blogger.com/profile/00868969448686556643noreply@blogger.com