Ir para conteúdo
Fórum Script Brasil
  • 0

Quem Pode Me Ajudar Neste Pepino?!


Marcoaajf

Pergunta

Crie uma função que receba como parâmetro um número inteiro representando o valor solicitado para saque num caixa eletrônico, e em seguida, sabendo que o caixa está alimentado com notas de 1, 5, 10, 50 e 100 reais, calcule e escreva quantas notas de cada valor serão necessárias para atender a solicitação de saque.

# O nome da função deve ter a seguinte assinatura: calculaNotas(valor)

# As notas devem ser distribuídas da maneira mais eficiente possível. Ou seja, se o usuário solicitou 100 reais, teremos que dar uma nota de 100, ao invés de 2 notas de 50 reais ou até mesmo 100 notas de 1 real.

Exemplo de uso:

>>> calculaNotas(187)

1 nota(s) de 100 reais

1 nota(s) de 50 reais

3 nota(s) de 10 reais

1 nota(s) de 5 reais

2 nota(s) de 1 reais

me ajudem!!!!!!!!

Link para o comentário
Compartilhar em outros sites

17 respostass a esta questão

Posts Recomendados

  • 0

Isso é um exercício, né? Então, você vai ter que pensar um pouquinho, não acha? Se eu entregar a resposta de bandeja não tem graça! Só uma dica: comece da maior nota e vai subtraindo as mesmas do valor. Quando o resultado da subtração for menor que 0 é porque você chegou no limite daquela nota específica e se for 0 é porque você já tem todas as notas necessárias.

Se tiver alguma dúvida, é só perguntar. Só não espere ver o exercício pronto. Ok? ;)

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Graymalkin

cara, eu acho que você não me entendeu... eu comecei no curso de python e o cara me passou essa parada!! eu estou com vontade de desistir porque a matéria não tem nada relacionado a isso!! desculpe pela minha total ignorância. só sei fazer.. def calculaNotas(): e só!!! se você puder me ajudar pode colocar seu nome que eu entrego com o seu nome...estou nem aí pra essa parada!!! e assim quem sabe o professor se manca...

mesmo assim valeu!!! e novamente me desculpe mas em duas semanas nunca tinha visto nada de python... assim é foda!! :unsure:

Link para o comentário
Compartilhar em outros sites

  • 0
Graymalkin

é...você tá certo!! melhor desistir da parada!!! valeu cara!! sorte!!

Como assim?! :blink: Eu não sugeri a você desistir em momento algum! Se você entrou neste curso é porque queria algo (ninguém iria entrar num curso sem saber nada sobre o assunto - bom, pelo menos eu nunca faria isso), então o melhor que se pode fazer é tentar aprender. E programação é um assunto interessantíssimo se você estiver disposto a aprender.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Graymalkin, me passa algum exemplo relacionado para que eu entenda... não gosto de desistir da parada mas entrei no meio do curso e o cara falou que dava pra pegar mas tá foda!! se você puder me passar qualquer coisa que me dê um caminho eu encaro na boa!! valeu!!

Graymalkin, se fosse em Delphi eu faria assim (por mais que você saiba como fazer mais facil)

procedure TForm1.Button1Click(Sender: TObject);

var

valor,notas:integer;

begin

notas := 0;

valor:= strtoint(Edit1.Text);

while valor >= 100 do

begin

valor := valor - 100;

notas := notas + 1;

end;

Label1.Caption := inttostr(notas)+ ' '+ Label1.Caption;

notas := 0;

while (valor >= 50) do

begin

valor := valor - 50;

notas := notas + 1;

end;

Label2.Caption := inttostr(notas)+ ' '+ Label2.Caption;

notas := 0;

while (valor >= 10) do

begin

valor := valor - 10;

notas := notas + 1;

end;

Label3.Caption := inttostr(notas)+ ' '+ Label3.Caption;

notas := 0;

while (valor >= 5) do

begin

valor := valor - 5;

notas := notas + 1;

end;

Label4.Caption := inttostr(notas)+ ' '+ Label4.Caption;

notas := 0;

while (valor >= 1) do

begin

valor := valor - 1;

notas := notas + 1;

end;

Label5.Caption := inttostr(notas)+ ' '+ Label5.Caption;

end;

por mais que seja idiota funciona!!! como eu coloco as variaveis?? o while é assim mesmo?? eu sei que você é bom e tá aqui só pra resolver grandes problemas, mas me ajuda só nessa!! prometo que nunca mais entro aqui pra perturbar vocês !!!

Link para o comentário
Compartilhar em outros sites

  • 0

Como Jack, vamos por partes. Você não precisa absorver todas as explicações abaixo de uma vez só. Portanto, aconselho à você primeiro ler o que coloquei abaixo dos "-------".

Primeiro, vamos conhecer uma lista:

notasCaixa = [100, 50, 10, 5, 1]
Você pode acessar cada um dos elementos da lista usando [], exemplo:
print notasCaixa[1]
50
Lembrando que o índice (o que está dentro dos colchetes), começa de 0. Para adicionar-se um elemento à lista usamos o método append(), exemplo:
lista = [1, 2, 3]
lista.append(4)
print lista
[1, 2, 3, 4]
Sendo que existe uma instrução para percorrer uma coleção, como uma lista, que é a instrução for (para). Exemplo:
for nota in notasCaixa:
    print nota
Isso vai mostrar todos os elementos de notasCaixa. Isso é uma iteração ou loop, e significa que o bloco de código (no caso, só temos uma linha, mas podiam ser mais) será executado para cada elemento da lista e este estará no identificado que determinarmos (no caso, o nota). Mas, e se precisarmos fazer uma iteração (loop) por uma condição e não pelos elementos? Então temos que usar um while (enquanto). Nesta instrução teremos um bloco de código sendo repetido enquanto uma determinada condição é verdadeira. Tanto para while quanto para for, se quisermos interromper o loop, por algum motivo, podemos usar a instrução break (parada ou quebra). Semelhante ao while temos a instrução if (se), que executa um determinado bloco de código se uma condição for verdadeira (mas apenas uma vez, não é um loop). Opcionalmente pode-se executar outro bloco de código caso a condição seja falsa, e para isso usa-se o else (senão). Operações aritméticas e de atribuição são feitas com os operadores normais. Exemplo:
valor = 100 + 5
No caso de...
valor += 2
... isso equivale à:
valor = valor + 2
Ou seja, soma-se 2 ao valor. Para todos as instruções os blocos de instruções indicados pela identação (o espaço no início da linha). Exemplo:
print "isso é executado antes do if"

if a==2:
    print "isso só vai ser executado se a for igual a 2"
    print "teste2 - isso só vai ser executado se a for igual a 2"
else:
    print "isso só vai ser executado se a for diferente de 2"
    print "teste3 - isso só vai ser executado se a for diferente de 2"

print "isso é executado depois do if"
Em suma, os espaços na frente das linhas são *realmente* necessários. ---------------------------------------------------------------------------------------- Bom, pra quê eu expliquei isso tudo aí em cima? É porque é tudo de que precisamos para fazer o tal exercício! :D Então, segue o código que fiz:
def calculaNotas(valor):
    notasCaixa = [100, 50, 10, 5, 1]
    notasValor = []

    for nota in notasCaixa:
        while valor>=nota:
            valor -= nota
            if valor>=0:
                notasValor.append(nota)
            else:
                valor += nota

        if valor==0:
            break

    return notasValor
Primeiro, coloque-o em um arquivo .py e execute-o no IDLE. Depois, vá no interpretador e faça o teste:
calculaNotas(187)
[100, 50, 10, 10, 10, 5, 1, 1]

E daí, dê uma boa analisada em cada linha e qualquer dúvida ache a explicação referente na parte acima. Caso a explicação tenha sido insuficiente, pode perguntar que eu explico melhor. Mas, o mais importante mesmo é que você entenda como o código funciona, ou seja, o porquê de tudo isso.

Qualquer dúvida, 'stamos aí.

Abraços,

Graymalkin

EDITADO:

Ah, tu saca de Delphi? Então acho que você vai pegar rapidinho o código acima e entender os conceitos. Mas, qualquer dúvida, é só falar.

eu sei que você é bom e tá aqui só pra resolver grandes problemas

Os que tem grandes problemas são os que já sabem bastante, então não é necessário se dedicar muito, mas apenas dar umas idéias, se possível. Como um professor que tive disse uma vez: "não me interessam aqueles que sabem, mas sim os que não sabem." (E se não me engano foi um professor de lógica de programação).

Abraços,

Graymalkin

EDITADO NOVAMENTE:

Recebi sua MP extremamente polida e já à respondi.

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Graymalkin, você é grande, cara!! foi a melhor aula de Python que tive!! me decepcionei muito com o Delphi (principalmente a parte de Midas) e estou tentando aprender novas linguagens... muito obrigado é pouco!! vou usar esta tua aula pra simular outros tipos de fracionamento . muito obrigado novamente e com certeza você me deu um safanão que eu precisava. grande abraço e muita sorte sempre!!

Graymalkin a unica coisa que não está entrando na minha cabeça é porque não há uma variavel que pudesse guardar a ocorrencia dos valores para imprimir tipo... 3 notas de 100...2 notas de 50... eu vi que você citou um código (print antes do if....)

def calculaNotas(valor):

'''Calcula o valor das notas'''

x = int(valor/100)

if (x > 0):

print("Quantidade de nota(s) de 100 reais:")

print(x)

if (valor <= 0) : return... isso é viagem??? ou não?? qual seria a melhor opção com relação a desempenho??

e se eu colocar assim:

def calculaNotas(valor):

'''Calcula o valor das notas'''

try:

x = int(valor/100)

if (x > 0):

print("Quantidade de nota(s) de 100 reais:")

print(x)

if (valor <= 0) : return

except

print ("Por favor entre com numeros inteiros!")

(cara se eu estiver fazendo merda me para!!!) ... apesar que não alterei o valor do "valor"...ele só vai dividir e trazer o resultado da divisão.... (tá fraco ainda....)

Editado por Marcoaajf
Link para o comentário
Compartilhar em outros sites

  • 0

Um modo de fazer isso neste caso seria usar um dicionário. Um dicionário é como uma lista onde você pode associar uma determinada "chave" para cada item. Um exemplo completo (usando a função anterior e uma nova):

def calculaNotas(valor):
    notasCaixa = [100, 50, 10, 5, 1]
    notasValor = []

    for nota in notasCaixa:
        while valor>=nota:
            valor -= nota
            if valor>=0:
                notasValor.append(nota)
            else:
                valor += nota

        if valor==0:
            break

    return notasValor    
            
def imprimirNotas(notasValor):
    notas = {}

    for nota in notasValor:
        if notas.has_key(nota):
            notas[nota] += 1
        else:
            notas[nota] = 1

    for nota, quantidade in notas.items():
        print "%i nota(s) de %i" % (quantidade, nota)

imprimirNotas(calculaNotas(187))

Certo? ;)

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

deu certo!!!!! mas como ordenar?? da maior para menor?? neste dicionário é onde acontece a ordenação? em cada programa que você faz você tem que fazer isto?? se sim o código não fica confuso, sabendo que tem que alterar valores e como imprimir os mesmo em funções diferentes??

Editado por Marcoaajf
Link para o comentário
Compartilhar em outros sites

  • 0

Graymalkin, o código aí está errado porque se eu coloco 1478 funciona legal mas se eu coloco 1211 só aparece as notas de 100 o que eu errei??

def calculaNotas(valor):

'''Calcula o valor das notas'''

x = int(valor/100)

if (x > 0):

print("Quantidade de nota(s) de 100 reais:")

print(x)

valor = valor % 100

if (valor <= 0) : return

y = int(valor/50)

if (y > 0):

print("Quantidade de nota(s) de 50 reais:")

print (y)

valor = valor % 50

if (valor <= 0): return

z = int(valor/10)

if (z > 0):

print ("Quantidade de nota(s) de 10 reais:")

print (z)

valor = valor % 10

if (valor <= 0): return

w = int(valor/5)

if (w > 0):

print ("Quantidade de nota(s) de 5 reais:")

print (w)

valor = valor % 5

if (valor <= 0): return

que = int(valor/1)

if (que > 0):

print ("Quantidade de nota(s) de 1 real:")

print (que)

if (valor <= 0): return

Link para o comentário
Compartilhar em outros sites

  • 0
deu certo!!!!! mas como ordenar?? da maior para menor?? neste dicionário é onde acontece a ordenação? em cada programa que você faz você tem que fazer isto??

Dicionários não são ordenados, mas você pode ordenar as chaves e então fazer o loop. No caso, aquele último loop...

for nota, quantidade in notas.items():
    print "%i nota(s) de %i" % (quantidade, nota)
... seria substituído por:
for nota in sorted(notas.keys(), reverse=True):
    print "%i nota(s) de %i" % (notas[nota], nota)

Este aí mostrará em ordem decrescente.

se sim o código não fica confuso, sabendo que tem que alterar valores e como imprimir os mesmo em funções diferentes??

Aí é uma questão de gosto e de contexto. Poderia estar tudo em uma só. Mas, dependendo do caso, você pode precisar formatar um mesmo conjunto de dados de maneiras diferentes. Neste caso eu acho mais simples criar uma função que faça os cálculos e outra que faça a exibição deles.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Aqui o seu código funcionou corretamente. Mas, sempre use a tag CODE para postar o código no fórum, senão o seu código fica sem identação (o que é muuuuito importante em Python).

Agora, algumas lições de Python. Primeiro: Python não é Pascal/Delphi! Não precisa de parênteses em tudo quanto é lugar. :D

Segundo: print é uma instrução da linguagem e não uma função (e justamente por isso não precisa realmente de parênteses).

Terceiro: não existe a necessidade de usar int() quando se faz uma divisão por um inteiro. No caso, ao invés de...

x = int(valor/100)
... basta fazer:
x = valor/100
O retorno vai ser um inteiro mesmo. Faça o teste no interpretador de Python:
>>> 2152/100
21
>>> 2152/100.00
21.52
Vê a diferença? No segundo caso eu usei um float (100.00) e o resultado da divisão foi um float. Quarto: interpolação de strings é muito bom para transformar...
print ("Quantidade de nota(s) de 5 reais:")
print (w)
... em:
print "Quantidade de nota(s) de 5 reais: %i" % w
Veja o seu código escrito de uma maneira mais pythônica:
def calculaNotas(valor):
    '''Calcula o valor das notas'''

    x = valor/100
    if x > 0:
        print "Quantidade de nota(s) de 100 reais: %i" % x
        valor = valor % 100
    if valor <= 0 : return

    y = valor/50
    if y > 0:
        print "Quantidade de nota(s) de 50 reais: %i" % y
        valor = valor % 50
    if valor <= 0: return

    z = valor/10
    if z > 0:
        print "Quantidade de nota(s) de 10 reais: %i" % z
        valor = valor % 10
    if valor <= 0: return

    w = valor/5
    if w > 0:
        print "Quantidade de nota(s) de 5 reais: %i" % z
        valor = valor % 5
    if valor <= 0: return

    que = valor/1
    if que > 0:
        print "Quantidade de nota(s) de 1 real: %i" % que

    if valor <= 0: return
Agora... códigos repetitivos como o código acima tendem sempre a poderem ser simplificados. Note que a mesma coisa é feita para cada uma das notas (100, 50, 10, 5 e 1). Então, será que não seria melhor um loop? Portanto, veja o código abaixo, que faz mesma coisa que o seu, porém com um loop:
def calculaNotas(valor):
    '''Calcula o valor das notas'''
    notas = [100, 50, 10, 5, 1]

    for nota in notas:
        x = valor/nota
        if x > 0:
            print "Quantidade de nota(s) de %i reais: %i" % (nota, x)
            valor = valor % nota
        if valor <= 0: break

Certo? ;)

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Graymalkin,

caramba!! você reduziu todo o codigo a 7 linhas!!!!!!! muito bom!!!!! as listas tem poder!!!!!

valeu!!!

a última coisa... como tratar um erro de valor não numeral (ou não inteiro)? tem que ser try, except?? e se for onde fica o código se for verdadeiro??

Editado por Marcoaajf
Link para o comentário
Compartilhar em outros sites

  • 0
Graymalkin,

caramba!! você reduziu todo o codigo a 7 linhas!!!!!!! muito bom!!!!! as listas tem poder!!!!!

valeu!!!

a última coisa... como tratar um erro de valor não numeral (ou não inteiro)? tem que ser try, except?? e se for onde fica o código se for verdadeiro??

Pode ser com try... except. O código mesmo ficaria dentro do try. Mas, dê uma olhada no código que postei no seu outro tópico. Eu acho que ele ficaria melhor.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...