Exercício Programa 5: Câmbio Automático - Parte C

Objetivos

  • Treinar o uso de dicionários em Python
  • Organizar os seus programas na forma de módulos em Python

O que são Módulos?

Um módulo é um arquivo contendo definições e comandos em Python para serem usados em outros programas em Python. Há diversos módulos do Python que fazem parte da biblioteca padrão, como os módulos:

math: contém funções matemáticas como, por exemplo, sin(), cos(), exp(), sqrt(),... ;

>>> import math
>>> math.sqrt(25)
5.0
>>> math.pi
3.141592653589793
>>> math.sin(math.pi)
1.2246467991473532e-16
>>> math.cos(math.pi)
-1.0
>>>

random: possui funções que manipulam geradores de números pseudo-aleatórios como randomrange(), random(), shuffle(),...;

>>> import random
>>> random.randrange(5,10)
7
>>> random.randrange(5,10)
9
>>> lista = [1,2,3,4,5]
>>> random.shuffle(lista)
>>> lista
[1, 5, 4, 3, 2]
>>>

statistics: com funções estatísticas como mean(), median(), variance(),...

>>> import statistics
>>> statistics.mean([-1.0, 2.5, 3.25, 5.75])
2.625
>>> statistics.median([2, 3, 4, 5])
3.5
>>> data = [1, 2, 2, 4, 4, 4, 5, 6]
>>> mu = statistics.mean(data)
>>> statistics.pvariance(data, mu)
2.5
>>>

Para facilitar o desenvolvimento desse e dos próximos exercícios, vamos começar a escrever e utilizar nossos próprios módulos para organizar os programas.

Para esse exercício, coloque as suas funções auxiliares no arquivo minhas_funcoes.py. Um esqueleto desse arquivo está sendo fornecido e nele está a função carrega() que deve ser utilizada na inicialização do seu programa.

Parte C: entrega até 18/09 (sexta-feira)

Na parte C, você deve desenvolver o restante do programa para a máquina de câmbio automático, ou seja, o seu programa deve receber uma quantia em dólares e trocar a quantia para virtuais imeanos retornando o menor número de notas e moedas possível. Caso não seja possível (troca impossível devido ao valor das notas disponíveis na máquina ou quantidade insuficiente de notas), o programa deve responder com mensagens apropriadas (veja os exemplos de execução). Para isso, o seu programa deve utilizar:

  • a função lista_trocos(): feita na parte A (EP3);
  • a função menor_troca(): feita na parte B (EP4);
  • o módulo minhas_funcoes: que deve conter as funções lista_trocos(), menor_troca(), e carrega(), além de outras funções auxiliares que desejar.

Você pode utilizar a seguinte estrutura para implementar o seu programa principal main.py, em um arquivo separado do minhas_funcoes.py:

  1. inicializações (lê o arquivo de estoque e carrega a máquina)

  2. impressão de mensagens sobre o estado da máquina (veja os exemplos de execução)

  3. pergunta ao usuário o que ele deseja fazer (terminar o programa ou trocar dólares)

    3.1) se o usuário digitar 't', o programa imprime o estoque de notas restante e termina.

    3.2) se o usuário digitar uma valor (float) em dólares:

    • converta o valor em virtuais imeanos
    • calcule os inteiros qn que é a quantia que deve ser trocada em notas e qm que é quantia em moedas.
    • se for possível trocar qn e qm então a máquina imprime a combinação de notas e moedas utilizadas e atualiza o estoque
    • caso não seja possível trocar qn ou qm, o programa indica que não foi possível, imprimindo uma mensagem adequada.
  4. repita a partir do passo 2

O que você deve fazer

Escreva um programa em Python que simula o funcionamento da máquina de câmbio. Lembre-se que, para usar as funções do módulo minhas_funcoes em seu programa, você precisa incluir o seguinte comando

import minhas_funcoes as mf

o as mf é opcional, e cria a abreviação mf para que você possa utilizar os recursos desse módulo.

Na inicialização, seu programa deve utilizar a função de protótipo

def carrega(nome_do_arquivo):
    '''

Como a função carrega() retorna três objetos, podemos usar o seguinte trecho de código para utilizar essa função:

import minhas_funcoes as mf

ESTOQUE = "estoque1.txt" # um dos arquivos de teste
taxa, estoque_notas, estoque_moedas = mf.carrega(ESTOQUE)

Suponha que o conteúdo do arquivo “estoque1.txt” seja:

T 1.0
N 5 4
N 2 5

M 10 7
M 3 8
M 1 9

Esse conteúdo indica que a taxa de câmbio é 1.0 (um bom valor para testar as funções), e que a máquina contém 4 notas de $5, 5 notas de $2, 7 moedas de $0.10, 8 moedas de $0.03 e 9 moedas de $0.01.

Nesse caso, o efeito da chamada da função carrega() no Python Shell seria:

>>> import minhas_funcoes as mf
>>> taxa, estoque_notas, estoque_moedas = mf.carrega("estoque1.txt")
>>> taxa
1.0
>>> estoque_notas
{2: 5, 5: 4}
>>> estoque_moedas
{1: 9, 10: 7, 3: 8}
>>>

Após a inicialização, o seu programa deve receber comandos do usuário. Se o comando for a letra 't', então o seu programa deve terminar. Caso contrário, o programa deve assumir que o comando é um número real representando um valor em dólares que o usuário deseja trocar por virtuais imeanos.

O seu programa deve tratar primeiro as notas e, caso seja possível, então as moedas. Caso não seja possível trocar as notas, não é necessário tentar trocar as notas em moedas.

Como o troco pode ser realizado de várias formas diferentes, a máquina deve tentar devolver o menor número possível de notas e moedas. Por exemplo, caso o usuário precise receber o valor 4 em notas de 1, 2, e 3 virtuais, a máquina deve tentar dar o troco usando uma dessas duas combinações: (1,3) ou (2,2). A ordem, nesse caso, é indiferente. Caso nenhuma dessas alternativas seja possível por falta de notas 2, 3 na máquina (o estoque dessas notas se esgotou), o sistema deve tentar dar o troco (1, 1, 1, 1).

Apenas se o troco correto existir (notas e moedas) então a troca é realizada e o estoque é atualizado, ou seja, a quantia deve ser subtraída do estoque.

Exemplo de execução

Para esse exemplo, considere o seguinte arquivo “estoque.txt”:

T 1.0
N 3 5
N 5 5

M 7 5
M 8 5

contendo portanto 5 notas de $3, 5 notas de $5, 5 moedas de $0.07 e 5 moedas de $0.08, com taxa de câmbio 1.0.

Digite o nome do arquivo contendo o estoque de notas: estoque.txt

=========================================================
===  Bem Vindo à Máquina Automática de Câmbio do IME  ===
=========================================================
>>> Taxa dólar para virtual:  1.0
>>> Estoque de notas :  {3: 5, 5: 5}
>>> Estoque de moedas:  {8: 5, 7: 5}

Digite:
    - um valor em dólar ou
    - 't' para terminar.

sua opção >>> 15.15

Você vai receber $15.15 virtuais pelos $15.15 dólares
Trocando $15 em notas:
Soluções possíveis:  [[5, 5, 5], [3, 3, 3, 3, 3]]
Solução encontrada:  [5, 5, 5]
Trocando $15 em moedas:
Soluções possíveis:  [[8, 7]]
Solução encontrada:  [8, 7]

>>> Você recebeu $15.15 virtuais:
>>> Notas recebidas:  [5, 5, 5]
>>> Moedas recebidas:  [8, 7]

Obrigado por utilizar a Máquina Automática de Câmbio do IME!

=========================================================
===  Bem Vindo à Máquina Automática de Câmbio do IME  ===
=========================================================
>>> Taxa dólar para virtual:  1.0
>>> Estoque de notas :  {3: 5, 5: 2}
>>> Estoque de moedas:  {8: 4, 7: 4}

Digite:
    - um valor em dólar ou
    - 't' para terminar.

sua opção >>> 20.30

Você vai receber $20.30 virtuais pelos $20.30 dólares
Trocando $20 em notas:
Soluções possíveis:  [[5, 5, 5, 5], [3, 3, 3, 3, 3, 5]]
Solução encontrada:  [3, 3, 3, 3, 3, 5]
Trocando $30 em moedas:
Soluções possíveis:  [[8, 8, 7, 7]]
Solução encontrada:  [8, 8, 7, 7]

>>> Você recebeu $20.30 virtuais:
>>> Notas recebidas:  [3, 3, 3, 3, 3, 5]
>>> Moedas recebidas:  [8, 8, 7, 7]

Obrigado por utilizar a Máquina Automática de Câmbio do IME!

=========================================================
===  Bem Vindo à Máquina Automática de Câmbio do IME  ===
=========================================================
>>> Taxa dólar para virtual:  1.0
>>> Estoque de notas :  {3: 0, 5: 1}
>>> Estoque de moedas:  {8: 2, 7: 2}

Digite:
    - um valor em dólar ou
    - 't' para terminar.

sua opção >>> 10.16

Você vai receber $10.16 virtuais pelos $10.16 dólares
Trocando $10 em notas:
Soluções possíveis:  [[5, 5]]
Não dá para trocar 10 com o estoque
{3: 0, 5: 1}

Obrigado por utilizar a Máquina Automática de Câmbio do IME!

=========================================================
===  Bem Vindo à Máquina Automática de Câmbio do IME  ===
=========================================================
>>> Taxa dólar para virtual:  1.0
>>> Estoque de notas :  {3: 0, 5: 1}
>>> Estoque de moedas:  {8: 2, 7: 2}

Digite:
    - um valor em dólar ou
    - 't' para terminar.

sua opção >>> 5.24

Você vai receber $5.24 virtuais pelos $5.24 dólares
Trocando $5 em notas:
Soluções possíveis:  [[5]]
Solução encontrada:  [5]
Trocando $24 em moedas:
Soluções possíveis:  [[8, 8, 8]]
Não dá para trocar 24 com o estoque
{8: 2, 7: 2}

Obrigado por utilizar a Máquina Automática de Câmbio do IME!

=========================================================
===  Bem Vindo à Máquina Automática de Câmbio do IME  ===
=========================================================
>>> Taxa dólar para virtual:  1.0
>>> Estoque de notas :  {3: 0, 5: 1}
>>> Estoque de moedas:  {8: 2, 7: 2}

Digite:
    - um valor em dólar ou
    - 't' para terminar.

sua opção >>> 5.15

Você vai receber $5.15 virtuais pelos $5.15 dólares
Trocando $5 em notas:
Soluções possíveis:  [[5]]
Solução encontrada:  [5]
Trocando $15 em moedas:
Soluções possíveis:  [[8, 7]]
Solução encontrada:  [8, 7]

>>> Você recebeu $5.15 virtuais:
>>> Notas recebidas:  [5]
>>> Moedas recebidas:  [8, 7]

Obrigado por utilizar a Máquina Automática de Câmbio do IME!

=========================================================
===  Bem Vindo à Máquina Automática de Câmbio do IME  ===
=========================================================
>>> Taxa dólar para virtual:  1.0
>>> Estoque de notas :  {3: 0, 5: 0}
>>> Estoque de moedas:  {8: 1, 7: 1}

Digite:
    - um valor em dólar ou
    - 't' para terminar.

sua opção >>> .15

Você vai receber $0.15 virtuais pelos $0.15 dólares
Trocando $0 em notas:
Soluções possíveis:  [[]]
Solução encontrada:  []
Trocando $15 em moedas:
Soluções possíveis:  [[8, 7]]
Solução encontrada:  [8, 7]

>>> Você recebeu $0.15 virtuais:
>>> Notas recebidas:  []
>>> Moedas recebidas:  [8, 7]

Obrigado por utilizar a Máquina Automática de Câmbio do IME!

=========================================================
===  Bem Vindo à Máquina Automática de Câmbio do IME  ===
=========================================================
>>> Taxa dólar para virtual:  1.0
>>> Estoque de notas :  {3: 0, 5: 0}
>>> Estoque de moedas:  {8: 0, 7: 0}

Digite:
    - um valor em dólar ou
    - 't' para terminar.

sua opção >>> 0

Você vai receber $0.00 virtuais pelos $0.00 dólares
Trocando $0 em notas:
Soluções possíveis:  [[]]
Solução encontrada:  []
Trocando $0 em moedas:
Soluções possíveis:  [[]]
Solução encontrada:  []

>>> Você recebeu $0.00 virtuais:
>>> Notas recebidas:  []
>>> Moedas recebidas:  []

Obrigado por utilizar a Máquina Automática de Câmbio do IME!

=========================================================
===  Bem Vindo à Máquina Automática de Câmbio do IME  ===
=========================================================
>>> Taxa dólar para virtual:  1.0
>>> Estoque de notas :  {3: 0, 5: 0}
>>> Estoque de moedas:  {8: 0, 7: 0}

Digite:
    - um valor em dólar ou
    - 't' para terminar.

sua opção >>> t


Obrigado por utilizar a Máquina Automática de Câmbio do IME!

As mensagens do seu programa devem ser exatamente como nos exemplos de execução indicados anteriormente.

Observe que:

  • no primeiro pedido para trocar $15.15 foi possível trocar $15.15 usando o menor número de notas e moedas do estoque.
  • no segundo pedido para trocar $20.30, foi possível trocar $20, porém não utilizando o menor número de notas.
  • no terceiro pedido para trocar $10.16, não há notas suficientes.
  • no quarto pedido para trocar $5.24, é possível trocar as notas porém não é possível trocar as moedas.
  • etc.

O que você precisa entregar

Neste exercício programa você deve entregar na página da disciplina dois arquivos:

  • main.py: contém a sua solução para esse exercício (APENAS a função main()), baseado no esqueleto fornecido;
  • minhas_funcoes.py: contém TODAS as funções que você usar no seu programa (função main()).

Dicas

  • Utilize o esqueleto do programa esqueleto_main.py.
  • Utilize o esqueleto do módulo esqueleto_minhas_funcoes.py, que contém uma solução para a função lista_trocos(), menor_troca() e a função carrega().
  • Utilize os arquivos de teste estoque.txt e estoque1.txt, e escreva outros testes, por exemplo, usando uma taxa diferente de 1.0.
  • Estude as funções e pedaços de código desses arquivos antes de escrever a sua solução para o EP5.