.. -- coding: utf-8 -- .. Copyright (C) Coelho e Hitoshi Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with Invariant Sections being Forward, Prefaces, and Contributor List, no Front-Cover Texts, and no Back-Cover Texts. .. shortname:: EP5 .. description:: final do exercício de câmbio automático 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()``,... ; .. sourcecode:: python >>> 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()``,...; .. sourcecode:: python >>> 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()``,... .. sourcecode:: python >>> 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 .. sourcecode:: python 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 .. sourcecode:: python 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: .. sourcecode:: python 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: .. sourcecode:: python 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: .. sourcecode:: python >>> 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": .. sourcecode:: python 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. .. sourcecode:: python 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.