Exercicio de conversão e soma de moedas

PESSOAL ESTOU COM DIFICULDADE NESSE EXERCICIO, PODEM ME AJUDAR ?

Ao perceber que um de seus amigos estava com dificuldades financeiras, Victória, uma garota muito inteligente, decidiu ajudá-lo com uma “vaquinha digital”, em que todos poderiam doar quanto pudessem para ajudar seu amigo.

Para isso, Victória criou uma criptomoeda, a Vic Coin, em que cada unidade equivale à R$ 2,50. Assim, os doadores primeiro compram a criptomoeda e, em seguida, depositam uma parte delas para doação. A parte que não foi doada pode ficar guardada em uma carteira digital e poderá ser usada no futuro para outras doações. Genial!

Victória está ocupada implementando o que é necessário para o funcionamento do ambiente de doações, por isso pediu para que você a ajudasse com uma das partes essenciais: a contabilização de doações e a conversão para reais.

Seu objetivo é criar um programa que receba como entrada diversas doações feitas em Vic Coin e, ao final, exiba o total de doações em Vic Coin (VC$) e o total convertido para reais (R$).

Entrada

Diversos números reais, um por linha, que representam os valores das doações feitas em Vic Coin. A entrada é finalizada quando o número -1.0 for lido e, evidentemente, não deverá ser contabilizado como doação.

Saída

A saída será composta de duas linhas:

  • A primeira linha será um número real com duas casas decimais indicando o total doado em Vic Coins (VC$);
  • A segunda linha será um número real com duas casas decimais indicando o total doado em reais (R$).
valor_real = float(input())
vicCoin = 2.50
contador = 0

for contador in range(valor_real > -1.0):
    total = valor_real + contador
    valor_desejado = valor_real*250

print('Moeda de trcoa {:.2f}'.format(valor_real))
print('sua compra é de {:.2f}'.format(valor_desejado))

Uma dica: sempre olhe a documentação de tudo que for usar. Por exemplo, na documentação de range vc vai ver que ele recebe até 3 valores inteiros (e não uma condicional).

Isso porque um range representa uma sequência de números, e os valores que você passa para criá-lo marcam o início e fim da sequência, além do “passo”. Por exemplo:

  • range(10): com apenas um número, ele representa o valor final, e o inicial será zero. Ou seja, este range representa os números entre 0 e 9 (sim, é 9 e não 10, porque o valor final não é incluso)
  • range(3, 10): com dois valores, indica o valor inicial e final. Ou seja, agora são os números entre 3 e 9 (o início é incluso, o final não)
  • range(3, 10, 2): o terceiro valor indica o “passo”, ou seja, a sequência andará de 2 em 2. Então esse range contém apenas os números 3, 5, 7, e 9.

E porque range(valor_real > -1.0) não dá nenhum erro? Basicamente, porque:

  • o resultado da comparação valor_real > -1.0 será um booleano (True ou False)
  • mas em Python, o tipo boolean é um sub-tipo dos inteiros, e segundo a documentação, eles se comportam como os inteiros 0 e 1 (respectivamente, False e True)

Ou seja, você está criando um range(0) (caso a condição seja falsa) ou um range(1) (caso seja verdadeira). Então ou ele não vai executar o for nenhuma vez, ou apenas uma.

Portanto, apesar de ser uma construção válida (não dá erro de sintaxe, está dentro das regras da linguagem), isso não faz o que você precisa.


Mas não é isso que o exercício pede. Ele quer que você leia vários valores (ou seja, o input deveria estar dentro do for, e esse for teria que executar várias vezes, até que o valor digitado seja -1).

Mas como você não sabe quantos valores serão (pois só vai saber depois que ler e ver que é -1), então não faz sentido usar um range. Você tem que ler indefinidamente, até encontrar -1. E o enunciado diz que os valores lidos estão em Vic Coin:

Ou seja, você vai lendo os valores e no final terá o total em Vic Coin, que deverá ser convertido para real (a conversão é feita só no final, e não dentro do loop). Algo assim:

taxa_conversao = 2.5

total_vic = 0 # valor total em Vic Coins
while True: # loop se repete indefinidamente
    valor_vic = float(input())
    if valor_vic == -1: # se o valor é -1, eu não adiciono no total
        break # em vez disso, eu interrompo o loop
    # atualiza o total
    total_vic += valor_vic

# imprime o total em Vic Coin
print(f'{total_vic:.2f}')
# imprime o total convertido para reais
print(f'{total_vic * taxa_conversao:.2f}')

Claro que também poderia ser feito assim:

taxa_conversao = 2.5

valor_vic = 0
total_vic = 0
while valor_vic != -1: # loop se repete enquanto o valor lido não é -1
    valor_vic = float(input())
    if valor_vic != -1: # se o valor não é -1, adiciono no total
        total_vic += valor_vic

# imprime o total em Vic Coin
print(f'{total_vic:.2f}')
# imprime o total convertido para reais
print(f'{total_vic * taxa_conversao:.2f}')

Mas eu não gosto muito de inicializar o valor_vic fora do loop com um valor artificial só para que ele entre no loop. Mas tem gente que prefere complicar à toa só porque não gosta de usar break. Aí vai do gosto de cada um…

Muito obrigado Hugo