Calculando o Troco em uma Aplicação Delphi
Veja neste artigo uma aplicação Delphi para calcular o troco no pagamento de uma conta. Como resultado será apresentado também o valor inteiro e o valor fracionário do troco dividido em notas e moedas, respectivamente.
Caros Amigos,
Pretendo demonstrar neste artigo uma aplicação Delphi para calcular o troco no pagamento de uma conta. Como resultado será apresentado também o valor inteiro do troco dividido em notas de R$ 100,00 - R$ 50,00 - R$ 20,00 - R$ 10,00 - R$ 5,00 - R$ 2,00 e R$ 1,00, respectivamente. E ainda, a parte fracionária do troco será dividida em moedas de R$ 0,50 - R$ 0,25 - R$ 0,10 - R$ 0,05 e R$ 0,01, respectivamente.
[1º Passo] Formulário Principal
Observe que as caixas de textos explicativos utilizadas na figura apresentam a ordem sequencial e o nome do componente, a página da sua localização e as propriedades que devem ser alteradas com os respectivos valores.

[2º Passo] implementation
a) Função que calcula e retorna o troco dividido em notas e moedas usando como parâmetros de entrada: "conta" = valor da conta; e, "pago" = valor pago.
b) Evento "onClick" do botão "Troco".
Entendendo o algoritmo da função "calculaTroco":
a) os vetores "nota" e "centavos" representam os valores das notas e centavos, respectivamente, usados nos cálculos das quantidades individuais na divisão do troco.
b) inicialmente é verificado se o valor pago é suficiente para o pagamento da conta.
c) a divisão do troco é realizada em duas partes:
c.1) dividindo a parte inteira do troco (trunc) da maior nota (R$ 100,00) para a menor nota (R$ 1,00) até zerar o valor inteiro do troco. O operador div é usado para calcular a quantidade de notas já o operador mod foi utilizado na expressão que calcula a sobra.
c.2) dividindo a parte fracionária do troco (frac) da maior moeda (R$ 0,50) para a menor moeda (R$ 0,01) até zerar o valor fracionário do troco. Novamente os operadores div e mod são utilizados nas expressões que fazem a divisão da parte fracionária do troco em moedas.
[3º Passo] Executando a Aplicação
Informar o valor da conta, o valor pago e pressionar o botão "Troco" e o seguinte resultado poderá ser exibido:

Veja também:
1) Separando a Parte Inteira e a Parte Fracionária de Valores do Tipo Real
2) Calculando o Troco em uma Aplicação Java
Obrigado e um abraço.
Prof. Omero Francisco Bertol (http://www.pb.utfpr.edu.br/omero/)
Download da Aplicação (http://www.pb.utfpr.edu.br/omero/Delphi/Artigos/TrocoDelphi.rar)
Pretendo demonstrar neste artigo uma aplicação Delphi para calcular o troco no pagamento de uma conta. Como resultado será apresentado também o valor inteiro do troco dividido em notas de R$ 100,00 - R$ 50,00 - R$ 20,00 - R$ 10,00 - R$ 5,00 - R$ 2,00 e R$ 1,00, respectivamente. E ainda, a parte fracionária do troco será dividida em moedas de R$ 0,50 - R$ 0,25 - R$ 0,10 - R$ 0,05 e R$ 0,01, respectivamente.
[1º Passo] Formulário Principal
Observe que as caixas de textos explicativos utilizadas na figura apresentam a ordem sequencial e o nome do componente, a página da sua localização e as propriedades que devem ser alteradas com os respectivos valores.

[2º Passo] implementation
a) Função que calcula e retorna o troco dividido em notas e moedas usando como parâmetros de entrada: "conta" = valor da conta; e, "pago" = valor pago.
function calculaTroco(conta, pago: real): String;
const nota: array[1..7] of integer = (100, 50, 20, 10, 5, 2, 1);
centavos: array[1..5] of integer = (50, 25, 10, 5, 1);
var troco: real;
i, vlr, ct: integer;
s: string;
begin
if (pago < conta)
then calculaTroco := 'Pagamento insuficiente, faltam R$ ' +
FloatToStr(conta - pago)
else begin
troco := pago - conta;
s := 'Troco = R$ ' + FloatToStr(troco);
s := s + #13#10 + #13#10;
// definindo as notas do troco (parte inteira)
vlr := trunc(troco);
i := 1;
while (vlr <> 0) do
begin
ct := vlr div nota[i]; // calculando a qtde de notas
if (ct <> 0)
then begin
s := s + IntToStr(ct) +
' nota(s) de R$ ' + IntToStr(nota[i]) + #13#10;
vlr := vlr mod nota[i]; // sobra
end;
i := i + 1; // próxima nota
end;
s := s + #13#10;
// definindo as moedas do troco (parte fracionária)
vlr := round(frac(troco) * 100);
i := 1;
while (vlr <> 0) do
begin
ct := vlr div centavos[i]; // calculando a qtde de moedas
if (ct <> 0)
then begin
s := s + IntToStr(ct) + ' moeda(s) de ' +
IntToStr(centavos[i]) + ' centavo(s)' + #13#10;
vlr := vlr mod centavos[i]; // sobra
end;
i := i + 1; // próxima moeda
end;
calculaTroco := s;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var conta, pago: real;
begin
Memo1.Clear;
try
conta := StrToFloat(Edit1.Text);
pago := StrToFloat(Edit2.Text);
Memo1.Lines.Add(calculaTroco(conta, pago));
except
ShowMessage('Erro: dados informados inválidos !!!');
end;
end;
Entendendo o algoritmo da função "calculaTroco":
a) os vetores "nota" e "centavos" representam os valores das notas e centavos, respectivamente, usados nos cálculos das quantidades individuais na divisão do troco.
b) inicialmente é verificado se o valor pago é suficiente para o pagamento da conta.
c) a divisão do troco é realizada em duas partes:
c.1) dividindo a parte inteira do troco (trunc) da maior nota (R$ 100,00) para a menor nota (R$ 1,00) até zerar o valor inteiro do troco. O operador div é usado para calcular a quantidade de notas já o operador mod foi utilizado na expressão que calcula a sobra.
c.2) dividindo a parte fracionária do troco (frac) da maior moeda (R$ 0,50) para a menor moeda (R$ 0,01) até zerar o valor fracionário do troco. Novamente os operadores div e mod são utilizados nas expressões que fazem a divisão da parte fracionária do troco em moedas.
[3º Passo] Executando a Aplicação
Informar o valor da conta, o valor pago e pressionar o botão "Troco" e o seguinte resultado poderá ser exibido:

Veja também:
1) Separando a Parte Inteira e a Parte Fracionária de Valores do Tipo Real
2) Calculando o Troco em uma Aplicação Java
Obrigado e um abraço.
Prof. Omero Francisco Bertol (http://www.pb.utfpr.edu.br/omero/)
Download da Aplicação (http://www.pb.utfpr.edu.br/omero/Delphi/Artigos/TrocoDelphi.rar)

5 COMENTÁRIOS
Marcelo Fernandes
Ola Omero, sua intensão foi boa na hora de escrever o artigo, porem vejo vc como professor deveria da o ex e escrever um artigo mais elaborado. te indico alguns livros: codigo limpo, programação orientada objeto, Teste unitário, alem disso ja analisarmos a complexidade ciclomática concerteza e nivel 100
[há +1 mês] -
Responder
[autor]
Omero Francisco Bertol
Olá Marcelo, obrigado pelas suas colocações. Ficaria muito agradecido em receber suas sugestões.
[há +1 mês] -
Responder
Marcelo Fernandes
Ola Omero, existe um livro muito bom chamado Codigo Limpo do Robert C. Martin ele da dicas valiosas quando se programa orientado objeto, alem deste livro existe os Design Patterns, que ajuda a elaborar uma aplicação mais fácil de se da manutenção e evolui a mesma, mesmo a seu exemplo e uma simples função de calcular troco, ela poderia ser uma class sendo assim reaproveitável e alem da possibilidade de fazer teste unitário usando DUnit, como pode ver no livro TDD do Kent beck.
Eu acho que poderia ser aplicado os seguintes princípios - Sigle Responsability Principle,Open Close Principle e Dependency inversion principle, ter uma class calculartroco que tem a responsabilidade de efetuar este calculo, e ela poderia ter um um metodo para impressão que vc passe alguma interface de impressão, aonde o usuário poderia escolher se ia querer imprimir no memo, txt, mostrar em html hoje a sua esta amarrado com memo, alem disso poderia retornar uma excessao invez de dar um showmenssage.
att
Eu acho que poderia ser aplicado os seguintes princípios - Sigle Responsability Principle,Open Close Principle e Dependency inversion principle, ter uma class calculartroco que tem a responsabilidade de efetuar este calculo, e ela poderia ter um um metodo para impressão que vc passe alguma interface de impressão, aonde o usuário poderia escolher se ia querer imprimir no memo, txt, mostrar em html hoje a sua esta amarrado com memo, alem disso poderia retornar uma excessao invez de dar um showmenssage.
att
[há +1 mês] -
Responder
[autor]
Omero Francisco Bertol
Olá Marcelo. Excelentes dicas vou procurar aplicá-las. Obrigado e um abraço.
[há +1 mês] -
Responder
[autor]
Omero Francisco Bertol
Boa Tarde Marcelo,
Modifiquei a aplicação criando uma função para retornar o detalhamento do troco com a seguinte interface:
function calculaTroco(conta, pago: real): String;
Meus alunos estão iniciando na programação e os aspcetos relacionados a lógica do desenvolvimento do algoritmo ainda geram muitas dificuldades. Acredito que neste momento a solução estruturada é uma alternativa interessante para o problema apresentado.
Novamente obrigado pelas dicas.
Bom domingo.
Modifiquei a aplicação criando uma função para retornar o detalhamento do troco com a seguinte interface:
function calculaTroco(conta, pago: real): String;
Meus alunos estão iniciando na programação e os aspcetos relacionados a lógica do desenvolvimento do algoritmo ainda geram muitas dificuldades. Acredito que neste momento a solução estruturada é uma alternativa interessante para o problema apresentado.
Novamente obrigado pelas dicas.
Bom domingo.
[há +1 mês] -
Responder
[Este post ainda não foi associado a uma sequência]
Você está em:
canal Delphi
Publicidade
Omero Francisco Bertol
Space do autor
Técnico Mecânico pelo CEFET, Curitiba/PR. Tecnólogo em Processamento de Dados pela UEM, Maringá/PR. Especialista em Informática pela Universidade Federal do Paraná. Mestre em Informática Aplicada pelo Programa de Pós Graduação em Informática Aplicada da PUC, Curitiba/PR. Professor de Ensino Superior...
Space do autor



0
2
