- Treinar o uso de dicionários em Python
- Organizar os seus programas na forma de módulos em Python
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.
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:
inicializações (lê o arquivo de estoque e carrega a máquina)
impressão de mensagens sobre o estado da máquina (veja os exemplos de execução)
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.
repita a partir do passo 2
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.
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.
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()).
- 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.