Resolução do Problema
do
Troco de Um Dólar

por

Wanderley Gazeta

São Carlos, 08 de abril de 1999.
 
 

Descrição do Problema

Linguagem

Características do Programa

Exemplos de Execução do Programa

Listagem do Programa

Descrição do Problema O programa deverá gerar todas as possibilidades de troco para um dólar, considerando as moedas:
 
Half-dólar US$ 0,50
Quarter US$ 0,25
Dime US$ 0,10
Nickel US$ 0,05
Peniie US$ 0,01

Voltar ao início

Linguagem

O programa foi gerado a partir da linguagem Prolog Amzi.

Voltar ao início

Características do Programa

O programa tem duas versões: Ambos os programas utilizam listas como recurso de manipulação de dados.

São bastante genéricos considerando que basta alterar o número e o valor dos componentes para que sejam utilizados para outras moedas e valores. Também pode ser parametrizada a entrada de um valor para permitir o cálculo para valores diferentes de um dólar.

Voltar ao início

Exemplos de Execução do Programa:

dolar1.pro

Para este caso existem mais de duzentas listas retornadas. Aqui foram apresentados alguns recortes desta solução.

?- consult(dolar1).
yes
?- troco(X).
X = [0,0,0,0,100] ;
X = [0,0,0,1,95] ;
X = [0,0,0,2,90] ;
X = [0,0,0,3,85] ;
X = [0,0,0,4,80] ;
X = [0,0,0,5,75] ;
X = [0,0,0,6,70] ;
X = [0,0,0,7,65] ;
....

X = [0,0,0,20,0] ;
X = [0,0,1,0,90] ;
X = [0,0,1,1,85] ;
X = [0,0,1,2,80] ;
X = [0,0,1,3,75] ;
X = [0,0,1,4,70] ;
X = [0,0,1,5,65] ;
X = [0,0,1,6,60] ;
X = [0,0,1,7,55] ;
X = [0,0,1,8,50] ;
X = [0,0,1,9,45] ;
...

X = [0,0,9,1,5] ;
X = [0,0,9,2,0] ;
X = [0,0,10,0,0] ;
X = [0,1,0,0,75] ;
X = [0,1,0,1,70] ;
X = [0,1,0,2,65] ;
X = [0,1,0,3,60] ;
X = [0,1,0,4,55] ;
X = [0,1,0,5,50] ;
X = [0,1,0,6,45] ;
X = [0,1,0,7,40] ;
...

X = [1,1,0,4,5] ;
X = [1,1,0,5,0] ;
X = [1,1,1,0,15] ;
X = [1,1,1,1,10] ;
X = [1,1,1,2,5] ;
X = [1,1,1,3,0] ;
X = [1,1,2,0,5] ;
X = [1,1,2,1,0] ;
X = [1,2,0,0,0] ;
X = [2,0,0,0,0] .
yes
?-

Voltar ao início

Dolar2.pro

Exemplo de execução do programa dolar.pro com para listar as possibilidades de troco para 1 dolar mediante uma despesa de 0,91:

?- consult(dolar2).
yes
?- troco(A,91).
A = [0,0,0,0,9] ; (9 pennies)
A = [0,0,0,1,4] ; (1 nickel e 9 pennies)
no
?-
 



 


Exemplo de execução do programa dolar.pro com para listar as possibilidades de troco para 1 dolar mediante uma despesa de 0,78:

?-
?- troco(A,78).
A = [0,0,0,0,22] ;
A = [0,0,0,1,17] ;
A = [0,0,0,2,12] ;
A = [0,0,0,3,7] ;
A = [0,0,0,4,2] ;
A = [0,0,1,0,12] ;
A = [0,0,1,1,7] ;
A = [0,0,1,2,2] ;
A = [0,0,2,0,2] ;
no
?-

Voltar ao início

Listagem do Programa
dolar1.pro
dolar2.pro
dolar1.pro /*===================================================================*/
/* Autor : Wanderley Gazeta - ICMC - USP/São Carlos */
/* data : 08/04/99 */
/* disciplina : Introdução à Inteligência Artificial */
/*===================================================================*/
/* programa para a solução do problema do troco de um dólar. Este */
/* programa retorna todas */
/* possibilidades de troco combinando as moedas de 0,50 0,25 0,10 */
/* 0,05 e 0,01 centavos de dólar. */
/*===================================================================*/
troco(L):-
troco(L, [50, 25, 10, 5, 1], [2, 4, 10, 20, 100], 0, 100).
troco([], [], [], R, R).
troco([N|Ns], [V|Vs], [Max|Maxs], Subt,Tot):-
entre(N, 0, Max),                                        /* busca todos os valores possíveis para cada moeda*/
Subt2 is N*V + Subt,                                  /* calcula a qtdade necessária de cada moeda */
troco(Ns, Vs, Maxs, Subt2, Tot).                /* chama a recursão */
entre(_,Min,Max):- Min > Max,                   /* qdo o mín > máx, não há necessidade */
!,                                                                 /* de continuar com as buscas */
fail.
entre(Min,Min,_).                                         /* transfere o valor de Min para N */
entre(N, Min, Max) :-                                   /* incrementa o Min */
ProxMin is Min+1,
entre(N, ProxMin, Max).                              /* chama a recursão */

Voltar ao início

dolar2.pro

/*===================================================================*/
/* Autor : Wanderley Gazeta - ICMC - USP/SC */
/* data : 08/04/99 */
/* disciplina : Introdução à Inteligência Artificial */
/*===================================================================*/
/* programa para a solução do problema do troco de um dólar. Este */
/* programa retorna todas possibilidades de troco a partir de um */
/* dado valor (S) combinando as moedas de 0,50 0,25 0,10, 0,05 e 0,01*/
/* centavos de dólar. */
/*===================================================================*/

troco(L,S):-
C is 100-S,
troco(L, [50, 25, 10, 5, 1], [C/50, C/25, C/10, C/5, C/1], 0, C).
troco([], [], [], R, R).
troco([N|Ns], [V|Vs], [Max|Maxs], Subt,Tot):-
entre(N, 0, Max),                           /* procura todos os valores possíveis para cada moeda */
Subt2 is N*V + Subt,                     /* calcula a qtde necessária de cada moeda */
troco(Ns, Vs, Maxs, Subt2, Tot).   /* chama a recursão */
entre(_,Min,Max):- Min > Max,      /* qdo o mín > máx, não há necessidade */
!,                                                    /* de continuar com as comparações */
fail.
entre(Min,Min,_).                            /* transfere o valor de Min para N */
entre(N, Min, Max) :-                     /* incrementa o Min */
ProxMin is Min+1,
entre(N, ProxMin, Max).                /* chama a recursão */

Voltar ao início